]> ToastFreeware Gitweb - gregoa/zavai.git/blobdiff - src/core.vala
Merge branch 'master' into gregoa
[gregoa/zavai.git] / src / core.vala
index 11a8804342be91efb3e989d0a44cdddc166b88ab..2e2191550fcb8d7a948b4538d7fd509a7f34f721 100644 (file)
@@ -42,7 +42,6 @@ public abstract class Service : Object, Resource {
     public bool started {
         get { return _started; }
         set { _started = value; }
-        default = false;
     }
 
     public signal void toggled(bool new_state);
@@ -62,6 +61,7 @@ public abstract class Service : Object, Resource {
 
     construct
     {
+        started = false;
         requests = null;
         zavai.registry.register(this);
     }
@@ -141,7 +141,9 @@ public abstract class Service : Object, Resource {
         if (el == null)
             return false;
 
-        requests.delete_link(el);
+        ++el.data.count;
+        if (el.data.count == 0)
+            requests.delete_link(el);
 
         if (requests != null)
             return false;
@@ -151,4 +153,139 @@ public abstract class Service : Object, Resource {
     }
 }
 
+public abstract class ScriptService : Service
+{
+    protected string script;
+
+    protected bool script_start()
+    {
+        try {
+            zavai.config.find_and_run_script(name, "start");
+            return true;
+        } catch (Error e) {
+            zavai.log.error("Running " + name + " start: " + e.message);
+            return false;
+        }
+    }
+
+    protected bool script_stop()
+    {
+        try {
+            zavai.config.find_and_run_script(name, "stop");
+            return true;
+        } catch (Error e) {
+            zavai.log.error("Running " + name + " stop: " + e.message);
+            return false;
+        }
+    }
+
+    protected bool script_status()
+    {
+        string std_out;
+        string std_err;
+        string script = zavai.config.find_script(name);
+        if (script == null)
+        {
+            zavai.log.error("Hook " + name + " does not exist");
+            return false;
+        }
+        string command = script + " status";
+        try {
+            int res = zavai.config.run_script_sync(command, out std_out, out std_err);
+            if (res != 0)
+            {
+                zavai.log.error("Running " + command + ": " + std_err);
+                return false;
+            }
+        } catch (SpawnError e) {
+            zavai.log.error("Running " + command + ": " + e.message);
+            return false;
+        }
+
+        std_out._strip();
+
+        return (std_out == "on");
+    }
+}
+
+public abstract class ScriptMonitorService : Service
+{
+    protected Pid child_pid;
+    protected int child_watch_id;
+
+    ScriptMonitorService()
+    {
+        child_pid = 0;
+        child_watch_id = 0;
+    }
+
+    protected bool script_start()
+    {
+        string script = zavai.config.find_script(name);
+        zavai.log.info("Run program: " + script + " pre");
+        try {
+            // Then run our own script
+            zavai.config.run_script(script + " pre");
+        } catch (Error e) {
+            zavai.log.error("Running " + script + " pre: " + e.message);
+            return false;
+        }
+
+        zavai.log.info("Run program: " + script + " run");
+        string[] args = { script, "run" };
+        try {
+            Process.spawn_async(
+                Environment.get_home_dir(),
+                args,
+                null,
+                SpawnFlags.SEARCH_PATH | SpawnFlags.DO_NOT_REAP_CHILD,
+                null,
+                out child_pid);
+        } catch (SpawnError e) {
+            zavai.log.error("Running " + script + " run: " + e.message);
+            return false;
+        }
+
+        // Add a child watch source to know when it ends
+        ChildWatch.add(child_pid, on_child);
+
+        return true;
+    }
+
+    protected bool script_stop()
+    {
+        Posix.kill((Posix.pid_t)child_pid, Posix.SIGTERM);
+        return true;
+    }
+
+    protected void on_child(Pid pid, int status)
+    {
+        zavai.log.info("Exited");
+stderr.printf("STATUS %d\n", status);
+        Process.close_pid(pid);
+
+        try {
+            // Then run our own script
+            zavai.config.find_and_run_script(name, "post");
+        } catch (Error e) {
+            zavai.log.error("Running " + name + " post: " + e.message);
+            return;
+        }
+
+        cleanup_after_script_stop();
+
+        base.stop();
+    }
+
+    protected virtual void cleanup_after_script_stop()
+    {
+    }
+
+    /*
+    protected bool script_status()
+    {
+    }
+    */
+}
+
 }