X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils%2Fion-statusd%2Fion-statusd.c;fp=utils%2Fion-statusd%2Fion-statusd.c;h=da9e432cd2d9b2970f0f05c31c1d6a45557627c1;hb=a6561c9679cd701b0d50c3cfd44e4664f7df2b2f;hp=0000000000000000000000000000000000000000;hpb=cd09055902de482a1be019bf4b4efdae64c98d35;p=ion3.git diff --git a/utils/ion-statusd/ion-statusd.c b/utils/ion-statusd/ion-statusd.c new file mode 100644 index 0000000..da9e432 --- /dev/null +++ b/utils/ion-statusd/ion-statusd.c @@ -0,0 +1,311 @@ +/* + * ion/utils/ion-statusd/ion-statusd.c + * + * Copyright (c) Tuomo Valkonen 2004-2006. + * + * Ion is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef CF_NO_LOCALE +#include +#endif + +#include "../../version.h" + + +static OptParserOpt ion_opts[]={ + /*{OPT_ID('d'), "display", OPT_ARG, "host:dpy.scr", + DUMMY_TR("X display to use")},*/ + + {'c', "conffile", OPT_ARG, "config_file", + DUMMY_TR("Configuration file")}, + + {'s', "searchdir", OPT_ARG, "dir", + DUMMY_TR("Add directory to search path")}, + + /*{OPT_ID('s'), "session", OPT_ARG, "session_name", + DUMMY_TR("Name of session (affects savefiles)")},*/ + + {'h', "help", 0, NULL, + DUMMY_TR("Show this help")}, + + {'V', "version", 0, NULL, + DUMMY_TR("Show program version")}, + + {OPT_ID('a'), "about", 0, NULL, + DUMMY_TR("Show about text")}, + + {'q', "quiet", 0, NULL, + DUMMY_TR("Quiet mode")}, + + {'m', "meter", OPT_ARG, "meter_module", + DUMMY_TR("Load a meter module")}, + + END_OPTPARSEROPTS +}; + + +static const char statusd_copy[]= + "Ion-statusd " ION_VERSION ", copyright (c) Tuomo Valkonen 2004-2005."; + + +static const char statusd_license[]=DUMMY_TR( + "This program is free software; you can redistribute it and/or\n" + "modify it under the terms of the GNU Lesser General Public\n" + "License as published by the Free Software Foundation; either\n" + "version 2.1 of the License, or (at your option) any later version.\n" + "\n" + "This program is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" + "Lesser General Public License for more details.\n"); + + +/* new_informs=TRUE because we should always print period when + * initialisation is done. + */ +static bool new_informs=TRUE; +static ExtlTab configtab; + +static void help() +{ + int i; + printf(TR("Usage: %s [options]\n\n"), libtu_progname()); + for(i=0; ion_opts[i].descr!=NULL; i++) + ion_opts[i].descr=TR(ion_opts[i].descr); + optparser_printhelp(OPTP_MIDLONG, ion_opts); + printf("\n"); +} + + +static void flush_informs() +{ + if(new_informs){ + printf(".\n"); + fflush(stdout); + new_informs=FALSE; + } +} + + +static void mainloop() +{ + sigset_t trapset; + + sigemptyset(&trapset); + sigaddset(&trapset, SIGALRM); + sigaddset(&trapset, SIGCHLD); + mainloop_trap_signals(&trapset); + + while(1){ + int kill_sig=mainloop_check_signals(); + if(kill_sig!=0 && kill_sig!=SIGUSR1){ + if(kill_sig==SIGTERM) + exit(EXIT_FAILURE); + else + kill(getpid(), kill_sig); + } + + mainloop_execute_deferred(); + + flush_informs(); + + mainloop_select(); + } +} + + +extern bool statusd_register_exports(); +extern void statusd_unregister_exports(); + + +static void stdout_closed(int fd, void *data) +{ + exit(EXIT_SUCCESS); +} + + +int main(int argc, char*argv[]) +{ + const char *mod=NULL; + char *mod2=NULL; + int loaded=0; + int opt; + bool quiet=FALSE; + +#ifndef CF_NO_LOCALE + if(setlocale(LC_ALL, "")==NULL) + warn("setlocale() call failed."); +#endif + + configtab=extl_table_none(); + + libtu_init(argv[0]); + extl_init(); + + if(!statusd_register_exports()) + return EXIT_FAILURE; + + extl_add_searchdir(EXTRABINDIR); + extl_add_searchdir(MODULEDIR); + extl_add_searchdir(ETCDIR); + extl_add_searchdir(SHAREDIR); + extl_add_searchdir(LCDIR); + extl_set_userdirs("ion3"); + + optparser_init(argc, argv, OPTP_MIDLONG, ion_opts); + + extl_read_config("ioncore_luaext", NULL, TRUE); + + while((opt=optparser_get_opt())){ + switch(opt){ + /*case OPT_ID('d'): + display=optparser_get_arg(); + break;*/ + case 's': + extl_add_searchdir(optparser_get_arg()); + break; + /*case OPT_ID('s'): + extl_set_sessiondir(optparser_get_arg()); + break;*/ + case 'h': + help(); + return EXIT_SUCCESS; + case 'V': + printf("%s\n", ION_VERSION); + return EXIT_SUCCESS; + case OPT_ID('a'): + printf("%s\n\n%s", statusd_copy, TR(statusd_license)); + return EXIT_SUCCESS; + case 'c': + { + ExtlTab t; + const char *f=optparser_get_arg(); + if(extl_read_savefile(f, &t)){ + extl_unref_table(configtab); + configtab=t; + }else{ + warn(TR("Unable to load configuration file %s"), f); + } + } + break; + case 'q': + quiet=TRUE; + break; + case 'm': + mod=optparser_get_arg(); + if(strchr(mod, '/')==NULL && strchr(mod, '.')==NULL){ + mod2=scat("statusd_", mod); + if(mod2==NULL) + return EXIT_FAILURE; + mod=mod2; + } + if(extl_read_config(mod, NULL, !quiet)) + loaded++; + if(mod2!=NULL) + free(mod2); + break; + default: + warn(TR("Invalid command line.")); + help(); + return EXIT_FAILURE; + } + } + + if(loaded==0 && !quiet){ + warn(TR("No meters loaded.")); + return EXIT_FAILURE; + } + + mainloop(); + + return EXIT_SUCCESS; +} + + +/*EXTL_DOC + * Inform that meter \var{name} has value \var{value}. + */ +EXTL_EXPORT +void statusd_inform(const char *name, const char *value) +{ + printf("%s: %s\n", name, value); + new_informs=TRUE; +} + + +/*EXTL_DOC + * Get configuration table for module \var{name} + */ +EXTL_EXPORT +ExtlTab statusd_get_config(const char *name) +{ + if(name==NULL){ + return extl_ref_table(configtab); + }else{ + ExtlTab t; + if(extl_table_gets_t(configtab, name, &t)) + return t; + else + return extl_create_table(); + } +} + + +/*EXTL_DOC + * Get last file modification time. + */ +EXTL_EXPORT +double statusd_last_modified(const char *fname) +{ + struct stat st; + + if(fname==NULL) + return (double)(-1); + + if(stat(fname, &st)!=0){ + /*warn_err_obj(fname);*/ + return (double)(-1); + } + + return (double)(st.st_mtime>st.st_ctime ? st.st_mtime : st.st_ctime); +} + + +EXTL_EXPORT +ExtlTab statusd_getloadavg() +{ + ExtlTab t=extl_create_table(); + double l[3]; + int n; + + n=getloadavg(l, 3); + + if(n>=1) + extl_table_sets_d(t, "1min", l[0]); + if(n>=2) + extl_table_sets_d(t, "5min", l[1]); + if(n>=3) + extl_table_sets_d(t, "15min", l[2]); + + return t; +} +