void wififriend_scan_network(GtkWidget* Widget, gpointer Data) { DWORD Error = ERROR_SUCCESS; PWLAN_AVAILABLE_NETWORK_LIST Network = NULL; t_wifi St; int I; GtkWidget *WinScan = NULL; GtkWidget *ListOfWifi = NULL; I = 1; St = wififriend_create_handle(); St = wififriend_retrieve_config(St); if((WlanGetAvailableNetworkList(St.MyHandle, &St.MyGuid, 0x00000001, NULL, &Network)) != ERROR_SUCCESS) error_scan(0); else { WinScan = create_window(236, 27, "Wifi scan"); ListOfWifi = gtk_combo_box_new_text(); while(I != Network->dwNumberOfItems) { gtk_combo_box_prepend_text(GTK_COMBO_BOX(ListOfWifi), (const gchar *)Network->Network[I].dot11Ssid.ucSSID); I++; } gtk_combo_box_set_active(GTK_COMBO_BOX(ListOfWifi), 0); gtk_container_add(GTK_CONTAINER(WinScan), ListOfWifi); g_signal_connect(G_OBJECT(ListOfWifi), "changed", G_CALLBACK(wififriend_connect_to_unsecure_network), (gpointer)ListOfWifi); display_interface(WinScan); WlanCloseHandle(St.MyHandle, NULL); } }
int main (int argc, char **argv) { char *command_line = NULL; char input_buffer[MAX_INPUT_BUFFER]; char *address = NULL; /* comma seperated str with addrs/ptrs (sorted) */ char **addresses = NULL; int n_addresses = 0; char *msg = NULL; char *temp_buffer = NULL; int non_authoritative = FALSE; int result = STATE_UNKNOWN; double elapsed_time; long microsec; struct timeval tv; int multi_address; int parse_address = FALSE; /* This flag scans for Address: but only after Name: */ output chld_out, chld_err; size_t i; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); /* Set signal handling and alarm */ if (signal (SIGALRM, runcmd_timeout_alarm_handler) == SIG_ERR) { usage_va(_("Cannot catch SIGALRM")); } /* Parse extra opts if any */ argv=np_extra_opts (&argc, argv, progname); if (process_arguments (argc, argv) == ERROR) { usage_va(_("Could not parse arguments")); } /* get the command to run */ xasprintf (&command_line, "%s %s %s", NSLOOKUP_COMMAND, query_address, dns_server); alarm (timeout_interval); gettimeofday (&tv, NULL); if (verbose) printf ("%s\n", command_line); /* run the command */ if((np_runcmd(command_line, &chld_out, &chld_err, 0)) != 0) { msg = (char *)_("nslookup returned an error status"); result = STATE_WARNING; } /* scan stdout */ for(i = 0; i < chld_out.lines; i++) { if (addresses == NULL) addresses = malloc(sizeof(*addresses)*10); else if (!(n_addresses % 10)) addresses = realloc(addresses,sizeof(*addresses) * (n_addresses + 10)); if (verbose) puts(chld_out.line[i]); if (strstr (chld_out.line[i], ".in-addr.arpa")) { if ((temp_buffer = strstr (chld_out.line[i], "name = "))) addresses[n_addresses++] = strdup (temp_buffer + 7); else { msg = (char *)_("Warning plugin error"); result = STATE_WARNING; } } /* the server is responding, we just got the host name... */ if (strstr (chld_out.line[i], "Name:")) parse_address = TRUE; else if (parse_address == TRUE && (strstr (chld_out.line[i], "Address:") || strstr (chld_out.line[i], "Addresses:"))) { temp_buffer = index (chld_out.line[i], ':'); temp_buffer++; /* Strip leading spaces */ for (; *temp_buffer != '\0' && *temp_buffer == ' '; temp_buffer++) /* NOOP */; strip(temp_buffer); if (temp_buffer==NULL || strlen(temp_buffer)==0) { die (STATE_CRITICAL, _("DNS CRITICAL - '%s' returned empty host name string\n"), NSLOOKUP_COMMAND); } addresses[n_addresses++] = strdup(temp_buffer); } else if (strstr (chld_out.line[i], _("Non-authoritative answer:"))) { non_authoritative = TRUE; } result = error_scan (chld_out.line[i]); if (result != STATE_OK) { msg = strchr (chld_out.line[i], ':'); if(msg) msg++; break; } } /* scan stderr */ for(i = 0; i < chld_err.lines; i++) { if (verbose) puts(chld_err.line[i]); if (error_scan (chld_err.line[i]) != STATE_OK) { result = max_state (result, error_scan (chld_err.line[i])); msg = strchr(input_buffer, ':'); if(msg) msg++; } } if (addresses) { int i,slen; char *adrp; qsort(addresses, n_addresses, sizeof(*addresses), qstrcmp); for(i=0, slen=1; i < n_addresses; i++) { slen += strlen(addresses[i])+1; } adrp = address = malloc(slen); for(i=0; i < n_addresses; i++) { if (i) *adrp++ = ','; strcpy(adrp, addresses[i]); adrp += strlen(addresses[i]); } *adrp = 0; } else die (STATE_CRITICAL, _("DNS CRITICAL - '%s' msg parsing exited with no address\n"), NSLOOKUP_COMMAND); /* compare to expected address */ if (result == STATE_OK && expected_address_cnt > 0) { result = STATE_CRITICAL; temp_buffer = ""; for (i=0; i<expected_address_cnt; i++) { /* check if we get a match and prepare an error string */ if (strcmp(address, expected_address[i]) == 0) result = STATE_OK; xasprintf(&temp_buffer, "%s%s; ", temp_buffer, expected_address[i]); } if (result == STATE_CRITICAL) { /* Strip off last semicolon... */ temp_buffer[strlen(temp_buffer)-2] = '\0'; xasprintf(&msg, _("expected '%s' but got '%s'"), temp_buffer, address); } } /* check if authoritative */ if (result == STATE_OK && expect_authority && non_authoritative) { result = STATE_CRITICAL; xasprintf(&msg, _("server %s is not authoritative for %s"), dns_server, query_address); } microsec = deltime (tv); elapsed_time = (double)microsec / 1.0e6; if (result == STATE_OK) { if (strchr (address, ',') == NULL) multi_address = FALSE; else multi_address = TRUE; result = get_status(elapsed_time, time_thresholds); if (result == STATE_OK) { printf ("DNS %s: ", _("OK")); } else if (result == STATE_WARNING) { printf ("DNS %s: ", _("WARNING")); } else if (result == STATE_CRITICAL) { printf ("DNS %s: ", _("CRITICAL")); } printf (ngettext("%.3f second response time", "%.3f seconds response time", elapsed_time), elapsed_time); printf (_(". %s returns %s"), query_address, address); printf ("|%s\n", fperfdata ("time", elapsed_time, "s", FALSE, 0, FALSE, 0, TRUE, 0, FALSE, 0)); } else if (result == STATE_WARNING) printf (_("DNS WARNING - %s\n"), !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); else if (result == STATE_CRITICAL) printf (_("DNS CRITICAL - %s\n"), !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); else printf (_("DNS UNKNOWN - %s\n"), !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); return result; }
int main (int argc, char **argv) { char *command_line = NULL; char input_buffer[MAX_INPUT_BUFFER]; char *address = NULL; /* comma seperated str with addrs/ptrs (sorted) */ char **addresses = NULL; int n_addresses = 0; char *msg = NULL; char query_found[16] = ""; char *temp_buffer = NULL; int non_authoritative = TRUE; int result = STATE_UNKNOWN; double elapsed_time; long microsec; struct timeval tv; int multi_address; int parse_address = FALSE; /* This flag scans for Address: but only after Name: */ output chld_out, chld_err; size_t i; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); /* Set signal handling and alarm */ if (signal (SIGALRM, runcmd_timeout_alarm_handler) == SIG_ERR) { usage_va(_("Cannot catch SIGALRM")); } /* Parse extra opts if any */ argv=np_extra_opts (&argc, argv, progname); if (process_arguments (argc, argv) == ERROR) { usage_va(_("Could not parse arguments")); } /* get the command to run */ xasprintf (&command_line, "%s %s %s %s", NSLOOKUP_COMMAND, query_type, query_address, dns_server); alarm (timeout_interval); gettimeofday (&tv, NULL); if (verbose) printf ("%s\n", command_line); /* run the command */ if((np_runcmd(command_line, &chld_out, &chld_err, 0)) != 0) { msg = (char *)_("nslookup returned an error status"); result = STATE_WARNING; } /* scan stdout */ for(i = 0; i < chld_out.lines; i++) { if (addresses == NULL) addresses = malloc(sizeof(*addresses)*10); else if (!(n_addresses % 10)) addresses = realloc(addresses,sizeof(*addresses) * (n_addresses + 10)); if (verbose) puts(chld_out.line[i]); if (strstr (chld_out.line[i], "Authoritative answers can be found from:")) { non_authoritative = FALSE; break; } /* the server is responding, we just got the host name... */ if (strstr (chld_out.line[i], "Name:")) parse_address = TRUE; /* begin handling types of records */ if (strstr (chld_out.line[i], "AAAA address")) { if (verbose) printf("Found AAAA record\n"); temp_buffer = rindex (chld_out.line[i], ' '); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=AAAA", sizeof(query_found)); } else if (strstr (chld_out.line[i], "exchanger =")) { if (verbose) printf("Found MX record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=MX", sizeof(query_found)); } else if (strstr (chld_out.line[i], "service =")) { if (verbose) printf("Found SRV record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=SRV", sizeof(query_found)); } else if (accept_cname && strstr (chld_out.line[i], "canonical name =")) { if (verbose) printf("Found CNAME record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=CNAME", sizeof(query_found)); } else if (parse_address == TRUE && (strstr (chld_out.line[i], "Address:") || strstr (chld_out.line[i], "Addresses:"))) { if (verbose) printf("Found A record\n"); temp_buffer = index (chld_out.line[i], ':'); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=A", sizeof(query_found)); } else if (strstr (chld_out.line[i], "nameserver =")) { if (verbose) printf("Found NS record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=NS", sizeof(query_found)); } else if (strstr (chld_out.line[i], "dname =")) { if (verbose) printf("Found DNAME record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=DNAME", sizeof(query_found)); } /* must be after other records with "name" as an identifier, as ptr does not spefify */ else if (strstr (chld_out.line[i], "name =")) { if (verbose) printf("Found PTR record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=PTR", sizeof(query_found)); } else if (strstr (chld_out.line[i], "protocol =")) { if (verbose) printf("Found WKS record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=WKS", sizeof(query_found)); } /* TODO: needs to be changed to handle txt output and max size of txt recrods */ else if (strstr (chld_out.line[i], "text =")) { if (verbose) printf("Found TXT record\n"); temp_buffer = index (chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=TXT", sizeof(query_found)); } /* only matching for origin records, if requested other fields could be included at a later date */ else if (strstr (chld_out.line[i], "origin =")) { if (verbose) printf("Found SOA record\n"); temp_buffer = index(chld_out.line[i], '='); addresses[n_addresses++] = check_new_address(temp_buffer); strncpy(query_found, "-querytype=SOA", sizeof(query_found)); } if (strstr (chld_out.line[i], _("Non-authoritative answer:"))) { non_authoritative = TRUE; } result = error_scan (chld_out.line[i]); if (result != STATE_OK) { msg = strchr (chld_out.line[i], ':'); if(msg) msg++; break; } } /* scan stderr */ for(i = 0; i < chld_err.lines; i++) { if (verbose) puts(chld_err.line[i]); if (error_scan (chld_err.line[i]) != STATE_OK) { result = max_state (result, error_scan (chld_err.line[i])); msg = strchr(input_buffer, ':'); if(msg) msg++; } } if (addresses) { int i,slen; char *adrp; qsort(addresses, n_addresses, sizeof(*addresses), qstrcmp); for(i=0, slen=1; i < n_addresses; i++) { slen += strlen(addresses[i])+1; } adrp = address = malloc(slen); for(i=0; i < n_addresses; i++) { if (i) *adrp++ = ','; strcpy(adrp, addresses[i]); adrp += strlen(addresses[i]); } *adrp = 0; } else die (STATE_CRITICAL, _("DNS CRITICAL - '%s' msg parsing exited with no address\n"), NSLOOKUP_COMMAND); /* compare to expected address */ if (result == STATE_OK && expected_address_cnt > 0) { result = STATE_CRITICAL; temp_buffer = ""; for (i=0; i<expected_address_cnt; i++) { /* check if we get a match and prepare an error string */ if (strcmp(address, expected_address[i]) == 0) result = STATE_OK; xasprintf(&temp_buffer, "%s%s; ", temp_buffer, expected_address[i]); } if (result == STATE_CRITICAL) { /* Strip off last semicolon... */ temp_buffer[strlen(temp_buffer)-2] = '\0'; xasprintf(&msg, _("expected '%s' but got '%s'"), temp_buffer, address); } } /* check if authoritative */ if (result == STATE_OK && expect_authority && !non_authoritative) { result = STATE_CRITICAL; if (strncmp(dns_server, "", 1)) xasprintf(&msg, _("server %s is not authoritative for %s"), dns_server, query_address); else xasprintf(&msg, _("there is no authoritative server for %s"), query_address); } /* compare query type to query found, if query type is ANY we can skip as any record is accepted*/ if (result == STATE_OK && strncmp(query_type, "", 1) && (strncmp(query_type, "-querytype=ANY", 15) != 0)) { if (strncmp(query_type, query_found, 16) != 0) { if (verbose) printf( "Failed query for %s only found %s, or nothing\n", query_type, query_found); result = STATE_CRITICAL; xasprintf(&msg, _("query type of %s was not found for %s"), query_type, query_address); } } microsec = deltime (tv); elapsed_time = (double)microsec / 1.0e6; if (result == STATE_OK) { if (strchr (address, ',') == NULL) multi_address = FALSE; else multi_address = TRUE; result = get_status(elapsed_time, time_thresholds); if (result == STATE_OK) { printf ("DNS %s: ", _("OK")); } else if (result == STATE_WARNING) { printf ("DNS %s: ", _("WARNING")); } else if (result == STATE_CRITICAL) { printf ("DNS %s: ", _("CRITICAL")); } printf (ngettext("%.3f second response time", "%.3f seconds response time", elapsed_time), elapsed_time); printf (_(". %s returns %s"), query_address, address); if ((time_thresholds->warning != NULL) && (time_thresholds->critical != NULL)) { printf ("|%s\n", fperfdata ("time", elapsed_time, "s", TRUE, time_thresholds->warning->end, TRUE, time_thresholds->critical->end, TRUE, 0, FALSE, 0)); } else if ((time_thresholds->warning == NULL) && (time_thresholds->critical != NULL)) { printf ("|%s\n", fperfdata ("time", elapsed_time, "s", FALSE, 0, TRUE, time_thresholds->critical->end, TRUE, 0, FALSE, 0)); } else if ((time_thresholds->warning != NULL) && (time_thresholds->critical == NULL)) { printf ("|%s\n", fperfdata ("time", elapsed_time, "s", TRUE, time_thresholds->warning->end, FALSE, 0, TRUE, 0, FALSE, 0)); } else printf ("|%s\n", fperfdata ("time", elapsed_time, "s", FALSE, 0, FALSE, 0, TRUE, 0, FALSE, 0)); } else if (result == STATE_WARNING) printf (_("DNS WARNING - %s\n"), !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); else if (result == STATE_CRITICAL) printf (_("DNS CRITICAL - %s\n"), !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); else printf (_("DNS UNKNOWN - %s\n"), !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); return result; }
int run_ping (const char *cmd, const char *addr) { char buf[MAX_INPUT_BUFFER]; int result = STATE_UNKNOWN; int match; if ((child_process = spopen (cmd)) == NULL) die (STATE_UNKNOWN, _("Could not open pipe: %s\n"), cmd); child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); if (child_stderr == NULL) printf (_("Cannot open stderr for %s\n"), cmd); while (fgets (buf, MAX_INPUT_BUFFER - 1, child_process)) { if (verbose >= 3) printf("Output: %s", buf); result = max_state (result, error_scan (buf, addr)); /* get the percent loss statistics */ match = 0; if((sscanf(buf,"%*d packets transmitted, %*d packets received, +%*d errors, %d%% packet loss%n",&pl,&match) && match) || (sscanf(buf,"%*d packets transmitted, %*d packets received, +%*d duplicates, %d%% packet loss%n",&pl,&match) && match) || (sscanf(buf,"%*d packets transmitted, %*d received, +%*d duplicates, %d%% packet loss%n",&pl,&match) && match) || (sscanf(buf,"%*d packets transmitted, %*d packets received, %d%% packet loss%n",&pl,&match) && match) || (sscanf(buf,"%*d packets transmitted, %*d packets received, %d%% loss, time%n",&pl,&match) && match) || (sscanf(buf,"%*d packets transmitted, %*d received, %d%% loss, time%n",&pl,&match) && match) || (sscanf(buf,"%*d packets transmitted, %*d received, %d%% packet loss, time%n",&pl,&match) && match) || (sscanf(buf,"%*d packets transmitted, %*d received, +%*d errors, %d%% packet loss%n",&pl,&match) && match) || (sscanf(buf,"%*d packets transmitted %*d received, +%*d errors, %d%% packet loss%n",&pl,&match) && match) || (sscanf(buf,"%*[^(](%d%% %*[^)])%n",&pl,&match) && match) ) continue; /* get the round trip average */ else if((sscanf(buf,"round-trip min/avg/max = %*f/%f/%*f%n",&rta,&match) && match) || (sscanf(buf,"round-trip min/avg/max/mdev = %*f/%f/%*f/%*f%n",&rta,&match) && match) || (sscanf(buf,"round-trip min/avg/max/sdev = %*f/%f/%*f/%*f%n",&rta,&match) && match) || (sscanf(buf,"round-trip min/avg/max/stddev = %*f/%f/%*f/%*f%n",&rta,&match) && match) || (sscanf(buf,"round-trip min/avg/max/std-dev = %*f/%f/%*f/%*f%n",&rta,&match) && match) || (sscanf(buf,"round-trip (ms) min/avg/max = %*f/%f/%*f%n",&rta,&match) && match) || (sscanf(buf,"round-trip (ms) min/avg/max/stddev = %*f/%f/%*f/%*f%n",&rta,&match) && match) || (sscanf(buf,"rtt min/avg/max/mdev = %*f/%f/%*f/%*f ms%n",&rta,&match) && match) || (sscanf(buf, "%*[^=] = %*fms, %*[^=] = %*fms, %*[^=] = %fms%n", &rta, &match) && match) ) continue; } /* this is needed because there is no rta if all packets are lost */ if (pl == 100) rta = crta; /* check stderr, setting at least WARNING if there is output here */ /* Add warning into warn_text */ while (fgets (buf, MAX_INPUT_BUFFER - 1, child_stderr)) { if ( ! strstr(buf,"WARNING - no SO_TIMESTAMP support, falling back to SIOCGSTAMP") && ! strstr(buf,"Warning: time of day goes back") ) { if (verbose >= 3) { printf("Got stderr: %s", buf); } if ((result=error_scan(buf, addr)) == STATE_OK) { result = STATE_WARNING; if (warn_text == NULL) { warn_text = strdup(_("System call sent warnings to stderr ")); } else { xasprintf(&warn_text, "%s %s", warn_text, _("System call sent warnings to stderr ")); } } } } (void) fclose (child_stderr); spclose (child_process); if (warn_text == NULL) warn_text = strdup(""); return result; }