// called at the top of each minute void schedule_update(int hour, int min) { #define UPDATE_SPREAD_HOURS 4 // # hours to spread updates over #define UPDATE_SPREAD_MIN (UPDATE_SPREAD_HOURS * 60) #define UPDATE_START_HOUR 2 // 2 AM UTC, 2(3) PM NZT(NZDT) #define UPDATE_END_HOUR (UPDATE_START_HOUR + UPDATE_SPREAD_HOURS) bool update = (hour >= UPDATE_START_HOUR && hour < UPDATE_END_HOUR); // don't let Kiwis hit github.com all at once! int mins; if (update) { mins = min + (hour - UPDATE_START_HOUR) * 60; //printf("UPDATE: %02d:%02d waiting for %d min = %d min(sn=%d)\n", hour, min, // mins, serial_number % UPDATE_SPREAD_MIN, serial_number); update = update && (mins == (serial_number % UPDATE_SPREAD_MIN)); if (update) { printf("TLIMIT-IP 24hr cache cleared\n"); json_init(&cfg_ipl, (char *) "{}"); // clear 24hr ip address connect time limit cache } } daily_restart = update && !update_on_startup && (admcfg_bool("daily_restart", NULL, CFG_REQUIRED) == true); if (update || update_on_startup) { lprintf("UPDATE: check scheduled %s\n", update_on_startup? "(startup)":""); update_on_startup = false; update_pending = true; check_for_update(WAIT_UNTIL_NO_USERS, NULL); } }
int main(int argc, char **argv) { char *hosts = NULL; FILE *fp; int c; char *me; if ( (me = strchr(argv[0],'/')) ) me++; else me = argv[0]; while((c = getopt(argc, argv, "f:")) > 0 ) { switch(c) { case 'f': hosts=strdup(optarg); break; default: usage(me); exit(0); } } if ( hosts == NULL ) hosts=strdup(HOSTS); read_hosts(hosts); read_command(); c = check_for_update(); if ( c && (fp=fopen(hosts,"w")) ) { writeout(fp); fclose(fp); } free_list(); if ( hosts ) free(hosts); return 0; }
void w2a_admin(void *param) { int n, i, j; conn_t *conn = (conn_t *) param; static char json_buf[16384]; u4_t ka_time = timer_sec(); // send initial values send_msg(conn, SM_NO_DEBUG, "ADM init=%d", RX_CHANS); nbuf_t *nb = NULL; while (TRUE) { if (nb) web_to_app_done(conn, nb); n = web_to_app(conn, &nb); if (n) { char *cmd = nb->buf; cmd[n] = 0; // okay to do this -- see nbuf.c:nbuf_allocq() ka_time = timer_sec(); if (rx_common_cmd("W/F", conn, cmd)) continue; //printf("ADMIN: %d <%s>\n", strlen(cmd), cmd); i = strcmp(cmd, "SET init"); if (i == 0) { continue; } i = strcmp(cmd, "SET gps_update"); if (i == 0) { gps_stats_t::gps_chan_t *c; char *cp = json_buf; n = sprintf(cp, "{ \"FFTch\":%d, \"ch\":[ ", gps.FFTch); cp += n; for (i=0; i < gps_chans; i++) { c = &gps.ch[i]; int un = c->ca_unlocked; n = sprintf(cp, "%s{ \"ch\":%d, \"prn\":%d, \"snr\":%d, \"rssi\":%d, \"gain\":%d, \"hold\":%d, \"wdog\":%d" ", \"unlock\":%d, \"parity\":%d, \"sub\":%d, \"sub_renew\":%d, \"novfl\":%d }", i? ", ":"", i, c->prn, c->snr, c->rssi, c->gain, c->hold, c->wdog, un, c->parity, c->sub, c->sub_renew, c->novfl); cp += n; c->parity = 0; for (j = 0; j < SUBFRAMES; j++) { if (c->sub_renew & (1<<j)) { c->sub |= 1<<j; c->sub_renew &= ~(1<<j); } } } n = sprintf(cp, " ]"); cp += n; UMS hms(gps.StatSec/60/60); unsigned r = (timer_ms() - gps.start)/1000; if (r >= 3600) { n = sprintf(cp, ", \"run\":\"%d:%02d:%02d\"", r / 3600, (r / 60) % 60, r % 60); cp += n; } else { n = sprintf(cp, ", \"run\":\"%d:%02d\"", (r / 60) % 60, r % 60); cp += n; } if (gps.ttff) { n = sprintf(cp, ", \"ttff\":\"%d:%02d\"", gps.ttff / 60, gps.ttff % 60); cp += n; } else { n = sprintf(cp, ", \"ttff\":null"); cp += n; } if (gps.StatDay != -1) { n = sprintf(cp, ", \"gpstime\":\"%s %02d:%02d:%02.0f\"", Week[gps.StatDay], hms.u, hms.m, hms.s); cp += n; } else { n = sprintf(cp, ", \"gpstime\":null"); cp += n; } if (gps.StatLat) { n = sprintf(cp, ", \"lat\":\"%8.6f %c\"", gps.StatLat, gps.StatNS); cp += n; n = sprintf(cp, ", \"lon\":\"%8.6f %c\"", gps.StatLon, gps.StatEW); cp += n; n = sprintf(cp, ", \"alt\":\"%1.0f m\"", gps.StatAlt); cp += n; n = sprintf(cp, ", \"map\":\"<a href='http://wikimapia.org/#lang=en&lat=%8.6f&lon=%8.6f&z=18&m=b' target='_blank'>wikimapia.org</a>\"", gps.sgnLat, gps.sgnLon); cp += n; } else { n = sprintf(cp, ", \"lat\":null"); cp += n; } n = sprintf(cp, ", \"acq\":%d, \"track\":%d, \"good\":%d, \"fixes\":%d, \"adc_clk\":%.6f, \"adc_corr\":%d", gps.acquiring? 1:0, gps.tracking, gps.good, gps.fixes, (adc_clock - adc_clock_offset)/1e6, gps.adc_clk_corr); cp += n; n = sprintf(cp, " }"); cp += n; send_encoded_msg_mc(conn->mc, "ADM", "gps_update", "%s", json_buf); continue; } i = strcmp(cmd, "SET sdr_hu_update"); if (i == 0) { gps_stats_t::gps_chan_t *c; char *cp = json_buf; n = sprintf(cp, "{ "); cp += n; if (gps.StatLat) { n = sprintf(cp, "\"lat\":\"%8.6f\", \"lon\":\"%8.6f\"", gps.sgnLat, gps.sgnLon); cp += n; } n = sprintf(cp, " }"); cp += n; send_encoded_msg_mc(conn->mc, "ADM", "sdr_hu_update", "%s", json_buf); continue; } int force_check; i = sscanf(cmd, "SET force_check=%d force_build=%d", &force_check, &force_build); if (i == 2) { check_for_update(force_check); continue; } i = strcmp(cmd, "SET reload_index_params"); if (i == 0) { reload_index_params(); continue; } i = strcmp(cmd, "SET extint_load_extension_configs"); if (i == 0) { extint_load_extension_configs(conn); continue; } i = strcmp(cmd, "SET restart"); if (i == 0) { lprintf("ADMIN: restart requested by admin..\n"); exit(0); } i = strcmp(cmd, "SET reboot"); if (i == 0) { lprintf("ADMIN: reboot requested by admin..\n"); system("reboot"); while (true) usleep(100000); } i = strcmp(cmd, "SET power_off"); if (i == 0) { lprintf("ADMIN: power off requested by admin..\n"); system("poweroff"); while (true) usleep(100000); } printf("ADMIN: unknown command: <%s>\n", cmd); continue; } conn->keep_alive = timer_sec() - ka_time; bool keepalive_expired = (conn->keep_alive > KEEPALIVE_SEC); if (keepalive_expired) { printf("ADMIN KEEP-ALIVE EXPIRED\n"); rx_server_remove(conn); return; } TaskSleep(250000); } }