/**
 * @param App $a
 * @param null|object $b
 */
function privacy_image_cache_cron(&$a = null, &$b = null)
{
    $cachetime = get_config('privacy_image_cache', 'cache_time');
    if (!$cachetime) {
        $cachetime = PRIVACY_IMAGE_CACHE_DEFAULT_TIME;
    }
    $last = get_config('pi_cache', 'last_delete');
    $time = time();
    if ($time < $last + 3600) {
        return;
    }
    logger("Purging old Cache of the Privacy Image Cache", LOGGER_DEBUG);
    q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
    clear_cache($a->get_basepath(), $a->get_basepath() . "/privacy_image_cache");
    set_config('pi_cache', 'last_delete', $time);
}
Exemple #2
0
function poller_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';
    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 . ' 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");
    // expire any expired accounts
    q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0 \n\t\tAND `account_expires_on` != '0000-00-00 00:00:00' \n\t\tAND `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_conversations();
    // 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;
    $hub_update = false;
    $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'));
    }
    $sql_extra = $manual_id ? " AND `id` = {$manual_id} " : "";
    reload_plugins();
    $d = datetime_convert();
    if (!$restart) {
        proc_run('php', 'include/cronhooks.php');
    }
    // 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` \n\t\tWHERE ( `rel` = %d OR `rel` = %d ) AND `poll` != ''\n\t\tAND NOT `network` IN ( '%s', '%s', '%s' )\n\t\t{$sql_extra} \n\t\tAND `self` = 0 AND `contact`.`blocked` = 0 AND `contact`.`readonly` = 0 \n\t\tAND `contact`.`archive` = 0 \n\t\tAND `user`.`account_expired` = 0 AND `user`.`account_removed` = 0 {$abandon_sql} ORDER BY RAND()", intval(CONTACT_IS_SHARING), intval(CONTACT_IS_FRIEND), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_FACEBOOK), dbesc(NETWORK_PUMPIO));
    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 ($contact['network'] === NETWORK_DFRN) {
                $contact['priority'] = 2;
            }
            if (!get_config('system', 'ostatus_use_priority') and $contact['network'] === NETWORK_OSTATUS) {
                $contact['priority'] = 2;
            }
            if ($contact['priority'] || $contact['subhub']) {
                $hub_update = true;
                $update = false;
                $t = $contact['last-update'];
                // 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'.
                if ($contact['subhub']) {
                    $poll_interval = get_config('system', 'pushpoll_frequency');
                    $contact['priority'] = $poll_interval !== false ? intval($poll_interval) : 3;
                    $hub_update = false;
                    if (datetime_convert('UTC', 'UTC', 'now') > datetime_convert('UTC', 'UTC', $t . " + 1 day") || $force) {
                        $hub_update = true;
                    }
                } else {
                    $hub_update = false;
                }
                /**
                 * 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 && !$force) {
                    continue;
                }
            }
            proc_run('php', 'include/onepoll.php', $contact['id']);
            if ($interval) {
                @time_sleep_until(microtime(true) + (double) $interval);
            }
        }
    }
    return;
}
Exemple #3
0
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;
    }
    $load = current_load();
    if ($load) {
        if (intval($load) > $maxsysload) {
            logger('system: load ' . $load . ' 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\n\t\tAND `account_expires_on` != '0000-00-00 00:00:00'\n\t\tAND `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();
        proc_run('php', "include/discover_poco.php", "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);
        }
        // Maximum table size in megabyte
        $max_tablesize = intval(get_config('system', 'optimize_max_tablesize')) * 1000000;
        if ($max_tablesize == 0) {
            $max_tablesize = 100 * 1000000;
        }
        // Default are 100 MB
        // Minimum fragmentation level in percent
        $fragmentation_level = intval(get_config('system', 'optimize_fragmentation')) / 100;
        if ($fragmentation_level == 0) {
            $fragmentation_level = 0.3;
        }
        // Default value is 30%
        // Optimize some tables that need to be optimized
        $r = q("SHOW TABLE STATUS");
        foreach ($r as $table) {
            // Don't optimize tables that are too large
            if ($table["Data_length"] > $max_tablesize) {
                continue;
            }
            // Don't optimize empty tables
            if ($table["Data_length"] == 0) {
                continue;
            }
            // Calculate fragmentation
            $fragmentation = $table["Data_free"] / $table["Data_length"];
            logger("Table " . $table["Name"] . " - Fragmentation level: " . round($fragmentation * 100, 2), LOGGER_DEBUG);
            // Don't optimize tables that needn't to be optimized
            if ($fragmentation < $fragmentation_level) {
                continue;
            }
            // So optimize it
            logger("Optimize Table " . $table["Name"], LOGGER_DEBUG);
            q("OPTIMIZE TABLE `%s`", dbesc($table["Name"]));
        }
        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`\n\t\tWHERE `rel` IN (%d, %d) AND `poll` != '' AND `network` IN ('%s', '%s', '%s', '%s', '%s', '%s')\n\t\t{$sql_extra}\n\t\tAND NOT `self` AND NOT `contact`.`blocked` AND NOT `contact`.`readonly` AND NOT `contact`.`archive`\n\t\tAND 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) + (double) $interval);
            }
        }
    }
    logger('cron: end');
    set_config('system', 'last_cron', time());
    return;
}