[Initng-svn] r3193 - initng/trunk/plugins/ngcs
svn at initng.thinktux.net
svn at initng.thinktux.net
Sat Mar 4 19:40:21 CET 2006
Author: makomk
Date: Sat Mar 4 19:40:20 2006
New Revision: 3193
Modified:
initng/trunk/plugins/ngcs/initng_ngcs.c
initng/trunk/plugins/ngcs/initng_ngcs_cmds.c
initng/trunk/plugins/ngcs/ngcs.py
Log:
More ngcs improvements (can now bring services down as well as up)
Modified: initng/trunk/plugins/ngcs/initng_ngcs.c
==============================================================================
--- initng/trunk/plugins/ngcs/initng_ngcs.c (original)
+++ initng/trunk/plugins/ngcs/initng_ngcs.c Sat Mar 4 19:40:20 2006
@@ -274,7 +274,7 @@
return;
}
}
- F_("Unknown ngcs command: %s", udata[0].d.s);
+ F_("Unknown ngcs command: %s\n", udata[0].d.s);
if (ngcs_sendmsg(sock, 0, NGCS_TYPE_NULL, 0, NULL))
closeconn(conn);
free(data);
@@ -292,7 +292,7 @@
free(data);
return;
}
- W_("Got data on unknown channel %i", chanid);
+ W_("Got data on unknown channel %i\n", chanid);
if (ngcs_sendmsg(conn->fdw.fds, chanid, NGCS_TYPE_NULL, -1, NULL))
closeconn(conn);
free(data);
Modified: initng/trunk/plugins/ngcs/initng_ngcs_cmds.c
==============================================================================
--- initng/trunk/plugins/ngcs/initng_ngcs_cmds.c (original)
+++ initng/trunk/plugins/ngcs/initng_ngcs_cmds.c Sat Mar 4 19:40:20 2006
@@ -76,6 +76,8 @@
static ngcs_watch* ngcs_add_watch(ngcs_conn* conn, char* svcname, int flags);
static void ngcs_cmd_start(ngcs_request * req);
static int ngcs_watch_initial(ngcs_watch *watch);
+static void ngcs_cmd_stop(ngcs_request * req);
+static void ngcs_cmd_hot_reload(ngcs_request * req);
ngcs_cmd ngcs_halt_cmd = {
"halt",
@@ -95,12 +97,24 @@
{0, 0}
};
+
+ngcs_cmd ngcs_stop_cmd = {
+ "stop",
+ ngcs_cmd_stop,
+ {0, 0}
+};
+
ngcs_cmd ngcs_watch_cmd = {
"watch",
ngcs_cmd_watch,
{0, 0}
};
+ngcs_cmd ngcs_hot_reload_cmd = {
+ "hot_reload",
+ ngcs_cmd_hot_reload,
+ {0, 0}
+};
ngcs_watch watches;
@@ -208,6 +222,37 @@
return FALSE;
}
+static void ngcs_cmd_stop(ngcs_request * req)
+{
+ int i = 0; ngcs_watch* watch;
+ active_db_h *serv = NULL; char* svcname = NULL;
+
+ if(req->type != NGCS_TYPE_STRING || req->data == NULL || req->len <= 0)
+ {
+ F_("Bad call to ngcs command 'stop'\n");
+ ngcs_send_response(req, NGCS_TYPE_STRING, 8, (char*)"BAD_CALL");
+ return;
+ }
+
+ svcname = i_calloc(1, req->len+1);
+ memcpy(svcname, req->data, req->len);
+
+ serv = initng_active_db_find_in_name(svcname);
+ if (!serv)
+ {
+ ngcs_send_response(req, NGCS_TYPE_STRING, 9, (char*)"NOT_FOUND");
+ free(svcname); return;
+ }
+
+ watch = ngcs_add_watch(req->conn, serv->name, NGCS_WATCH_STATUS | NGCS_WATCH_OUTPUT | NGCS_CURRENT_STATUS);
+ if(watch) i = watch->chan->id;
+ ngcs_send_response(req, NGCS_TYPE_INT, sizeof(int), (char *) &i);
+ ngcs_watch_initial(watch);
+ initng_handler_stop_service(serv);
+ free(svcname); return;
+}
+
+
static void ngcs_cmd_start(ngcs_request * req)
{
int i = 0; ngcs_watch* watch;
@@ -225,8 +270,7 @@
serv = initng_active_db_find_in_name(svcname);
if (serv)
{
- watch = ngcs_add_watch(req->conn, serv->name, NGCS_WATCH_STATUS | NGCS_WATCH_OUTPUT |
- NGCS_CURRENT_STATUS);
+ watch = ngcs_add_watch(req->conn, serv->name, NGCS_WATCH_STATUS | NGCS_WATCH_OUTPUT | NGCS_CURRENT_STATUS);
if(watch) i = watch->chan->id;
ngcs_send_response(req, NGCS_TYPE_INT, sizeof(int), (char *) &i);
ngcs_watch_initial(watch);
@@ -355,8 +399,10 @@
{
ngcs_reg_cmd(&ngcs_halt_cmd);
ngcs_reg_cmd(&ngcs_start_cmd);
+ ngcs_reg_cmd(&ngcs_stop_cmd);
ngcs_reg_cmd(&ngcs_reboot_cmd);
ngcs_reg_cmd(&ngcs_watch_cmd);
+ ngcs_reg_cmd(&ngcs_hot_reload_cmd);
initng_plugin_hook_add(&g.ASTATUS_CHANGE, 50, &service_status_watch);
initng_plugin_hook_add(&g.PIPEWATCHERS, 50, &service_output_watch);
INIT_LIST_HEAD(&watches.list);
@@ -368,8 +414,10 @@
initng_plugin_hook_del(&g.PIPEWATCHERS, &service_output_watch);
ngcs_unreg_cmd(&ngcs_halt_cmd);
ngcs_unreg_cmd(&ngcs_start_cmd);
+ ngcs_unreg_cmd(&ngcs_stop_cmd);
ngcs_unreg_cmd(&ngcs_reboot_cmd);
ngcs_unreg_cmd(&ngcs_watch_cmd);
+ ngcs_unreg_cmd(&ngcs_hot_reload_cmd);
/* TODO - need to free watches */
}
@@ -382,7 +430,6 @@
ngcs_send_response(req, NGCS_TYPE_INT, sizeof(int), (char *) &i);
}
-
static void ngcs_cmd_reboot(ngcs_request * req)
{
int i = 0;
@@ -391,3 +438,35 @@
initng_handler_stop_all();
ngcs_send_response(req, NGCS_TYPE_INT, sizeof(int), (char *) &i);
}
+
+static void ngcs_cmd_hot_reload(ngcs_request * req)
+{
+ int i = 0;
+
+ int retval;
+ char *new_argv[4];
+
+ retval = initng_plugin_callers_dump_state();
+
+ if (retval == TRUE)
+ {
+ ngcs_send_response(req, NGCS_TYPE_INT, sizeof(int), (char *) &i);
+ D_("exec()int initng\n");
+ new_argv[0] = i_strdup("/sbin/initng");
+ new_argv[1] = i_strdup("--hot_reload");
+ new_argv[2] = NULL;
+
+ execve("/sbin/initng", new_argv, environ);
+ F_("Failed to reload initng!\n");
+ }
+ else if (retval == FALSE)
+ {
+ F_("No plugin was willing to dump state\n");
+ ngcs_send_response(req, NGCS_TYPE_STRING, 13, (char*)"NOT_AVAILABLE");
+ }
+ else
+ {
+ F_("dump_state failed!\n");
+ ngcs_send_response(req, NGCS_TYPE_STRING, 10, (char*)"DUMP_ERROR");
+ }
+}
Modified: initng/trunk/plugins/ngcs/ngcs.py
==============================================================================
--- initng/trunk/plugins/ngcs/ngcs.py (original)
+++ initng/trunk/plugins/ngcs/ngcs.py Sat Mar 4 19:40:20 2006
@@ -241,6 +241,20 @@
sys.stderr.write("Service %s failed to start (%s)\n" % (self._svc, state[0]))
self._done(); self._cmds.fail()
+class _NgcsStopCmd(_NgcsStartStopCmd):
+ def __init__(self, cmds, svc):
+ _NgcsStartStopCmd.__init__(self, cmds, "stop", svc)
+
+ def _state_check(self, state):
+ if state[1] == IS_STOPPING:
+ pass
+ elif state[1] == IS_DOWN:
+ sys.stderr.write("Service %s stopped succesfully (%s)\n" % (self._svc, state[0]))
+ self._done()
+ elif self._rtmark:
+ sys.stderr.write("Service %s failed to stop (%s)\n" % (self._svc, state[0]))
+ self._done(); self._cmds.fail()
+
def connect():
global sock;
sock = socket.socket(socket.AF_UNIX,socket.SOCK_STREAM)
@@ -308,32 +322,10 @@
buf += data
return buf
-def ez_cmd(*data):
- sock.settimeout(None)
- chan = 0
- ngcs_send(0, data)
- while True:
- msg = ngcs_recv()
- msg = (msg[0], ngcs_unpack(msg[1]))
- print msg
- if chan == 0 and msg[0] == 0:
- if isinstance(msg[1], NgcsData) and msg[1].type == NCGS_TYPE_NULL:
- print "Command execution failed"; break
- elif not isinstance(msg[1], IntType):
- print "Bad data type!"; break
- elif msg[1] == 0:
- print "Command failed?"; break
- else:
- chan = msg[1]
- print "Opened channel %i" % chan
- elif chan != 0 and msg[0] == chan and isinstance(msg[1],NgcsEOF):
- print "---End---"; break
-
-_simple_cmds = { "-6": ("reboot", False, "initiate reboot"), "-0": ("halt", False, "initiate shutdown") }
+_simple_cmds = { "-6": ("reboot", False, "initiate reboot"), "-0": ("halt", False, "initiate shutdown"), "-c": ("hot_reload", False, "initiate hot reload") }
_simple_cmds["--halt"] = _simple_cmds["-0"]
_simple_cmds["--reboot"] = _simple_cmds["-6"]
-
-
+_simple_cmds["--hot_reload"] = _simple_cmds["-c"]
def _main():
cmd = None; cmdlist = []; cmdargs = []; success = True
@@ -364,6 +356,9 @@
elif cmd in ("-u","--start"):
for arg in c[1]:
_NgcsStartCmd(wcmds,arg)
+ elif cmd in ("-d","--stop"):
+ for arg in c[1]:
+ _NgcsStopCmd(wcmds,arg)
else:
sys.stderr.write("Error: unknown command "+c[0]+"\n")
More information about the Initng-svn
mailing list