]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
scripts daemonize themselves
authorEvan Prodromou <evan@prodromou.name>
Thu, 4 Sep 2008 18:40:31 +0000 (14:40 -0400)
committerEvan Prodromou <evan@prodromou.name>
Thu, 4 Sep 2008 18:40:31 +0000 (14:40 -0400)
darcs-hash:20080904184031-84dde-eba2061f3aa898d0c791ffeb70837f759778c567.gz

lib/common.php
lib/daemon.php [new file with mode: 0644]
lib/queuehandler.php
scripts/ombqueuehandler.php
scripts/publicqueuehandler.php
scripts/smsqueuehandler.php
scripts/xmppconfirmhandler.php
scripts/xmppdaemon.php
scripts/xmppqueuehandler.php

index e4c8e9032a9bc66c1e78a5a46c09648e62026928..80aab806f3bf795615b4dd99895eec4850927109 100644 (file)
@@ -94,6 +94,10 @@ $config =
                          'public' => array()), # JIDs of users who want to receive the public stream
                'tag' =>
                array('dropoff' => 864000.0),
+               'daemon' =>
+               array('piddir' => '/var/run',
+                         'user' => false,
+                         'group' => false)
                );
 
 $config['db'] = &PEAR::getStaticProperty('DB_DataObject','options');
