function housekeeping_common($debug)
{
    expire_cached_files($debug);
    expire_lock_files($debug);
    expire_error_log($debug);
    $count = update_feedbrowser_cache();
    _debug("Feedbrowser updated, {$count} feeds processed.");
    purge_orphans(true);
    $rc = cleanup_tags(14, 50000);
    _debug("Cleaned {$rc} cached tags.");
}
         if (!init_connection($link)) {
             return;
         }
         // We disable stamp file, since it is of no use in a multiprocess update.
         // not really, tho for the time being -fox
         if (!make_stampfile('update_daemon.stamp')) {
             print "warning: unable to create stampfile";
         }
         // Call to the feed batch update function
         // or regenerate feedbrowser cache
         if (rand(0, 100) > 30) {
             update_daemon_common($link);
         } else {
             $count = update_feedbrowser_cache($link);
             _debug("Feedbrowser updated, {$count} feeds processed.");
             purge_orphans($link, true);
             $rc = cleanup_tags($link, 14, 50000);
             _debug("Cleaned {$rc} cached tags.");
             _debug("Updating linked feeds...");
             get_linked_feeds($link);
         }
         _debug("Elapsed time: " . (time() - $start_timestamp) . " second(s)");
         db_close($link);
         // We are in a fork.
         // We wait a little before exiting to avoid to be faster than our parent process.
         sleep(1);
         unlink(LOCK_DIRECTORY . "/{$lock_filename}");
         // We exit in order to avoid fork bombing.
         exit(0);
     }
 }
Example #3
0
function housekeeping_common($debug)
{
    expire_cached_files($debug);
    expire_lock_files($debug);
    expire_error_log($debug);
    $count = update_feedbrowser_cache();
    _debug("Feedbrowser updated, {$count} feeds processed.");
    purge_orphans(true);
    $rc = cleanup_tags(14, 50000);
    _debug("Cleaned {$rc} cached tags.");
    PluginHost::getInstance()->run_hooks(PluginHost::HOOK_HOUSE_KEEPING, "hook_house_keeping", "");
}
Example #4
0
/**
 * Update a feed batch.
 * Used by daemons to update n feeds by run.
 * Only update feed needing a update, and not being processed
 * by another process.
 * 
 * @param mixed $link Database link
 * @param integer $limit Maximum number of feeds in update batch. Default to DAEMON_FEED_LIMIT.
 * @param boolean $from_http Set to true if you call this function from http to disable cli specific code.
 * @param boolean $debug Set to false to disable debug output. Default to true.
 * @return void
 */
