Annotation of embedaddon/bmon/src/conf.c, revision 1.1.1.3

1.1       misho       1: /*
                      2:  * conf.c        Config Crap
                      3:  *
1.1.1.2   misho       4:  * Copyright (c) 2001-2013 Thomas Graf <tgraf@suug.ch>
                      5:  * Copyright (c) 2013 Red Hat, Inc.
1.1       misho       6:  *
                      7:  * Permission is hereby granted, free of charge, to any person obtaining a
                      8:  * copy of this software and associated documentation files (the "Software"),
                      9:  * to deal in the Software without restriction, including without limitation
                     10:  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
                     11:  * and/or sell copies of the Software, and to permit persons to whom the
                     12:  * Software is furnished to do so, subject to the following conditions:
                     13:  *
                     14:  * The above copyright notice and this permission notice shall be included
                     15:  * in all copies or substantial portions of the Software.
                     16:  *
                     17:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
                     18:  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
                     19:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
                     20:  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
                     21:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
                     22:  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
                     23:  * DEALINGS IN THE SOFTWARE.
                     24:  */
                     25: 
                     26: #include <bmon/bmon.h>
                     27: #include <bmon/conf.h>
1.1.1.2   misho      28: #include <bmon/unit.h>
                     29: #include <bmon/attr.h>
                     30: #include <bmon/element.h>
                     31: #include <bmon/element_cfg.h>
                     32: #include <bmon/history.h>
1.1.1.3 ! misho      33: #include <bmon/layout.h>
1.1       misho      34: #include <bmon/utils.h>
                     35: 
1.1.1.2   misho      36: cfg_t *cfg;
                     37: 
                     38: static cfg_opt_t element_opts[] = {
                     39:        CFG_STR("description", NULL, CFGF_NONE),
                     40:        CFG_BOOL("show", cfg_true, CFGF_NONE),
                     41:        CFG_INT("rxmax", 0, CFGF_NONE),
                     42:        CFG_INT("txmax", 0, CFGF_NONE),
                     43:        CFG_INT("max", 0, CFGF_NONE),
                     44:        CFG_END()
                     45: };
                     46: 
                     47: static cfg_opt_t history_opts[] = {
                     48:        CFG_FLOAT("interval", 1.0f, CFGF_NONE),
                     49:        CFG_INT("size", 60, CFGF_NONE),
                     50:        CFG_STR("type", "64bit", CFGF_NONE),
                     51:        CFG_END()
                     52: };
                     53: 
                     54: static cfg_opt_t attr_opts[] = {
                     55:        CFG_STR("description", "", CFGF_NONE),
                     56:        CFG_STR("unit", "", CFGF_NONE),
                     57:        CFG_STR("type", "counter", CFGF_NONE),
                     58:        CFG_BOOL("history", cfg_false, CFGF_NONE),
                     59:        CFG_END()
                     60: };
                     61: 
                     62: static cfg_opt_t variant_opts[] = {
                     63:        CFG_FLOAT_LIST("div", "{}", CFGF_NONE),
                     64:        CFG_STR_LIST("txt", "", CFGF_NONE),
                     65:        CFG_END()
                     66: };
                     67: 
                     68: static cfg_opt_t unit_opts[] = {
                     69:        CFG_SEC("variant", variant_opts, CFGF_MULTI | CFGF_TITLE),
                     70:        CFG_END()
                     71: };
                     72: 
1.1.1.3 ! misho      73: static cfg_opt_t color_opts[] = {
        !            74:     CFG_STR_LIST("color_pair", "", CFGF_NONE),
        !            75:     CFG_END()
        !            76: };
        !            77: 
        !            78: static cfg_opt_t layout_opts[] = {
        !            79:     CFG_SEC("color", color_opts, CFGF_MULTI | CFGF_TITLE),
        !            80:     CFG_END()
        !            81: };
        !            82: 
