WIP services optimisation

pull/90/head
parent 996cce94a2
commit 948213947c

@ -70,12 +70,18 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror -Wmissing-declarations
-Wformat -Werror=format-security \ -Wformat -Werror=format-security \
-fstack-clash-protection -fcf-protection") -fstack-clash-protection -fcf-protection")
string(FIND "${CMAKE_CXX_FLAGS}" "-D_FORTIFY_SOURCE" FORTIFY_FOUND) string(FIND "${CMAKE_CXX_FLAGS}" "-D_FORTIFY_SOURCE" FORTIFY_FOUND)
if(FORTIFY_FOUND EQUAL -1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wp,-D_FORTIFY_SOURCE=2")
endif()
set(SOURCE_FILES set(SOURCE_FILES
ubl-settings-services.c ubl-settings-services.c
ubl-settings-services.h ubl-settings-services.h
ubl-settings-services-systemd.c
ubl-settings-services-systemd.h
ubl-strings.h ubl-strings.h
) )
@ -88,7 +94,8 @@ set(LIBRARIES
pthread pthread
ublsettings ublsettings
ublsettings-gtk3 ublsettings-gtk3
ublsettingsui-gtk3) ublsettingsui-gtk3
systemd)
add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C})

@ -0,0 +1,123 @@
#include "ubl-settings-services-systemd.h"
void at_exit_cleanup();
sd_bus *global_bus=NULL;
void at_exit_cleanup(){
if (global_bus) {
sd_bus_unref(global_bus);
}
}
dictionary *yon_systemd_get_list() {
sd_bus *bus = NULL;
sd_bus_message *reply = NULL;
int r;
r = sd_bus_open_system(&bus);
if (r < 0) return NULL;
dictionary *dict = NULL;
r = sd_bus_call_method(bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
"ListUnits",
NULL,
&reply,
"");
if (r < 0) {if (bus) sd_bus_unref(bus);return NULL;}
sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "(ssssssouso)");
while (sd_bus_message_enter_container(reply, SD_BUS_TYPE_STRUCT, "ssssssouso") > 0) {
const char *name, *description;
const char *load_state, *active_state, *sub_state;
const char *following, *unit_path;
unsigned int job_id;
const char *job_type, *job_path;
sd_bus_message_read(reply, "ssssssouso",
&name, &description,
&load_state, &active_state,
&sub_state, &following,
&unit_path, &job_id,
&job_type, &job_path);
systemd_struct *u = calloc(1, sizeof(systemd_struct));
u->name = yon_char_new(name);
u->description = yon_char_new(description);
u->load = !strcmp(load_state,"loaded");
u->active = !strcmp(active_state, "active");
u->state = yon_char_new(sub_state);
u->enable = 0;
yon_dictionary_add_or_create_if_exists_with_data(dict, (char*)name, u);
sd_bus_message_exit_container(reply);
}
sd_bus_message_unref(reply);
reply = NULL;
r = sd_bus_call_method(bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
"ListUnitFiles",
NULL,
&reply,
"");
if (r < 0) {if (bus) sd_bus_unref(bus); return NULL;}
sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "(ss)");
while (sd_bus_message_enter_container(reply, SD_BUS_TYPE_STRUCT, "ss") > 0) {
const char *name, *file_state;
sd_bus_message_read(reply, "ss", &name, &file_state);
dictionary *found = NULL;
for (dictionary *it = dict; it; it = it->next) {
if (strcmp(it->key, name) == 0) {
found = it;
break;
}
}
if (!found) {
systemd_struct *u = calloc(1, sizeof(systemd_struct));
u->name = yon_char_new(name);
u->description = yon_char_new("");
u->load = 0;
u->active = 0;
u->state = yon_char_new("");
u->enable = 0;
yon_dictionary_add_or_create_if_exists_with_data(dict, (char*)name, u);
}
sd_bus_message_exit_container(reply);
}
sd_bus_message_unref(reply);
reply = NULL;
dictionary *it;
for_dictionaries(it, dict) {
systemd_struct *u = (systemd_struct*)it->data;
r = sd_bus_call_method(bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
"GetUnitFileState",
NULL,
&reply,
"s", u->name);
if (r >= 0) {
const char *status;
sd_bus_message_read(reply, "s", &status);
u->enable = (strcmp(status, "enabled") == 0);
}
sd_bus_message_unref(reply);
reply = NULL;
}
if (reply) sd_bus_message_unref(reply);
if (bus) sd_bus_unref(bus);
return dict;
}

