25
25
#include "apt-dater.h"
27
26
#include "keyfiles.h"
31
31
#ifdef HAVE_CONFIG_H
32
32
# include "config.h"
35
37
#include <libxml/parser.h>
38
#include <libxml/xinclude.h>
36
39
#include <libxml/xpath.h>
38
41
#include "../conf/apt-dater.xml.inc"
39
42
#include "../conf/hosts.xml.inc"
44
#include "../conf/tmux.conf.inc"
40
46
#include "../conf/screenrc.inc"
42
49
void dump_config(const gchar *dir, const gchar *fn, const gchar *str, const unsigned int len) {
43
50
gchar *pathtofile = g_strdup_printf("%s/%s", dir, (fn));
62
69
int chkForInitialConfig(const gchar *cfgdir, const gchar *cfgfile) {
63
70
if(g_file_test(cfgdir, G_FILE_TEST_IS_DIR) == FALSE) {
64
if(g_mkdir_with_parents (cfgdir, 0700)) return(1);
71
if(g_mkdir_with_parents (cfgdir, S_IRWXU)) return(1);
67
74
dump_config(cfgdir, "apt-dater.xml", (gchar *)apt_dater_xml, apt_dater_xml_len);
76
/* Convert legacy hosts.conf to new hosts.xml using external helper script. */
77
gchar *fnold = g_strdup_printf("%s/%s", cfgdir, "hosts.conf");
78
gchar *fnnew = g_strdup_printf("%s/%s", cfgdir, "hosts.xml");
79
if((g_file_test(fnnew, G_FILE_TEST_IS_REGULAR|G_FILE_TEST_EXISTS) == FALSE) &&
80
(g_file_test(fnold, G_FILE_TEST_IS_REGULAR|G_FILE_TEST_EXISTS) == TRUE)) {
82
gchar *argv[3] = {PKGLIBDIR"/hosts2xml", "hosts2xml", NULL};
84
if(g_spawn_sync(g_getenv ("HOME"), argv, NULL, G_SPAWN_CHILD_INHERITS_STDIN, NULL, NULL, NULL, NULL, NULL, &error) == FALSE) {
85
g_warning("%s", error->message);
86
g_clear_error (&error);
68
90
dump_config(cfgdir, "hosts.xml", (gchar *)hosts_xml, hosts_xml_len);
92
dump_config(cfgdir, "tmux.conf", (gchar *)tmux_conf, tmux_conf_len);
69
94
dump_config(cfgdir, "screenrc", (gchar *)screenrc, screenrc_len);
81
107
g_free(cfg->cmd_refresh);
82
108
g_free(cfg->cmd_upgrade);
83
109
g_free(cfg->cmd_install);
111
g_free(cfg->tmuxconffile);
112
g_free(cfg->tmuxsockpath);
84
114
g_free(cfg->screenrcfile);
85
115
g_free(cfg->screentitle);
86
117
g_strfreev(cfg->colors);
94
125
lcfg->_type = T_CFGFILE;
97
lcfg->hostsfile = g_strdup_printf("%s/%s/%s", g_get_user_config_dir(), PROG_NAME, "hosts.xml");
98
lcfg->statsdir = g_strdup_printf("%s/%s/%s", g_get_user_cache_dir(), PROG_NAME, "stats");
100
lcfg->screenrcfile = g_strdup_printf("%s/%s/%s", g_get_user_config_dir(), PROG_NAME, "screenrc");
102
128
lcfg->dump_screen = TRUE;
103
lcfg->query_maintainer = FALSE;
105
130
#ifdef FEAT_AUTOREF
106
131
lcfg->auto_refresh = TRUE;
252
/* Handle Xincludes. */
253
xmlXIncludeProcess(xcfg);
255
/* Validate against DTD. */
256
xmlValidCtxtPtr xval = xmlNewValidCtxt();
257
if(xmlValidateDocument(xval, xcfg) == 0) {
258
xmlFreeValidCtxt(xval);
261
xmlFreeValidCtxt(xval);
228
263
/* Allocate XPath context. */
229
264
xmlXPathContextPtr xctx = xmlXPathNewContext(xcfg);
235
270
xmlNodePtr s_ssh[2] = {getXNode(xctx, "/apt-dater/ssh"), NULL};
236
271
xmlNodePtr s_path[2] = {getXNode(xctx, "/apt-dater/paths"), NULL};
273
xmlNodePtr s_tmux[2] = {getXNode(xctx, "/apt-dater/tmux"), NULL};
237
275
xmlNodePtr s_screen[2] = {getXNode(xctx, "/apt-dater/screen"), NULL};
238
277
xmlNodePtr s_appearance[2] = {getXNode(xctx, "/apt-dater/appearance"), NULL};
239
278
xmlNodePtr s_notify[2] = {getXNode(xctx, "/apt-dater/notify"), NULL};
240
279
xmlNodePtr s_hooks[2] = {getXNode(xctx, "/apt-dater/hooks"), NULL};
248
287
xmlNodePtr s_tclfilter[2] = {getXNode(xctx, "/apt-dater/tcl-filter"), NULL};
251
lcfg->ssh_optflags = getXPropStr(s_ssh, "opt-cmd-flags", NULL);
290
lcfg->ssh_optflags = getXPropStr(s_ssh, "opt-cmd-flags", "-t");
252
291
lcfg->ssh_cmd = getXPropStr(s_ssh, "cmd", "/usr/bin/ssh");
253
292
lcfg->sftp_cmd = getXPropStr(s_ssh, "sftp-cmd", "/usr/bin/sftp");
294
lcfg->umask = getXPropInt(s_path, "umask", S_IRWXG | S_IRWXO);
255
297
lcfg->hostsfile = getXPropStr(s_path, "hosts-file", g_strdup_printf("%s/%s/%s", g_get_user_config_dir(), PROG_NAME, "hosts.xml"));
256
298
lcfg->statsdir = getXPropStr(s_path, "stats-dir", g_strdup_printf("%s/%s/%s", g_get_user_cache_dir(), PROG_NAME, "stats"));
257
g_mkdir_with_parents(lcfg->statsdir, S_IRWXU | S_IRWXG | S_IRWXO);
299
if(g_mkdir_with_parents(lcfg->statsdir, S_IRWXU | S_IRWXG) == -1) {
300
g_warning("Failed to create %s: %s", lcfg->statsdir, g_strerror(errno));
305
lcfg->tmuxconffile = getXPropStr(s_tmux, "conf-file", g_strdup_printf("%s/%s/%s", g_get_user_config_dir(), PROG_NAME, "tmux.conf"));
306
lcfg->tmuxsockpath = getXPropStr(s_tmux, "socket-path", g_strdup_printf("%s/%s/%s", g_get_user_cache_dir(), PROG_NAME, "tmux"));
307
if(g_mkdir_with_parents(lcfg->tmuxsockpath, S_IRWXU | S_IRWXG) == -1) {
308
g_warning("Failed to create %s: %s", lcfg->tmuxsockpath, g_strerror(errno));
259
312
lcfg->screenrcfile = getXPropStr(s_screen, "rc-file", g_strdup_printf("%s/%s/%s", g_get_user_config_dir(), PROG_NAME, "screenrc"));
260
313
lcfg->screentitle = getXPropStr(s_screen, "title", g_strdup("%m # %U%H"));
263
316
lcfg->ssh_agent = getXPropBool(s_ssh, "spawn-agent", FALSE);
269
322
for(i = 0; i < s_addkeys->nodeNr; i++) {
270
323
lcfg->ssh_add[i] = g_strdup((gchar *)xmlGetProp(s_addkeys->nodeTab[i], BAD_CAST("name")));
324
xmlChar *c = xmlGetProp(s_addkeys->nodeTab[i], BAD_CAST("fn"));
326
g_printerr(_("Empty SSH key filename (%s/@fn) in configuration."), xmlGetNodePath(s_addkeys->nodeTab[i]));
329
lcfg->ssh_add[i] = g_strdup((gchar *)c);
331
lcfg->ssh_numadd = s_addkeys->nodeNr;
273
333
xmlXPathFreeNodeSet(s_addkeys);
336
// XXX needs to be ported to tmux XXX
337
lcfg->dump_screen = FALSE;
338
lcfg->query_maintainer = FALSE;
339
// XXX needs to be ported to tmux XXX
275
341
lcfg->dump_screen = !getXPropBool(s_screen, "no-dumps", FALSE);
276
342
lcfg->query_maintainer = getXPropBool(s_screen, "query-maintainer", FALSE);
278
345
gchar *colors = getXPropStr(s_appearance, "colors", "menu brightgreen blue;status brightgreen blue;selector black red;");
294
361
#ifdef FEAT_HISTORY
295
362
lcfg->record_history = getXPropBool(s_history, "record", TRUE);
296
363
lcfg->history_errpattern = getXPropStr(s_history, "err-pattern", "((?<!no )error|warning|fail)");
364
lcfg->history_dir = getXPropStr(s_path, "history-dir", g_strdup_printf("%s/%s/history", g_get_user_data_dir(), PACKAGE));
299
367
lcfg->hook_pre_upgrade = getXPropStr(s_hooks, "pre-upgrade", "/etc/apt-dater/pre-upg.d");
382
gint cmp_hosts(gconstpointer a, gconstpointer b, gpointer p) {
383
HostNode *ha = (HostNode *)a;
384
HostNode *hb = (HostNode *)b;
387
ret = g_strcmp0(ha->group, hb->group);
389
ret = g_strcmp0(ha->hostname, hb->hostname);
314
394
GList *loadHosts (const gchar *filename) {
315
395
/* Parse hosts.xml document. */
316
396
xmlDocPtr xcfg = xmlParseFile(filename);
400
/* Handle Xincludes. */
401
xmlXIncludeProcess(xcfg);
403
/* Validate against DTD. */
404
xmlValidCtxtPtr xval = xmlNewValidCtxt();
405
if(xmlValidateDocument(xval, xcfg) == 0) {
406
xmlFreeValidCtxt(xval);
409
xmlFreeValidCtxt(xval);
320
411
/* Allocate XPath context. */
321
412
xmlXPathContextPtr xctx = xmlXPathNewContext(xcfg);
384
475
hostnode->group = g_strdup((gchar *)groupname);
386
477
hostnode->statsfile = g_strdup_printf("%s/%s:%d.stat", cfg->statsdir, hostnode->hostname, hostnode->ssh_port);
478
hostnode->statstmpf = g_strdup_printf("%s/%s:%d.stat.new", cfg->statsdir, hostnode->hostname, hostnode->ssh_port);
387
479
hostnode->fdlock = -1;
388
480
hostnode->uuid[0] = 0;
389
481
hostnode->tagged = FALSE;
391
483
getUpdatesFromStat(hostnode);
393
hostlist = g_list_append(hostlist, hostnode);
485
TTYMUX_INITIALIZE(hostnode);
486
stats_initialize(hostnode);
488
hostlist = g_list_prepend(hostlist, hostnode);
395
490
xmlFree(hostname);