1.1.1.2   misho      83: static cfg_opt_t global_opts[] = {
                     84:        CFG_FLOAT("read_interval", 1.0f, CFGF_NONE),
                     85:        CFG_FLOAT("rate_interval", 1.0f, CFGF_NONE),
                     86:        CFG_FLOAT("lifetime", 30.0f, CFGF_NONE),
                     87:        CFG_FLOAT("history_variance", 0.1f, CFGF_NONE),
                     88:        CFG_FLOAT("variance", 0.1f, CFGF_NONE),
                     89:        CFG_BOOL("show_all", cfg_false, CFGF_NONE),
                     90:        CFG_INT("unit_exp", -1, CFGF_NONE),
                     91:        CFG_INT("sleep_time", 20000UL, CFGF_NONE),
                     92:        CFG_BOOL("use_si", 0, CFGF_NONE),
                     93:        CFG_BOOL("use_bit", 0, CFGF_NONE),
                     94:        CFG_STR("uid", NULL, CFGF_NONE),
                     95:        CFG_STR("gid", NULL, CFGF_NONE),
                     96:        CFG_STR("policy", "", CFGF_NONE),
                     97:        CFG_SEC("unit", unit_opts, CFGF_MULTI | CFGF_TITLE),
                     98:        CFG_SEC("attr", attr_opts, CFGF_MULTI | CFGF_TITLE),
                     99:        CFG_SEC("history", history_opts, CFGF_MULTI | CFGF_TITLE),
                    100:        CFG_SEC("element", element_opts, CFGF_MULTI | CFGF_TITLE),
1.1.1.3 ! misho     101:     CFG_SEC("layout", layout_opts, CFGF_MULTI | CFGF_TITLE),
1.1.1.2   misho     102:        CFG_END()
                    103: };
                    104: 
                    105: float                  cfg_read_interval;
                    106: float                  cfg_rate_interval;
                    107: float                  cfg_rate_variance;
                    108: float                  cfg_history_variance;
                    109: int                    cfg_show_all;
                    110: int                    cfg_unit_exp            = DYNAMIC_EXP;
                    111: 
                    112: static char *          configfile              = NULL;
1.1       misho     113: 
                    114: #if defined HAVE_CURSES
                    115: #if defined HAVE_USE_DEFAULT_COLORS
1.1.1.2   misho     116: struct layout cfg_layout[] =
1.1       misho     117: {
1.1.1.3 ! misho     118:     {-1, -1, 0},            /* dummy, not used */
        !           119:     {-1, -1, 0},            /* default */
        !           120:     {-1, -1, A_REVERSE},    /* statusbar */
        !           121:     {-1, -1, 0},            /* header */
        !           122:     {-1, -1, 0},            /* list */
        !           123:     {-1, -1, A_REVERSE},    /* selected */
        !           124:     {-1, -1, 0},            /* RX graph */
        !           125:     {-1, -1, 0},            /* TX graph */
1.1       misho     126: };
                    127: #else
