Esempio n. 1
0
static void
_register_field(struct pbc_rmessage * field, struct _field * f, struct _stringpool *pool) {
	f->id = pbc_rmessage_integer(field, "number", 0 , 0);
	f->type = pbc_rmessage_integer(field, "type", 0 , 0);	// enum
	f->label = pbc_rmessage_integer(field, "label", 0, 0) - 1; // LABEL_OPTIONAL = 0
	if (pbc_rmessage_size(field , "options") > 0) {
		struct pbc_rmessage * options = pbc_rmessage_message(field, "options" , 0);
		int packed = pbc_rmessage_integer(options , "packed" , 0 , NULL);
		if (packed) {
			f->label = LABEL_PACKED;
		}
	}
	f->type_name.n = pbc_rmessage_string(field, "type_name", 0 , NULL) +1;	// abandon prefix '.' 
	int vsz;
	const char * default_value = pbc_rmessage_string(field, "default_value", 0 , &vsz);
	_set_default(pool , f , f->type, default_value , vsz);
}
Esempio n. 2
0
gboolean sd_maincfg_new(gchar *fname) {
    FILE *in;
    gchar line[BUFSIZ];
    gchar key[32], value[1024];
    gint currnfd, nfd;
    struct rlimit lim;

    if (Cfg)
        g_hash_table_destroy(Cfg);

    Cfg = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
    assert(Cfg);

    /* setting defaults */
    _set_default(Cfg, "maxfd",              "1024");
    _set_default(Cfg, "log",                "/var/log/surealived/surealived.log");
    _set_default(Cfg, "use_log",            "false");
    _set_default(Cfg, "logging",            "info");
    _set_default(Cfg, "use_syslog",         "false");
    _set_default(Cfg, "use_tm_in_syslog",   "false");
    _set_default(Cfg, "modules_path",       "/usr/lib/surealived/modules/");
    _set_default(Cfg, "modules",            "all");
    _set_default(Cfg, "listen_addr",        "127.0.0.1");
    _set_default(Cfg, "listen_port",        "1337");
    _set_default(Cfg, "memlimit",           "0"); /* unlimited */

    _set_default(Cfg, "loop_interval_ms",   "100");
    _set_default(Cfg, "epoll_interval_ms",  "10");
    _set_default(Cfg, "startup_delay_ms",   "1000");
    _set_default(Cfg, "debug_comm",         "0");
    _set_default(Cfg, "debug_comm_path",    "/var/log/surealived/comm");

    _set_default(Cfg, "stats_dir",          "/var/log/surealived/stats");
    _set_default(Cfg, "log_stats",          "false");
    _set_default(Cfg, "log_stats_combined", "false");

    _set_default(Cfg, "no_sync",            "false");
    _set_default(Cfg, "lock_sync_file",     "/var/lib/surealived/ipvsfull.lock");
    _set_default(Cfg, "full_sync_file",     "/var/lib/surealived/ipvsfull.cfg");
    _set_default(Cfg, "full_reload_file",   "/var/lib/surealived/ipvsfull.reload");
    _set_default(Cfg, "diff_sync_dir",      "/var/lib/surealived/diffs");

    _set_default(Cfg, "offline_dump",       "/var/lib/surealived/offline.dump");
    _set_default(Cfg, "use_offline_dump",   "true");
    _set_default(Cfg, "override_dump",      "/var/lib/surealived/override.dump");

    _set_default(Cfg, "gather_stats",       "true");
    _set_default(Cfg, "stats_dump",         "/var/lib/surealived/stats.dump");
    _set_default(Cfg, "stats_dump_savesec", "60");

    _set_default(Cfg, "notify_dump",        "/var/lib/surealived/notify.dump");

    _set_default(Cfg, "epoll_size",         "256"); 

    in = fopen(fname, "r");
    if (in) {
        while (fgets(line, BUFSIZ, in)) {
            g_strchomp(line);

            if (line[0] == '#')
                continue;

            if (sscanf(line, "%32s %1024s", key, value) == 2)
                g_hash_table_replace(Cfg, g_strdup(key), g_strdup(value));
        }

        fclose(in);
    }

    /* Do we use logging to file */
    if (toupper(((gchar *)g_hash_table_lookup(Cfg, "use_log"))[0]) == 'T')
        G_use_log = TRUE;

    /* Do we use syslog? */
    if (toupper(((gchar *)g_hash_table_lookup(Cfg, "use_syslog"))[0]) == 'T')
        G_use_syslog = TRUE;

    /* Add timestamp to syslog messages? */
    if (toupper(((gchar *)g_hash_table_lookup(Cfg, "use_tm_in_syslog"))[0]) == 'T')
        G_use_tm_in_syslog = TRUE;

    if (G_test_config) {
        G_use_syslog = FALSE;
        G_logfd = STDERR_FILENO;
    }

    G_logfname = g_hash_table_lookup(Cfg, "log");
    if (!strcmp(G_logfname, "stderr"))
        G_logfd = STDERR_FILENO;

    log_init(&G_logfd, G_logfname, G_use_log, G_use_syslog, G_use_tm_in_syslog, "surealived");

    log_message(2, TRUE, TRUE, "Starting surealived %s", VERSION);
    log_message(2, TRUE, TRUE, "logging level: %s", g_hash_table_lookup(Cfg, "logging"));
    log_message(2, TRUE, TRUE, "log file: %s", G_logfname);

    /* Set global variable: logging */
    if (G_logging < 0)
        G_logging = log_level_no(g_hash_table_lookup(Cfg, "logging"));

    /* Verify and try to setrlimit for maxfd */
    if (getrlimit(RLIMIT_NOFILE, &lim))
        LOGWARN("%s", "getrlimit error");
    else
        LOGINFO("current maxfd: (soft=%d, hard=%d)",
            (int) lim.rlim_cur, (int) lim.rlim_max);

    currnfd = (int) lim.rlim_cur;
    nfd = atoi((char *) g_hash_table_lookup(Cfg, "maxfd"));
    if (lim.rlim_max < nfd) {
        lim.rlim_cur = nfd;
        lim.rlim_max = nfd;
    }
    else
        lim.rlim_cur = nfd;

    if (setrlimit(RLIMIT_NOFILE, &lim)) {
        gchar t[16];
        sprintf(t, "%d", currnfd);
        g_hash_table_replace(Cfg, g_strdup("maxfd"), g_strdup(t));
        LOGWARN("setrlimit error: [sys=%s]", STRERROR);
    } 
    else 
        LOGINFO("changed maxfd to: (soft=%d, hard=%d)",
                (int) lim.rlim_cur, (int) lim.rlim_max);

    sscanf(g_hash_table_lookup(Cfg, "listen_port"), "%hu", &G_listen_port);
    G_listen_addr = g_hash_table_lookup(Cfg, "listen_addr");
    sscanf(g_hash_table_lookup(Cfg, "memlimit"), "%u", &G_memlimit);

    sscanf(g_hash_table_lookup(Cfg, "loop_interval_ms"), "%u", &G_loop_interval_ms);
    sscanf(g_hash_table_lookup(Cfg, "epoll_interval_ms"), "%u", &G_epoll_interval_ms);
    sscanf(g_hash_table_lookup(Cfg, "startup_delay_ms"), "%u", &G_startup_delay_ms);
    sscanf(g_hash_table_lookup(Cfg, "debug_comm"), "%u", &G_debug_comm);
    G_debug_comm_path = g_hash_table_lookup(Cfg, "debug_comm_path");

    G_stats_dir = g_hash_table_lookup(Cfg, "stats_dir");
    if (toupper(((gchar *)g_hash_table_lookup(Cfg, "log_stats"))[0]) == 'T')
        G_log_stats = TRUE;
    if (toupper(((gchar *)g_hash_table_lookup(Cfg, "log_stats_combined"))[0]) == 'T')
        G_log_stats_combined = TRUE;
    if (G_log_stats || G_log_stats_combined)
        mkdir(G_stats_dir, 0700);

    if (toupper(((gchar *)g_hash_table_lookup(Cfg, "no_sync"))[0]) == 'T')
        G_no_sync = TRUE;
    G_lock_sync_file = g_hash_table_lookup(Cfg, "lock_sync_file");
    G_full_sync_file = g_hash_table_lookup(Cfg, "full_sync_file");
    G_full_reload_file = g_hash_table_lookup(Cfg, "full_reload_file");
    G_diff_sync_dir = g_hash_table_lookup(Cfg, "diff_sync_dir");

    if (toupper(((gchar *)g_hash_table_lookup(Cfg, "use_offline_dump"))[0]) == 'T')
        G_use_offline_dump = TRUE;
    else
        G_use_offline_dump = FALSE;

    G_offline_dump = g_hash_table_lookup(Cfg, "offline_dump");
    G_override_dump = g_hash_table_lookup(Cfg, "override_dump");

    if (toupper(((gchar *)g_hash_table_lookup(Cfg, "gather_stats"))[0]) == 'T')
        G_gather_stats = TRUE;
    else
        G_gather_stats = FALSE;
    G_stats_dump = g_hash_table_lookup(Cfg, "stats_dump");
    sscanf(g_hash_table_lookup(Cfg, "stats_dump_savesec"), "%u", &G_stats_dump_savesec);

    G_notify_dump = g_hash_table_lookup(Cfg, "notify_dump");

    if (G_loop_interval_ms > G_startup_delay_ms) {
        LOGWARN("loop_interval_ms MUST BE <= startup_delay_ms, "
            "setting loop_interval_ms = startup_delay_ms/2");
        G_loop_interval_ms = G_startup_delay_ms/2;
    }

    G_epoll_size = atoi((gchar *)g_hash_table_lookup(Cfg, "epoll_size"));;
    
    return in ? TRUE : FALSE;
}
Esempio n. 3
0
gboolean maincfg_new(gchar *fname) {
    FILE *in;
//    gchar *logfname;
    gchar line[BUFSIZ];
    gchar key[32], value[1024];

    if (Cfg)
        g_hash_table_destroy(Cfg);

    Cfg = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
    assert(Cfg);

    /* setting defaults */
    _set_default(Cfg, "ipvssync_log",       "/var/log/surealived/ipvssync.log");
    _set_default(Cfg, "use_log",            "false");
    _set_default(Cfg, "ipvssync_logging",   "debug");
    _set_default(Cfg, "use_syslog",         "false");
    _set_default(Cfg, "use_tm_in_syslog",   "false");
    _set_default(Cfg, "no_sync",            "false");
    _set_default(Cfg, "lock_sync_file",     "/var/lib/surealived/ipvsfull.lock");
    _set_default(Cfg, "full_sync_file",     "/var/lib/surealived/ipvsfull.cfg");
    _set_default(Cfg, "full_reload_file",   "/var/lib/surealived/ipvsfull.reload");
    _set_default(Cfg, "diff_sync_dir",      "/var/lib/surealived/diffs");

    in = fopen(fname, "r");
    if (in) {
        while (fgets(line, BUFSIZ, in)) {
            g_strchomp(line);

            if (line[0] == '#')
                continue;

            if (sscanf(line, "%32s %1024s", key, value) == 2)
                g_hash_table_replace(Cfg, g_strdup(key), g_strdup(value));
        }

        fclose(in);
    }

    /* Open log file (global flog) - if not already set to stderr */
    G_logfname = g_hash_table_lookup(Cfg, "ipvssync_log");
    if (!strcmp(G_logfname, "stderr"))
        G_logfd = STDERR_FILENO;

    if (toupper(((gchar *)g_hash_table_lookup(Cfg, "use_log"))[0]) == 'T')
        G_use_log = TRUE;

    if (toupper(((gchar *)g_hash_table_lookup(Cfg, "use_syslog"))[0]) == 'T')
        G_use_syslog = TRUE;

    if (toupper(((gchar *)g_hash_table_lookup(Cfg, "use_tm_in_syslog"))[0]) == 'T')
        G_use_tm_in_syslog = TRUE;


    log_init(&G_logfd, G_logfname, G_use_log, G_use_syslog, G_use_tm_in_syslog, "ipvssync");

    /* Set global variable: logging */
    if (G_logging < 0)
        G_logging = log_level_no(g_hash_table_lookup(Cfg, "ipvssync_logging"));

    log_message(2, TRUE, TRUE, "Starting ipvssync");
    log_message(2, TRUE, TRUE, "logging level: %d", G_logging);
    log_message(2, TRUE, TRUE, "logging level: %s", log_level_str(G_logging));
    if (G_logfname)
        log_message(2, TRUE, TRUE, "log file: %s", G_logfname);

    if (toupper(((gchar *)g_hash_table_lookup(Cfg, "no_sync"))[0]) == 'T')
        G_no_sync = TRUE;
    G_lock_sync_file = g_hash_table_lookup(Cfg, "lock_sync_file");
    G_full_sync_file = g_hash_table_lookup(Cfg, "full_sync_file");
    G_full_reload_file = g_hash_table_lookup(Cfg, "full_reload_file");
    G_diff_sync_dir = g_hash_table_lookup(Cfg, "diff_sync_dir");
    
    return in ? TRUE : FALSE;
}