function update_daemon_common($link, $limit = DAEMON_FEED_LIMIT, $from_http = false, $debug = true)
{
    // Process all other feeds using last_updated and interval parameters
    // Test if the user has loggued in recently. If not, it does not update its feeds.
    if (DAEMON_UPDATE_LOGIN_LIMIT > 0) {
        if (DB_TYPE == "pgsql") {
            $login_thresh_qpart = "AND ttrss_users.last_login >= NOW() - INTERVAL '" . DAEMON_UPDATE_LOGIN_LIMIT . " days'";
        } else {
            $login_thresh_qpart = "AND ttrss_users.last_login >= DATE_SUB(NOW(), INTERVAL " . DAEMON_UPDATE_LOGIN_LIMIT . " DAY)";
        }
    } else {
        $login_thresh_qpart = "";
    }
    // Test if the feed need a update (update interval exceded).
    if (DB_TYPE == "pgsql") {
        $update_limit_qpart = "AND ((\n\t\t\t\t\tttrss_feeds.update_interval = 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < NOW() - CAST((ttrss_user_prefs.value || ' minutes') AS INTERVAL)\n\t\t\t\t) OR (\n\t\t\t\t\tttrss_feeds.update_interval > 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < NOW() - CAST((ttrss_feeds.update_interval || ' minutes') AS INTERVAL)\n\t\t\t\t) OR ttrss_feeds.last_updated IS NULL)";
    } else {
        $update_limit_qpart = "AND ((\n\t\t\t\t\tttrss_feeds.update_interval = 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < DATE_SUB(NOW(), INTERVAL CONVERT(ttrss_user_prefs.value, SIGNED INTEGER) MINUTE)\n\t\t\t\t) OR (\n\t\t\t\t\tttrss_feeds.update_interval > 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < DATE_SUB(NOW(), INTERVAL ttrss_feeds.update_interval MINUTE)\n\t\t\t\t) OR ttrss_feeds.last_updated IS NULL)";
    }
    // Test if feed is currently being updated by another process.
    if (DB_TYPE == "pgsql") {
        $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < NOW() - INTERVAL '120 seconds')";
    } else {
        $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < DATE_SUB(NOW(), INTERVAL 120 SECOND))";
    }
    // Test if there is a limit to number of updated feeds
    $query_limit = "";
    if ($limit) {
        $query_limit = sprintf("LIMIT %d", $limit);
    }
    $random_qpart = sql_random_function();
    // We search for feed needing update.
    $result = db_query($link, "SELECT ttrss_feeds.feed_url,ttrss_feeds.id, ttrss_feeds.owner_uid,\n\t\t\t\t" . SUBSTRING_FOR_DATE . "(ttrss_feeds.last_updated,1,19) AS last_updated,\n\t\t\t\tttrss_feeds.update_interval \n\t\t\tFROM \n\t\t\t\tttrss_feeds, ttrss_users, ttrss_user_prefs\n\t\t\tWHERE\n\t\t\t\tttrss_feeds.owner_uid = ttrss_users.id\n\t\t\t\tAND ttrss_users.id = ttrss_user_prefs.owner_uid\n\t\t\t\tAND ttrss_user_prefs.pref_name = 'DEFAULT_UPDATE_INTERVAL'\n\t\t\t\t{$login_thresh_qpart} {$update_limit_qpart}\n\t\t\t {$updstart_thresh_qpart}\n\t\t\tORDER BY {$random_qpart} {$query_limit}");
    $user_prefs_cache = array();
    if ($debug) {
        _debug(sprintf("Scheduled %d feeds to update...\n", db_num_rows($result)));
    }
    // Here is a little cache magic in order to minimize risk of double feed updates.
    $feeds_to_update = array();
    while ($line = db_fetch_assoc($result)) {
        $feeds_to_update[$line['id']] = $line;
    }
    // We update the feed last update started date before anything else.
    // There is no lag due to feed contents downloads
    // It prevent an other process to update the same feed.
    $feed_ids = array_keys($feeds_to_update);
    if ($feed_ids) {
        db_query($link, sprintf("UPDATE ttrss_feeds SET last_update_started = NOW()\n\t\t\t\tWHERE id IN (%s)", implode(',', $feed_ids)));
    }
    // For each feed, we call the feed update function.
    while ($line = array_pop($feeds_to_update)) {
        if ($debug) {
            _debug("Feed: " . $line["feed_url"] . ", " . $line["last_updated"]);
        }
        // We setup a alarm to alert if the feed take more than 300s to update.
        // => HANG alarm.
        if (!$from_http && function_exists('pcntl_alarm')) {
            pcntl_alarm(300);
        }
        update_rss_feed($link, $line["id"], true);
        // Cancel the alarm (the update went well)
        if (!$from_http && function_exists('pcntl_alarm')) {
            pcntl_alarm(0);
        }
        sleep(1);
        // prevent flood (FIXME make this an option?)
    }
    // Send feed digests by email if needed.
    if (DAEMON_SENDS_DIGESTS) {
        send_headlines_digests($link);
    }
    purge_orphans($link);
}
Example #5
0
 static function updaterandomfeed_real($dbh)
 {
     // Test if the feed need a update (update interval exceded).
     if (DB_TYPE == "pgsql") {
         $update_limit_qpart = "AND ((\n                    ttrss_feeds.update_interval = 0\n                    AND ttrss_feeds.last_updated < NOW() - CAST((ttrss_user_prefs.value || ' minutes') AS INTERVAL)\n                ) OR (\n                    ttrss_feeds.update_interval > 0\n                    AND ttrss_feeds.last_updated < NOW() - CAST((ttrss_feeds.update_interval || ' minutes') AS INTERVAL)\n                ) OR ttrss_feeds.last_updated IS NULL\n                OR last_updated = '1970-01-01 00:00:00')";
     } else {
         $update_limit_qpart = "AND ((\n                    ttrss_feeds.update_interval = 0\n                    AND ttrss_feeds.last_updated < DATE_SUB(NOW(), INTERVAL CONVERT(ttrss_user_prefs.value, SIGNED INTEGER) MINUTE)\n                ) OR (\n                    ttrss_feeds.update_interval > 0\n                    AND ttrss_feeds.last_updated < DATE_SUB(NOW(), INTERVAL ttrss_feeds.update_interval MINUTE)\n                ) OR ttrss_feeds.last_updated IS NULL\n                OR last_updated = '1970-01-01 00:00:00')";
     }
     // Test if feed is currently being updated by another process.
     if (DB_TYPE == "pgsql") {
         $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < NOW() - INTERVAL '5 minutes')";
     } else {
         $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < DATE_SUB(NOW(), INTERVAL 5 MINUTE))";
     }
     $random_qpart = sql_random_function();
     // we could be invoked from public.php with no active session
     if ($_SESSION["uid"]) {
         $owner_check_qpart = "AND ttrss_feeds.owner_uid = '" . $_SESSION["uid"] . "'";
     } else {
         $owner_check_qpart = "";
     }
     // We search for feed needing update.
     $result = $dbh->query("SELECT ttrss_feeds.feed_url,ttrss_feeds.id\n            FROM\n                ttrss_feeds, ttrss_users, ttrss_user_prefs\n            WHERE\n                ttrss_feeds.owner_uid = ttrss_users.id\n                AND ttrss_users.id = ttrss_user_prefs.owner_uid\n                AND ttrss_user_prefs.pref_name = 'DEFAULT_UPDATE_INTERVAL'\n                {$owner_check_qpart}\n                {$update_limit_qpart}\n                {$updstart_thresh_qpart}\n            ORDER BY {$random_qpart} LIMIT 30");
     $feed_id = -1;
     require_once "rssfuncs.php";
     $num_updated = 0;
     $tstart = time();
     while ($line = $dbh->fetch_assoc($result)) {
         $feed_id = $line["id"];
         if (time() - $tstart < ini_get("max_execution_time") * 0.7) {
             update_rss_feed($feed_id, true);
             ++$num_updated;
         } else {
             break;
         }
     }
     // Purge orphans and cleanup tags
     purge_orphans();
     cleanup_tags(14, 50000);
     if ($num_updated > 0) {
         print json_encode(array("message" => "UPDATE_COUNTERS", "num_updated" => $num_updated));
     } else {
         print json_encode(array("message" => "NOTHING_TO_UPDATE"));
     }
 }