1.1.1.2   misho     128: struct layout cfg_layout[] =
1.1       misho     129: {
1.1.1.3 ! misho     130:        {0, 0, 0},                               /* dummy, not used */
        !           131:        {COLOR_WHITE, COLOR_BLACK, 0},           /* default */
        !           132:        {COLOR_BLUE,   COLOR_GREEN, A_REVERSE},  /* statusbar */
        !           133:        {COLOR_GREEN,  COLOR_BLACK, 0},          /* header */
        !           134:        {COLOR_WHITE,  COLOR_BLACK, 0},          /* list */
        !           135:        {COLOR_YELLOW, COLOR_BLACK, A_REVERSE},  /* selected */
        !           136:     {COLOR_GREEN,  COLOR_BLACK, 0},          /* RX graph */
        !           137:     {COLOR_RED,    COLOR_BLACK, 0},          /* TX graph */
1.1       misho     138: };
                    139: #endif
                    140: #endif
                    141: 
                    142: tv_t * parse_tv(char *data)
                    143: {
                    144:        char *value;
                    145:        tv_t *tv = xcalloc(1, sizeof(tv_t));
                    146: 
1.1.1.2   misho     147:        init_list_head(&tv->tv_list);
                    148: 
1.1       misho     149:        value = strchr(data, '=');
                    150: 
                    151:        if (value) {
                    152:                *value = '\0';
                    153:                ++value;
1.1.1.2   misho     154:                tv->tv_value = strdup(value);
1.1       misho     155:        }
                    156: 
1.1.1.2   misho     157:        tv->tv_type = strdup(data);
1.1       misho     158:        return tv;
                    159: }
                    160: 
                    161: module_conf_t * parse_module(char *data)
                    162: {
                    163:        char *name = data, *opts = data, *next;
                    164:        module_conf_t *m;
                    165: 
                    166:        if (!*name)
                    167:                quit("No module name given");
                    168: 
                    169:        m = xcalloc(1, sizeof(module_conf_t));
                    170: 
1.1.1.2   misho     171:        init_list_head(&m->m_attrs);
                    172: 
1.1       misho     173:        opts = strchr(data, ':');
                    174: 
                    175:        if (opts) {
                    176:                *opts = '\0';
                    177:                opts++;
                    178: 
                    179:                do {
                    180:                        tv_t *tv;
                    181:                        next = strchr(opts, ';');
                    182: 
                    183:                        if (next) {
                    184:                                *next = '\0';
                    185:                                ++next;
                    186:                        }
                    187: 
                    188:                        tv = parse_tv(opts);
1.1.1.2   misho     189:                        list_add_tail(&tv->tv_list, &m->m_attrs);
1.1       misho     190: 
                    191:                        opts = next;
                    192:                } while(next);
                    193:        }
                    194: 
1.1.1.2   misho     195:        m->m_name = strdup(name);
1.1       misho     196:        return m;
                    197: }
                    198: 
                    199: 
1.1.1.2   misho     200: int parse_module_param(const char *data, struct list_head *list)
1.1       misho     201: {
                    202:        char *buf = strdup(data);
                    203:        char *next;
                    204:        char *current = buf;
1.1.1.2   misho     205:        module_conf_t *m;
                    206:        int n = 0;
1.1       misho     207:        
                    208:        do {
                    209:                next = strchr(current, ',');
                    210: 
                    211:                if (next) {
                    212:                        *next = '\0';
                    213:                        ++next;
                    214:                }
                    215: 
                    216:                m = parse_module(current);
                    217:                if (m) {
1.1.1.2   misho     218:                        list_add_tail(&m->m_list, list);
                    219:                        n++;
1.1       misho     220:                }
                    221: 
                    222:                current = next;
                    223:        } while (next);
                    224: 
                    225:        free(buf);
                    226: 
1.1.1.2   misho     227:        return n;
1.1       misho     228: }
                    229: 
1.1.1.2   misho     230: static void configfile_read_history(void)
1.1       misho     231: {
1.1.1.2   misho     232:        int i, nhistory;
1.1       misho     233: 
1.1.1.2   misho     234:        nhistory = cfg_size(cfg, "history");
1.1       misho     235: 
1.1.1.2   misho     236:        for (i = 0; i < nhistory; i++) {
                    237:                struct history_def *def;
                    238:                cfg_t *history;
                    239:                const char *name, *type;
                    240:                float interval;
                    241:                int size;
1.1       misho     242: 
1.1.1.2   misho     243:                if (!(history = cfg_getnsec(cfg, "history", i)))
                    244:                        BUG();
1.1       misho     245: 
1.1.1.2   misho     246:                if (!(name = cfg_title(history)))
                    247:                        BUG();
1.1       misho     248: 
1.1.1.2   misho     249:                interval = cfg_getfloat(history, "interval");
                    250:                size = cfg_getint(history, "size");
                    251:                type = cfg_getstr(history, "type");
1.1       misho     252: 
1.1.1.2   misho     253:                if (interval == 0.0f)
                    254:                        interval = cfg_getfloat(cfg, "read_interval");
1.1       misho     255: 
1.1.1.2   misho     256:                def = history_def_alloc(name);
                    257:                def->hd_interval = interval;
                    258:                def->hd_size = size;
1.1       misho     259: 
1.1.1.2   misho     260:                if (!strcasecmp(type, "8bit"))
                    261:                        def->hd_type = HISTORY_TYPE_8;
                    262:                else if (!strcasecmp(type, "16bit"))
                    263:                        def->hd_type = HISTORY_TYPE_16;
                    264:                else if (!strcasecmp(type, "32bit"))
                    265:                        def->hd_type = HISTORY_TYPE_32;
                    266:                else if (!strcasecmp(type, "64bit"))
                    267:                        def->hd_type = HISTORY_TYPE_64;
                    268:                else
                    269:                        quit("Invalid type \'%s\', must be \"(8|16|32|64)bit\""
                    270:                             " in history definition #%d\n", type, i+1);
1.1       misho     271:        }
                    272: }
                    273: 