@ -0,0 +1,8 @@
#ifndef UBL_SETTINGS_SERVICES_SYSTEMD_H
#define UBL_SETTINGS_SERVICES_SYSTEMD_H
#include "ubl-settings-services.h"
#include <systemd/sd-bus.h>
dictionary *yon_systemd_get_list();
#endif

@ -1224,10 +1224,12 @@ gboolean yon_interface_update_finish(main_window *widgets){
} }
void* yon_interface_update(main_window *widgets){ void* yon_interface_update(main_window *widgets){
dictionary *dict = yon_systemd_get_list();
if (dict){}
if (widgets){ if (widgets){
g_idle_add((GSourceFunc)yon_interface_list_models_disconnect,widgets); g_idle_add((GSourceFunc)yon_interface_list_models_disconnect,widgets);
int system_size; // int system_size;
config_str system_services = yon_config_load(load_services_command,&system_size); // config_str system_services = yon_config_load(load_services_command,&system_size);
int user_size; int user_size;
config_str user_services = yon_config_load(load_user_services_command,&user_size); config_str user_services = yon_config_load(load_user_services_command,&user_size);
int config_size; int config_size;
@ -1240,34 +1242,23 @@ void* yon_interface_update(main_window *widgets){
for (int i=0;i<launched_size;i++){ for (int i=0;i<launched_size;i++){
yon_char_remove_last_symbol(launched[i],'\n'); yon_char_remove_last_symbol(launched[i],'\n');
} }
for (int i=0; i<system_size;i++){
yon_char_remove_last_symbol(system_services[i],'\n'); dictionary *dact = NULL;
int size; for_dictionaries(dact,dict){
config_str parsed = yon_char_parse(system_services[i],&size,";"); enum YON_UNIT_TYPE type = yon_get_unit_type(((systemd_struct*)dact->data)->name);
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 loaded = !system(check_enabled_command(parsed[0]));
int active = !system(service_check_active_command(parsed[0]));
enum YON_UNIT_TYPE type = yon_get_unit_type(parsed[0]);
struct system_services_data *data = malloc(sizeof(struct system_services_data)); struct system_services_data *data = malloc(sizeof(struct system_services_data));
{ {
data->widgets=widgets; data->widgets=widgets;
data->SystemAutostart=loaded; data->SystemAutostart=((systemd_struct*)dact->data)->enable;
data->SystemLaunched=active; data->SystemLaunched=((systemd_struct*)dact->data)->active;
data->Name=yon_char_new(parsed[0]); data->Name=((systemd_struct*)dact->data)->name;
data->Descr=yon_char_new(parsed[4]); data->Descr=((systemd_struct*)dact->data)->description;
data->Type = type; data->Type = type;
data->Loaded=strcmp(parsed[1],"loaded")?0:1; data->Loaded=((systemd_struct*)dact->data)->load;
data->Active=strcmp(parsed[2],"active")?0:1; data->Active=((systemd_struct*)dact->data)->active;
data->State=_(parsed[3]); data->State=((systemd_struct*)dact->data)->state;
} }
g_idle_add((GSourceFunc)yon_system_set,data); g_idle_add((GSourceFunc)yon_system_set,data);
}
yon_char_parsed_free(parsed,size);
} }
for (int i=0; i<user_size;i++){ for (int i=0; i<user_size;i++){
@ -1275,14 +1266,14 @@ void* yon_interface_update(main_window *widgets){
int size; int size;
config_str parsed = yon_char_parse(user_services[i],&size,";"); config_str parsed = yon_char_parse(user_services[i],&size,";");
if (parsed){ if (parsed){
int loaded = !system(user_check_enabled_command(parsed[0])); // int loaded = !system(user_check_enabled_command(parsed[0]));
int active = !system(user_check_active_command(parsed[0])); // int active = !system(user_check_active_command(parsed[0]));
enum YON_UNIT_TYPE type = yon_get_unit_type(parsed[0]); enum YON_UNIT_TYPE type = yon_get_unit_type(parsed[0]);
struct system_user_data *data = malloc(sizeof(struct system_user_data)); struct system_user_data *data = malloc(sizeof(struct system_user_data));
{ {
data->widgets=widgets; data->widgets=widgets;
data->SystemAutostart=loaded; data->SystemAutostart=0;//loaded;
data->SystemLaunched=active; data->SystemLaunched=0;//active;
data->Name=yon_char_new(parsed[0]); data->Name=yon_char_new(parsed[0]);
data->Descr=yon_char_new(parsed[4]); data->Descr=yon_char_new(parsed[4]);
data->Type = type; data->Type = type;
@ -1605,7 +1596,7 @@ gboolean on_tooltip_show(GtkWidget*, gint x, gint y, gboolean, GtkTooltip* toolt
int deactivated_size; int deactivated_size;
config_str deactivated_parsed = yon_char_parse(target[2],&deactivated_size," "); config_str deactivated_parsed = yon_char_parse(target[2],&deactivated_size," ");
int date_size; int date_size;
config_str date_parsed = yon_char_parse(deactivated_parsed[1],&date_size,"-"); config_str date_parsed = yon_char_parse(deactivated_parsed[0],&date_size,"-");
if (date_size>=2){ if (date_size>=2){
char *temp = date_parsed[0]; char *temp = date_parsed[0];
date_parsed[0]=date_parsed[2]; date_parsed[0]=date_parsed[2];
@ -1903,8 +1894,8 @@ void yon_main_window_complete(main_window *widgets){
yon_save_window_set_postsave_function(on_save_done,widgets); yon_save_window_set_postsave_function(on_save_done,widgets);
} }
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){
local=setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
textdomain (LocaleName); textdomain (LocaleName);
config_init(); config_init();

@ -1,3 +1,5 @@
#ifndef UBL_SETTINGS_SERVICES_H
#define UBL_SETTINGS_SERVICES_H
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <gtk/gtkx.h> #include <gtk/gtkx.h>
@ -12,6 +14,7 @@
#include <libublsettings.h> #include <libublsettings.h>
#include <libublsettings-gtk3.h> #include <libublsettings-gtk3.h>
#include <libublsettingsui-gtk3.h> #include <libublsettingsui-gtk3.h>
#include "ubl-settings-services-systemd.h"
#include <time.h> #include <time.h>
#include <json-c/json.h> #include <json-c/json.h>
#ifdef WEBKIT_FOUND #ifdef WEBKIT_FOUND
@ -127,9 +130,33 @@
#define SERVICES_MASK_PARAMETER "SERVICES_MASK" #define SERVICES_MASK_PARAMETER "SERVICES_MASK"
typedef char* string; typedef char* string;
__attribute__((unused)) static \
string version_application; string version_application;
char *local; enum YON_UNIT_TYPE {
YON_UNIT_SERVICE=0,
YON_UNIT_SWAP,
YON_UNIT_SOCKET,
YON_UNIT_DEVICE,
YON_UNIT_TARGET,
YON_UNIT_MOUNT,
YON_UNIT_TIMER,
YON_UNIT_PATH,
YON_UNIT_SLICE,
YON_UNIT_SCOPE,
YON_UNIT_UNRECOGNISED
};
typedef struct systemd_struct{
char *name;
char *description;
int enable;
int active;
char *state;
int load;
}systemd_struct;
typedef struct { typedef struct {
template_config_fields template_config_fields
@ -451,19 +478,6 @@ void on_root_access(GtkWidget *self, main_window *widgets);
void on_save_done(main_window *widgets, config_str output, int size); void on_save_done(main_window *widgets, config_str output, int size);
enum YON_UNIT_TYPE {
YON_UNIT_SERVICE=0,
YON_UNIT_SWAP,
YON_UNIT_SOCKET,
YON_UNIT_DEVICE,
YON_UNIT_TARGET,
YON_UNIT_MOUNT,
YON_UNIT_TIMER,
YON_UNIT_PATH,
YON_UNIT_SLICE,
YON_UNIT_SCOPE,
YON_UNIT_UNRECOGNISED
};
struct system_services_data{ struct system_services_data{
main_window *widgets; main_window *widgets;
@ -516,4 +530,5 @@ gboolean yon_system_config_set(struct system_config_data *data);
gboolean yon_user_set(struct system_user_data *data); gboolean yon_user_set(struct system_user_data *data);
gboolean yon_system_set(struct system_services_data *data); gboolean yon_system_set(struct system_services_data *data);
gboolean yon_interface_list_models_connect(main_window *widgets); gboolean yon_interface_list_models_connect(main_window *widgets);
gboolean yon_interface_list_models_disconnect(main_window *widgets); gboolean yon_interface_list_models_disconnect(main_window *widgets);
#endif
Loading…
Cancel
Save