Released version 3-2015061300
[notion.git] / utils / ion-statusd / ion-statusd.c
blobbb5a4d1723ba00cfcd60fbdc393c91540021cf86
1 /*
2 * ion/utils/ion-statusd/ion-statusd.c
4 * Copyright (c) Tuomo Valkonen 2004-2009.
6 * See the included file LICENSE for details.
7 */
9 #include <string.h>
10 #include <unistd.h>
11 #include <stdlib.h>
12 #include <sys/types.h>
13 #include <sys/stat.h>
15 #include <libtu/util.h>
16 #include <libtu/optparser.h>
17 #include <libtu/errorlog.h>
18 #include <libtu/locale.h>
19 #include <libtu/misc.h>
20 #include <libtu/prefix.h>
21 #include <libextl/readconfig.h>
22 #include <libmainloop/select.h>
23 #include <libmainloop/signal.h>
24 #include <libmainloop/defer.h>
26 #ifndef CF_NO_LOCALE
27 #include <locale.h>
28 #endif
30 #include "../../version.h"
33 static OptParserOpt ion_opts[]={
34 /*{OPT_ID('d'), "display", OPT_ARG, "host:dpy.scr",
35 DUMMY_TR("X display to use")},*/
37 {'c', "conffile", OPT_ARG, "config_file",
38 DUMMY_TR("Configuration file")},
40 {'s', "searchdir", OPT_ARG, "dir",
41 DUMMY_TR("Add directory to search path")},
43 /*{OPT_ID('s'), "session", OPT_ARG, "session_name",
44 DUMMY_TR("Name of session (affects savefiles)")},*/
46 {'h', "help", 0, NULL,
47 DUMMY_TR("Show this help")},
49 {'V', "version", 0, NULL,
50 DUMMY_TR("Show program version")},
52 {OPT_ID('a'), "about", 0, NULL,
53 DUMMY_TR("Show about text")},
55 {'q', "quiet", 0, NULL,
56 DUMMY_TR("Quiet mode")},
58 {'m', "meter", OPT_ARG, "meter_module",
59 DUMMY_TR("Load a meter module")},
61 END_OPTPARSEROPTS
65 static const char statusd_copy[]=
66 "Ion-statusd " ION_VERSION ", copyright (c) Tuomo Valkonen 2004-2009.";
69 static const char statusd_license[]=DUMMY_TR(
70 "This software is licensed under the GNU Lesser General Public License\n"
71 "(LGPL), version 2.1, extended with terms applying to the use of the name\n"
72 "of the project, Ion(tm), unless otherwise indicated in components taken\n"
73 "from elsewhere. For details, see the file LICENSE that you should have\n"
74 "received with this software.\n"
75 "\n"
76 "This program is distributed in the hope that it will be useful,\n"
77 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
78 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n");
81 /* new_informs=TRUE because we should always print period when
82 * initialisation is done.
84 static bool new_informs=TRUE;
85 static ExtlTab configtab;
87 static void help()
89 int i;
90 printf(TR("Usage: %s [options]\n\n"), libtu_progname());
91 for(i=0; ion_opts[i].descr!=NULL; i++)
92 ion_opts[i].descr=TR(ion_opts[i].descr);
93 optparser_printhelp(OPTP_MIDLONG, ion_opts);
94 printf("\n");
98 static void flush_informs()
100 if(new_informs){
101 printf(".\n");
102 fflush(stdout);
103 new_informs=FALSE;
108 static void mainloop()
110 sigset_t trapset;
112 sigemptyset(&trapset);
113 sigaddset(&trapset, SIGALRM);
114 sigaddset(&trapset, SIGCHLD);
115 mainloop_trap_signals(&trapset);
117 while(1){
118 int kill_sig=mainloop_check_signals();
119 if(kill_sig!=0 && kill_sig!=SIGUSR1){
120 if(kill_sig==SIGTERM)
121 exit(EXIT_FAILURE);
122 else
123 kill(getpid(), kill_sig);
126 mainloop_execute_deferred();
128 flush_informs();
130 mainloop_select();
135 extern bool statusd_register_exports();
136 extern void statusd_unregister_exports();
139 int main(int argc, char*argv[])
141 const char *mod=NULL;
142 char *mod2=NULL;
143 int loaded=0;
144 int opt;
145 bool quiet=FALSE;
147 #ifndef CF_NO_LOCALE
148 if(setlocale(LC_ALL, "")==NULL)
149 warn("setlocale() call failed.");
150 #endif
152 configtab=extl_table_none();
154 libtu_init(argv[0]);
156 #ifdef CF_RELOCATABLE_BIN_LOCATION
157 prefix_set(argv[0], CF_RELOCATABLE_BIN_LOCATION);
158 #endif
160 extl_init();
162 if(!statusd_register_exports())
163 return EXIT_FAILURE;
165 prefix_wrap_simple(extl_add_searchdir, EXTRABINDIR);
166 prefix_wrap_simple(extl_add_searchdir, MODULEDIR);
167 prefix_wrap_simple(extl_add_searchdir, ETCDIR);
168 prefix_wrap_simple(extl_add_searchdir, SHAREDIR);
169 prefix_wrap_simple(extl_add_searchdir, LCDIR);
170 extl_set_userdirs(CF_ION_EXECUTABLE);
172 optparser_init(argc, argv, OPTP_MIDLONG, ion_opts);
174 extl_read_config("ioncore_luaext", NULL, TRUE);
176 while((opt=optparser_get_opt())){
177 switch(opt){
178 /*case OPT_ID('d'):
179 display=optparser_get_arg();
180 break;*/
181 case 's':
182 extl_add_searchdir(optparser_get_arg());
183 break;
184 /*case OPT_ID('s'):
185 extl_set_sessiondir(optparser_get_arg());
186 break;*/
187 case 'h':
188 help();
189 return EXIT_SUCCESS;
190 case 'V':
191 printf("%s\n", ION_VERSION);
192 return EXIT_SUCCESS;
193 case OPT_ID('a'):
194 printf("%s\n\n%s", statusd_copy, TR(statusd_license));
195 return EXIT_SUCCESS;
196 case 'c':
198 ExtlTab t;
199 const char *f=optparser_get_arg();
200 if(extl_read_savefile(f, &t)){
201 extl_unref_table(configtab);
202 configtab=t;
203 }else{
204 warn(TR("Unable to load configuration file %s"), f);
207 break;
208 case 'q':
209 quiet=TRUE;
210 break;
211 case 'm':
212 mod=optparser_get_arg();
213 if(strchr(mod, '/')==NULL && strchr(mod, '.')==NULL){
214 mod2=scat("statusd_", mod);
215 if(mod2==NULL)
216 return EXIT_FAILURE;
217 mod=mod2;
219 if(extl_read_config(mod, NULL, !quiet))
220 loaded++;
221 if(mod2!=NULL)
222 free(mod2);
223 break;
224 default:
225 warn(TR("Invalid command line."));
226 help();
227 return EXIT_FAILURE;
231 if(loaded==0 && !quiet){
232 warn(TR("No meters loaded."));
233 return EXIT_FAILURE;
236 mainloop();
238 return EXIT_SUCCESS;
242 /*EXTL_DOC
243 * Inform that meter \var{name} has value \var{value}.
245 EXTL_EXPORT
246 void statusd_inform(const char *name, const char *value)
248 printf("%s: %s\n", name, value);
249 new_informs=TRUE;
253 /*EXTL_DOC
254 * Get configuration table for module \var{name}
256 EXTL_EXPORT
257 ExtlTab statusd_get_config(const char *name)
259 if(name==NULL){
260 return extl_ref_table(configtab);
261 }else{
262 ExtlTab t;
263 if(extl_table_gets_t(configtab, name, &t))
264 return t;
265 else
266 return extl_create_table();
271 /*EXTL_DOC
272 * Get last file modification time.
274 EXTL_EXPORT
275 double statusd_last_modified(const char *fname)
277 struct stat st;
279 if(fname==NULL)
280 return (double)(-1);
282 if(stat(fname, &st)!=0){
283 /*warn_err_obj(fname);*/
284 return (double)(-1);
287 return (double)(st.st_mtime>st.st_ctime ? st.st_mtime : st.st_ctime);
291 EXTL_EXPORT
292 ExtlTab statusd_getloadavg()
294 ExtlTab t=extl_create_table();
295 #ifndef CF_NO_GETLOADAVG
296 double l[3];
297 int n;
299 n=getloadavg(l, 3);
301 if(n>=1)
302 extl_table_sets_d(t, "1min", l[0]);
303 if(n>=2)
304 extl_table_sets_d(t, "5min", l[1]);
305 if(n>=3)
306 extl_table_sets_d(t, "15min", l[2]);
307 #endif
308 return t;