1.1.1.2   misho     274: static void configfile_read_element_cfg(void)
1.1       misho     275: {
1.1.1.2   misho     276:        int i, nelement;
1.1       misho     277: 
1.1.1.2   misho     278:        nelement = cfg_size(cfg, "element");
1.1       misho     279: 
1.1.1.2   misho     280:        for (i = 0; i < nelement; i++) {
                    281:                struct element_cfg *ec;
                    282:                cfg_t *element;
                    283:                const char *name, *description;
                    284:                long max;
1.1       misho     285: 
1.1.1.2   misho     286:                if (!(element = cfg_getnsec(cfg, "element", i)))
                    287:                        BUG();
1.1       misho     288: 
1.1.1.2   misho     289:                if (!(name = cfg_title(element)))
                    290:                        BUG();
1.1       misho     291: 
1.1.1.2   misho     292:                ec = element_cfg_alloc(name);
1.1       misho     293: 
1.1.1.2   misho     294:                if ((description = cfg_getstr(element, "description")))
                    295:                        ec->ec_description = strdup(description);
1.1       misho     296: 
1.1.1.2   misho     297:                if ((max = cfg_getint(element, "max")))
                    298:                        ec->ec_rxmax = ec->ec_txmax = max;
1.1       misho     299: 
1.1.1.2   misho     300:                if ((max = cfg_getint(element, "rxmax")))
                    301:                        ec->ec_rxmax = max;
1.1       misho     302: 
1.1.1.2   misho     303:                if ((max = cfg_getint(element, "txmax")))
                    304:                        ec->ec_txmax = max;
1.1       misho     305: 
1.1.1.2   misho     306:                if (cfg_getbool(element, "show"))
                    307:                        ec->ec_flags |= ELEMENT_CFG_SHOW;
1.1       misho     308:                else
1.1.1.2   misho     309:                        ec->ec_flags |= ELEMENT_CFG_HIDE;
1.1       misho     310:        }
                    311: }
                    312: 
1.1.1.2   misho     313: static void add_div(struct unit *unit, int type, cfg_t *variant)
1.1       misho     314: {
1.1.1.2   misho     315:        int ndiv, n, ntxt;
1.1       misho     316: 
1.1.1.2   misho     317:        if (!(ndiv = cfg_size(variant, "div")))
                    318:                return;
1.1       misho     319: 
1.1.1.2   misho     320:        ntxt = cfg_size(variant, "txt");
                    321:        if (ntxt != ndiv)
                    322:                quit("Number of elements for div and txt not equal\n");
1.1       misho     323: 
1.1.1.2   misho     324:        if (!list_empty(&unit->u_div[type])) {
                    325:                struct fraction *f, *n;
                    326: 
                    327:                list_for_each_entry_safe(f, n, &unit->u_div[type], f_list)
                    328:                        fraction_free(f);
1.1       misho     329:        }
                    330: 
1.1.1.2   misho     331:        for (n = 0; n < ndiv; n++) {
                    332:                char *txt;
                    333:                float div;
1.1       misho     334: 
1.1.1.2   misho     335:                div = cfg_getnfloat(variant, "div", n);
                    336:                txt = cfg_getnstr(variant, "txt", n);
                    337: 
                    338:                unit_add_div(unit, type, txt, div);
1.1       misho     339:        }
                    340: }
                    341: 
