mirror of
https://codeberg.org/streams/streams.git
synced 2024-09-20 13:35:12 +00:00
e992cfeca9
The flow is as follows: Once a day go out to all the directory servers besides yourself and grab a list of updates. This happens in the poller. If we've never seen them before add them to the updates table. The poller also looks to see if we're a directory server and have updates that haven't yet been processed. It calls onedirsync.php to process each one. If we contact the channel to update and don't find anything (we're just doing a basic zot_finger), set a ud_last timestamp. If this is set we will only try once a day for seven days. Then we stop trying to update. This will probably cause a spike the first time through because you haven't seen any updates before, but we spread out the load over your delivery interval.
270 lines
7.3 KiB
PHP
270 lines
7.3 KiB
PHP
<?php /** @file */
|
|
|
|
require_once('boot.php');
|
|
require_once('include/cli_startup.php');
|
|
|
|
|
|
function poller_run($argv, $argc){
|
|
|
|
cli_startup();
|
|
|
|
$a = get_app();
|
|
|
|
$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;
|
|
}
|
|
}
|
|
|
|
logger('poller: start');
|
|
|
|
// run queue delivery process in the background
|
|
|
|
proc_run('php',"include/queue.php");
|
|
|
|
// expire any expired accounts
|
|
|
|
q("UPDATE account
|
|
SET account_flags = (account_flags | %d)
|
|
where not (account_flags & %d)
|
|
and account_expires != '0000-00-00 00:00:00'
|
|
and account_expires < UTC_TIMESTAMP() ",
|
|
intval(ACCOUNT_EXPIRED),
|
|
intval(ACCOUNT_EXPIRED)
|
|
);
|
|
|
|
// publish any applicable items that were set to be published in the future
|
|
// (time travel posts)
|
|
|
|
$r = q("select id from item where ( item_restrict & %d ) and created <= UTC_TIMESTAMP() ",
|
|
intval(ITEM_DELAYED_PUBLISH)
|
|
);
|
|
if($r) {
|
|
foreach($r as $rr) {
|
|
$x = q("update item set item_restrict = ( item_restrict ^ %d ) where id = %d limit 1",
|
|
intval(ITEM_DELAYED_PUBLISH),
|
|
intval($rr['id'])
|
|
);
|
|
if($x) {
|
|
proc_run('php','include/notifer.php','wall-new',$rr['id']);
|
|
}
|
|
}
|
|
}
|
|
|
|
$abandon_days = intval(get_config('system','account_abandon_days'));
|
|
if($abandon_days < 1)
|
|
$abandon_days = 0;
|
|
|
|
|
|
// once daily run birthday_updates and then expire in background
|
|
|
|
// FIXME: add birthday updates, both locally and for xprof for use
|
|
// by directory servers
|
|
|
|
$d1 = get_config('system','last_expire_day');
|
|
$d2 = intval(datetime_convert('UTC','UTC','now','d'));
|
|
|
|
$dirmode = get_config('system','directory_mode');
|
|
|
|
if($d2 != intval($d1)) {
|
|
|
|
// If this is a directory server, request a sync with an upstream
|
|
// directory at least once a day, up to once every poll interval.
|
|
// Pull remote changes and push local changes.
|
|
// potential issue: how do we keep from creating an endless update loop?
|
|
|
|
if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) {
|
|
require_once('include/dir_fns.php');
|
|
sync_directories($dirmode);
|
|
}
|
|
|
|
|
|
set_config('system','last_expire_day',$d2);
|
|
// Uncomment when expire protocol component is working
|
|
// proc_run('php','include/expire.php');
|
|
|
|
proc_run('php','include/cli_suggest.php');
|
|
|
|
}
|
|
|
|
// update any photos which didn't get imported properly
|
|
// This should be rare
|
|
|
|
$r = q("select xchan_photo_l, xchan_hash from xchan where xchan_photo_l != '' and xchan_photo_m = ''
|
|
and xchan_photo_date < UTC_TIMESTAMP() - INTERVAL 1 DAY");
|
|
if($r) {
|
|
require_once('include/photo/photo_driver.php');
|
|
foreach($r as $rr) {
|
|
$photos = import_profile_photo($rr['xchan_photo_l'],$rr['xchan_hash']);
|
|
$x = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
|
|
where xchan_hash = '%s' limit 1",
|
|
dbesc($photos[0]),
|
|
dbesc($photos[1]),
|
|
dbesc($photos[2]),
|
|
dbesc($photos[3]),
|
|
dbesc($rr['xchan_hash'])
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
$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')));
|
|
|
|
$sql_extra = (($manual_id) ? " AND abook_id = $manual_id " : "");
|
|
|
|
reload_plugins();
|
|
|
|
$d = datetime_convert();
|
|
|
|
//TODO check to see if there are any cronhooks before wasting a process
|
|
|
|
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 account_lastlog > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days))
|
|
: ''
|
|
);
|
|
|
|
|
|
$contacts = q("SELECT abook_id, abook_flags, abook_updated, abook_connected, abook_closeness, abook_channel
|
|
FROM abook LEFT JOIN account on abook_account = account_id where 1
|
|
$sql_extra
|
|
AND (( abook_flags = %d ) OR ( abook_flags = %d ))
|
|
AND (( account_flags = %d ) OR ( account_flags = %d )) $abandon_sql ORDER BY RAND()",
|
|
|
|
intval(ABOOK_FLAG_HIDDEN),
|
|
intval(0),
|
|
intval(ACCOUNT_OK),
|
|
intval(ACCOUNT_UNVERIFIED) // FIXME
|
|
|
|
);
|
|
|
|
if($contacts) {
|
|
|
|
foreach($contacts as $contact) {
|
|
|
|
$update = false;
|
|
|
|
$t = $contact['abook_updated'];
|
|
$c = $contact['abook_connected'];
|
|
|
|
|
|
if($c == $t) {
|
|
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day"))
|
|
$update = true;
|
|
}
|
|
else {
|
|
// if we've never connected with them, start the mark for death countdown from now
|
|
|
|
if($c == '0000-00-00 00:00:00') {
|
|
$r = q("update abook set abook_connected = '%s' where abook_id = %d limit 1",
|
|
dbesc(datetime_convert()),
|
|
intval($contact['abook_id'])
|
|
);
|
|
$c = datetime_convert();
|
|
$update = true;
|
|
}
|
|
|
|
// He's dead, Jim
|
|
|
|
if(strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $c . " + 30 day")) > 0) {
|
|
$r = q("update abook set abook_flags = (abook_flags | %d) where abook_id = %d limit 1",
|
|
intval(ABOOK_FLAG_ARCHIVED),
|
|
intval($contact['abook_id'])
|
|
);
|
|
$update = false;
|
|
continue;
|
|
}
|
|
|
|
if($contact['abook_flags'] & ABOOK_FLAG_ARCHIVED) {
|
|
$update = false;
|
|
continue;
|
|
}
|
|
|
|
// might be dead, so maybe don't poll quite so often
|
|
|
|
// recently deceased, so keep up the regular schedule for 3 days
|
|
|
|
if((strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $c . " + 3 day")) > 0)
|
|
&& (strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $t . " + 1 day")) > 0))
|
|
$update = true;
|
|
|
|
// After that back off and put them on a morphine drip
|
|
|
|
if(strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $t . " + 2 day")) > 0) {
|
|
$update = true;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
if((! $update) && (! $force))
|
|
continue;
|
|
|
|
proc_run('php','include/onepoll.php',$contact['abook_id']);
|
|
if($interval)
|
|
@time_sleep_until(microtime(true) + (float) $interval);
|
|
|
|
}
|
|
}
|
|
|
|
if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) {
|
|
$r = q("select ud_id from updates where not ( ud_flags & %d ) and ( ud_last = '0000-00-00 00:00:00' OR ud_last > UTC_TIMESTAMP() - INTERVAL 7 DAYS) ",
|
|
intval(UPDATE_FLAGS_UPDATED)
|
|
);
|
|
if($r) {
|
|
foreach($r as $rr) {
|
|
|
|
// If they didn't respond when we attempted before, back off to once a day
|
|
// After 7 days we won't bother anymore
|
|
|
|
if($rr['ud_last'] != '0000-00-00 00:00:00')
|
|
if($rr['ud_last'] > datetime_convert('UTC','UTC', 'now - 1 day'))
|
|
continue;
|
|
proc_run('php','include/onedirsync.php',$rr['ud_id']);
|
|
if($interval)
|
|
@time_sleep_until(microtime(true) + (float) $interval);
|
|
}
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if (array_search(__file__,get_included_files())===0){
|
|
poller_run($argv,$argc);
|
|
killme();
|
|
}
|