]> git.mxchange.org Git - friendica.git/commitdiff
Merge geotag into develop
authorrabuzarus <trebor@central-unit>
Wed, 30 Sep 2015 10:37:20 +0000 (12:37 +0200)
committerrabuzarus <trebor@central-unit>
Wed, 30 Sep 2015 10:37:20 +0000 (12:37 +0200)
Conflicts:
mod/photos.php

19 files changed:
boot.php
database.sql
include/cron.php [new file with mode: 0644]
include/cronhooks.php
include/dbstructure.php
include/feed.php [new file with mode: 0644]
include/follow.php
include/items.php
include/nav.php
include/notifier.php
include/onepoll.php
include/pidfile.php
include/poller.php
include/queue.php
mod/events.php
mod/photos.php
update.php
view/templates/event_head.tpl
view/theme/vier/templates/nav.tpl

index dcf6c65b1eb3c47375c1baa0b3df95d575aa5112..5f633fd87877b37cb9ba531cdcd5b5477ca7441d 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -19,7 +19,7 @@ define ( 'FRIENDICA_PLATFORM',     'Friendica');
 define ( 'FRIENDICA_CODENAME',     'Lily of the valley');
 define ( 'FRIENDICA_VERSION',      '3.4.2' );
 define ( 'DFRN_PROTOCOL_VERSION',  '2.23'    );
-define ( 'DB_UPDATE_VERSION',      1188      );
+define ( 'DB_UPDATE_VERSION',      1189      );
 define ( 'EOL',                    "<br />\r\n"     );
 define ( 'ATOM_TIME',              'Y-m-d\TH:i:s\Z' );
 
