139 #include <sys/utsname.h> 141 #include <glib/gi18n.h> 142 #include <glib/gstdio.h> 156 #ifdef GDK_WINDOWING_WAYLAND 157 #include <gdk/gdkwayland.h> 159 #ifdef GDK_WINDOWING_X11 160 #include <gdk/gdkx.h> 175 TRACE_CALL(__func__);
180 gchar *kernel_release;
184 GHashTable *etc_release;
193 b = json_builder_new();
194 json_builder_begin_object(b);
196 json_builder_set_member_name(b,
"kernel_name");
198 if (!kernel_name || kernel_name[0] ==
'\0') {
199 json_builder_add_null_value(b);
201 json_builder_add_string_value(b, kernel_name);
205 json_builder_set_member_name(b,
"kernel_release");
207 if (!kernel_release || kernel_release[0] ==
'\0') {
208 json_builder_add_null_value(b);
210 json_builder_add_string_value(b, kernel_release);
212 g_free(kernel_release);
214 json_builder_set_member_name(b,
"kernel_arch");
216 if (!kernel_arch || kernel_arch[0] ==
'\0') {
217 json_builder_add_null_value(b);
219 json_builder_add_string_value(b, kernel_arch);
223 json_builder_set_member_name(b,
"lsb_distributor");
225 if (!
id ||
id[0] ==
'\0') {
226 json_builder_add_null_value(b);
228 json_builder_add_string_value(b,
id);
232 json_builder_set_member_name(b,
"lsb_distro_description");
234 if (!description || description[0] ==
'\0') {
235 json_builder_add_null_value(b);
237 json_builder_add_string_value(b, description);
241 json_builder_set_member_name(b,
"lsb_distro_release");
243 if (!release || release[0] ==
'\0') {
244 json_builder_add_null_value(b);
246 json_builder_add_string_value(b, release);
250 json_builder_set_member_name(b,
"lsb_distro_codename");
252 if (!codename || codename[0] ==
'\0') {
253 json_builder_add_null_value(b);
255 json_builder_add_string_value(b, codename);
260 json_builder_set_member_name(b,
"etc_release");
262 json_builder_begin_object(b);
263 g_hash_table_iter_init (&iter, etc_release);
264 while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&value)) {
265 json_builder_set_member_name(b, key);
266 json_builder_add_string_value(b, value);
268 json_builder_end_object(b);
269 g_hash_table_remove_all(etc_release);
270 g_hash_table_unref(etc_release);
272 json_builder_add_null_value(b);
279 json_builder_end_object(b);
280 r = json_builder_get_root(b);
293 TRACE_CALL(__func__);
301 b = json_builder_new();
302 json_builder_begin_object(b);
303 json_builder_set_member_name(b,
"language");
305 json_builder_add_string_value(b, language);
307 json_builder_end_object(b);
308 r = json_builder_get_root(b);
316 TRACE_CALL(__func__);
324 b = json_builder_new();
325 json_builder_begin_object(b);
326 json_builder_set_member_name(b,
"version");
327 json_builder_add_string_value(b, VERSION);
328 json_builder_set_member_name(b,
"git_revision");
329 json_builder_add_string_value(b, REMMINA_GIT_REVISION);
330 json_builder_set_member_name(b,
"snap_build");
332 json_builder_add_int_value(b, 1);
334 json_builder_add_int_value(b, 0);
340 json_builder_set_member_name(b,
"flatpak_build");
342 flatpak_info = g_build_filename(g_get_user_runtime_dir(),
"flatpak-info", NULL);
343 if (g_file_test(flatpak_info, G_FILE_TEST_EXISTS)) {
344 json_builder_add_int_value(b, 1);
346 json_builder_add_int_value(b, 0);
348 g_free(flatpak_info);
350 json_builder_end_object(b);
351 r = json_builder_get_root(b);
358 TRACE_CALL(__func__);
366 b = json_builder_new();
367 json_builder_begin_object(b);
368 json_builder_set_member_name(b,
"major");
369 json_builder_add_int_value(b, gtk_get_major_version());
370 json_builder_set_member_name(b,
"minor");
371 json_builder_add_int_value(b, gtk_get_minor_version());
372 json_builder_set_member_name(b,
"micro");
373 json_builder_add_int_value(b, gtk_get_micro_version());
374 json_builder_end_object(b);
375 r = json_builder_get_root(b);
383 TRACE_CALL(__func__);
392 disp = gdk_display_get_default();
394 #ifdef GDK_WINDOWING_WAYLAND 395 if (GDK_IS_WAYLAND_DISPLAY(disp)) {
399 #ifdef GDK_WINDOWING_X11 400 if (GDK_IS_X11_DISPLAY(disp)) {
406 r = json_node_alloc();
407 json_node_init_string(r, bkend);
415 TRACE_CALL(__func__);
421 b = json_builder_new();
422 json_builder_begin_object(b);
424 json_builder_set_member_name(b,
"window_manager");
428 if (!wmver || wmver[0] ==
'\0') {
429 REMMINA_DEBUG(
"GNOME Shell not found");
431 REMMINA_DEBUG(
"GNOME Shell version: %s\n", wmver);
432 json_builder_add_string_value(b,
"GNOME Shell");
433 json_builder_set_member_name(b,
"gnome_shell_ver");
434 json_builder_add_string_value(b, wmver);
440 if (!wmname || wmname[0] ==
'\0') {
442 REMMINA_DEBUG(
"Cannot determine the window manger name");
443 json_builder_add_string_value(b,
"n/a");
445 REMMINA_DEBUG(
"Window manger names %s", wmname);
446 json_builder_add_string_value(b, wmname);
451 json_builder_end_object(b);
452 r = json_builder_get_root(b);
459 TRACE_CALL(__func__);
464 b = json_builder_new();
465 json_builder_begin_object(b);
467 json_builder_set_member_name(b,
"appindicator_supported");
471 json_builder_add_int_value(b, 1);
472 json_builder_set_member_name(b,
"appindicator_compiled");
473 #ifdef HAVE_LIBAPPINDICATOR 475 json_builder_add_int_value(b, 1);
478 json_builder_add_int_value(b, 0);
482 json_builder_add_int_value(b, 0);
483 json_builder_set_member_name(b,
"icon_is_active");
486 json_builder_add_int_value(b, 1);
487 json_builder_set_member_name(b,
"appindicator_type");
488 #ifdef HAVE_LIBAPPINDICATOR 490 json_builder_add_string_value(b,
"AppIndicator on GtkStatusIcon/xembed");
493 json_builder_add_string_value(b,
"Remmina icon on GtkStatusIcon/xembed");
497 json_builder_add_int_value(b, 0);
499 json_builder_end_object(b);
500 r = json_builder_get_root(b);
513 TRACE_CALL(__func__);
518 gchar *hday, *hmonth, *hyear;
519 gchar *pday, *pmonth, *pyear;
521 GDateTime *prof_gdate;
522 GDateTime *pdata_gdate;
530 g_debug(
"%s date %s", pdata->
protocol, last_success);
532 prof_gdate = pdata_gdate = NULL;
533 if (last_success && last_success[0] !=
'\0' && strlen(last_success) >= 6) {
534 pyear = g_strdup_printf(
"%.4s", last_success);
535 pmonth = g_strdup_printf(
"%.2s", last_success + 4);
536 pday = g_strdup_printf(
"%.2s", last_success + 6);
537 prof_gdate = g_date_time_new_local(
540 atoi(pday), 0, 0, 0);
549 count = GPOINTER_TO_INT(pcount) + 1;
552 g_hash_table_insert(pdata->
proto_count, g_strdup(pdata->
protocol), GINT_TO_POINTER(count));
554 g_hash_table_replace(pdata->
proto_count, g_strdup(pdata->
protocol), GINT_TO_POINTER(count));
559 if (pdate && strlen(pdate) >= 6) {
561 hyear = g_strdup_printf(
"%.4s", (
char*)pdate);
562 hmonth = g_strdup_printf(
"%.2s", (
char*)pdate + 4);
563 hday = g_strdup_printf(
"%.2s", (
char*)pdate + 6);
564 pdata_gdate = g_date_time_new_local(
567 atoi(hday), 0, 0, 0);
574 if (prof_gdate != NULL && pdata_gdate != NULL ) {
575 g_debug(
"Comparing dates");
576 gint res = g_date_time_compare( pdata_gdate, prof_gdate );
579 g_debug(
"hash date is less than profile date. Replacing date in the hashtable");
580 g_hash_table_replace(pdata->
proto_date, g_strdup(pdata->
protocol), g_strdup(last_success));
582 g_debug(
"profile date is less than hash date. Replacing date in the hashtable");
588 if (prof_gdate == NULL && pdata_gdate != NULL) {
589 g_debug(
"prof_gdate is NULL, replacing date in the hashtable");
594 if (prof_gdate != NULL && pdata_gdate == NULL) {
595 g_debug(
"pdata_gdate is NULL, replacing date in the hashtable");
596 g_hash_table_replace(pdata->
proto_date, g_strdup(pdata->
protocol), g_strdup(last_success));
599 if ((prof_gdate == NULL && pdata_gdate == NULL) && pdata->
pdatestr) {
600 g_debug(
"All dates are NULL, replacing date in the hashtable");
614 g_debug(
"pdata set to %s protocol with last_success to %s", pdata->
protocol, pdata->
pdatestr);
616 g_date_time_unref(pdata_gdate);
618 g_date_time_unref(prof_gdate);
646 TRACE_CALL(__func__);
653 GHashTableIter pcountiter, pdateiter;
654 gpointer pcountkey, pcountvalue;
655 gpointer pdatekey, pdatevalue;
660 b = json_builder_new();
661 json_builder_begin_object(b);
663 json_builder_set_member_name(b,
"profile_count");
668 pdata->
proto_date = g_hash_table_new_full(g_str_hash, g_str_equal,
669 (GDestroyNotify)g_free, (GDestroyNotify)g_free);
670 pdata->
proto_count = g_hash_table_new_full(g_str_hash, g_str_equal,
671 (GDestroyNotify)g_free, NULL);
676 g_debug(
"Number of profiles: %d", profiles_count);
678 json_builder_add_int_value(b, profiles_count);
680 g_hash_table_iter_init(&pcountiter, pdata->proto_count);
681 while (g_hash_table_iter_next(&pcountiter, &pcountkey, &pcountvalue)) {
682 json_builder_set_member_name(b, (gchar*)pcountkey);
683 json_builder_add_int_value(b, GPOINTER_TO_INT(pcountvalue));
686 g_hash_table_iter_init(&pdateiter, pdata->proto_date);
687 while (g_hash_table_iter_next(&pdateiter, &pdatekey, &pdatevalue)) {
688 s = g_strdup_printf(
"DATE_%s", (gchar*)pdatekey);
689 g_debug(
"Protocol date label: %s", s);
690 json_builder_set_member_name(b, s);
692 json_builder_add_string_value(b, (gchar*)pdatevalue);
693 g_debug(
"Protocol date: %s", (gchar*)pdatevalue);
696 json_builder_end_object(b);
697 r = json_builder_get_root(b);
700 g_hash_table_remove_all(pdata->proto_date);
701 g_hash_table_unref(pdata->proto_date);
702 g_hash_table_remove_all(pdata->proto_count);
703 g_hash_table_unref(pdata->proto_count);
718 TRACE_CALL(__func__);
725 b = json_builder_new();
726 json_builder_begin_object(b);
729 json_builder_set_member_name(b,
"plugin_name");
730 json_builder_add_string_value(b, secret_plugin->
name);
732 json_builder_end_object(b);
733 r = json_builder_get_root(b);
747 TRACE_CALL(__func__);
752 b = json_builder_new();
753 json_builder_begin_object(b);
755 json_builder_set_member_name(b,
"primary_password_status");
757 json_builder_add_string_value(b,
"ON");
759 json_builder_add_string_value(b,
"OFF");
762 json_builder_end_object(b);
763 r = json_builder_get_root(b);
777 TRACE_CALL(__func__);
782 b = json_builder_new();
783 json_builder_begin_object(b);
785 json_builder_set_member_name(b,
"kiosk_status");
787 json_builder_add_string_value(b,
"OFF");
789 json_builder_add_string_value(b,
"ON");
792 json_builder_end_object(b);
793 r = json_builder_get_root(b);
808 TRACE_CALL(__func__);
812 b = json_builder_new();
813 json_builder_begin_object(b);
816 json_builder_set_member_name(b,
"REMMINAVERSION");
817 json_builder_add_value(b, n);
820 json_builder_set_member_name(b,
"SYSTEM");
821 json_builder_add_value(b, n);
828 json_builder_set_member_name(b,
"ENVIRONMENT");
829 json_builder_add_value(b, n);
832 json_builder_set_member_name(b,
"GTKVERSION");
833 json_builder_add_value(b, n);
836 json_builder_set_member_name(b,
"GTKBACKEND");
837 json_builder_add_value(b, n);
840 json_builder_set_member_name(b,
"WINDOWMANAGER");
841 json_builder_add_value(b, n);
844 json_builder_set_member_name(b,
"APPINDICATOR");
845 json_builder_add_value(b, n);
848 json_builder_set_member_name(b,
"PROFILES");
849 json_builder_add_value(b, n);
852 json_builder_set_member_name(b,
"ACTIVESECRETPLUGIN");
853 json_builder_add_value(b, n);
856 json_builder_set_member_name(b,
"HASPRIMARYPASSWORD");
857 json_builder_add_value(b, n);
860 json_builder_set_member_name(b,
"KIOSK");
861 json_builder_add_value(b, n);
864 json_builder_end_object(b);
865 n = json_builder_get_root(b);
const gchar * remmina_file_get_string(RemminaFile *remminafile, const gchar *setting)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
JsonNode * remmina_stats_get_user_env()
Gets the following user environment:
RemminaSecretPlugin * remmina_plugin_manager_get_secret_plugin(void)
gint pcount
Date in string format in the proto_date hash table.
gboolean(* is_service_available)(struct _RemminaSecretPlugin *instance)
JsonNode * remmina_stats_get_primary_password_status()
Add a JSON member HASPRIMARYPASSWORD which shows the status of the master password.
gchar * remmina_utils_get_lsb_codename()
Print the Distribution codename as specified by the lsb_release command.
gboolean remmina_icon_is_available(void)
Determine whenever the Remmina icon is available.
gchar * remmina_utils_get_lsb_id()
Print the Distributor as specified by the lsb_release command.
const gchar * remmina_utils_get_kernel_name()
Return the OS name as in "uname -s".
JsonNode * remmina_stats_get_secret_plugin()
Add a JSON member ACTIVESECRETPLUGIN which shows the current secret plugin in use by Remmina...
const gchar * remmina_utils_get_kernel_release()
Return the OS version as in "uname -r".
JsonNode * remmina_stats_get_gtk_version()
JsonNode * remmina_stats_get_os_info()
General utility functions, non-GTK related.
gchar * remmina_utils_get_lsb_release()
Print the Distribution release name as specified by the lsb_release command.
gchar * remmina_utils_get_lang()
Return the current language defined in the LC_ALL.
gchar * remmina_utils_get_lsb_description()
Print the Distribution description as specified by the lsb_release command.
gchar * remmina_sysinfo_get_gnome_shell_version()
Query DBUS to get GNOME Shell version.
JsonNode * remmina_stats_get_gtk_backend()
gboolean remmina_pref_get_boolean(const gchar *key)
JsonNode * remmina_stats_get_profiles()
Add a JSON member profile_count with a child for each protocol used by the user.
static void remmina_profiles_get_data(RemminaFile *remminafile, gpointer user_data)
Given a remmina file, fills a structure containing profiles keys/value tuples.
JsonNode * remmina_stats_get_all()
Get all statistics in JSON format to send periodically to the PHP server.
gchar * remmina_sysinfo_get_wm_name()
Query environment variables to get the Window manager name.
const gchar * pdatestr
Key in the proto_count hash table.
gboolean remmina_sysinfo_is_appindicator_available()
JsonNode * remmina_stats_get_indicator()
JsonNode * remmina_stats_get_wm_name()
GHashTable * remmina_utils_get_etc_release()
Print the distribution description if found.
const gchar * remmina_utils_get_kernel_arch()
Return the machine hardware name as in "uname -m".
JsonNode * remmina_stats_get_kiosk_mode()
Add a json member KIOSK which shows the status of the kiosk.
gint remmina_file_manager_iterate(GFunc func, gpointer user_data)
JsonNode * remmina_stats_get_version()