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;
}
}
+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");
+ 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()
+ {
+ }
+ */
+}
+
}