@@ -1432,8 +1432,46 @@ if(! function_exists('proc_run')) {
                if(! $arr['run_cmd'])
                        return;
 
-               if(count($args) && $args[0] === 'php')
+               if(count($args) && $args[0] === 'php') {
+
+                       if (get_config("system", "worker")) {
+                               $argv = $args;
+                               array_shift($argv);
+
+                               $parameters = json_encode($argv);
+                               $found = q("SELECT `id` FROM `workerqueue` WHERE `parameter` = '%s'",
+                                               dbesc($parameters));
+
+                               if (!$found)
+                                       q("INSERT INTO `workerqueue` (`parameter`, `created`, `priority`)
+                                                               VALUES ('%s', '%s', %d)",
+                                               dbesc($parameters),
+                                               dbesc(datetime_convert()),
+                                               intval(0));
+
+                               // Should we quit and wait for the poller to be called as a cronjob?
+                               if (get_config("system", "worker_dont_fork"))
+                                       return;
+
+                               // Checking number of workers
+                               $workers = q("SELECT COUNT(*) AS `workers` FROM `workerqueue` WHERE `executed` != '0000-00-00 00:00:00'");
+
+                               // Get number of allowed number of worker threads
+                               $queues = intval(get_config("system", "worker_queues"));
+
+                               if ($queues == 0)
+                                       $queues = 4;
+
+                               // If there are already enough workers running, don't fork another one
+                               if ($workers[0]["workers"] >= $queues)
+                                       return;
+
+                               // Now call the poller to execute the jobs that we just added to the queue
+                               $args = array("php", "include/poller.php", "no_cron");
+                       }
+
                        $args[0] = ((x($a->config,'php_path')) && (strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php');
+               }
 
                // add baseurl to args. cli scripts can't construct it
                $args[] = $a->get_baseurl();
@@ -1441,9 +1479,8 @@ if(! function_exists('proc_run')) {
                for($x = 0; $x < count($args); $x ++)
                        $args[$x] = escapeshellarg($args[$x]);
 
-
-
                $cmdline = implode($args," ");
+
                if(get_config('system','proc_windows'))
                        proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo,dirname(__FILE__)));
                else
@@ -1860,3 +1897,31 @@ if(!function_exists('exif_imagetype')) {
                return($size[2]);
        }
 }
+
+function validate_include(&$file) {
+       $orig_file = $file;
+
+       $file = realpath($file);
+
+       if (strpos($file, getcwd()) !== 0)
+               return false;
+
+       $file = str_replace(getcwd()."/", "", $file, $count);
+       if ($count != 1)
+               return false;
+
+       if ($orig_file !== $file)
+               return false;
+
+       $valid = false;
+       if (strpos($file, "include/") === 0)
+               $valid = true;
+
+       if (strpos($file, "addon/") === 0)
+               $valid = true;
+
+       if (!$valid)
+               return false;
+
+       return true;
+}
index 76df6aec1990d576abdb7bf0b0b9796732296742..a6eb71ef3bdb922b5967d0f4350d9a26004ed5a2 100644 (file)
@@ -1,6 +1,6 @@
 -- ------------------------------------------
 -- Friendica 3.4.1 (Lily of the valley)
--- DB_UPDATE_VERSION 1188
+-- DB_UPDATE_VERSION 1189
 -- ------------------------------------------
 
 
@@ -1020,3 +1020,16 @@ CREATE TABLE IF NOT EXISTS `userd` (
         INDEX `username` (`username`)
 ) DEFAULT CHARSET=utf8;
 
+--
+-- TABLE workerqueue
+--
+CREATE TABLE IF NOT EXISTS `workerqueue` (
+       `id` int(11) NOT NULL auto_increment PRIMARY KEY,
+       `parameter` text NOT NULL,
+       `priority` tinyint(3) unsigned NOT NULL DEFAULT 0,
+       `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+       `pid` int(11) NOT NULL DEFAULT 0,
+       `executed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+        INDEX `created` (`created`)
+) DEFAULT CHARSET=utf8;
+
diff --git a/include/cron.php b/include/cron.php
new file mode 100644 (file)
index 0000000..46067d7
--- /dev/null
@@ -0,0 +1,341 @@
+<?php
+if (!file_exists("boot.php") AND (sizeof($_SERVER["argv"]) != 0)) {
+       $directory = dirname($_SERVER["argv"][0]);
+
+       if (substr($directory, 0, 1) != "/")
+               $directory = $_SERVER["PWD"]."/".$directory;
+
+       $directory = realpath($directory."/..");
+
+       chdir($directory);
+}
+
+require_once("boot.php");
+
+
+function cron_run(&$argv, &$argc){
+       global $a, $db;
+
+       if(is_null($a)) {
+               $a = new App;
+       }
+
+       if(is_null($db)) {
+               @include(".htconfig.php");
+               require_once("include/dba.php");
+               $db = new dba($db_host, $db_user, $db_pass, $db_data);
+               unset($db_host, $db_user, $db_pass, $db_data);
+       };
+
+
+       require_once('include/session.php');
+       require_once('include/datetime.php');
+       require_once('library/simplepie/simplepie.inc');
+       require_once('include/items.php');
+       require_once('include/Contact.php');
+       require_once('include/email.php');
+       require_once('include/socgraph.php');
+       require_once('include/pidfile.php');
+       require_once('mod/nodeinfo.php');
+
+       load_config('config');
+       load_config('system');
+
+       $maxsysload = intval(get_config('system','maxloadavg'));
+       if($maxsysload < 1)
+               $maxsysload = 50;
+       if(function_exists('sys_getloadavg')) {
+               $load = sys_getloadavg();
+               if(intval($load[0]) > $maxsysload) {
+                       logger('system: load ' . $load[0] . ' too high. cron deferred to next scheduled run.');
+                       return;
+               }
+       }
+
+       $last = get_config('system','last_cron');
+
+       $poll_interval = intval(get_config('system','cron_interval'));
+       if(! $poll_interval)
+               $poll_interval = 10;
+
+       if($last) {
+               $next = $last + ($poll_interval * 60);
+               if($next > time()) {
+                       logger('cron intervall not reached');
+                       return;
+               }
+       }
+
+       $lockpath = get_lockpath();
+       if ($lockpath != '') {
+               $pidfile = new pidfile($lockpath, 'cron');
+               if($pidfile->is_already_running()) {
+                       logger("cron: Already running");
+                       if ($pidfile->running_time() > 9*60) {
+                               $pidfile->kill();
+                               logger("cron: killed stale process");
+                               // Calling a new instance
+                               proc_run('php','include/cron.php');
+                       }
+                       exit;
+               }
+       }
+
+
+
+       $a->set_baseurl(get_config('system','url'));
+
+       load_hooks();
+
+       logger('cron: start');
+
+       // run queue delivery process in the background
+
+       proc_run('php',"include/queue.php");
+
+       // run diaspora photo queue process in the background
+
+       proc_run('php',"include/dsprphotoq.php");
+
+       // run the process to discover global contacts in the background
+
+       proc_run('php',"include/discover_poco.php");
+
+       // run the process to update locally stored global contacts in the background
+
+       proc_run('php',"include/discover_poco.php", "checkcontact");
+
+       // expire any expired accounts
+
+       q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0
+               AND `account_expires_on` != '0000-00-00 00:00:00'
+               AND `account_expires_on` < UTC_TIMESTAMP() ");
+
+       // delete user and contact records for recently removed accounts
+
+       $r = q("SELECT * FROM `user` WHERE `account_removed` = 1 AND `account_expires_on` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
+       if ($r) {
+               foreach($r as $user) {
+                       q("DELETE FROM `contact` WHERE `uid` = %d", intval($user['uid']));
+                       q("DELETE FROM `user` WHERE `uid` = %d", intval($user['uid']));
+               }
+       }
+
+       $abandon_days = intval(get_config('system','account_abandon_days'));
+       if($abandon_days < 1)
+               $abandon_days = 0;
+
+       // Check OStatus conversations
+       // Check only conversations with mentions (for a longer time)
+       check_conversations(true);
+
+       // Check every conversation
+       check_conversations(false);
+
+       // Follow your friends from your legacy OStatus account
+       // Doesn't work
+       // ostatus_check_follow_friends();
+
+       // update nodeinfo data
+       nodeinfo_cron();
+
+       // To-Do: Regenerate usage statistics
+       // q("ANALYZE TABLE `item`");
+
+       // once daily run birthday_updates and then expire in background
+
+       $d1 = get_config('system','last_expire_day');
+       $d2 = intval(datetime_convert('UTC','UTC','now','d'));
+
+       if($d2 != intval($d1)) {
+
+               update_contact_birthdays();
+
+               update_suggestions();
+
+               set_config('system','last_expire_day',$d2);
+               proc_run('php','include/expire.php');
+       }
+
+       $last = get_config('system','cache_last_cleared');
+
+       if($last) {
+               $next = $last + (3600); // Once per hour
+               $clear_cache = ($next <= time());
+       } else
+               $clear_cache = true;
+
+       if ($clear_cache) {
+               // clear old cache
+               Cache::clear();
+
+               // clear old item cache files
+               clear_cache();
+
+               // clear cache for photos
+               clear_cache($a->get_basepath(), $a->get_basepath()."/photo");
+
+               // clear smarty cache
+               clear_cache($a->get_basepath()."/view/smarty3/compiled", $a->get_basepath()."/view/smarty3/compiled");
+
+               // clear cache for image proxy
+               if (!get_config("system", "proxy_disabled")) {
+                       clear_cache($a->get_basepath(), $a->get_basepath()."/proxy");
+
+                       $cachetime = get_config('system','proxy_cache_time');
+                       if (!$cachetime) $cachetime = PROXY_DEFAULT_TIME;
+
+                       q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
+               }
+
+               set_config('system','cache_last_cleared', time());
+       }
+
+       $manual_id  = 0;
+       $generation = 0;
+       $force      = false;
+       $restart    = false;
+
+       if(($argc > 1) && ($argv[1] == 'force'))
+               $force = true;
+
+       if(($argc > 1) && ($argv[1] == 'restart')) {
+               $restart = true;
+               $generation = intval($argv[2]);
+               if(! $generation)
+                       killme();
+       }
+
+       if(($argc > 1) && intval($argv[1])) {
+               $manual_id = intval($argv[1]);
+               $force     = true;
+       }
+
+       $interval = intval(get_config('system','poll_interval'));
+       if(! $interval)
+               $interval = ((get_config('system','delivery_interval') === false) ? 3 : intval(get_config('system','delivery_interval')));
+
+       // If we are using the worker we don't need a delivery interval
+       if (get_config("system", "worker"))
+               $interval = false;
+
+       $sql_extra = (($manual_id) ? " AND `id` = $manual_id " : "");
+
+       reload_plugins();
+
+       $d = datetime_convert();
+
+       // Only poll from those with suitable relationships,
+       // and which have a polling address and ignore Diaspora since
+       // we are unable to match those posts with a Diaspora GUID and prevent duplicates.
+
+       $abandon_sql = (($abandon_days)
+               ? sprintf(" AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days))
+               : ''
+       );
+
+       $contacts = q("SELECT `contact`.`id` FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid`
+               WHERE `rel` IN (%d, %d) AND `poll` != '' AND `network` IN ('%s', '%s', '%s', '%s', '%s', '%s')
+               $sql_extra
+               AND NOT `self` AND NOT `contact`.`blocked` AND NOT `contact`.`readonly` AND NOT `contact`.`archive`
+               AND NOT `user`.`account_expired` AND NOT `user`.`account_removed` $abandon_sql ORDER BY RAND()",
+               intval(CONTACT_IS_SHARING),
+               intval(CONTACT_IS_FRIEND),
+               dbesc(NETWORK_DFRN),
+               dbesc(NETWORK_ZOT),
+               dbesc(NETWORK_OSTATUS),
+               dbesc(NETWORK_FEED),
+               dbesc(NETWORK_MAIL),
+               dbesc(NETWORK_MAIL2)
+       );
+
+       if(! count($contacts)) {
+               return;
+       }
+
+       foreach($contacts as $c) {
+
+               $res = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
+                       intval($c['id'])
+               );
+
+               if((! $res) || (! count($res)))
+                       continue;
+
+               foreach($res as $contact) {
+
+                       $xml = false;
+
+                       if($manual_id)
+                               $contact['last-update'] = '0000-00-00 00:00:00';
+
+                       if(in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS)))
+                               $contact['priority'] = 2;
+
+                       if($contact['subhub'] AND in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS))) {
+                               // We should be getting everything via a hub. But just to be sure, let's check once a day.
+                               // (You can make this more or less frequent if desired by setting 'pushpoll_frequency' appropriately)
+                               // This also lets us update our subscription to the hub, and add or replace hubs in case it
+                               // changed. We will only update hubs once a day, regardless of 'pushpoll_frequency'.
+
+                               $poll_interval = get_config('system','pushpoll_frequency');
+                               $contact['priority'] = (($poll_interval !== false) ? intval($poll_interval) : 3);
+                       }
+
+                       if($contact['priority'] AND !$force) {
+
+                               $update     = false;
+
+                               $t = $contact['last-update'];
+
+                               /**
+                                * Based on $contact['priority'], should we poll this site now? Or later?
+                                */
+
+                               switch ($contact['priority']) {
+                                       case 5:
+                                               if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 month"))
+                                                       $update = true;
+                                               break;
+                                       case 4:
+                                               if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 week"))
+                                                       $update = true;
+                                               break;
+                                       case 3:
+                                               if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day"))
+                                                       $update = true;
+                                               break;
+                                       case 2:
+                                               if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 12 hour"))
+                                                       $update = true;
+                                               break;
+                                       case 1:
+                                       default:
+                                               if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 hour"))
+                                                       $update = true;
+                                               break;
+                               }
+                               if(!$update)
+                                       continue;
+                       }
+
+                       logger("Polling ".$contact["network"]." ".$contact["id"]." ".$contact["nick"]." ".$contact["name"]);
+
+                       proc_run('php','include/onepoll.php',$contact['id']);
+
+                       if($interval)
+                               @time_sleep_until(microtime(true) + (float) $interval);
+               }
+       }
+
+       logger('cron: end');
+
+       set_config('system','last_cron', time());
+
+       return;
+}
+
+if (array_search(__file__,get_included_files())===0){
+       cron_run($_SERVER["argv"],$_SERVER["argc"]);
+       killme();
+}
index 26cab3cf92a86a0c3a2b566f3d24dc56ed7e356c..d5b4f3bf6f1b4f07974f409f44d987f809a86854 100644 (file)
@@ -11,11 +11,11 @@ function cronhooks_run(&$argv, &$argc){
        }
 
        if(is_null($db)) {
-           @include(".htconfig.php");
-       require_once("include/dba.php");
-           $db = new dba($db_host, $db_user, $db_pass, $db_data);
-       unset($db_host, $db_user, $db_pass, $db_data);
-       };
+               @include(".htconfig.php");
+               require_once("include/dba.php");
+               $db = new dba($db_host, $db_user, $db_pass, $db_data);
+               unset($db_host, $db_user, $db_pass, $db_data);
+       };
 
        require_once('include/session.php');
        require_once('include/datetime.php');