diff --git a/lib/daemon.php b/lib/daemon.php
new file mode 100644 (file)
index 0000000..09144af
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+/*
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('LACONICA')) { exit(1); }
+
+class Daemon {
+
+       function name() {
+               return NULL;
+       }
+       
+       function background() {
+               $pid = pcntl_fork();
+               if ($pid < 0) { # error
+                       return false;
+               } else if ($pid > 0) { # parent
+                       common_log(LOG_INFO, "Successfully forked.");
+                       exit(0);
+               } else { # child
+                       return true;
+               }
+       }
+
+       function alreadyRunning() {
+
+               $pidfilename = $this->pidFilename();
+
+               if (!$pidfilename) {
+                       return false;
+               }
+               
+               if (!file_exists($pidfilename)) {
+                       return false;
+               }
+               $contents = file_get_contents($pidfilename);
+               if (posix_kill(trim($contents),0)) {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+       
+       function writePidFile() {
+               $pidfilename = $this->pidFilename();
+               
+               if (!$pidfilename) {
+                       return false;
+               }
+               
+               file_put_contents($pidfilename, posix_getpid());
+       }
+
+       function clearPidFile() {
+               $pidfilename = $this->pidFilename();
+               unlink($pidfilename);
+       }
+       
+       function pidFilename() {
+               $piddir = common_config('daemon', 'piddir');
+               if (!$piddir) {
+                       return NULL;
+               }
+               $name = $this->name();
+               if (!$name) {
+                       return NULL;
+               }
+               return $piddir . '/' . $name;
+       }
+
+       function changeUser() {
+
+               if (common_config('daemon', 'user')) {
+                       $user_info = posix_getpwnam(common_config('daemon', 'user'));
+                       common_log(LOG_INFO, "Setting user to " . common_config('daemon', 'user'));
+                       posix_setuid($user_info['uid']);
+               }
+               
+               if (common_config('daemon', 'group')) {
+                       $group_info = posix_getgrnam(common_config('daemon', 'group'));
+                       common_log(LOG_INFO, "Setting group to " . common_config('daemon', 'group'));
+                       posix_setgid($group_info['gid']);
+               }
+       }
+       
+       function runOnce() {
+               if ($this->alreadyRunning()) {
+                       common_log(LOG_INFO, $this->name() . ' already running. Exiting.');
+                       exit(0);
+               }
+               if ($this->background()) {
+                       $this->writePidFile();
+                       $this->changeUser();
+                       $this->run();
+                       $this->clearPidFile();
+               }
+       }
+       
+       function run() {
+               return true;
+       }
+}
index 3115ea38d2a470334ee5dd8783d606fd383e13b8..d673f7f947b9ec94879573521082c4680beb0887 100644 (file)
 
 define('CLAIM_TIMEOUT', 1200);
 
-class QueueHandler {
+if (!defined('LACONICA')) { exit(1); }
+
+require_once(INSTALLDIR.'/lib/daemon.php');
+
+class QueueHandler extends Daemon {
 
        var $_id = 'generic';
 
@@ -32,6 +36,10 @@ class QueueHandler {
        function class_name() {
                return ucfirst($this->transport()) . 'Handler';
        }
+
+       function name() {
+               return strtolower($this->class_name().'.'.$this->get_id());
+       }
        
        function get_id() {
                return $this->_id;
@@ -55,7 +63,10 @@ class QueueHandler {
                return true;
        }
        
-       function handle_queue() {
+       function run() {
+               if (!$this->start()) {
+                       return false;
+               }
                $this->log(LOG_INFO, 'checking for queued notices');
                $transport = $this->transport();
                do {
@@ -87,6 +98,10 @@ class QueueHandler {
                                $this->idle(5);
                        }       
                } while (true);
+               if (!$this->finish()) {
+                       return false;
+               }
+               return true;
        }
 
        function idle($timeout=0) {
index da089feab0bb911364f83df0b6612d862158c43c..1df816d1403e2b49566313a8b57a048623a9ce1f 100755 (executable)
@@ -71,8 +71,4 @@ $id = ($argc > 1) ? $argv[1] : NULL;
 
 $handler = new OmbQueueHandler($id);
 
-if ($handler->start()) {
-       $handler->handle_queue();
-}
-
-$handler->finish();
+$handler->runOnce();
index bd0a3670e9d42d5aefe79a8539269064922d517c..62e60b858f6356555e4bb6d347f72bb88de4756e 100755 (executable)
@@ -105,8 +105,4 @@ $resource = ($argc > 1) ? $argv[1] : (common_config('xmpp','resource') . '-publi
 
 $handler = new PublicQueueHandler($resource);
 
-if ($handler->start()) {
-       $handler->handle_queue();
-}
-
-$handler->finish();
+$handler->runOnce();
index 9968a78611344b8bcdf3273f7e887671e29cfcca..8f0d02d9b67f76e35b17add1357de82e8e867f23 100755 (executable)
@@ -61,8 +61,4 @@ $id = ($argc > 1) ? $argv[1] : NULL;
 
 $handler = new SmsQueueHandler($id);
 
-if ($handler->start()) {
-       $handler->handle_queue();
-}
-
-$handler->finish();
+$handler->runOnce();
index e863f3e7ef4ad5f7ed3d1986f305799cf9c3ec2a..3c31c5d8b0e5c7f2c406a474d456e9ceab6c801a 100755 (executable)
@@ -63,7 +63,10 @@ class XmppConfirmHandler {
                $this->conn->presence(NULL, 'available', NULL, 'available', -1);
        }
        
-       function handle_queue() {
+       function run() {
+               if (!$this->start()) {
+                       return false;
+               }
                $this->log(LOG_INFO, 'checking for queued confirmations');
                do {
                        $confirm = $this->next_confirm();
@@ -99,6 +102,10 @@ class XmppConfirmHandler {
                                $this->idle(10);
                        }
                } while (true);
+               if (!$this->finish()) {
+                       return false;
+               }
+               return true;
        }
 
        function next_confirm() {
@@ -181,8 +188,5 @@ $resource = ($argc > 1) ? $argv[1] : (common_config('xmpp', 'resource').'-confir
 
 $handler = new XmppConfirmHandler($resource);
 
-if ($handler->start()) {
-       $handler->handle_queue();
-}
+$handler->runOnce();
 
-$handler->finish();
index c29b14b7bd22e53f806f4b01d443da30d42e1053..c5a53e457675c42e0014766fb4f3d182b005fe6f 100755 (executable)
@@ -29,6 +29,7 @@ define('LACONICA', true);
 
 require_once(INSTALLDIR . '/lib/common.php');
 require_once(INSTALLDIR . '/lib/jabber.php');
+require_once(INSTALLDIR . '/lib/daemon.php');
 
 set_error_handler('common_error_handler');
 
@@ -36,7 +37,7 @@ set_error_handler('common_error_handler');
 # in jabber.php, which create a new XMPP class. A more elegant (?) solution
 # might be to use make this a subclass of XMPP.
 
-class XMPPDaemon {
+class XMPPDaemon extends Daemon {
 
        function XMPPDaemon($resource=NULL) {
                static $attrs = array('server', 'port', 'user', 'password', 'host');
@@ -74,12 +75,19 @@ class XMPPDaemon {
                return !$this->conn->isDisconnected();
        }
 
-       function handle() {
-               $this->conn->addEventHandler('message', 'handle_message', $this);
-               $this->conn->addEventHandler('presence', 'handle_presence', $this);
-               $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
-
-               $this->conn->process();
+       function name() {
+               return strtolower('xmppdaemon.'.$this->resource);
+       }
+       
+       function run() {
+               if ($this->connect()) {
+                       
+                       $this->conn->addEventHandler('message', 'handle_message', $this);
+                       $this->conn->addEventHandler('presence', 'handle_presence', $this);
+                       $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
+                       
+                       $this->conn->process();
+               }
        }
 
        function handle_reconnect(&$pl) {
@@ -325,6 +333,4 @@ $resource = ($argc > 1) ? $argv[1] : (common_config('xmpp','resource') . '-liste
 
 $daemon = new XMPPDaemon($resource);
 
-if ($daemon->connect()) {
-       $daemon->handle();
-}
+$daemon->runOnce();
index 4394a1a40e70d5ddb23ab7b102e5ef511359944c..1c594f210aefcc6a6485d1e80595f79954c22458 100755 (executable)
@@ -110,8 +110,4 @@ $resource = ($argc > 1) ? $argv[1] : (common_config('xmpp','resource') . '-queue
 
 $handler = new XmppQueueHandler($resource);
 
-if ($handler->start()) {
-       $handler->handle_queue();
-}
-
-$handler->finish();
+$handler->runOnce();
\ No newline at end of file