[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