static void create_show_hide (void) { GtkWidget *window = NULL; GtkWidget *box1; GtkWidget *box2; GtkWidget *close_button; GtkWidget *enable_box; GtkWidget *box; GtkWidget *table; GtkWidget *label; GtkWidget *separator; GtkDataboxGraph *graph; gfloat *X; gfloat *Y; GdkColor color; gint i; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_size_request (window, 600, 600); g_signal_connect (GTK_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_window_set_title (GTK_WINDOW (window), "GtkDatabox: Enable/Disable Features"); gtk_container_set_border_width (GTK_CONTAINER (window), 0); box1 = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), box1); label = gtk_label_new ("Click on the buttons to enable/disable features.\n\nFor basic understanding: See basics :-)\n\n"); gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, FALSE, 0); enable_box = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (box1), enable_box, FALSE, FALSE, 0); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, FALSE, 0); /* Create a GtkDatabox widget along with scrollbars and rulers */ gtk_databox_create_box_with_scrollbars_and_rulers (&box, &table, TRUE, TRUE, TRUE, TRUE); gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0); X = g_new0 (gfloat, POINTS); Y = g_new0 (gfloat, POINTS); for (i = 0; i < POINTS; i++) { X[i] = i; Y[i] = 100. * sin (i * 2 * G_PI / POINTS); } color.red = 0; color.green = 0; color.blue = 65535; graph = gtk_databox_bars_new (POINTS, X, Y, &color, 1); gtk_databox_graph_add (GTK_DATABOX (box), graph); gtk_databox_auto_rescale (GTK_DATABOX (box), 0.05); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0); box2 = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 10); gtk_box_pack_end (GTK_BOX (box1), box2, FALSE, TRUE, 0); close_button = gtk_button_new_with_label ("close"); g_signal_connect_swapped (GTK_OBJECT (close_button), "clicked", G_CALLBACK (gtk_main_quit), GTK_OBJECT (box)); gtk_box_pack_start (GTK_BOX (box2), close_button, TRUE, TRUE, 0); GTK_WIDGET_SET_FLAGS (close_button, GTK_CAN_DEFAULT); for (i = 0; i < noEnableSets; ++i) { GtkWidget *vbox = gtk_vbox_new (FALSE, 10); GtkWidget *label = gtk_label_new (enableSets[i].title); GtkWidget *entry = gtk_entry_new (); GtkWidget *button = gtk_button_new_with_label ("Change"); gtk_box_pack_start (GTK_BOX (enable_box), vbox, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); gtk_editable_set_editable (GTK_EDITABLE (entry), FALSE); g_signal_connect_swapped (button, "clicked", G_CALLBACK (update_enable), (gpointer) & (enableSets[i])); enableSets[i].box = GTK_DATABOX (box); enableSets[i].entry = GTK_ENTRY (entry); update_enable (&enableSets[i]); update_enable (&enableSets[i]); } gtk_widget_grab_default (close_button); gtk_widget_show_all (window); }
int main(int argc, char *argv[]) { char *filedir = NULL; char *htmldir = NULL; char *htmlextension = "html"; char *onlytests = NULL; char *msg; enum role_t role = ROLE_STATUS; enum msgchannels_t chnid = C_STATUS; int argi; int seq; int running = 1; /* Dont save the error buffer */ save_errbuf = 0; for (argi = 1; (argi < argc); argi++) { if (strcmp(argv[argi], "--status") == 0) { role = ROLE_STATUS; chnid = C_STATUS; if (!filedir) filedir = xgetenv("XYMONRAWSTATUSDIR"); } else if (strcmp(argv[argi], "--html") == 0) { role = ROLE_STATUS; chnid = C_STATUS; if (!htmldir) htmldir = xgetenv("XYMONHTMLSTATUSDIR"); } else if (strcmp(argv[argi], "--data") == 0) { role = ROLE_DATA; chnid = C_DATA; if (!filedir) filedir = xgetenv("XYMONDATADIR"); } else if (strcmp(argv[argi], "--notes") == 0) { role = ROLE_NOTES; chnid = C_NOTES; if (!filedir) filedir = xgetenv("XYMONNOTESDIR"); } else if (strcmp(argv[argi], "--enadis") == 0) { role = ROLE_ENADIS; chnid = C_ENADIS; if (!filedir) filedir = xgetenv("XYMONDISABLEDDIR"); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (argnmatch(argv[argi], "--dir=")) { filedir = strchr(argv[argi], '=')+1; } else if (argnmatch(argv[argi], "--htmldir=")) { htmldir = strchr(argv[argi], '=')+1; } else if (argnmatch(argv[argi], "--htmlext=")) { htmlextension = strchr(argv[argi], '=')+1; } else if (argnmatch(argv[argi], "--only=")) { char *p = strchr(argv[argi], '=') + 1; onlytests = (char *)malloc(3 + strlen(p)); sprintf(onlytests, ",%s,", p); } else if (argnmatch(argv[argi], "--multigraphs=")) { char *p = strchr(argv[argi], '='); multigraphs = (char *)malloc(strlen(p+1) + 3); sprintf(multigraphs, ",%s,", p+1); } else if (argnmatch(argv[argi], "--locator=")) { char *p = strchr(argv[argi], '='); locator_init(p+1); locatorbased = 1; } } if (filedir == NULL) { errprintf("No directory given, aborting\n"); return 1; } /* For picking up lost children */ setup_signalhandler("xymond_filestore"); signal(SIGPIPE, SIG_DFL); if (onlytests) dbgprintf("Storing tests '%s' only\n", onlytests); else dbgprintf("Storing all tests\n"); while (running) { char *metadata[20] = { NULL, }; char *statusdata = ""; char *p; int metacount; char *hostname, *testname; time_t expiretime = 0; char logfn[PATH_MAX]; MEMDEFINE(logfn); msg = get_xymond_message(chnid, "filestore", &seq, NULL); if (msg == NULL) { running = 0; MEMUNDEFINE(logfn); continue; } p = strchr(msg, '\n'); if (p) { *p = '\0'; statusdata = p+1; } metacount = 0; memset(&metadata, 0, sizeof(metadata)); p = gettok(msg, "|"); while (p && (metacount < 20)) { metadata[metacount++] = p; p = gettok(NULL, "|"); } if ((role == ROLE_STATUS) && (metacount >= 14) && (strncmp(metadata[0], "@@status", 8) == 0)) { /* @@status|timestamp|sender|origin|hostname|testname|expiretime|color|testflags|prevcolor|changetime|ackexpiretime|ackmessage|disableexpiretime|disablemessage|clientmsgtstamp|flapping */ int ltime, flapping = 0; time_t logtime = 0, timesincechange = 0, acktime = 0, disabletime = 0; hostname = metadata[4]; testname = metadata[5]; if (!wantedtest(onlytests, testname)) { dbgprintf("Status dropped - not wanted\n"); MEMUNDEFINE(logfn); continue; } sprintf(logfn, "%s/%s.%s", filedir, commafy(hostname), testname); expiretime = atoi(metadata[6]); statusdata = msg_data(statusdata); sscanf(metadata[1], "%d.%*d", <ime); logtime = ltime; timesincechange = logtime - atoi(metadata[10]); update_file(logfn, "w", statusdata, expiretime, metadata[2], timesincechange, seq); if (htmldir) { char *ackmsg = NULL; char *dismsg = NULL; char htmllogfn[PATH_MAX]; MEMDEFINE(htmllogfn); if (metadata[11]) acktime = atoi(metadata[11]); if (metadata[12] && strlen(metadata[12])) ackmsg = metadata[12]; if (ackmsg) nldecode(ackmsg); if (metadata[13]) disabletime = atoi(metadata[13]); if (metadata[14] && strlen(metadata[14]) && (disabletime > 0)) dismsg = metadata[14]; if (dismsg) nldecode(dismsg); flapping = (metadata[16] ? (*metadata[16] == '1') : 0); sprintf(htmllogfn, "%s/%s.%s.%s", htmldir, hostname, testname, htmlextension); update_htmlfile(htmllogfn, statusdata, hostname, testname, parse_color(metadata[7]), flapping, metadata[2], metadata[8], logtime, timesincechange, acktime, ackmsg, disabletime, dismsg); MEMUNDEFINE(htmllogfn); } } else if ((role == ROLE_DATA) && (metacount > 5) && (strncmp(metadata[0], "@@data", 6) == 0)) { /* @@data|timestamp|sender|hostname|testname */ p = hostname = metadata[4]; while ((p = strchr(p, '.')) != NULL) *p = ','; testname = metadata[5]; if (!wantedtest(onlytests, testname)) { dbgprintf("data dropped - not wanted\n"); MEMUNDEFINE(logfn); continue; } statusdata = msg_data(statusdata); if (*statusdata == '\n') statusdata++; sprintf(logfn, "%s/%s.%s", filedir, hostname, testname); expiretime = 0; update_file(logfn, "a", statusdata, expiretime, NULL, -1, seq); } else if ((role == ROLE_NOTES) && (metacount > 3) && (strncmp(metadata[0], "@@notes", 7) == 0)) { /* @@notes|timestamp|sender|hostname */ hostname = metadata[3]; statusdata = msg_data(statusdata); if (*statusdata == '\n') statusdata++; sprintf(logfn, "%s/%s", basename(filedir), hostname); expiretime = 0; update_file(logfn, "w", statusdata, expiretime, NULL, -1, seq); } else if ((role == ROLE_ENADIS) && (metacount > 5) && (strncmp(metadata[0], "@@enadis", 8) == 0)) { /* @@enadis|timestamp|sender|hostname|testname|expiretime */ p = hostname = metadata[3]; while ((p = strchr(p, '.')) != NULL) *p = ','; testname = metadata[4]; expiretime = atoi(metadata[5]); sprintf(logfn, "%s/%s.%s", filedir, hostname, testname); update_enable(logfn, expiretime); } else if (((role == ROLE_STATUS) || (role == ROLE_DATA) || (role == ROLE_ENADIS)) && (metacount > 3) && (strncmp(metadata[0], "@@drophost", 10) == 0)) { /* @@drophost|timestamp|sender|hostname */ DIR *dirfd; struct dirent *de; char *hostlead; p = hostname = metadata[3]; while ((p = strchr(p, '.')) != NULL) *p = ','; hostlead = malloc(strlen(hostname) + 2); strcpy(hostlead, hostname); strcat(hostlead, "."); dirfd = opendir(filedir); if (dirfd) { while ( (de = readdir(dirfd)) != NULL) { if (strncmp(de->d_name, hostlead, strlen(hostlead)) == 0) { sprintf(logfn, "%s/%s", filedir, de->d_name); unlink(logfn); } } closedir(dirfd); } xfree(hostlead); } else if (((role == ROLE_STATUS) || (role == ROLE_DATA) || (role == ROLE_ENADIS)) && (metacount > 4) && (strncmp(metadata[0], "@@droptest", 10) == 0)) { /* @@droptest|timestamp|sender|hostname|testname */ p = hostname = metadata[3]; while ((p = strchr(p, '.')) != NULL) *p = ','; testname = metadata[4]; sprintf(logfn, "%s/%s.%s", filedir, hostname, testname); unlink(logfn); } else if (((role == ROLE_STATUS) || (role == ROLE_DATA) || (role == ROLE_ENADIS)) && (metacount > 4) && (strncmp(metadata[0], "@@renamehost", 12) == 0)) { /* @@renamehost|timestamp|sender|hostname|newhostname */ DIR *dirfd; struct dirent *de; char *hostlead; char *newhostname; char newlogfn[PATH_MAX]; MEMDEFINE(newlogfn); p = hostname = metadata[3]; while ((p = strchr(p, '.')) != NULL) *p = ','; hostlead = malloc(strlen(hostname) + 2); strcpy(hostlead, hostname); strcat(hostlead, "."); p = newhostname = metadata[4]; while ((p = strchr(p, '.')) != NULL) *p = ','; dirfd = opendir(filedir); if (dirfd) { while ( (de = readdir(dirfd)) != NULL) { if (strncmp(de->d_name, hostlead, strlen(hostlead)) == 0) { char *testname = strchr(de->d_name, '.'); sprintf(logfn, "%s/%s", filedir, de->d_name); sprintf(newlogfn, "%s/%s%s", filedir, newhostname, testname); rename(logfn, newlogfn); } } closedir(dirfd); } xfree(hostlead); MEMUNDEFINE(newlogfn); } else if (((role == ROLE_STATUS) || (role == ROLE_DATA) || (role == ROLE_ENADIS)) && (metacount > 5) && (strncmp(metadata[0], "@@renametest", 12) == 0)) { /* @@renametest|timestamp|sender|hostname|oldtestname|newtestname */ char *newtestname; char newfn[PATH_MAX]; MEMDEFINE(newfn); p = hostname = metadata[3]; while ((p = strchr(p, '.')) != NULL) *p = ','; testname = metadata[4]; newtestname = metadata[5]; sprintf(logfn, "%s/%s.%s", filedir, hostname, testname); sprintf(newfn, "%s/%s.%s", filedir, hostname, newtestname); rename(logfn, newfn); MEMUNDEFINE(newfn); } else if (strncmp(metadata[0], "@@shutdown", 10) == 0) { running = 0; } else if (strncmp(metadata[0], "@@logrotate", 11) == 0) { char *fn = xgetenv("XYMONCHANNEL_LOGFILENAME"); if (fn && strlen(fn)) { freopen(fn, "a", stdout); freopen(fn, "a", stderr); } continue; } else if (strncmp(metadata[0], "@@idle", 6) == 0) { /* Ignored */ } else { errprintf("Dropping message type %s, metacount=%d\n", metadata[0], metacount); } MEMUNDEFINE(logfn); } return 0; }