@@ -35,17 +35,31 @@ function cronhooks_run(&$argv, &$argc){
                }
        }
 
+       $last = get_config('system','last_cronhook');
+
+       $poll_interval = intval(get_config('system','cronhook_interval'));
+       if(! $poll_interval)
+               $poll_interval = 9;
+
+       if($last) {
+               $next = $last + ($poll_interval * 60);
+               if($next > time()) {
+                       logger('cronhook intervall not reached');
+                       return;
+               }
+       }
+
        $lockpath = get_lockpath();
        if ($lockpath != '') {
                $pidfile = new pidfile($lockpath, 'cronhooks');
                if($pidfile->is_already_running()) {
                        logger("cronhooks: Already running");
                        if ($pidfile->running_time() > 19*60) {
-                                $pidfile->kill();
-                                logger("cronhooks: killed stale process");
+                               $pidfile->kill();
+                               logger("cronhooks: killed stale process");
                                // Calling a new instance
                                proc_run('php','include/cronhooks.php');
-                        }
+                       }
                        exit;
                }
        }
@@ -62,10 +76,12 @@ function cronhooks_run(&$argv, &$argc){
 
        logger('cronhooks: end');
 
+       set_config('system','last_cronhook', time());
+
        return;
 }
 
 if (array_search(__file__,get_included_files())===0){
-  cronhooks_run($_SERVER["argv"],$_SERVER["argc"]);
-  killme();
+       cronhooks_run($_SERVER["argv"],$_SERVER["argc"]);
+       killme();
 }
index 2b1ee84fdac90b4a975bf411ae21ed47c9683fd0..deb6ddf5330639acab34f8fe11f1eb6ebb0a4d4c 100644 (file)
@@ -1382,6 +1382,20 @@ function db_definition() {
                                        "username" => array("username"),
                                        )
                        );
+       $database["workerqueue"] = array(
+                       "fields" => array(
+                                       "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
+                                       "parameter" => array("type" => "text", "not null" => "1"),
+                                       "priority" => array("type" => "tinyint(3) unsigned", "not null" => "1", "default" => "0"),
+                                       "created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"),
+                                       "pid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
+                                       "executed" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"),
+                                       ),
+                       "indexes" => array(
+                                       "PRIMARY" => array("id"),
+                                       "created" => array("created"),
+                                       )
+                       );
 
        return($database);
 }