1.1.1.2   misho     342: static void configfile_read_units(void)
1.1       misho     343: {
1.1.1.2   misho     344:        int i, nunits;
                    345:        struct unit *u;
1.1       misho     346: 
1.1.1.2   misho     347:        nunits = cfg_size(cfg, "unit");
1.1       misho     348: 
1.1.1.2   misho     349:        for (i = 0; i < nunits; i++) {
                    350:                int nvariants, n;
                    351:                cfg_t *unit;
                    352:                const char *name;
1.1       misho     353: 
1.1.1.2   misho     354:                if (!(unit = cfg_getnsec(cfg, "unit", i)))
                    355:                        BUG();
1.1       misho     356: 
1.1.1.2   misho     357:                if (!(name = cfg_title(unit)))
                    358:                        BUG();
1.1       misho     359: 
1.1.1.2   misho     360:                if (!(nvariants = cfg_size(unit, "variant")))
                    361:                        continue;
1.1       misho     362: 
1.1.1.2   misho     363:                if (!(u = unit_add(name)))
                    364:                        continue;
                    365: 
                    366:                for (n = 0; n < nvariants; n++) {
                    367:                        cfg_t *variant;
                    368:                        const char *vtitle;
                    369: 
                    370:                        if (!(variant = cfg_getnsec(unit, "variant", n)))
                    371:                                BUG();
                    372: 
                    373:                        if (!(vtitle = cfg_title(variant)))
                    374:                                BUG();
                    375: 
                    376:                        if (!strcasecmp(vtitle, "default"))
                    377:                                add_div(u, UNIT_DEFAULT, variant);
                    378:                        else if (!strcasecmp(vtitle, "si"))
                    379:                                add_div(u, UNIT_SI, variant);
                    380:                        else if (!strcasecmp(vtitle, "bit"))
                    381:                                add_div(u, UNIT_BIT, variant);
                    382:                        else
                    383:                                quit("Unknown unit variant \'%s\'\n", vtitle);
                    384:                }
1.1       misho     385:        }
                    386: }
                    387: 
1.1.1.2   misho     388: static void configfile_read_attrs(void)
1.1       misho     389: {
1.1.1.3 ! misho     390:        int i, nattrs, t = 0;
1.1       misho     391: 
1.1.1.2   misho     392:        nattrs = cfg_size(cfg, "attr");
                    393: 
                    394:        for (i = 0; i < nattrs; i++) {
                    395:                struct unit *u;
                    396:                cfg_t *attr;
                    397:                const char *name, *description, *unit, *type;
                    398:                int flags = 0;
                    399: 
                    400:                if (!(attr = cfg_getnsec(cfg, "attr", i)))
                    401:                        BUG();
                    402: 
                    403:                if (!(name = cfg_title(attr)))
                    404:                        BUG();
                    405: 
                    406:                description = cfg_getstr(attr, "description");
                    407:                unit = cfg_getstr(attr, "unit");
                    408:                type = cfg_getstr(attr, "type");
                    409: 
                    410:                if (!unit)
                    411:                        quit("Attribute '%s' is missing unit specification\n",
                    412:                             name);
                    413: 
                    414:                if (!type)
                    415:                        quit("Attribute '%s' is missing type specification\n",
                    416:                             name);
                    417: 
                    418:                if (!(u = unit_lookup(unit)))
                    419:                        quit("Unknown unit \'%s\' attribute '%s'\n",
                    420:                                unit, name);
                    421: 
                    422:                if (!strcasecmp(type, "counter"))
                    423:                        t = ATTR_TYPE_COUNTER;
                    424:                else if (!strcasecmp(type, "rate"))
                    425:                        t = ATTR_TYPE_RATE;
                    426:                else if (!strcasecmp(type, "percent"))
                    427:                        t = ATTR_TYPE_PERCENT;
                    428:                else
                    429:                        quit("Unknown type \'%s\' in attribute '%s'\n",
                    430:                                type, name);
                    431: 
                    432:                if (cfg_getbool(attr, "history"))
                    433:                        flags |= ATTR_FORCE_HISTORY;
                    434: 
                    435:                if (cfg_getbool(attr, "ignore_overflows"))
                    436:                        flags |= ATTR_IGNORE_OVERFLOWS;
                    437: 
                    438:                attr_def_add(name, description, u, t, flags);
1.1       misho     439:        }
                    440: }
                    441: 
