from PageFlush to more generale PendingPage class
[brisk.git] / web / Obj / sac-a-push.phh
index c6858b8..d39740c 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
- *  brisk - spush/sac-a-push.phh
+ *  brisk - Obj/sac-a-push.phh
  *
  *  Copyright (C) 2012 Matteo Nastasi
  *                          mailto: nastasi@alternativeoutput.it 
 define('SITE_PREFIX', '/brisk/');
 define('SITE_PREFIX_LEN', 7);
 
+declare(ticks = 1);
+
+function global_dump()
+{
+    GLOBAL $G_alarm_passwd, $G_black_list, $G_btrace_pref_sub, $G_dbauth;
+    GLOBAL $G_dbpfx, $G_donors_all, $G_donors_cur, $G_is_local, $G_lang;
+    GLOBAL $G_poll_entries, $G_poll_name, $G_poll_title, $G_proxy_white_list;
+    GLOBAL $G_room_roadmap, $G_shutdown, $G_sidebanner, $G_sidebanner2;
+    GLOBAL $G_splash_content, $G_splash_contents, $G_splash_cont_idx;
+    GLOBAL $G_splash_h, $G_splash_idx, $G_splash_interval, $G_splash_timeout;
+    GLOBAL $G_splash_w, $G_topbanner, $G_with_donors, $G_with_poll;
+    GLOBAL $G_with_sidebanner, $G_with_sidebanner2, $G_with_splash;
+    GLOBAL $G_with_topbanner;
+
+    fprintf(STDERR, "G_alarm_passwd = [%s]\n", print_r($G_alarm_passwd, TRUE));
+    fprintf(STDERR, "G_black_list = [%s]\n", print_r($G_black_list, TRUE));
+    fprintf(STDERR, "G_btrace_pref_sub = [%s]\n", print_r($G_btrace_pref_sub, TRUE));
+    fprintf(STDERR, "G_dbauth = [%s]\n", print_r($G_dbauth, TRUE));
+    fprintf(STDERR, "G_dbpfx = [%s]\n", print_r($G_dbpfx, TRUE));
+    fprintf(STDERR, "G_donors_all = [%s]\n", print_r($G_donors_all, TRUE));
+    fprintf(STDERR, "G_donors_cur = [%s]\n", print_r($G_donors_cur, TRUE));
+    fprintf(STDERR, "G_is_local = [%s]\n", print_r($G_is_local, TRUE));
+    fprintf(STDERR, "G_lang = [%s]\n", print_r($G_lang, TRUE));
+    fprintf(STDERR, "G_poll_entries = [%s]\n", print_r($G_poll_entries, TRUE));
+    fprintf(STDERR, "G_poll_name = [%s]\n", print_r($G_poll_name, TRUE));
+    fprintf(STDERR, "G_poll_title = [%s]\n", print_r($G_poll_title, TRUE));
+    fprintf(STDERR, "G_proxy_white_list = [%s]\n", print_r($G_proxy_white_list, TRUE));
+    fprintf(STDERR, "G_room_roadmap = [%s]\n", print_r($G_room_roadmap, TRUE));
+    fprintf(STDERR, "G_shutdown = [%s]\n", print_r($G_shutdown, TRUE));
+    fprintf(STDERR, "G_sidebanner = [%s]\n", print_r($G_sidebanner, TRUE));
+    fprintf(STDERR, "G_sidebanner2 = [%s]\n", print_r($G_sidebanner2, TRUE));
+    fprintf(STDERR, "G_splash_content = [%s]\n", print_r($G_splash_content, TRUE));
+    fprintf(STDERR, "G_splash_contents = [%s]\n", print_r($G_splash_contents, TRUE));
+    fprintf(STDERR, "G_splash_cont_idx = [%s]\n", print_r($G_splash_cont_idx, TRUE));
+    fprintf(STDERR, "G_splash_h = [%s]\n", print_r($G_splash_h, TRUE));
+    fprintf(STDERR, "G_splash_idx = [%s]\n", print_r($G_splash_idx, TRUE));
+    fprintf(STDERR, "G_splash_interval = [%s]\n", print_r($G_splash_interval, TRUE));
+    fprintf(STDERR, "G_splash_timeout = [%s]\n", print_r($G_splash_timeout, TRUE));
+    fprintf(STDERR, "G_splash_w = [%s]\n", print_r($G_splash_w, TRUE));
+    fprintf(STDERR, "G_topbanner = [%s]\n", print_r($G_topbanner, TRUE));
+    fprintf(STDERR, "G_with_donors = [%s]\n", print_r($G_with_donors, TRUE));
+    fprintf(STDERR, "G_with_poll = [%s]\n", print_r($G_with_poll, TRUE));
+    fprintf(STDERR, "G_with_sidebanner = [%s]\n", print_r($G_with_sidebanner, TRUE));
+    fprintf(STDERR, "G_with_sidebanner2 = [%s]\n", print_r($G_with_sidebanner2, TRUE));
+    fprintf(STDERR, "G_with_splash = [%s]\n", print_r($G_with_splash, TRUE));
+    fprintf(STDERR, "G_with_topbanner = [%s]\n", print_r($G_with_topbanner, TRUE));
+}
+
+function pid_save()
+{
+    $pid = getmypid();
+    $fname = LEGAL_PATH."/brisk.pid";
+
+    if (file_exists($fname)) {
+        log_crit("WARN: brisk.pid already exists");
+    }
+    file_put_contents($fname, sprintf("%d\n", $pid));
+}
+
+function pid_remove()
+{
+    $fname = LEGAL_PATH."/brisk.pid";
+
+    if (file_exists($fname)) {
+        unlink($fname);
+    }
+}
+
 function spu_process_info($stream_info, $method, &$header, &$get, &$post, &$cookie)
 {
     $check_post = FALSE;
@@ -53,7 +121,7 @@ function spu_process_info($stream_info, $method, &$header, &$get, &$post, &$cook
             }
             // GET params management
             $get_vars = explode('?', $req[1], 2);
-            $path =   $get_vars[0];
+            $path = $get_vars[0];
             if (count($get_vars) > 1) {
                 $a = explode('&', $get_vars[1]);
                 printf("A COUNT: [%s] %d\n", $a[0], count($a));
@@ -295,13 +363,16 @@ class Cookies {
 
 
 class Sac_a_push {
-    static $fixed_fd = 2;
+    // maybe fixed_fd is unuseful
+    static $fixed_fd = 3;
+    static $cnt_master = NULL;
+    static $cnt_slave  = NULL;
     
     var $file_socket;
     var $unix_socket;
     var $socks;
     var $s2u;
-    var $pages_flush;
+    var $pending_pages;
 
     var $list;
     var $in;
@@ -320,7 +391,29 @@ class Sac_a_push {
     {
     }
 
-    // Sac_a_push::create("/tmp/brisk.sock", 0, 0
+    function sig_handler($sig)
+    {
+        switch ($sig) {
+        case SIGINT:
+            exit(1);
+            break;
+        case SIGTERM:
+            if (static::$cnt_master != NULL) {
+                    fwrite(static::$cnt_master, "\nshutdown\n");
+                    fflush(static::$cnt_master);
+            }
+            else {
+                exit(1);
+            }
+            break;
+        case SIGHUP: 
+            if (static::$cnt_master != NULL) {
+                fwrite(static::$cnt_master, "\nreload\n");
+                fflush(static::$cnt_master);
+            }
+            break;
+        }
+    }
 
     static function create(&$app, $sockname, $debug, $blocking_mode)
     {        
@@ -332,7 +425,19 @@ class Sac_a_push {
         $thiz->debug = $debug;
         $thiz->socks = array();
         $thiz->s2u  = array();
-        $thiz->pages_flush = array();
+        $thiz->pending_pages = array();
+
+        // create a couple of sockets for control management
+        if (($sockpair = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM,
+                                            STREAM_IPPROTO_IP)) == FALSE) {
+            return FALSE;
+        }
+        static::$cnt_master = $sockpair[0];
+        static::$cnt_slave  = $sockpair[1];
+
+        pcntl_signal(SIGTERM, array("Sac_a_push", "sig_handler"));
+        pcntl_signal(SIGINT, array("Sac_a_push", "sig_handler"));
+        pcntl_signal(SIGHUP, array("Sac_a_push", "sig_handler"));
 
         $thiz->blocking_mode = 0; // 0 for non-blocking
 
@@ -380,9 +485,9 @@ class Sac_a_push {
         unset($this->socks[$id]);
     }
 
-    function pgflush_try_add($enc, &$new_socket, $tout, $header_out, $content)
+    function pendpage_try_addflush($enc, &$new_socket, $tout, $header_out, $content)
     {
-        $pgflush = new PageFlush($new_socket, $enc, $this->curtime, $tout, $header_out, $content);
+        $pgflush = PendingPage::pendingpage_flushing($new_socket, $enc, $this->curtime, $tout, $header_out, $content);
 
         if ($pgflush->try_flush($this->curtime) == FALSE) {
             // Add $pgflush to the pgflush array
@@ -392,7 +497,7 @@ class Sac_a_push {
 
     function pgflush_add($pgflush)
     {
-        array_push($this->pages_flush, $pgflush);
+        array_push($this->pending_pages, $pgflush);
     }
 
     function garbage_manager($force)
@@ -414,7 +519,17 @@ class Sac_a_push {
 
     function run()
     {
-        GLOBAL $DOCUMENT_ROOT, $HTTP_HOST, $G_with_splash;
+        GLOBAL $DOCUMENT_ROOT, $HTTP_HOST;
+
+        GLOBAL $G_alarm_passwd, $G_black_list, $G_btrace_pref_sub, $G_dbauth;
+        GLOBAL $G_dbpfx, $G_donors_all, $G_donors_cur, $G_is_local, $G_lang;
+        GLOBAL $G_poll_entries, $G_poll_name, $G_poll_title, $G_proxy_white_list;
+        GLOBAL $G_room_roadmap, $G_shutdown, $G_sidebanner, $G_sidebanner2;
+        GLOBAL $G_splash_content, $G_splash_contents, $G_splash_cont_idx;
+        GLOBAL $G_splash_h, $G_splash_idx, $G_splash_interval, $G_splash_timeout;
+        GLOBAL $G_splash_w, $G_topbanner, $G_with_donors, $G_with_poll;
+        GLOBAL $G_with_sidebanner, $G_with_sidebanner2, $G_with_splash;
+        GLOBAL $G_with_topbanner;
 
         if ($this->main_loop) {
             return (FALSE);
@@ -424,14 +539,15 @@ class Sac_a_push {
         
         while ($this->main_loop) {
             $this->curtime = time();
-            printf("IN LOOP: Current opened: %d  pages_flush: %d - ", count($this->socks), count($this->pages_flush));
+            printf("IN LOOP: Current opened: %d  pending_pages: %d - ", count($this->socks), count($this->pending_pages));
             
             /* Prepare the read array */
             /* // when we manage it ... */
             /* if ($shutdown)  */
             /*     $read   = array_merge(array("$in" => $in), $socks); */
             /* else */
-            $read   = array_merge(array(intval($this->list) => $this->list, intval($this->in) => $this->in),
+            $read   = array_merge(array(intval($this->list) => $this->list, intval($this->in) => $this->in,
+                                        intval(static::$cnt_slave) => static::$cnt_slave),
                                   $this->socks);
             
             if ($this->debug > 1) {
@@ -440,7 +556,7 @@ class Sac_a_push {
             }
             $write  = NULL;
             $except = NULL;
-            $num_changed_sockets = stream_select($read, $write, $except, 0, 500000);
+            $num_changed_sockets = @stream_select($read, $write, $except, 0, 500000);
         
             if ($num_changed_sockets == 0) {
                 printf(" no data in 5 secs, splash [%d]\n", $G_with_splash);
@@ -510,11 +626,11 @@ class Sac_a_push {
                             }
                             if ($sock === $this->list) {
                                 printf("Arrivati %d bytes da list\n", strlen($buf));
-                                exit(21);
+                                return(21);
                             }
-                            else if ($sock === $this->in) {
+                            else if ($sock === $this->in || $sock === static::$cnt_slave) {
                                 printf("Arrivati %d bytes da stdin\n", strlen($buf));
-                                exit(22);
+                                return(22);
                             }
                             else {
                                 // $user_a[$s2u[intval($sock)]]->disable();
@@ -539,18 +655,20 @@ class Sac_a_push {
                             if ($sock === $this->list) {
                                 printf("Arrivati %d bytes da list\n", strlen($buf));
                             }
-                            else if ($sock === $this->in) {
+                            else if ($sock === $this->in || $sock === static::$cnt_slave) {
                                 printf("Arrivati %d bytes da stdin\n", strlen($buf));
                                 $line = trim($buf);
                                 if ($line == "reload") {
                                     require("$DOCUMENT_ROOT/Etc/".BRISK_CONF);
+
+                                    global_dump();
                                 }
                                 else if ($line == "shutdown") {
                                     if ($this->app->dump_data()) {
-                                        exit(0);
+                                        return(0);
                                     }
                                     else {
-                                        exit(1);
+                                        return(1);
                                     }
                                 }
                             }
@@ -566,9 +684,10 @@ class Sac_a_push {
             $this->garbage_manager(FALSE);
 
             /* manage unfinished pages */
-            foreach ($this->pages_flush as $k => $pgflush) {
+            foreach ($this->pending_pages as $k => $pgflush) {
+                // TODO: try_flush if exists in the class
                 if ($pgflush->try_flush($this->curtime) == TRUE) {
-                    unset($this->pages_flush[$k]);
+                    unset($this->pending_pages[$k]);
                 }
             }