diff --git a/Makefile b/Makefile index e333928..d23ee79 100644 --- a/Makefile +++ b/Makefile @@ -133,6 +133,8 @@ install: check uninstall @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.decrease-symbolic.svg" @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.profile-symbolic.svg" @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.edit-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.check-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.uncheck-symbolic.svg" @install -Dm644 -t "${DESTDIR}/usr/share/${PKGNAME}/csv/" "journals_list.csv" @install -Dm644 -t "${DESTDIR}/usr/share/${PKGNAME}/csv/" "logging_services.csv" @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "${CMAKE_BUILD_DIR}/com.ublinux.${PKGNAME}${PKGIDENT}.policy" diff --git a/icons/com.ublinux.ubl-settings-logging.check-symbolic.svg b/icons/com.ublinux.ubl-settings-logging.check-symbolic.svg new file mode 100644 index 0000000..a49c2d1 --- /dev/null +++ b/icons/com.ublinux.ubl-settings-logging.check-symbolic.svg @@ -0,0 +1,43 @@ + + + + + + + diff --git a/icons/com.ublinux.ubl-settings-logging.uncheck-symbolic.svg b/icons/com.ublinux.ubl-settings-logging.uncheck-symbolic.svg new file mode 100644 index 0000000..305416e --- /dev/null +++ b/icons/com.ublinux.ubl-settings-logging.uncheck-symbolic.svg @@ -0,0 +1,38 @@ + + + + + + diff --git a/source/ubl-settings-logging.c b/source/ubl-settings-logging.c index f034761..46baf09 100644 --- a/source/ubl-settings-logging.c +++ b/source/ubl-settings-logging.c @@ -660,6 +660,28 @@ logrotate_configure_window *yon_logrotate_window_new(char *paths, logrotate_wind window->EndworkCommandEntry=yon_gtk_builder_get_widget(builder,"EndworkCommandEntry"); gtk_window_set_title(GTK_WINDOW(window->MainWindow),TITLE_LABEL); + if (paths){ + int sz; + float finalsize=0.0; + char *temp_paths = yon_char_new(paths); + config_str parsed_paths = yon_char_parse(temp_paths,&sz,","); + free(temp_paths); + temp_paths=NULL; + for (int i=0;iLogSizeLabel),yon_char_append(fin,yon_size_get_letter_from_int(sizenumber))); + + } dictionary *dict=NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"dialog",dialog); yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); @@ -1144,6 +1166,11 @@ journald_window *yon_journald_open(GtkWidget *self, main_window *widgets){ window->LowerTimeButton=yon_gtk_builder_get_widget(builder,"LowerTimeButton"); window->headerTopic=yon_gtk_builder_get_widget(builder,"headerTopic"); + { + int sz; + config_str logsize = yon_config_load(journald_size_command,&sz); + gtk_label_set_text(GTK_LABEL(window->LogSizeLabel),logsize[0]); + } gtk_window_set_title(GTK_WINDOW(window->MainWindow),TITLE_LABEL); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); @@ -1251,7 +1278,23 @@ void on_journald_open(GtkWidget *self, main_window *widgets){ // Log adding menu -add_log_window *on_add_open(){ +void on_log_save(GtkWidget *self, dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + add_log_window *window = yon_dictionary_get_data(dict->first->next,add_log_window*); + GList *list = gtk_container_get_children(GTK_CONTAINER(window->LogPathsBox)); + char *pathse=NULL; + for (int i=0;ilist,&iter); + gtk_list_store_set(widgets->list,&iter,1,pathse,-1); + on_close_subwindow(self); +} + +add_log_window *on_add_open(main_window *widgets){ add_log_window *window = malloc(sizeof(add_log_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_add_path); window->MainWindow=yon_gtk_builder_get_widget(builder,"MainWindow"); @@ -1271,8 +1314,11 @@ add_log_window *on_add_open(){ window->ControlSectionBox=yon_gtk_builder_get_widget(builder,"ControlSectionBox"); window->LogPathsBox=yon_gtk_builder_get_widget(builder,"LogPathsBox"); gtk_window_set_title(GTK_WINDOW(window->MainWindow),TITLE_LABEL); + dictionary *dict = NULL; + yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); + yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); g_signal_connect(G_OBJECT(window->CancelButton),"clicked", G_CALLBACK(on_close_subwindow),NULL); - g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_close_subwindow),NULL); + g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_log_save),dict); return window; } @@ -1338,7 +1384,7 @@ void on_log_path_append(GtkWidget *self, add_log_window *window){ void on_log_add(GtkWidget *self, main_window *widgets){ GtkTreeModel *model = GTK_TREE_MODEL(widgets->list); GtkTreeIter iter; - add_log_window *window = on_add_open(); + add_log_window *window = on_add_open(widgets); gtk_widget_show(window->MainWindow); gtk_widget_hide(window->StatisticsFrame); gtk_widget_hide(window->ControlSectionBox); @@ -1349,7 +1395,7 @@ void on_log_edit(GtkWidget *self,main_window *widgets){ GtkTreeModel *model = GTK_TREE_MODEL(widgets->list); GtkTreeIter iter; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ - add_log_window *window = on_add_open(); + add_log_window *window = on_add_open(widgets); gtk_widget_show(window->MainWindow); gtk_widget_hide(window->StatisticsFrame); char *name; @@ -1420,6 +1466,98 @@ void on_service_edit(GtkWidget *self,main_window *widgets){ } } +void on_main_window_tree_selection_changed(GtkWidget *self,main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(widgets->list); + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ + gtk_widget_set_sensitive(widgets->AddButton,1); + gtk_widget_set_sensitive(widgets->RemoveButton,1); + gtk_widget_set_sensitive(widgets->InspectButton,1); + gtk_widget_set_sensitive(widgets->ConfigureButton,1); + } else { + gtk_widget_set_sensitive(widgets->AddButton,0); + gtk_widget_set_sensitive(widgets->RemoveButton,0); + gtk_widget_set_sensitive(widgets->InspectButton,0); + gtk_widget_set_sensitive(widgets->ConfigureButton,0); + } +} + +void on_main_window_services_tree_selection_changed(GtkWidget *self,main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(widgets->ServicesList); + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ServicesTree)),&model,&iter)){ + gboolean is_active; + gboolean is_enabled; + char *name; + gtk_tree_model_get(model,&iter,0,&is_active,1,&is_enabled,2,&name,-1); + if (is_active){ + gtk_widget_set_sensitive(widgets->ServicesEditButton,1); + gtk_widget_set_sensitive(widgets->ServicesEnableDisableButton,1); + gtk_widget_set_sensitive(widgets->ServicesStartStopButton,1); + gtk_image_set_from_icon_name(GTK_IMAGE(gtk_button_get_image(GTK_BUTTON(widgets->ServicesStartStopButton))),stop_icon_name,GTK_ICON_SIZE_BUTTON); + } else { + gtk_widget_set_sensitive(widgets->ServicesEditButton,0); + gtk_widget_set_sensitive(widgets->ServicesEnableDisableButton,1); + gtk_widget_set_sensitive(widgets->ServicesStartStopButton,1); + gtk_image_set_from_icon_name(GTK_IMAGE(gtk_button_get_image(GTK_BUTTON(widgets->ServicesStartStopButton))),start_icon_name,GTK_ICON_SIZE_BUTTON); + } + if (is_enabled){ + gtk_image_set_from_icon_name(GTK_IMAGE(gtk_button_get_image(GTK_BUTTON(widgets->ServicesEnableDisableButton))),disable_icon_name,GTK_ICON_SIZE_BUTTON); + } else { + gtk_image_set_from_icon_name(GTK_IMAGE(gtk_button_get_image(GTK_BUTTON(widgets->ServicesEnableDisableButton))),enable_icon_name,GTK_ICON_SIZE_BUTTON); + + } + if (!strcmp(name,"journald")){ + gtk_widget_set_sensitive(widgets->ServicesEnableDisableButton,0); + gtk_widget_set_sensitive(widgets->ServicesStartStopButton,0); + } + } else { + gtk_widget_set_sensitive(widgets->ServicesEditButton,0); + gtk_widget_set_sensitive(widgets->ServicesEnableDisableButton,0); + gtk_widget_set_sensitive(widgets->ServicesStartStopButton,0); + } +} + +void on_start_stop_clicked(GtkButton *self, main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(widgets->ServicesList); + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ServicesTree)),&model,&iter)){ + char *start_command; + char *stop_command; + gboolean is_started; + gtk_tree_model_get(model,&iter,0,&is_started,5,&start_command,6,&stop_command,-1); + if (is_started){ + yon_launch(stop_command); + gtk_list_store_set(widgets->ServicesList,&iter,0,0,-1); + gtk_image_set_from_icon_name(GTK_IMAGE(gtk_button_get_image(self)),start_icon_name,GTK_ICON_SIZE_BUTTON); + } else { + yon_launch(start_command); + gtk_list_store_set(widgets->ServicesList,&iter,0,1,-1); + gtk_image_set_from_icon_name(GTK_IMAGE(gtk_button_get_image(self)),stop_icon_name,GTK_ICON_SIZE_BUTTON); + } + } +} + +void on_enable_disable_clicked(GtkButton *self, main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(widgets->ServicesList); + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ServicesTree)),&model,&iter)){ + char *start_command; + char *stop_command; + gboolean is_started; + gtk_tree_model_get(model,&iter,1,&is_started,7,&start_command,8,&stop_command,-1); + if (is_started){ + yon_launch(stop_command); + gtk_list_store_set(widgets->ServicesList,&iter,1,0,-1); + gtk_image_set_from_icon_name(GTK_IMAGE(gtk_button_get_image(self)),start_icon_name,GTK_ICON_SIZE_BUTTON); + } else { + yon_launch(start_command); + gtk_list_store_set(widgets->ServicesList,&iter,1,1,-1); + gtk_image_set_from_icon_name(GTK_IMAGE(gtk_button_get_image(self)),stop_icon_name,GTK_ICON_SIZE_BUTTON); + } + } +} + // standard functions void config_init(){ @@ -1478,6 +1616,8 @@ main_window *setup_window(){ widgets->RemoveButton = yon_gtk_builder_get_widget(builder,"MainRemoveButton"); widgets->Notebook = yon_gtk_builder_get_widget(builder,"MainNotebook"); widgets->ServicesEditButton = yon_gtk_builder_get_widget(builder,"ServicesEditButton"); + widgets->ServicesStartStopButton = yon_gtk_builder_get_widget(builder,"ServicesStartStopButton"); + widgets->ServicesEnableDisableButton = yon_gtk_builder_get_widget(builder,"ServicesEnableDisableButton"); widgets->ServicesTree = yon_gtk_builder_get_widget(builder,"ServicesTree"); widgets->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); widgets->ServicesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"ServicesList")); @@ -1523,7 +1663,7 @@ main_window *setup_window(){ services[i]=yon_char_divide_search(services[i],"\n",-1); config_str log = yon_char_parse(services[i],&log_size,";"); gtk_list_store_append(widgets->ServicesList,&iter); - gtk_list_store_set(widgets->ServicesList,&iter,0,1,1,1,2,log[0],3,log[1],-1); + gtk_list_store_set(widgets->ServicesList,&iter,0,1,1,1,2,log[0],3,log[1],4,log[2],5,log[3],6,log[4],7,log[5],8,log[6],-1); } } config_str dirs = yon_config_load(logrotate_config_command,&dirs_size); @@ -1579,7 +1719,12 @@ main_window *setup_window(){ g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem),"activate",G_CALLBACK(on_load_global),NULL); g_signal_connect(G_OBJECT(widgets->LoadLocalMenuItem),"activate",G_CALLBACK(on_load_local),NULL); + + g_signal_connect(G_OBJECT(widgets->MainTree),"cursor-changed",G_CALLBACK(on_main_window_tree_selection_changed),widgets); + g_signal_connect(G_OBJECT(widgets->ServicesTree),"cursor-changed",G_CALLBACK(on_main_window_services_tree_selection_changed),widgets); + g_signal_connect(G_OBJECT(widgets->ServicesStartStopButton),"clicked",G_CALLBACK(on_start_stop_clicked),widgets); + g_signal_connect(G_OBJECT(widgets->ServicesEnableDisableButton),"clicked",G_CALLBACK(on_enable_disable_clicked),widgets); gtk_widget_show(widgets->Window); return widgets; diff --git a/source/ubl-settings-logging.h b/source/ubl-settings-logging.h index b560b95..50fd25e 100644 --- a/source/ubl-settings-logging.h +++ b/source/ubl-settings-logging.h @@ -31,6 +31,8 @@ #define journals_list_path "/usr/share/ubl-settings-logging/csv/journals_list.csv" #define services_list_path "/usr/share/ubl-settings-logging/csv/logging_services.csv" #define logrotate_config_command "ls /etc/logrotate.d/ |sed -e 's/ */\\n/g'" +#define journald_size_command "journalctl --disk-usage | grep -oE \"[0-9]{1,}.[0-9]{1,}[A-Z]\"" +#define logrotate_size_command(paths) yon_char_unite("du ",paths," |grep -oE '^[0-9]{1,}'",NULL) #define logrotate_config_path "/etc/logrotate.d/" #define LocalePath "/usr/share/locale" @@ -45,6 +47,11 @@ #define get_journal_output_kernel_command "journalctl --no-pager -k" #define get_journal_output_prioritied_command "journalctl --no-pager -p err..alert" +#define start_icon_name "com.ublinux.ubl-settings-logging.play-symbolic" +#define stop_icon_name "com.ublinux.ubl-settings-logging.stop-symbolic" +#define enable_icon_name "com.ublinux.ubl-settings-logging.check-symbolic" +#define disable_icon_name "com.ublinux.ubl-settings-logging.uncheck-symbolic" + #define yon_add_space_if_exists(string) yon_char_is_empty(string) ? "" : yon_char_append(",",string) typedef char* string; string version_application; @@ -113,6 +120,8 @@ typedef struct { GtkWidget *Notebook; GtkWidget *ServicesTree; GtkWidget *ServicesEditButton; + GtkWidget *ServicesStartStopButton; + GtkWidget *ServicesEnableDisableButton; GtkListStore *list; GtkListStore *ServicesList; // Custom diff --git a/source/ubl-utils.c b/source/ubl-utils.c index 29373da..a50de19 100644 --- a/source/ubl-utils.c +++ b/source/ubl-utils.c @@ -607,12 +607,32 @@ char *yon_char_from_int(int int_to_convert) return ch; } +/**yon_char_from_float(int int_to_convert) + * [EN] + * converts float to char*. + * + * [RU] + * Конвертирует float в char* + */ +char *yon_char_from_float(float int_to_convert) +{ + int i = 1; + float convert_check = (float)int_to_convert; + for (i = 1; convert_check >= 10; i++) + { + convert_check = convert_check / 10; + } + char *ch = g_malloc0(i * sizeof(char) + 1); + sprintf(ch, "%f", int_to_convert); + return ch; +} + /**yon_char_from_long(int int_to_convert) * [EN] - * converts int to char*. + * converts long to char*. * * [RU] - * Конвертирует int в char* + * Конвертирует long в char* */ char *yon_char_from_long(long int_to_convert) { @@ -867,6 +887,23 @@ config_str yon_ubl_get_all_users(int *user_size){ // parsing functions +/** yon_size_convert_automatic(int bytes, int *size) + * [EN] + * + * [RU] + * +*/ +float yon_size_convert_automatic(int bytes, int *size){ + float byte_float=bytes; + for (*size=-1;byte_float>1024;*size=*size+1){ + byte_float=byte_float/1024; + } + if (*size==-1) { + *size=0; + byte_float=byte_float/1024; + } + return byte_float; +} apps *yon_apps_scan_and_parse_desktops(int *sizef) { diff --git a/source/ubl-utils.h b/source/ubl-utils.h index 0ed953b..79dcf00 100644 --- a/source/ubl-utils.h +++ b/source/ubl-utils.h @@ -141,6 +141,8 @@ char *yon_char_divide_search(char *source, char *dividepos, int delete_divider); char *yon_char_from_int(int int_to_convert); +char *yon_char_from_float(float int_to_convert); + char *yon_char_from_long(long int_to_convert); char *yon_char_replace(char *source, char *find, char*replace); @@ -173,6 +175,8 @@ config_str yon_ubl_get_all_users(int *user_size); // parsing functions +float yon_size_convert_automatic(int bytes, int *size); + config_str philos_list_user(int* size); apps *yon_apps_scan_and_parse_desktops(int *sizef); diff --git a/ubl-settings-logging-add.glade b/ubl-settings-logging-add.glade index f7d8eec..e9a1efe 100644 --- a/ubl-settings-logging-add.glade +++ b/ubl-settings-logging-add.glade @@ -50,6 +50,7 @@ 450 + 550 False True com.ublinux.ubl-settings-logging diff --git a/ubl-settings-logging-filechooser.glade b/ubl-settings-logging-filechooser.glade new file mode 100644 index 0000000..226d754 --- /dev/null +++ b/ubl-settings-logging-filechooser.glade @@ -0,0 +1,123 @@ + + + + + + True + False + process-stop-symbolic + + + True + False + emblem-ok-symbolic + + + 800 + 600 + False + com.ublinux.ubl-settings-logging + dialog + True + True + + + False + vertical + 2 + + + False + end + + + Choose directory instead of file + True + True + False + True + + + True + True + 0 + + + + + Cancel + True + True + True + image1 + + + True + True + 1 + + + + + Accept + True + True + True + image2 + + + True + True + 2 + + + + + False + False + 0 + + + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 2 + Logs and events + + + + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 32 + com.ublinux.ubl-settings-logging + + + + + + + diff --git a/ubl-settings-logging.glade b/ubl-settings-logging.glade index 3f720ec..4599617 100644 --- a/ubl-settings-logging.glade +++ b/ubl-settings-logging.glade @@ -207,6 +207,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + + + + + + + + + @@ -232,12 +242,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True False - com.ublinux.ubl-settings-logging.stop-symbolic + com.ublinux.ubl-settings-logging.play-symbolic True False - com.ublinux.ubl-settings-logging.play-symbolic + com.ublinux.ubl-settings-logging.check-symbolic True @@ -682,6 +692,7 @@ translated and supported by community. True + False True True Inspect log @@ -699,6 +710,7 @@ translated and supported by community. True + False True True Configure log @@ -716,6 +728,7 @@ translated and supported by community. True + False True True Add log @@ -733,6 +746,7 @@ translated and supported by community. True + False True True Remove log @@ -856,8 +870,9 @@ translated and supported by community. vertical 5 - + True + False True True Stop service @@ -873,8 +888,9 @@ translated and supported by community. - + True + False True True Start service @@ -892,6 +908,7 @@ translated and supported by community. True + False True True Configure service