1.1.1.3 ! misho     442: static void configfile_read_layout_cfg(void)
        !           443: {
        !           444:     int i, nlayouts;
        !           445:     cfg_t *lout;
        !           446:     nlayouts = cfg_size(cfg, "layout");
        !           447:     for (i = 0; i < nlayouts; i++)
        !           448:     {
        !           449:         int c, ncolors;
        !           450:         const char *name;
        !           451:         if (!(lout = cfg_getnsec(cfg, "layout", i)))
        !           452:             BUG();
        !           453: 
        !           454:         if (!(name = cfg_title(lout)))
        !           455:             BUG();
        !           456: 
        !           457:         ncolors = cfg_size(lout, "color");
        !           458:         if (ncolors > LAYOUT_MAX) {
        !           459:             fprintf(stderr, "Warning excceeded maximum number of layouts\n");
        !           460:             ncolors = LAYOUT_MAX;
        !           461:         }
        !           462: 
        !           463:         for (c = 0; c < ncolors; c++) {
        !           464:             cfg_t *color_pair;
        !           465: 
        !           466:             if (!(color_pair = cfg_getnsec(lout, "color", c)))
        !           467:                 BUG();
        !           468: 
        !           469:             if (!(name = cfg_title(color_pair)))
        !           470:                 BUG();
        !           471: 
        !           472:             add_layout(name, color_pair);
        !           473:         }
        !           474:     }
        !           475: }
        !           476: 