Example #6
0
 function import($file = false, $owner_uid = 0)
 {
     purge_orphans();
     if (!$file) {
         header("Content-Type: text/html");
         $owner_uid = $_SESSION["uid"];
         if ($_FILES['starred_file']['error'] != 0) {
             print_error(T_sprintf("Upload failed with error code %d", $_FILES['starred_file']['error']));
             return;
         }
         $tmp_file = false;
         if (is_uploaded_file($_FILES['starred_file']['tmp_name'])) {
             $tmp_file = tempnam(CACHE_DIR . '/upload', 'starred');
             $result = move_uploaded_file($_FILES['starred_file']['tmp_name'], $tmp_file);
             if (!$result) {
                 print_error(__("Unable to move uploaded file."));
                 return;
             }
         } else {
             print_error(__('Error: please upload OPML file.'));
             return;
         }
         if (is_file($tmp_file)) {
             $doc = json_decode(file_get_contents($tmp_file), true);
             unlink($tmp_file);
         } else {
             print_error(__('No file uploaded.'));
             return;
         }
     } else {
         $doc = json_decode(file_get_contents($file), true);
     }
     if ($file) {
         $sql_set_marked = strtolower(basename($file)) == 'starred.json' ? 'true' : 'false';
         _debug("will set articles as starred: {$sql_set_marked}");
     } else {
         $sql_set_marked = strtolower($_FILES['starred_file']['name']) == 'starred.json' ? 'true' : 'false';
     }
     if ($doc) {
         if (isset($doc['items'])) {
             $processed = 0;
             foreach ($doc['items'] as $item) {
                 //					print_r($item);
                 $guid = db_escape_string(mb_substr($item['id'], 0, 250));
                 $title = db_escape_string($item['title']);
                 $updated = date('Y-m-d h:i:s', $item['updated']);
                 $last_marked = date('Y-m-d h:i:s', mb_substr($item['crawlTimeMsec'], 0, 10));
                 $link = '';
                 $content = '';
                 $author = db_escape_string($item['author']);
                 $tags = array();
                 $orig_feed_data = array();
                 if (is_array($item['alternate'])) {
                     foreach ($item['alternate'] as $alt) {
                         if (isset($alt['type']) && $alt['type'] == 'text/html') {
                             $link = db_escape_string($alt['href']);
                         }
                     }
                 }
                 if (is_array($item['summary'])) {
                     $content = db_escape_string($item['summary']['content'], false);
                 }
                 if (is_array($item['content'])) {
                     $content = db_escape_string($item['content']['content'], false);
                 }
                 if (is_array($item['categories'])) {
                     foreach ($item['categories'] as $cat) {
                         if (strstr($cat, "com.google/") === FALSE) {
                             array_push($tags, sanitize_tag($cat));
                         }
                     }
                 }
                 if (is_array($item['origin'])) {
                     if (strpos($item['origin']['streamId'], 'feed/') === 0) {
                         $orig_feed_data['feed_url'] = db_escape_string(mb_substr(preg_replace("/^feed\\//", "", $item['origin']['streamId']), 0, 200));
                         $orig_feed_data['title'] = db_escape_string(mb_substr($item['origin']['title'], 0, 200));
                         $orig_feed_data['site_url'] = db_escape_string(mb_substr($item['origin']['htmlUrl'], 0, 200));
                     }
                 }
                 $processed++;
                 $imported += (int) $this->create_article($owner_uid, $guid, $title, $link, $updated, $content, $author, $sql_set_marked, $tags, $orig_feed_data, $last_marked);
                 if ($file && $processed % 25 == 0) {
                     _debug("processed {$processed} articles...");
                 }
             }
             if ($file) {
                 _debug(sprintf("All done. %d of %d articles imported.", $imported, $processed));
             } else {
                 print "<p style='text-align : center'>" . T_sprintf("All done. %d out of %d articles imported.", $imported, $processed) . "</p>";
             }
         } else {
             print_error(__('The document has incorrect format.'));
         }
     } else {
         print_error(__('Error while parsing document.'));
     }
     if (!$file) {
         print "<div align='center'>";
         print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('starredImportDlg').execute()\">" . __('Close this window') . "</button>";
         print "</div>";
     }
 }
Example #7
0
function purge_old_posts($link)
{
    $user_id = $_SESSION["uid"];
    $result = db_query($link, "SELECT id,purge_interval FROM ttrss_feeds\n\t\t\tWHERE owner_uid = '{$user_id}'");
    while ($line = db_fetch_assoc($result)) {
        $feed_id = $line["id"];
        $purge_interval = $line["purge_interval"];
        if ($purge_interval == 0) {
            $purge_interval = get_pref($link, 'PURGE_OLD_DAYS');
        }
        if ($purge_interval > 0) {
            purge_feed($link, $feed_id, $purge_interval);
        }
    }
    purge_orphans($link);
}