From 63c3eadac36f541e839c1ff305dbf9e745f09383 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 15 May 2025 17:48:47 +0600 Subject: [PATCH] Services loading changes --- source/ubl-settings-services.c | 70 +++++++++++++++++++++++++++++++--- source/ubl-settings-services.h | 14 +++++++ 2 files changed, 79 insertions(+), 5 deletions(-) diff --git a/source/ubl-settings-services.c b/source/ubl-settings-services.c index 3b6c00c..b0a715a 100644 --- a/source/ubl-settings-services.c +++ b/source/ubl-settings-services.c @@ -1342,6 +1342,62 @@ gboolean yon_interface_update_finish(main_window *widgets){ return G_SOURCE_REMOVE; } +void yon_service_update(main_window *widgets){ + int active_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook)); + switch (active_page) + { + case 0:{ + GtkTreeModel *model; + GtkTreeIter iter; + gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->SystemUnitsTree)),&model,&iter); + char *target; + gtk_tree_model_get(model,&iter,5,&target,-1); + int size; + config_str new_info = yon_config_load(load_system_service_single(target),&size); + int parsed_size; + config_str parsed = yon_char_parse(new_info[0],&parsed_size,";"); + char *name_temp = yon_char_replace(parsed[0],"\\","\18"); + if (name_temp!=parsed[0]) free(parsed[0]); + parsed[0]=yon_char_replace(name_temp,"\18","\\\\"); + if (name_temp!=parsed[0]) free(name_temp); + if (parsed){ + int enabled = !strcmp(parsed[5],"enabled"); + int loaded = !strcmp(parsed[1],"loaded"); + int active = !strcmp(parsed[2],"active"); + enum YON_UNIT_TYPE type = yon_get_unit_type(parsed[0]); + gtk_list_store_append(widgets->SystemList,&iter); + gtk_list_store_set(widgets->SystemList,&iter,3,enabled,4,active,5,parsed[0],6,parsed[4],7,type,8,active,9,loaded,11,_(parsed[3]),13,parsed[3],-1); + } + + } break; + case 1:{ + GtkTreeModel *model; + GtkTreeIter iter; + gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UserUnitsTree)),&model,&iter); + char *target; + gtk_tree_model_get(model,&iter,5,&target,-1); + int size; + config_str new_info = yon_config_load(load_user_service_single(target),&size); + int parsed_size; + config_str parsed = yon_char_parse(new_info[0],&parsed_size,";"); + char *name_temp = yon_char_replace(parsed[0],"\\","\18"); + if (name_temp!=parsed[0]) free(parsed[0]); + parsed[0]=yon_char_replace(name_temp,"\18","\\\\"); + if (name_temp!=parsed[0]) free(name_temp); + if (parsed){ + int enabled = !strcmp(parsed[5],"enabled"); + int loaded = !strcmp(parsed[1],"loaded"); + int active = !strcmp(parsed[2],"active"); + enum YON_UNIT_TYPE type = yon_get_unit_type(parsed[0]); + gtk_list_store_append(widgets->SystemList,&iter); + gtk_list_store_set(widgets->SystemList,&iter,3,enabled,4,active,5,parsed[0],6,parsed[4],7,type,8,active,9,loaded,11,_(parsed[3]),13,parsed[3],-1); + } + } break; + default: + break; + } +} + void* yon_interface_update(main_window *widgets){ // dictionary *dict = yon_systemd_get_list(); // if (dict){} @@ -1360,11 +1416,11 @@ void* yon_interface_update(main_window *widgets){ int timers_size; config_str timers = yon_config_load(get_timers_command,&timers_size); struct json_object *jsobject = json_tokener_parse(timers[0]); - int launched_size; - config_str launched = yon_config_load(load_launched_command,&launched_size); - for (int i=0;iSystemUnitsTree))); gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UserUnitsTree))); + yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_INFO_TYPE); main_config.update_thread_active=1; g_thread_new("update",(GThreadFunc)yon_interface_update,widgets); } diff --git a/source/ubl-settings-services.h b/source/ubl-settings-services.h index 2e6c752..b310dce 100644 --- a/source/ubl-settings-services.h +++ b/source/ubl-settings-services.h @@ -76,6 +76,19 @@ #define user_check_active_command(target) yon_char_unite("systemctl --user --machine=",yon_ubl_root_user_get(),"@ is-active ",target,NULL) #define user_check_enabled_command(target) yon_char_unite("systemctl --user --machine=",yon_ubl_root_user_get(),"@ is-enabled ",target,NULL) +#define load_system_service_single(target) yon_char_unite("systemctl --property=Names,Description,LoadState,ActiveState,SubState,UnitFileState,ActiveEnterTimestampMonotonic,InactiveEnterTimestampMonotonic --no-pager --all --no-legend show -- ",target,\ +"awk 'BEGIN { RS=\"\"; FS=\"\\n\" } " \ +"{ for (i=1; i<=NF; i++) { split($i, kv, \"=\"); val[kv[1]] = kv[2]; } " \ +"print val[\"Names\"] \";\" val[\"LoadState\"] \";\" val[\"ActiveState\"] \";\" val[\"SubState\"] \";\" " \ +"val[\"Description\"] \";\" val[\"UnitFileState\"] \";\" val[\"ActiveEnterTimestampMonotonic\"] \";\" " \ +"val[\"InactiveEnterTimestampMonotonic\"]; delete val }'",NULL) +#define load_user_service_single(target) yon_char_unite("systemctl --user --machine=",yon_ubl_root_user_get(),"@ --property=Names,Description,LoadState,ActiveState,SubState,UnitFileState,ActiveEnterTimestampMonotonic,InactiveEnterTimestampMonotonic --no-pager --all --no-legend show -- ",target,\ +"awk 'BEGIN { RS=\"\"; FS=\"\\n\" } " \ +"{ for (i=1; i<=NF; i++) { split($i, kv, \"=\"); val[kv[1]] = kv[2]; } " \ +"print val[\"Names\"] \";\" val[\"LoadState\"] \";\" val[\"ActiveState\"] \";\" val[\"SubState\"] \";\" " \ +"val[\"Description\"] \";\" val[\"UnitFileState\"] \";\" val[\"ActiveEnterTimestampMonotonic\"] \";\" " \ +"val[\"InactiveEnterTimestampMonotonic\"]; delete val }'",NULL) + #define service_info_command(target) yon_char_append("systemctl status -l --no-pager ",target) #define get_log_command(target) yon_char_append("journalctl --all --no-pager --unit ",target) #define show_source_command(target) yon_char_append("systemctl edit --full ",target) @@ -567,4 +580,5 @@ gboolean yon_interface_list_models_disconnect(main_window *widgets); void on_sort_activate(GtkTreeViewColumn *self, main_window *widgets); gboolean sort_bool(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,gpointer col); gboolean sort_string(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,gpointer col); +void yon_service_update(main_window *widgets); #endif \ No newline at end of file