1.1.1.2   misho     477: static void conf_read(const char *path, int must)
1.1       misho     478: {
1.1.1.2   misho     479:        int err;
1.1       misho     480: 
1.1.1.2   misho     481:        DBG("Reading configfile %s...", path);
1.1       misho     482: 
1.1.1.2   misho     483:        if (access(path, R_OK) != 0) {
                    484:                if (must)
                    485:                        quit("Error: Unable to read configfile \"%s\": %s\n",
                    486:                             path, strerror(errno));
                    487:                else
                    488:                        return;
                    489:        }
                    490: 
                    491:        err = cfg_parse(cfg, path);
                    492:        if (err == CFG_FILE_ERROR) {
                    493:                quit("Error while reading configfile \"%s\": %s\n",
                    494:                     path, strerror(errno));
                    495:        } else if (err == CFG_PARSE_ERROR) {
                    496:                quit("Error while reading configfile \"%s\": parse error\n",
                    497:                     path);
                    498:        }
                    499: 
                    500:        configfile_read_units();
                    501:        configfile_read_history();
                    502:        configfile_read_attrs();
                    503:        configfile_read_element_cfg();
1.1.1.3 ! misho     504:     configfile_read_layout_cfg();
1.1.1.2   misho     505: }
                    506: 
                    507: static const char default_config[] = \
                    508: "unit byte {" \
                    509: "      variant default {" \
                    510: "              div     = { 1, 1024, 1048576, 1073741824, 1099511627776}" \
                    511: "              txt     = { \"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\" }" \
                    512: "      }" \
                    513: "      variant si {" \
                    514: "              div     = { 1, 1000, 1000000, 1000000000, 1000000000000 }" \
                    515: "              txt     = { \"B\", \"KB\", \"MB\", \"GB\", \"TB\" }" \
                    516: "      }" \
                    517: "      variant bit {" \
                    518: "              div     = { 0.125, 125, 125000, 125000000, 125000000000 }" \
                    519: "              txt     = { \"b\", \"Kb\", \"Mb\", \"Gb\", \"Tb\" }" \
                    520: "      }" \
                    521: " }" \
                    522: "unit bit {" \
                    523: "      variant default {" \
                    524: "              div     = { 1, 1000, 1000000, 1000000000, 1000000000000 }" \
                    525: "              txt     = { \"b\", \"Kb\", \"Mb\", \"Gb\", \"Tb\" }" \
                    526: "      }" \
                    527: "      variant si {" \
                    528: "              div     = { 1, 1000, 1000000, 1000000000, 1000000000000 }" \
                    529: "              txt     = { \"b\", \"Kb\", \"Mb\", \"Gb\", \"Tb\" }" \
                    530: "      }" \
                    531: "      variant bit {" \
                    532: "              div     = { 1, 1000, 1000000, 1000000000, 1000000000000 }" \
                    533: "              txt     = { \"b\", \"Kb\", \"Mb\", \"Gb\", \"Tb\" }" \
                    534: "      }" \
                    535: "}" \
                    536: "unit number {" \
                    537: "      variant default {" \
                    538: "              div     = { 1, 1000, 1000000, 1000000000, 1000000000000 }" \
                    539: "              txt     = { \"\", \"K\", \"M\", \"G\", \"T\" }" \
                    540: "      }" \
                    541: "}" \
                    542: "unit percent {" \
                    543: "      variant default {" \
                    544: "              div     = { 1. }" \
                    545: "              txt     = { \"%\" }" \
                    546: "      }" \
                    547: "}" \
                    548: "history second {" \
                    549: "      interval        = 1.0" \
                    550: "      size            = 60" \
                    551: "}" \
                    552: "history minute {" \
                    553: "      interval        = 60.0" \
                    554: "      size            = 60" \
                    555: "}" \
                    556: "history hour {" \
                    557: "      interval        = 3600.0" \
                    558: "      size            = 60" \
                    559: "}" \
                    560: "history day {" \
                    561: "      interval        = 86400.0" \
                    562: "      size            = 60" \
1.1.1.3 ! misho     563: "}"
        !           564: "layout colors {" \
        !           565: "   color default {" \
        !           566: "       color_pair = { \"white\", \"black\" }" \
        !           567: "   }" \
        !           568: "   color statusbar{" \
        !           569: "       color_pair = { \"blue\", \"white\", \"reverse\" }" \
        !           570: "   }" \
        !           571: "   color header {" \
        !           572: "       color_pair = { \"yellow\", \"black\" }" \
        !           573: "   }" \
        !           574: "   color list {" \
        !           575: "       color_pair = { \"white\", \"black\" }" \
        !           576: "   }" \
        !           577: "   color selected {" \
        !           578: "       color_pair = { \"yellow\", \"black\", \"reverse\" }" \
        !           579: "   }" \
        !           580: "   color rx_graph {" \
        !           581: "       color_pair = { \"green\", \"black\" }" \
        !           582: "   }" \
        !           583: "   color tx_graph {" \
        !           584: "       color_pair = { \"red\", \"black\" }" \
        !           585: "   }" \
1.1.1.2   misho     586: "}";
                    587: 
                    588: static void conf_read_default(void)
                    589: {
                    590:        int err;
                    591: 
                    592:        DBG("Reading default config");
                    593: 
                    594:        err = cfg_parse_buf(cfg, default_config);
                    595:        if (err)
                    596:                quit("Error while parsing default config\n");
                    597: 
                    598:        configfile_read_units();
                    599:        configfile_read_history();
                    600:        configfile_read_attrs();
                    601:        configfile_read_element_cfg();
1.1.1.3 ! misho     602:     configfile_read_layout_cfg();
1.1       misho     603: }
                    604: 
