<?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;
}
// 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));
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;
{
}
- // 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)
{
$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
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
function pgflush_add($pgflush)
{
- array_push($this->pages_flush, $pgflush);
+ array_push($this->pending_pages, $pgflush);
}
function garbage_manager($force)
function run()
{
- GLOBAL $DOCUMENT_ROOT, $HTTP_HOST, $G_with_splash, $G_shutdown, $G_black_list;
+ 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);
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) {
}
$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);
}
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();
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);
}
}
}
$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]);
}
}