diff --git a/include/feed.php b/include/feed.php
new file mode 100644 (file)
index 0000000..18d96e6
--- /dev/null
@@ -0,0 +1,275 @@
+<?php
+require_once("include/html2bbcode.php");
+require_once("include/items.php");
+
+function feed_import($xml,$importer,&$contact, &$hub) {
+
+       $a = get_app();
+
+       logger("Import Atom/RSS feed", LOGGER_DEBUG);
+
+       if ($xml == "")
+               return;
+
+       $doc = new DOMDocument();
+       @$doc->loadXML($xml);
+       $xpath = new DomXPath($doc);
+       $xpath->registerNamespace('atom', "http://www.w3.org/2005/Atom");
+       $xpath->registerNamespace('dc', "http://purl.org/dc/elements/1.1/");
+       $xpath->registerNamespace('content', "http://purl.org/rss/1.0/modules/content/");
+       $xpath->registerNamespace('rdf', "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
+       $xpath->registerNamespace('rss', "http://purl.org/rss/1.0/");
+       $xpath->registerNamespace('media', "http://search.yahoo.com/mrss/");
+
+       $author = array();
+
+       // Is it RDF?
+       if ($xpath->query('/rdf:RDF/rss:channel')->length > 0) {
+               //$author["author-link"] = $xpath->evaluate('/rdf:RDF/rss:channel/rss:link/text()')->item(0)->nodeValue;
+               $author["author-name"] = $xpath->evaluate('/rdf:RDF/rss:channel/rss:title/text()')->item(0)->nodeValue;
+
+               if ($author["author-name"] == "")
+                       $author["author-name"] = $xpath->evaluate('/rdf:RDF/rss:channel/rss:description/text()')->item(0)->nodeValue;
+
+               $entries = $xpath->query('/rdf:RDF/rss:item');
+       }
+
+       // Is it Atom?
+       if ($xpath->query('/atom:feed/atom:entry')->length > 0) {
+               //$self = $xpath->query("/atom:feed/atom:link[@rel='self']")->item(0)->attributes;
+               //if (is_object($self))
+               //      foreach($self AS $attributes)
+               //              if ($attributes->name == "href")
+               //                      $author["author-link"] = $attributes->textContent;
+
+               //if ($author["author-link"] == "") {
+               //      $alternate = $xpath->query("/atom:feed/atom:link[@rel='alternate']")->item(0)->attributes;
+               //      if (is_object($alternate))
+               //              foreach($alternate AS $attributes)
+               //                      if ($attributes->name == "href")
+               //                              $author["author-link"] = $attributes->textContent;
+               //}
+
+               $author["author-name"] = $xpath->evaluate('/atom:feed/atom:title/text()')->item(0)->nodeValue;
+
+               if ($author["author-name"] == "")
+                       $author["author-name"] = $xpath->evaluate('/atom:feed/atom:subtitle/text()')->item(0)->nodeValue;
+
+               if ($author["author-name"] == "")
+                       $author["author-name"] = $xpath->evaluate('/atom:feed/atom:author/atom:name/text()')->item(0)->nodeValue;
+
+               //$author["author-avatar"] = $xpath->evaluate('/atom:feed/atom:logo/text()')->item(0)->nodeValue;
+
+               $author["edited"] = $author["created"] = $xpath->query('/atom:feed/atom:updated/text()')->item(0)->nodeValue;
+
+               $author["app"] = $xpath->evaluate('/atom:feed/atom:generator/text()')->item(0)->nodeValue;
+
+               $entries = $xpath->query('/atom:feed/atom:entry');
+       }
+
+       // Is it RSS?
+       if ($xpath->query('/rss/channel')->length > 0) {
+               //$author["author-link"] = $xpath->evaluate('/rss/channel/link/text()')->item(0)->nodeValue;
+               $author["author-name"] = $xpath->evaluate('/rss/channel/title/text()')->item(0)->nodeValue;
+               //$author["author-avatar"] = $xpath->evaluate('/rss/channel/image/url/text()')->item(0)->nodeValue;
+
+               if ($author["author-name"] == "")
+                       $author["author-name"] = $xpath->evaluate('/rss/channel/copyright/text()')->item(0)->nodeValue;
+
+               if ($author["author-name"] == "")
+                       $author["author-name"] = $xpath->evaluate('/rss/channel/description/text()')->item(0)->nodeValue;
+
+               $author["edited"] = $author["created"] = $xpath->query('/rss/channel/pubDate/text()')->item(0)->nodeValue;
+
+               $author["app"] = $xpath->evaluate('/rss/channel/generator/text()')->item(0)->nodeValue;
+
+               $entries = $xpath->query('/rss/channel/item');
+       }
+
+       //if ($author["author-link"] == "")
+               $author["author-link"] = $contact["url"];
+
+       if ($author["author-name"] == "")
+               $author["author-name"] = $contact["name"];
+
+       //if ($author["author-avatar"] == "")
+               $author["author-avatar"] = $contact["thumb"];
+
+       $author["owner-link"] = $contact["url"];
+       $author["owner-name"] = $contact["name"];
+       $author["owner-avatar"] = $contact["thumb"];
+
+       $header = array();
+       $header["uid"] = $importer["uid"];
+       $header["network"] = NETWORK_FEED;
+       $header["type"] = "remote";
+       $header["wall"] = 0;
+       $header["origin"] = 0;
+       $header["gravity"] = GRAVITY_PARENT;
+
+       $header["contact-id"] = $contact["id"];
+
+       if (!is_object($entries))
+               return;
+
+       foreach ($entries AS $entry)
+               $entrylist[] = $entry;
+
+       foreach (array_reverse($entrylist) AS $entry) {
+               $item = array_merge($header, $author);
+
+               $item["title"] = $xpath->evaluate('atom:title/text()', $entry)->item(0)->nodeValue;
+
+               if ($item["title"] == "")
+                       $item["title"] = $xpath->evaluate('title/text()', $entry)->item(0)->nodeValue;
+
+               if ($item["title"] == "")
+                       $item["title"] = $xpath->evaluate('rss:title/text()', $entry)->item(0)->nodeValue;
+
+               $alternate = $xpath->query("atom:link[@rel='alternate']", $entry)->item(0)->attributes;
+               if (!is_object($alternate))
+                       $alternate = $xpath->query("atom:link", $entry)->item(0)->attributes;
+
+               if (is_object($alternate))
+                       foreach($alternate AS $attributes)
+                               if ($attributes->name == "href")
+                                       $item["plink"] = $attributes->textContent;
+
+               if ($item["plink"] == "")
+                       $item["plink"] = $xpath->evaluate('link/text()', $entry)->item(0)->nodeValue;
+
+               if ($item["plink"] == "")
+                       $item["plink"] = $xpath->evaluate('rss:link/text()', $entry)->item(0)->nodeValue;
+
+               $item["plink"] = original_url($item["plink"]);
+
+               $item["uri"] = $xpath->evaluate('atom:id/text()', $entry)->item(0)->nodeValue;
+
+               if ($item["uri"] == "")
+                       $item["uri"] = $xpath->evaluate('guid/text()', $entry)->item(0)->nodeValue;
+
+               if ($item["uri"] == "")
+                       $item["uri"] = $item["plink"];
+
+               $item["parent-uri"] = $item["uri"];
+
+               $published = $xpath->query('atom:published/text()', $entry)->item(0)->nodeValue;
+
+               if ($published == "")
+                       $published = $xpath->query('pubDate/text()', $entry)->item(0)->nodeValue;
+
+               if ($published == "")
+                       $published = $xpath->query('dc:date/text()', $entry)->item(0)->nodeValue;
+
+               $updated = $xpath->query('atom:updated/text()', $entry)->item(0)->nodeValue;
+
+               if ($updated == "")
+                       $updated = $published;
+
+               if ($published != "")
+                       $item["created"] = $published;
+
+               if ($updated != "")
+                       $item["edited"] = $updated;
+
+               $creator = $xpath->query('author/text()', $entry)->item(0)->nodeValue;
+
+               if ($creator == "")
+                       $creator = $xpath->query('atom:author/atom:name/text()', $entry)->item(0)->nodeValue;
+
+               if ($creator == "")
+                       $creator = $xpath->query('dc:creator/text()', $entry)->item(0)->nodeValue;
+
+               if ($creator != "")
+                       $item["author-name"] = $creator;
+
+               if ($pubDate != "")
+                       $item["edited"] = $item["created"] = $pubDate;
+
+               $creator = $xpath->query('dc:creator/text()', $entry)->item(0)->nodeValue;
+
+               if ($creator != "")
+                       $item["author-name"] = $creator;
+
+               //$item["object"] = $xml;
+
+               $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s'",
+                       intval($importer["uid"]), dbesc($item["uri"]));
+               if ($r) {
+                       logger("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already existed under id ".$r[0]["id"], LOGGER_DEBUG);
+                       continue;
+               }
+
+               // To-Do?
+               // <category>Ausland</category>
+               // <media:thumbnail width="152" height="76" url="http://www.taz.de/picture/667875/192/14388767.jpg"/>
+
+               $attachments = array();
+
+               $enclosures = $xpath->query("enclosure", $entry);
+               foreach ($enclosures AS $enclosure) {
+                       $href = "";
+                       $length = "";
+                       $type = "";
+                       $title = "";
+
+                       foreach($enclosure->attributes AS $attributes) {
+                               if ($attributes->name == "url")
+                                       $href = $attributes->textContent;
+                               elseif ($attributes->name == "length")
+                                       $length = $attributes->textContent;
+                               elseif ($attributes->name == "type")
+                                       $type = $attributes->textContent;
+                       }
+                       if(strlen($item["attach"]))
+                               $item["attach"] .= ',';
+
+                       $attachments[] = array("link" => $href, "type" => $type, "length" => $length);
+
+                       $item["attach"] .= '[attach]href="'.$href.'" length="'.$length.'" type="'.$type.'"[/attach]';
+               }
+
+               if ($contact["fetch_further_information"]) {
+                       $preview = "";
+
+                       // Handle enclosures and treat them as preview picture
+                       foreach ($attachments AS $attachment)
+                               if ($attachment["type"] == "image/jpeg")
+                                       $preview = $attachment["link"];
+
+                       $item["body"] = $item["title"].add_page_info($item["plink"], false, $preview, ($contact["fetch_further_information"] == 2), $contact["ffi_keyword_blacklist"]);
+                       $item["tag"] = add_page_keywords($item["plink"], false, $preview, ($contact["fetch_further_information"] == 2), $contact["ffi_keyword_blacklist"]);
+                       $item["title"] = "";
+                       $item["object-type"] = ACTIVITY_OBJ_BOOKMARK;
+                       unset($item["attach"]);
+               } else {
+                       $body = trim($xpath->evaluate('atom:content/text()', $entry)->item(0)->nodeValue);
+
+                       if ($body == "")
+                               $body = trim($xpath->evaluate('content:encoded/text()', $entry)->item(0)->nodeValue);
+
+                       if ($body == "")
+                               $body = trim($xpath->evaluate('description/text()', $entry)->item(0)->nodeValue);
+
+                       if ($body == "")
+                               $body = trim($xpath->evaluate('atom:summary/text()', $entry)->item(0)->nodeValue);
+
+                       // remove the content of the title if it is identically to the body
+                       // This helps with auto generated titles e.g. from tumblr
+                       if (title_is_body($item["title"], $body))
+                               $item["title"] = "";
+
+                       $item["body"] = html2bbcode($body);
+               }
+
+               logger("Stored feed: ".print_r($item, true), LOGGER_DEBUG);
+
+               $notify = item_is_remote_self($contact, $item);
+               $id = item_store($item, false, $notify);
+
+               //print_r($item);
+
+               logger("Feed for contact ".$contact["url"]." stored under id ".$id);
+       }
+}
+?>
index 217b9d07b7b37c22de81af99793c6cd968b1146f..ca0228cc0f89542f3f66ae7531de0fe3c68e6329 100644 (file)
@@ -9,13 +9,13 @@ function update_contact($id) {
 
        $r = q("SELECT `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `network` FROM `contact` WHERE `id` = %d", intval($id));
        if (!$r)
-               return;
+               return false;
 
        $ret = probe_url($r[0]["url"]);
 
        // If probe_url fails the network code will be different
        if ($ret["network"] != $r[0]["network"])
-               return;
+               return false;
 
        $update = false;
 
@@ -29,7 +29,7 @@ function update_contact($id) {
        }
 
        if (!$update)
-               return;
+               return true;
 
        q("UPDATE `contact` SET `url` = '%s', `nurl` = '%s', `addr` = '%s', `alias` = '%s', `batch` = '%s', `notify` = '%s', `poll` = '%s', `poco` = '%s' WHERE `id` = %d",
                dbesc($ret['url']),
@@ -42,6 +42,8 @@ function update_contact($id) {
                dbesc($ret['poco']),
                intval($id)
        );
+
+       return true;
 }
 
 //
index 2d05488bcd1e8e4b7302e35fe690f1c368128c92..0d442e317031d2a750f52973ad388447a6e20962 100644 (file)
@@ -13,6 +13,7 @@ require_once('include/threads.php');
 require_once('include/socgraph.php');
 require_once('include/plaintext.php');
 require_once('include/ostatus.php');
+require_once('include/feed.php');
 require_once('mod/share.php');
 
 require_once('library/defuse/php-encryption-1.2.1/Crypto.php');
@@ -2284,16 +2285,20 @@ function edited_timestamp_is_newer($existing, $update) {
 function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) {
        if ($contact['network'] === NETWORK_OSTATUS) {
                if ($pass < 2) {
-                       // Test - remove before flight
-                       //$tempfile = tempnam(get_temppath(), "ostatus");
-                       //file_put_contents($tempfile, $xml);
-
                        logger("Consume OStatus messages ", LOGGER_DEBUG);
                        ostatus_import($xml,$importer,$contact, $hub);
                }
                return;
        }
 
+       if ($contact['network'] === NETWORK_FEED) {
+               if ($pass < 2) {
+                       logger("Consume feeds", LOGGER_DEBUG);
+                       feed_import($xml,$importer,$contact, $hub);
+               }
+               return;
+       }
+
        require_once('library/simplepie/simplepie.inc');
        require_once('include/contact_selectors.php');
 
index 935d08f524536b6272951cf643842415f071e4b5..972a6248c1defca27b3aa9ac9f0eb50d8bd72def 100644 (file)
@@ -138,6 +138,8 @@ function nav_info(&$a) {
        elseif(get_config('system','community_page_style') == CP_GLOBAL_COMMUNITY)
                $nav['community'] = array('community', t('Community'), "", t('Conversations on the network'));
 
+       $nav['events'] = Array('events', t('Events'), "", t('Events and Calendar'));
+
        $nav['directory'] = array($gdirpath, t('Directory'), "", t('People directory'));
 
        $nav['about'] = Array('friendica', t('Information'), "", t('Information about this friendica instance'));
index 002b3c8d74302e0d79000ec201dc050ff6632a1e..d4d254f1c9a82a628aad02b43bef658a189b4c17 100644 (file)
@@ -615,6 +615,10 @@ function notifier_run(&$argv, &$argc){
 
        $interval = ((get_config('system','delivery_interval') === false) ? 2 : intval(get_config('system','delivery_interval')));
 
+       // If we are using the worker we don't need a delivery interval
+       if (get_config("system", "worker"))
+               $interval = false;
+
        // delivery loop
 
        if(count($r)) {
@@ -634,7 +638,7 @@ function notifier_run(&$argv, &$argc){
 
                // This controls the number of deliveries to execute with each separate delivery process.
                // By default we'll perform one delivery per process. Assuming a hostile shared hosting
-               // provider, this provides the greatest chance of deliveries if processes start getting 
+               // provider, this provides the greatest chance of deliveries if processes start getting
                // killed. We can also space them out with the delivery_interval to also help avoid them
                // getting whacked.
 
@@ -642,8 +646,10 @@ function notifier_run(&$argv, &$argc){
                // together into a single process. This will reduce the overall number of processes
                // spawned for each delivery, but they will run longer.
 
+               // When using the workerqueue, we don't need this functionality.
+
                $deliveries_per_process = intval(get_config('system','delivery_batch_count'));
-               if($deliveries_per_process <= 0)
+               if (($deliveries_per_process <= 0) OR get_config("system", "worker"))
                        $deliveries_per_process = 1;
 
                $this_batch = array();
index 1fc861afa2a4f2fa0648110cf197fc2cd2967ded..0e58a776ca2d1c47a801561cfc18c9d71dea5135 100644 (file)
@@ -168,8 +168,18 @@ function onepoll_run(&$argv, &$argc){
        );
 
        // Update the contact entry
-       if(($contact['network'] === NETWORK_OSTATUS) || ($contact['network'] === NETWORK_DIASPORA) || ($contact['network'] === NETWORK_DFRN))
-               update_contact($contact["id"]);
+       if(($contact['network'] === NETWORK_OSTATUS) || ($contact['network'] === NETWORK_DIASPORA) || ($contact['network'] === NETWORK_DFRN)) {
+               if (!poco_reachable($contact['url'])) {
+                       logger("Skipping probably dead contact ".$contact['url']);
+                       return;
+               }
+
+               if (!update_contact($contact["id"])) {
+                       mark_for_death($contact);
+                       return;
+               } else
+                       unmark_for_death($contact);
+       }
 
        if($contact['network'] === NETWORK_DFRN) {
 
@@ -360,7 +370,7 @@ function onepoll_run(&$argv, &$argc){
                                );
                                logger("Mail: Connected to " . $mailconf[0]['user']);
                        } else
-                               logger("Mail: Connection error ".$mailconf[0]['user']." ".print_r(imap_errors()));
+                               logger("Mail: Connection error ".$mailconf[0]['user']." ".print_r(imap_errors(), true));
                }
                if($mbox) {
 
index 4f5b25ad756521af2dee7626a26beb6c83395964..3093e149aeb869acc2c35ca0a49e9087642e7cb6 100644 (file)
@@ -7,8 +7,8 @@ class pidfile {
                $this->_file = "$dir/$name.pid";
 
                if (file_exists($this->_file)) {
-                       $pid = trim(file_get_contents($this->_file));
-                       if (posix_kill($pid, 0)) {
+                       $pid = trim(@file_get_contents($this->_file));
+                       if (($pid != "") AND posix_kill($pid, 0)) {
                                $this->_running = true;
                        }
                }
@@ -21,7 +21,7 @@ class pidfile {
 
        public function __destruct() {
                if ((! $this->_running) && file_exists($this->_file)) {
-                       unlink($this->_file);
+                       @unlink($this->_file);
                }
        }
 
@@ -30,7 +30,7 @@ class pidfile {
        }
 
        public function running_time() {
-               return(time() - filectime($this->_file));
+               return(time() - @filectime($this->_file));
        }
 
        public function kill() {
index 28dc0c0cde03748f926822923b6855d9b70aba4e..45740dab62c3ba04975a08f41b112096968c4c53 100644 (file)
@@ -12,7 +12,6 @@ if (!file_exists("boot.php") AND (sizeof($_SERVER["argv"]) != 0)) {
 
 require_once("boot.php");
 
-
 function poller_run(&$argv, &$argc){
        global $a, $db;
 
@@ -21,303 +20,145 @@ function poller_run(&$argv, &$argc){
        }
 
        if(is_null($db)) {
-           @include(".htconfig.php");
-       require_once("include/dba.php");
-           $db = new dba($db_host, $db_user, $db_pass, $db_data);
-       unset($db_host, $db_user, $db_pass, $db_data);
-       };
-
-
-       require_once('include/session.php');
-       require_once('include/datetime.php');
-       require_once('library/simplepie/simplepie.inc');
-       require_once('include/items.php');
-       require_once('include/Contact.php');
-       require_once('include/email.php');
-       require_once('include/socgraph.php');
-       require_once('include/pidfile.php');
-       require_once('mod/nodeinfo.php');
-
-       load_config('config');
-       load_config('system');
-
-       $maxsysload = intval(get_config('system','maxloadavg'));
-       if($maxsysload < 1)
-               $maxsysload = 50;
+               @include(".htconfig.php");
+               require_once("include/dba.php");
+               $db = new dba($db_host, $db_user, $db_pass, $db_data);
+               unset($db_host, $db_user, $db_pass, $db_data);
+       };
+
        if(function_exists('sys_getloadavg')) {
+               $maxsysload = intval(get_config('system','maxloadavg'));
+               if($maxsysload < 1)
+                       $maxsysload = 50;
+
                $load = sys_getloadavg();
                if(intval($load[0]) > $maxsysload) {
-                       logger('system: load ' . $load[0] . ' too high. Poller deferred to next scheduled run.');
+                       logger('system: load ' . $load[0] . ' too high. poller deferred to next scheduled run.');
                        return;
                }
        }
 
-       $lockpath = get_lockpath();
-       if ($lockpath != '') {
-               $pidfile = new pidfile($lockpath, 'poller');
-               if($pidfile->is_already_running()) {
-                       logger("poller: Already running");
-                       if ($pidfile->running_time() > 9*60) {
-                                $pidfile->kill();
-                                logger("poller: killed stale process");
-                                // Calling a new instance
-                                proc_run('php','include/poller.php');
-                        }
-                       exit;
-               }
-       }
-
-
-
-       $a->set_baseurl(get_config('system','url'));
-
-       load_hooks();
-
-       logger('poller: start');
-
-       // run queue delivery process in the background
-
-       proc_run('php',"include/queue.php");
-
-       // run diaspora photo queue process in the background
-
-       proc_run('php',"include/dsprphotoq.php");
-
-       // run the process to discover global contacts in the background
-
-       proc_run('php',"include/discover_poco.php");
+       if(($argc <= 1) OR ($argv[1] != "no_cron")) {
+               // Run the cron job that calls all other jobs
+               proc_run("php","include/cron.php");
+
+               // Run the cronhooks job separately from cron for being able to use a different timing
+               proc_run("php","include/cronhooks.php");
+
+               // Cleaning dead processes
+               $r = q("SELECT DISTINCT(`pid`) FROM `workerqueue` WHERE `executed` != '0000-00-00 00:00:00'");
+               foreach($r AS $pid)
+                       if (!posix_kill($pid["pid"], 0))
+                               q("UPDATE `workerqueue` SET `executed` = '0000-00-00 00:00:00', `pid` = 0 WHERE `pid` = %d",
+                                       intval($pid["pid"]));
+                       else {
+                               // To-Do: Kill long running processes
+                               // But: Update processes (like the database update) mustn't be killed
+                       }
 
-       // run the process to update locally stored global contacts in the background
+       } else
+               // Sleep two seconds before checking for running processes to avoid having too many workers
+               sleep(4);
 
-       proc_run('php',"include/discover_poco.php", "checkcontact");
+       // Checking number of workers
+       if (poller_too_much_workers())
+               return;
 
-       // expire any expired accounts
+       $starttime = time();
 
-       q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0
-               AND `account_expires_on` != '0000-00-00 00:00:00'
-               AND `account_expires_on` < UTC_TIMESTAMP() ");
+       while ($r = q("SELECT * FROM `workerqueue` WHERE `executed` = '0000-00-00 00:00:00' ORDER BY `created` LIMIT 1")) {
 
-       // delete user and contact records for recently removed accounts
+               q("UPDATE `workerqueue` SET `executed` = '%s', `pid` = %d WHERE `id` = %d AND `executed` = '0000-00-00 00:00:00'",
+                       dbesc(datetime_convert()),
+                       intval(getmypid()),
+                       intval($r[0]["id"]));
 
-       $r = q("SELECT * FROM `user` WHERE `account_removed` = 1 AND `account_expires_on` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
-       if ($r) {
-               foreach($r as $user) {
-                       q("DELETE FROM `contact` WHERE `uid` = %d", intval($user['uid']));
-                       q("DELETE FROM `user` WHERE `uid` = %d", intval($user['uid']));
+               // Assure that there are no tasks executed twice
+               $id = q("SELECT `id` FROM `workerqueue` WHERE `id` = %d AND `pid` = %d",
+                       intval($r[0]["id"]),
+                       intval(getmypid()));
+               if (!$id) {
+                       logger("Queue item ".$r[0]["id"]." was executed multiple times - skip this execution", LOGGER_DEBUG);
+                       continue;
                }
-       }
-
-       $abandon_days = intval(get_config('system','account_abandon_days'));
-       if($abandon_days < 1)
-               $abandon_days = 0;
-
-       // Check OStatus conversations
-       // Check only conversations with mentions (for a longer time)
-       check_conversations(true);
-
-       // Check every conversation
-       check_conversations(false);
-
-       // Follow your friends from your legacy OStatus account
-       ostatus_check_follow_friends();
-
-       // update nodeinfo data
-       nodeinfo_cron();
-
-       // To-Do: Regenerate usage statistics
-       // q("ANALYZE TABLE `item`");
-
-       // once daily run birthday_updates and then expire in background
-
-       $d1 = get_config('system','last_expire_day');
-       $d2 = intval(datetime_convert('UTC','UTC','now','d'));
-
-       if($d2 != intval($d1)) {
-
-               update_contact_birthdays();
-
-               update_suggestions();
 
-               set_config('system','last_expire_day',$d2);
-               proc_run('php','include/expire.php');
-       }
-
-       $last = get_config('system','cache_last_cleared');
-
-       if($last) {
-               $next = $last + (3600); // Once per hour
-               $clear_cache = ($next <= time());
-        } else
-               $clear_cache = true;
-
-       if ($clear_cache) {
-               // clear old cache
-               Cache::clear();
+               $argv = json_decode($r[0]["parameter"]);
 
-               // clear old item cache files
-               clear_cache();
+               $argc = count($argv);
 
-               // clear cache for photos
-               clear_cache($a->get_basepath(), $a->get_basepath()."/photo");
+               // Check for existance and validity of the include file
+               $include = $argv[0];
 
-               // clear smarty cache
-               clear_cache($a->get_basepath()."/view/smarty3/compiled", $a->get_basepath()."/view/smarty3/compiled");
-
-               // clear cache for image proxy
-               if (!get_config("system", "proxy_disabled")) {
-                       clear_cache($a->get_basepath(), $a->get_basepath()."/proxy");
-
-                       $cachetime = get_config('system','proxy_cache_time');
-                       if (!$cachetime) $cachetime = PROXY_DEFAULT_TIME;
-
-                       q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
+               if (!validate_include($include)) {
+                       logger("Include file ".$argv[0]." is not valid!");
+                       q("DELETE FROM `workerqueue` WHERE `id` = %d", intval($r[0]["id"]));
+                       continue;
                }
 
-               set_config('system','cache_last_cleared', time());
-       }
-
-       $manual_id  = 0;
-       $generation = 0;
-       $force      = false;
-       $restart    = false;
-
-       if(($argc > 1) && ($argv[1] == 'force'))
-               $force = true;
-
-       if(($argc > 1) && ($argv[1] == 'restart')) {
-               $restart = true;
-               $generation = intval($argv[2]);
-               if(! $generation)
-                       killme();
-       }
-
-       if(($argc > 1) && intval($argv[1])) {
-               $manual_id = intval($argv[1]);
-               $force     = true;
-       }
-
-       $interval = intval(get_config('system','poll_interval'));
-       if(! $interval)
-               $interval = ((get_config('system','delivery_interval') === false) ? 3 : intval(get_config('system','delivery_interval')));
+               require_once($include);
 
-       $sql_extra = (($manual_id) ? " AND `id` = $manual_id " : "");
+               $funcname=str_replace(".php", "", basename($argv[0]))."_run";
 
-       reload_plugins();
+               if (function_exists($funcname)) {
+                       logger("Process ".getmypid().": ".$funcname." ".$r[0]["parameter"]);
+                       $funcname($argv, $argc);
 
-       $d = datetime_convert();
+                       logger("Process ".getmypid().": ".$funcname." - done");
 
-       if(! $restart)
-               proc_run('php','include/cronhooks.php');
+                       q("DELETE FROM `workerqueue` WHERE `id` = %d", intval($r[0]["id"]));
+               } else
+                       logger("Function ".$funcname." does not exist");
 
-       // Only poll from those with suitable relationships,
-       // and which have a polling address and ignore Diaspora since
-       // we are unable to match those posts with a Diaspora GUID and prevent duplicates.
-
-       $abandon_sql = (($abandon_days)
-               ? sprintf(" AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days))
-               : ''
-       );
-
-       $contacts = q("SELECT `contact`.`id` FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid`
-               WHERE `rel` IN (%d, %d) AND `poll` != '' AND `network` IN ('%s', '%s', '%s', '%s', '%s', '%s')
-               $sql_extra
-               AND NOT `self` AND NOT `contact`.`blocked` AND NOT `contact`.`readonly` AND NOT `contact`.`archive`
-               AND NOT `user`.`account_expired` AND NOT `user`.`account_removed` $abandon_sql ORDER BY RAND()",
-               intval(CONTACT_IS_SHARING),
-               intval(CONTACT_IS_FRIEND),
-               dbesc(NETWORK_DFRN),
-               dbesc(NETWORK_ZOT),
-               dbesc(NETWORK_OSTATUS),
-               dbesc(NETWORK_FEED),
-               dbesc(NETWORK_MAIL),
-               dbesc(NETWORK_MAIL2)
-       );
+               // Quit the poller once every hour
+               if (time() > ($starttime + 3600))
+                       return;
 
-       if(! count($contacts)) {
-               return;
+               // Count active workers and compare them with a maximum value that depends on the load
+               if (poller_too_much_workers())
+                       return;
        }
 
-       foreach($contacts as $c) {
-
-               $res = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
-                       intval($c['id'])
-               );
-
-               if((! $res) || (! count($res)))
-                       continue;
+}
 
-               foreach($res as $contact) {
+function poller_too_much_workers() {
 
-                       $xml = false;
+       $queues = get_config("system", "worker_queues");
 
-                       if($manual_id)
-                               $contact['last-update'] = '0000-00-00 00:00:00';
+       if ($queues == 0)
+               $queues = 4;
 
-                       if(in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS)))
-                               $contact['priority'] = 2;
+       $active = poller_active_workers();
 
-                       if($contact['subhub'] AND in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS))) {
-                               // We should be getting everything via a hub. But just to be sure, let's check once a day.
-                               // (You can make this more or less frequent if desired by setting 'pushpoll_frequency' appropriately)
-                               // This also lets us update our subscription to the hub, and add or replace hubs in case it
-                               // changed. We will only update hubs once a day, regardless of 'pushpoll_frequency'.
+       // Decrease the number of workers at higher load
+       if(function_exists('sys_getloadavg')) {
+               $load = max(sys_getloadavg());
 
-                               $poll_interval = get_config('system','pushpoll_frequency');
-                               $contact['priority'] = (($poll_interval !== false) ? intval($poll_interval) : 3);
-                       }
+               $maxsysload = intval(get_config('system','maxloadavg'));
+               if($maxsysload < 1)
+                       $maxsysload = 50;
 
-                       if($contact['priority'] AND !$force) {
-
-                               $update     = false;
-
-                               $t = $contact['last-update'];
-
-                               /**
-                                * Based on $contact['priority'], should we poll this site now? Or later?
-                                */
-
-                               switch ($contact['priority']) {
-                                       case 5:
-                                               if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 month"))
-                                                       $update = true;
-                                               break;
-                                       case 4:
-                                               if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 week"))
-                                                       $update = true;
-                                               break;
-                                       case 3:
-                                               if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day"))
-                                                       $update = true;
-                                               break;
-                                       case 2:
-                                               if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 12 hour"))
-                                                       $update = true;
-                                               break;
-                                       case 1:
-                                       default:
-                                               if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 hour"))
-                                                       $update = true;
-                                               break;
-                               }
-                               if(!$update)
-                                       continue;
-                       }
+               $maxworkers = $queues;
 
-                       logger("Polling ".$contact["network"]." ".$contact["id"]." ".$contact["nick"]." ".$contact["name"]);
+               // Some magical mathemathics to reduce the workers
+               $exponent = 3;
+               $slope = $maxworkers / pow($maxsysload, $exponent);
+               $queues = ceil($slope * pow(max(0, $maxsysload - $load), $exponent));
 
-                       proc_run('php','include/onepoll.php',$contact['id']);
+               logger("Current load: ".$load." - maximum: ".$maxsysload." - current queues: ".$active." - maximum: ".$queues, LOGGER_DEBUG);
 
-                       if($interval)
-                               @time_sleep_until(microtime(true) + (float) $interval);
-               }
        }
 
-       logger('poller: end');
+       return($active >= $queues);
+}
+
+function poller_active_workers() {
+       $workers = q("SELECT COUNT(*) AS `workers` FROM `workerqueue` WHERE `executed` != '0000-00-00 00:00:00'");
 
-       return;
+       return($workers[0]["workers"]);
 }
 
 if (array_search(__file__,get_included_files())===0){
   poller_run($_SERVER["argv"],$_SERVER["argc"]);
   killme();
 }
+?>
index 0edd64fdb1bec08558c233e670e9a5f08a182c73..cb5fe28ad9bc5e1fee4ab55fdcdb43f0b2c27ed4 100644 (file)
@@ -22,6 +22,7 @@ function queue_run(&$argv, &$argc){
        require_once('include/items.php');
        require_once('include/bbcode.php');
        require_once('include/pidfile.php');
+       require_once('include/socgraph.php');
 
        load_config('config');
        load_config('system');
@@ -59,6 +60,10 @@ function queue_run(&$argv, &$argc){
 
        $interval = ((get_config('system','delivery_interval') === false) ? 2 : intval(get_config('system','delivery_interval')));
 
+       // If we are using the worker we don't need a delivery interval
+       if (get_config("system", "worker"))
+               $interval = false;
+
        $r = q("select * from deliverq where 1");
        if($r) {
                foreach($r as $rr) {
@@ -88,7 +93,7 @@ function queue_run(&$argv, &$argc){
        else {
 
                // For the first 12 hours we'll try to deliver every 15 minutes
-               // After that, we'll only attempt delivery once per hour. 
+               // After that, we'll only attempt delivery once per hour.
 
                $r = q("SELECT `id` FROM `queue` WHERE (( `created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR && `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ) OR ( `last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR ))");
        }
@@ -107,7 +112,7 @@ function queue_run(&$argv, &$argc){
 
        foreach($r as $q_item) {
 
-               // queue_predeliver hooks may have changed the queue db details, 
+               // queue_predeliver hooks may have changed the queue db details,
                // so check again if this entry still needs processing
 
                if($queue_id) {
@@ -132,12 +137,18 @@ function queue_run(&$argv, &$argc){
                        continue;
                }
                if(in_array($c[0]['notify'],$deadguys)) {
-                               logger('queue: skipping known dead url: ' . $c[0]['notify']);
-                               update_queue_time($q_item['id']);
-                               continue;
+                       logger('queue: skipping known dead url: ' . $c[0]['notify']);
+                       update_queue_time($q_item['id']);
+                       continue;
+               }
+
+               if (!poco_reachable($c[0]['url'])) {
+                       logger('queue: skipping probably dead url: ' . $c[0]['url']);
+                       update_queue_time($q_item['id']);
+                       continue;
                }
 
-               $u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey` 
+               $u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`
                        FROM `user` WHERE `uid` = %d LIMIT 1",
                        intval($c[0]['uid'])
                );
@@ -194,9 +205,9 @@ function queue_run(&$argv, &$argc){
                                call_hooks('queue_deliver', $a, $params);
 
                                if($params['result'])
-                                               remove_queue_item($q_item['id']);
+                                       remove_queue_item($q_item['id']);
                                else
-                                               update_queue_time($q_item['id']);
+                                       update_queue_time($q_item['id']);
 
                                break;
 
index 242f27f135b59b3cf987bfe402037a053b361372..ff615141705ceb0c3af8f04747396a7af4f4fae0 100644 (file)
@@ -184,9 +184,60 @@ function events_content(&$a) {
        if( feature_enabled(local_user(), 'richtext') )
                $editselect = 'textareas';
 
+       // First day of the week (0 = Sunday)
+       // To-Do: Needs to be configurable
+       $firstDay = 0;
+
+       $i18n = array(
+                       "firstDay" => $firstDay,
+                       "Sun" => t("Sun"),
+                       "Mon" => t("Mon"),
+                       "Tue" => t("Tue"),
+                       "Wed" => t("Wed"),
+                       "Thu" => t("Thu"),
+                       "Fri" => t("Fri"),
+                       "Sat" => t("Sat"),
+                       "Sunday" => t("Sunday"),
+                       "Monday" => t("Monday"),
+                       "Tuesday" => t("Tuesday"),
+                       "Wednesday" => t("Wednesday"),
+                       "Thursday" => t("Thursday"),
+                       "Friday" => t("Friday"),
+                       "Saturday" => t("Saturday"),
+                       "Jan" => t("Jan"),
+                       "Feb" => t("Feb"),
+                       "Mar" => t("Mar"),
+                       "Apr" => t("Apr"),
+                       "May" => t("May"),
+                       "Jun" => t("Jun"),
+                       "Jul" => t("Jul"),
+                       "Aug" => t("Aug"),
+                       "Sep" => t("Sept"),
+                       "Oct" => t("Oct"),
+                       "Nov" => t("Nov"),
+                       "Dec" => t("Dec"),
+                       "January" => t("January"),
+                       "February" => t("February"),
+                       "March" => t("March"),
+                       "April" => t("April"),
+                       "May" => t("May"),
+                       "June" => t("June"),
+                       "July" => t("July"),
+                       "August" => t("August"),
+                       "September" => t("September"),
+                       "October" => t("October"),
+                       "November" => t("November"),
+                       "December" => t("December"),
+                       "today" => t("today"),
+                       "month" => t("month"),
+                       "week" => t("week"),
+                       "day" => t("day"),
+               );
+
        $htpl = get_markup_template('event_head.tpl');
        $a->page['htmlhead'] .= replace_macros($htpl,array(
                '$baseurl' => $a->get_baseurl(),
+               '$i18n' => $i18n,
                '$editselect' => $editselect
        ));
 
index e911c65054f1530ba13f962fcf2a708a0e00fe45..834fab33fdb7459b6e324f8b833a0db3a825b31b 100644 (file)
@@ -31,6 +31,7 @@ function photos_init(&$a) {
 
                $a->data['user'] = $r[0];
                $a->profile_uid = $r[0]['uid'];
+               $is_owner = (local_user() && (local_user() == $a->profile_uid));
 
                $profilephoto = $a->get_cached_avatar_image($a->get_baseurl() . '/photo/profile/' . $a->data['user']['uid'] . '.jpg');
 
@@ -63,6 +64,9 @@ function photos_init(&$a) {
 
                        $ret['albums'] = array();
                        foreach($albums as $k => $album) {
+                               //hide profile photos to others
+                               if((! $is_owner) && (! remote_user()) && ($album['album'] == t('Profile Photos')))
+                                       continue;
                                $entry = array(
                                        'text'      => $album['album'],
                                        'total'     => $album['total'],
@@ -542,12 +546,12 @@ function photos_post(&$a) {
                                                        if(count($links)) {
                                                                foreach($links as $link) {
                                                                        if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
-                                                                               $profile = $link['@attributes']['href'];
+                                                       $profile = $link['@attributes']['href'];
                                                                        if($link['@attributes']['rel'] === 'salmon') {
                                                                                $salmon = '$url:' . str_replace(',','%sc',$link['@attributes']['href']);
                                                                                if(strlen($inform))
                                                                                        $inform .= ',';
-                                                                                       $inform .= $salmon;
+                                                       $inform .= $salmon;
                                                                        }
                                                                }
                                                        }
@@ -1079,8 +1083,8 @@ function photos_content(&$a) {
        $o = "";
 
        // tabs
-       $_is_owner = (local_user() && (local_user() == $owner_uid));
-       $o .= profile_tabs($a,$_is_owner, $a->data['user']['nickname']);
+       $is_owner = (local_user() && (local_user() == $owner_uid));
+       $o .= profile_tabs($a,$is_owner, $a->data['user']['nickname']);
 
        /**
         * Display upload form
@@ -1833,6 +1837,10 @@ function photos_content(&$a) {
        if(count($r)) {
                $twist = 'rotright';
                foreach($r as $rr) {
+                       //hide profile photos to others
+                       if((! $is_owner) && (! remote_user()) && ($rr['album'] == t('Profile Photos')))
+                                       continue;
+                       
                        if($twist == 'rotright')
                                $twist = 'rotleft';
                        else
@@ -1849,8 +1857,8 @@ function photos_content(&$a) {
                        }
 
                        $photos[] = array(
-                               'id'       => $rr['id'],
-                               'twist'    => ' ' . $twist . rand(2,4),
+                               'id'            => $rr['id'],
+                               'twist'         => ' ' . $twist . rand(2,4),
                                'link'          => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'],
                                'title'         => t('View Photo'),
                                'src'           => $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.' . $ext,
index 761da7273d5d94da645a528517a6eb7e0c62de75..06aab577a35609f5dccc38f5c6f845bac1e52fcf 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-define( 'UPDATE_VERSION' , 1188 );
+define( 'UPDATE_VERSION' , 1189 );
 
 /**
  *
index a96e5aff31c1f54a51bc8f2ef231e223e3bda77d..ceb251a9e21243fb992dcfc1f15604032efbabcc 100644 (file)
@@ -1,7 +1,7 @@
 
 <link rel='stylesheet' type='text/css' href='{{$baseurl}}/library/fullcalendar/fullcalendar.css' />
 <script language="javascript" type="text/javascript"
-          src="{{$baseurl}}/library/fullcalendar/fullcalendar.min.js"></script>
+         src="{{$baseurl}}/library/fullcalendar/fullcalendar.min.js"></script>
 
 <script>
        function showEvent(eventid) {
                        }
                );                      
        }
-        
-        function doEventPreview() {
-                $('#event-edit-preview').val(1);
-                $.post('events',$('#event-edit-form').serialize(), function(data) {
-                        $.colorbox({ html: data });
-                });
-                $('#event-edit-preview').val(0);
+
+       function doEventPreview() {
+               $('#event-edit-preview').val(1);
+               $.post('events',$('#event-edit-form').serialize(), function(data) {
+                       $.colorbox({ html: data });
+               });
+               $('#event-edit-preview').val(0);
        }
 
-       
+
        $(document).ready(function() {
                $('#events-calendar').fullCalendar({
+                       firstDay: {{$i18n.firstDay}},
+                       monthNames: ['{{$i18n.January}}','{{$i18n.February}}','{{$i18n.March}}','{{$i18n.April}}','{{$i18n.May}}','{{$i18n.June}}','{{$i18n.July}}','{{$i18n.August}}','{{$i18n.September}}','{{$i18n.October}}','{{$i18n.November}}','{{$i18n.December}}'],
+                       monthNamesShort: ['{{$i18n.Jan}}','{{$i18n.Feb}}','{{$i18n.Mar}}','{{$i18n.Apr}}','{{$i18n.May}}','{{$i18n.Jun}}','{{$i18n.Jul}}','{{$i18n.Aug}}','{{$i18n.Sep}}','{{$i18n.Oct}}','{{$i18n.Nov}}','{{$i18n.Dec}}'],
+                       dayNames: ['{{$i18n.Sunday}}','{{$i18n.Monday}}','{{$i18n.Tuesday}}','{{$i18n.Wednesday}}','{{$i18n.Thursday}}','{{$i18n.Friday}}','{{$i18n.Saturday}}'],
+                       dayNamesShort: ['{{$i18n.Sun}}','{{$i18n.Mon}}','{{$i18n.Tue}}','{{$i18n.Wed}}','{{$i18n.Thu}}','{{$i18n.Fri}}','{{$i18n.Sat}}'],
+                       buttonText: {
+                               prev: "<span class='fc-text-arrow'>&lsaquo;</span>",
+                               next: "<span class='fc-text-arrow'>&rsaquo;</span>",
+                               prevYear: "<span class='fc-text-arrow'>&laquo;</span>",
+                               nextYear: "<span class='fc-text-arrow'>&raquo;</span>",
+                               today: '{{$i18n.today}}',
+                               month: '{{$i18n.month}}',
+                               week: '{{$i18n.week}}',
+                               day: '{{$i18n.day}}'
+                       },
                        events: '{{$baseurl}}/events/json/',
                        header: {
                                left: 'prev,next today',
@@ -34,7 +49,7 @@
                        eventClick: function(calEvent, jsEvent, view) {
                                showEvent(calEvent.id);
                        },
-                        loading: function(isLoading, view) {
+                       loading: function(isLoading, view) {
                                if(!isLoading) {
                                        $('td.fc-day').dblclick(function() { window.location.href='/events/new?start='+$(this).data('date'); });
                                }
 
 {{if $editselect != 'none'}}
 <script language="javascript" type="text/javascript"
-          src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
+         src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
 <script language="javascript" type="text/javascript">
 
 
                }
 
        });
-        {{else}}
+       {{else}}
        <script language="javascript" type="text/javascript">
        {{/if}}
 
index 11add9e8a81d05cc87cfd00794c8e1464f8ad5d7..4888468cee43b5d269cc94123feb74d7d78a0224 100644 (file)
                                <span id="net-update" class="nav-notify"></span>
                        </li>
                {{/if}}
+               {{if $nav.events}}
+                       <li role="menuitem" id="nav-events-link" class="nav-menu {{$sel.events}}">
+                               <a accesskey="e" class="{{$nav.events.2}}" href="{{$nav.events.0}}" title="{{$nav.events.3}}" >{{$nav.events.1}}</a>
+                       </li>
+               {{/if}}
                {{if $nav.community}}
                        <li role="menuitem" id="nav-community-link" class="nav-menu {{$sel.community}}">
                                <a accesskey="c" class="{{$nav.community.2}}" href="{{$nav.community.0}}" title="{{$nav.community.3}}" >{{$nav.community.1}}</a>