1.1.1.2   misho     605: void configfile_read(void)
1.1       misho     606: {
1.1.1.2   misho     607:        if (configfile)
                    608:                conf_read(configfile, 1);
                    609:        else {
                    610:                conf_read(SYSCONFDIR "/bmon.conf", 0);
                    611:                
                    612:                if (getenv("HOME")) {
                    613:                        char path[FILENAME_MAX+1];
                    614:                        snprintf(path, sizeof(path), "%s/.bmonrc",
                    615:                                 getenv("HOME"));
                    616:                        conf_read(path, 0);
                    617:                }
1.1       misho     618:        }
                    619: }
                    620: 
1.1.1.2   misho     621: void conf_init_pre(void)
1.1       misho     622: {
1.1.1.2   misho     623:        conf_read_default();
1.1       misho     624: }
                    625: 
1.1.1.2   misho     626: void conf_init_post(void)
1.1       misho     627: {
1.1.1.2   misho     628:        cfg_read_interval = cfg_getfloat(cfg, "read_interval");
                    629:        cfg_rate_interval = cfg_getfloat(cfg, "rate_interval");
                    630:        cfg_rate_variance = cfg_getfloat(cfg, "variance") * cfg_rate_interval;
                    631:        cfg_history_variance = cfg_getfloat(cfg, "history_variance");
                    632:        cfg_show_all = cfg_getbool(cfg, "show_all");
                    633:        cfg_unit_exp = cfg_getint(cfg, "unit_exp");
                    634: 
                    635:        element_parse_policy(cfg_getstr(cfg, "policy"));
1.1       misho     636: }
                    637: 
1.1.1.2   misho     638: void set_configfile(const char *file)
1.1       misho     639: {
                    640:        static int set = 0;
                    641:        if (!set) {
1.1.1.2   misho     642:                configfile = strdup(file);
1.1       misho     643:                set = 1;
                    644:        }
                    645: }
                    646: 
1.1.1.2   misho     647: void set_unit_exp(const char *name)
1.1       misho     648: {
1.1.1.2   misho     649:        if (tolower(*name) == 'b')
                    650:                cfg_setint(cfg, "unit_exp", 0);
                    651:        else if (tolower(*name) == 'k')
                    652:                cfg_setint(cfg, "unit_exp", 1);
                    653:        else if (tolower(*name) == 'm')
                    654:                cfg_setint(cfg, "unit_exp", 2);
                    655:        else if (tolower(*name) == 'g')
                    656:                cfg_setint(cfg, "unit_exp", 3);
                    657:        else if (tolower(*name) == 't')
                    658:                cfg_setint(cfg, "unit_exp", 4);
                    659:        else if (tolower(*name) == 'd')
                    660:                cfg_setint(cfg, "unit_exp", DYNAMIC_EXP);
                    661:        else
                    662:                quit("Unknown unit exponent '%s'\n", name);
1.1       misho     663: }
                    664: 
1.1.1.2   misho     665: unsigned int get_lifecycles(void)
1.1       misho     666: {
1.1.1.2   misho     667:        return (unsigned int)
                    668:                (cfg_getfloat(cfg, "lifetime") / cfg_getfloat(cfg, "read_interval"));
1.1       misho     669: }
                    670: 
1.1.1.2   misho     671: static void __exit conf_shutdown(void)
1.1       misho     672: {
1.1.1.2   misho     673:        cfg_free(cfg);
1.1       misho     674: }
                    675: 
1.1.1.2   misho     676: static void __init __conf_init(void)
1.1       misho     677: {
1.1.1.2   misho     678:        DBG("init");
                    679: 
                    680:        cfg = cfg_init(global_opts, CFGF_NOCASE);
                    681: 
                    682:        /* FIXME: Add validation functions */
                    683:        //cfg_set_validate_func(cfg, "bookmark", &cb_validate_bookmark);
1.1       misho     684: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>