/home/fernape/Projects/lkmonitor/src/lkmonitor.c

Go to the documentation of this file.
00001 
00002 /*
00003         lkmonitor (Linux Kernel Monitor)
00004 
00005         Application for monitoring and tuning a Linux kernel.
00006 
00007         Copyright (C) 2005-2008  Fernando ApesteguĂ­a
00008 
00009         This program is free software; you can redistribute it and/or
00010         modify it under the terms of the GNU General Public License
00011         as published by the Free Software Foundation; either version 2
00012         of the License, or (at your option) any later version.
00013 
00014         This program is distributed in the hope that it will be useful,
00015         but WITHOUT ANY WARRANTY; without even the implied warranty of
00016         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017         GNU General Public License for more details.
00018 
00019         You should have received a copy of the GNU General Public License
00020         along with this program; if not, write to the Free Software
00021         Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00022 */
00023 
00024 #ifdef HAVE_CONFIG_H
00025 #  include <config.h>
00026 #endif
00027 #include <glib.h>
00028 #include <gtk/gtk.h>
00029 
00030 #include "eggtrayicon.h"
00031 #include "support.h"
00032 
00033 #include "others.h"
00034 #include "lininfo.h"
00035 
00036 
00037 
00043 struct {
00044         EggTrayIcon *eti;
00045     GtkWidget *eb;
00046     GtkWidget *image;     
00047   }     docklet;
00048 
00049 
00050 extern GThread *gt_collector;
00051 extern GtkWidget *window1;
00052 
00056 void lkmonitor_exit()
00057 {
00058         extern gboolean collector_exit;
00059 
00060         collector_exit=TRUE;
00061         gtk_main_quit();
00062 }
00063 
00067 void docklet_onclick(GtkWidget *w)
00068 {
00069         extern gboolean is_icon;
00070         
00071         gtk_widget_show(window1);
00072         is_icon=FALSE;
00073         
00074 }
00075 
00079 void lkmonitor_create_tray_icon(){
00080 
00081   gint w = 0;
00082   gint h = 0;
00083         
00084   docklet.eti = egg_tray_icon_new("lkmonitor");
00085   docklet.eb = gtk_event_box_new();
00086   docklet.image = gtk_image_new();
00087 
00088   GdkPixbuf *pb = NULL;
00089   GdkPixbuf *pb_scaled = NULL;
00090 
00091   pb =create_pixbuf("lkmonitor/spider-shadow32.png");
00092   gtk_icon_size_lookup(GTK_ICON_SIZE_LARGE_TOOLBAR, &w, &h);
00093   pb_scaled = gdk_pixbuf_scale_simple(pb, w, h, GDK_INTERP_BILINEAR);
00094   gtk_image_set_from_pixbuf(GTK_IMAGE(docklet.image), pb_scaled);
00095 
00096 
00097   gtk_container_add(GTK_CONTAINER(docklet.eb), docklet.image);
00098   gtk_container_add(GTK_CONTAINER(docklet.eti), docklet.eb);
00099   gtk_widget_show_all(GTK_WIDGET(docklet.eti));
00100   
00101  
00102   g_signal_connect(G_OBJECT(docklet.eb), "button-press-event", G_CALLBACK(docklet_onclick), window1);
00103   
00104   
00105   g_object_ref(G_OBJECT(docklet.eti));
00106 }
00107 
00112 int lkmonitor_load_net_dev(GtkWidget *w)
00113 {
00114   char *contents,*contentsp,*p;
00115   char dev_name[10];
00116   int i=0;
00117   GtkComboBox *gcb_netdevs;
00118 
00119   if(g_file_get_contents(NET_DEVS,&contents,NULL,NULL)==FALSE){
00120         g_warning("No net devices file");
00121         gcb_netdevs=GTK_COMBO_BOX(lookup_widget(w,"cb_net_devs"));
00122         gtk_widget_set_sensitive(GTK_WIDGET(gcb_netdevs),FALSE);
00123         g_free(contents);
00124         return -1;
00125   }
00126 
00127   gcb_netdevs=GTK_COMBO_BOX(lookup_widget(w,"cb_net_devs"));
00128 
00129   /* File exists */
00130 
00131   contentsp=skip_lines(contents,2);
00132   
00133   while(sscanf(contentsp,"%10s:",dev_name)!=EOF){
00134         /* Remove the ':' */
00135         if((p=strchr(dev_name,':'))!=NULL)
00136                 *p='\0';
00137         gtk_combo_box_insert_text(gcb_netdevs,i++,dev_name);
00138         contentsp=skip_lines(contentsp,1);
00139   }
00140   
00141   gtk_combo_box_set_active(gcb_netdevs,0);
00142 
00143         /* Clean up */
00144         g_free(contents);
00145         return 0;
00146 
00147 }
00148 
00153 void lkmonitor_init_widgets(GtkWidget *window)
00154 {
00155 
00156   GtkListStore *block_list;
00157   GtkListStore *char_list;
00158   GtkListStore *process_list;
00159   GtkListStore *modules_list;
00160   GtkCellRenderer *b_renderer;
00161   GtkCellRenderer *c_renderer;
00162   GtkCellRenderer *p_renderer;
00163   GtkTreeView *gtv_char;
00164   GtkTreeView *gtv_block;
00165   GtkTreeView *gtv_processes;
00166   GtkTreeView *gtv_modules;
00167   
00168   /* For the gtktextviews */
00169   GtkTextView *gtv;
00170   GtkTextBuffer *gtktextb_ioports;
00171   GtkTextBuffer *gtktextb_iomem;
00172   GtkTextBuffer *gtktextb_dma;
00173   GtkTextBuffer *gtktextb_fs;
00174   GtkTextBuffer *gtktextb_pfs;
00175   
00176 
00177         /*Tree views to show devices*/
00178         /*For block devices*/
00179         
00180         /*First column*/
00181   gtv_block= (GtkTreeView *)lookup_widget(window,"gtv_block");
00182   block_list=gtk_list_store_new(2,G_TYPE_INT, G_TYPE_STRING);
00183   gtk_tree_view_set_model(GTK_TREE_VIEW(gtv_block),GTK_TREE_MODEL(block_list));
00184  
00185   b_renderer = gtk_cell_renderer_text_new ();
00186   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (gtv_block),
00187                                                -1,      
00188                                                _("Number"),  
00189                                                b_renderer,
00190                                                "text", 0,
00191                                                NULL);
00192 
00193   /*Second column*/
00194 
00195   b_renderer = gtk_cell_renderer_text_new ();
00196   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (gtv_block),
00197                                                -1,      
00198                                                _("Device"),  
00199                                                b_renderer,
00200                                                "text", 1,
00201                                                NULL);
00202                                                                                            
00203   
00204   /*For char devices*/  
00205   
00206   /*First column*/
00207   gtv_char= (GtkTreeView *)lookup_widget(window,"gtv_char");
00208   char_list=gtk_list_store_new(2,G_TYPE_INT, G_TYPE_STRING);
00209   gtk_tree_view_set_model(GTK_TREE_VIEW(gtv_char),GTK_TREE_MODEL(char_list));
00210  
00211   c_renderer = gtk_cell_renderer_text_new ();
00212   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (gtv_char),
00213                                                -1,      
00214                                                _("Number"),  
00215                                                c_renderer,
00216                                                "text", 0,
00217                                                NULL);
00218 
00219   /*Second column*/
00220 
00221   c_renderer = gtk_cell_renderer_text_new ();
00222   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (gtv_char),
00223                                                -1,      
00224                                                _("Device"),  
00225                                                c_renderer,
00226                                                "text", 1,
00227                                                NULL);
00228   
00229   /*For Processes List*/        
00230   
00231   /*First column*/
00232   gtv_processes= (GtkTreeView *)lookup_widget(window,"gtv_processes");
00233   process_list=gtk_list_store_new(2,G_TYPE_INT, G_TYPE_STRING);
00234   gtk_tree_view_set_model(GTK_TREE_VIEW(gtv_processes),GTK_TREE_MODEL(process_list));
00235  
00236   p_renderer = gtk_cell_renderer_text_new ();
00237   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (gtv_processes),
00238                                                -1,      
00239                                                _("PID"),  
00240                                                p_renderer,
00241                                                "text", 0,
00242                                                NULL);
00243 
00244   /*Second column*/
00245 
00246   c_renderer = gtk_cell_renderer_text_new ();
00247   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (gtv_processes),
00248                                                -1,      
00249                                                _("Command"),  
00250                                                c_renderer,
00251                                                "text", 1,
00252                                                NULL); 
00253 
00254   /* For Modules list */  
00255                                              
00256   gtv_modules= (GtkTreeView *)lookup_widget(window,"gtv_modules");
00257   modules_list=gtk_list_store_new(5,G_TYPE_STRING, G_TYPE_STRING,G_TYPE_STRING,
00258                                         G_TYPE_STRING,G_TYPE_STRING);
00259   
00260   gtk_tree_view_set_model(GTK_TREE_VIEW(gtv_modules),GTK_TREE_MODEL(modules_list));
00261  
00262   /*First column*/
00263   p_renderer = gtk_cell_renderer_text_new ();
00264   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (gtv_modules),
00265                                                -1,      
00266                                                _("Name"),  
00267                                                p_renderer,
00268                                                "text", 0,
00269                                                NULL);
00270 
00271   /*Second column*/
00272 
00273   c_renderer = gtk_cell_renderer_text_new ();
00274   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (gtv_modules),
00275                                                -1,      
00276                                                _("Size"),  
00277                                                c_renderer,
00278                                                "text", 1,
00279                                                NULL); 
00280 
00281   /*Third column*/
00282   p_renderer = gtk_cell_renderer_text_new ();
00283   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (gtv_modules),
00284                                                -1,      
00285                                                _("RefCount"),  
00286                                                p_renderer,
00287                                                "text", 2,
00288                                                NULL);
00289 
00290   /*Forth column*/
00291 
00292   c_renderer = gtk_cell_renderer_text_new ();
00293   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (gtv_modules),
00294                                                -1,      
00295                                                _("State"),  
00296                                                c_renderer,
00297                                                "text", 3,
00298                                                NULL); 
00299 
00300   /*Fifth column*/
00301 
00302   c_renderer = gtk_cell_renderer_text_new ();
00303   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (gtv_modules),
00304                                                -1,      
00305                                                _("Address"),  
00306                                                c_renderer,
00307                                                "text", 4,
00308                                                NULL); 
00309 
00310 /* We need to initialize the gtktextviews adding buffers to them */
00311 
00312 /* First, create the GtkTextBuffers */
00313 
00314 gtktextb_ioports=gtk_text_buffer_new(NULL);
00315 gtktextb_iomem=gtk_text_buffer_new(NULL);
00316 gtktextb_dma=gtk_text_buffer_new(NULL);
00317 gtktextb_fs=gtk_text_buffer_new(NULL);
00318 gtktextb_pfs=gtk_text_buffer_new(NULL);
00319 
00320 /* Attach them */
00321 gtv=GTK_TEXT_VIEW(lookup_widget(window1,"gtextv_ioports"));
00322 gtk_text_view_set_buffer(gtv,gtktextb_ioports);
00323 
00324 gtv=GTK_TEXT_VIEW(lookup_widget(window1,"gtextv_iomem"));
00325 gtk_text_view_set_buffer(gtv,gtktextb_iomem);
00326 
00327 gtv=GTK_TEXT_VIEW(lookup_widget(window1,"gtextv_dma"));
00328 gtk_text_view_set_buffer(gtv,gtktextb_dma);
00329 
00330 gtv=GTK_TEXT_VIEW(lookup_widget(window1,"gtextv_fs"));
00331 gtk_text_view_set_buffer(gtv,gtktextb_fs);
00332 
00333 gtv=GTK_TEXT_VIEW(lookup_widget(window1,"gtextv_pfs"));
00334 gtk_text_view_set_buffer(gtv,gtktextb_pfs);
00335 
00336 
00337 /* Search for net devices and fill the combo box */
00338  lkmonitor_load_net_dev(window1);
00339 
00340 }
00341 
00342 
00351 void lkmonitor_fill_tv(GtkListStore *model, GtkTreeView *gtv,
00352                                         GtkTreeIter iter, char *buffer, int type)
00353 {
00354         g_assert(model!=NULL && gtv!=NULL && buffer !=NULL);
00355         
00356         char *pointer;
00357         //Now add data to model
00358 
00359         pointer=buffer;
00360 
00361   if(type==TV_DEVS){
00362         
00363         char name[50];
00364         int num;
00365 
00366         while(*pointer!='\0'){
00367                 gtk_list_store_append(model,&iter);
00368                 sscanf(pointer,"%d %s",&num,name);
00369                 gtk_list_store_set(model,&iter,0,num,1,name,-1);
00370                 pointer=strchr(pointer,'\n')+1;
00371         }
00372   }
00373 
00374   if(type==TV_MODS){
00375         
00376         char name[20], size[6], refcount[3], state[10], address[20];    
00377 
00378         while(*pointer!='\0'){
00379                 gtk_list_store_append(model,&iter);
00380                 sscanf(pointer,"%s %s %s %s %s",name,size,refcount,state,address);
00381                 gtk_list_store_set(model,&iter,0,name,1,size,2,refcount,3,state,4,address,-1);
00382                 pointer=strchr(pointer, '\n')+1;
00383         }
00384   }
00385 }
00386 
00394 void lkmonitor_fill_tv_modules(GtkListStore *model, GtkTreeView *gtv,
00395                                         GtkTreeIter iter, char *buffer)
00396 {
00397         g_assert(model!=NULL && gtv!=NULL && buffer !=NULL);
00398         
00399         char *pointer;
00400         char name[50];
00401         int num;
00402         //Now add data to model
00403 
00404         pointer=buffer;
00405 
00406         while(*pointer!='\0'){
00407                 gtk_list_store_append(model,&iter);
00408                 sscanf(pointer,"%d %s",&num,name);
00409                 gtk_list_store_set(model,&iter,0,num,1,name,-1);
00410                 pointer=strchr(pointer,'\n')+1;
00411         }
00412 }
00413 
00416 void lkmonitor_write_settings()
00417 {
00418   //This is called from a callback, so we are still running in a gtk lock.
00419   GtkEntry *ent;
00420   GtkLabel *lbl;
00421   GtkSpinButton *spb;
00422   GString *gs;
00423   int val1,val2,val3,val4;
00424         
00425 /*For Identification*/
00426   ent=GTK_ENTRY(lookup_widget(window1,"ent_hostname"));
00427   gs=g_string_new(gtk_entry_get_text(ent));
00428   write_string_to_file(gs->str,HOST_NAME);
00429         
00430   ent=GTK_ENTRY(lookup_widget(window1,"ent_domainname"));
00431   gs=g_string_new(gtk_entry_get_text(ent));
00432   write_string_to_file(gs->str,DOMAIN_NAME);
00433         
00434 /*For Files*/
00435         
00436   spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_fdmax"));
00437   val1=(int)gtk_spin_button_get_value_as_int(spb);
00438 
00439   write_values_to_file(3,FILE_MAX,val1);
00440 
00441 /*For Inodes*/
00442         lbl=GTK_LABEL(lookup_widget(window1,"lbl_inmax"));
00443         val1=atoi((char *)gtk_label_get_text(lbl));
00444         
00445         lbl=GTK_LABEL(lookup_widget(window1,"lbl_ina"));
00446         val2=atoi((char *)gtk_label_get_text(lbl));
00447         
00448         write_values_to_file(2,INODES,val1,val2);
00449 
00450 /*For POSIX signals*/
00451         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_mq"));
00452         val1=gtk_spin_button_get_value_as_int(spb);
00453         write_values_to_file(1,P_MAX_Q,val1);
00454         
00455         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_max_mpq"));
00456         val1=gtk_spin_button_get_value_as_int(spb);
00457         write_values_to_file(1,P_MAX_M,val1);
00458         
00459         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_max_ms"));
00460         val1=gtk_spin_button_get_value_as_int(spb);
00461         write_values_to_file(1,P_MAX_S,val1);
00462 
00463 /*For shared memory*/
00464         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_max_pages"));
00465         val1=gtk_spin_button_get_value_as_int(spb);
00466         write_values_to_file(1,PAGE_MAX,val1);
00467         
00468         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_max_segs"));
00469         val1=gtk_spin_button_get_value_as_int(spb);
00470         write_values_to_file(1,SEG_MAX,val1);
00471         
00472         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_seg_size"));
00473         val1=gtk_spin_button_get_value_as_int(spb);
00474         write_values_to_file(1,SEG_SIZE,val1);
00475         
00476 /*For semaphores*/
00477         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_sem_per_id"));
00478         val1=gtk_spin_button_get_value_as_int(spb);
00479         
00480         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_sem_val"));
00481         val2=gtk_spin_button_get_value_as_int(spb);
00482         
00483         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_ops"));
00484         val3=gtk_spin_button_get_value_as_int(spb);
00485         
00486         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_sem_id"));
00487         val4=gtk_spin_button_get_value_as_int(spb);
00488         
00489         write_values_to_file(4,SEM,val1,val2,val3,val4);
00490         
00491 /*For threads*/
00492         spb=GTK_SPIN_BUTTON(lookup_widget(window1,"spb_maxthreads"));
00493         val1=gtk_spin_button_get_value_as_int(spb);
00494         
00495         write_values_to_file(1,THREADS_MAX,val1);
00496 }
00497 
00498 
00499 
00504 char *lkmonitor_itoa(int num)
00505 {
00506   GString *gs=g_string_new("");
00507 
00508   g_string_printf(gs,"%d",num);
00509 
00510   return gs->str;
00511 
00512 }

Generated on Tue Apr 1 22:52:52 2008 for lkmonitor by  doxygen 1.5.1