2012-06-20 05:35:34 +00:00
#!/usr/bin/env php
2007-02-24 16:46:39 +00:00
< ? php
2012-12-09 09:41:22 +00:00
set_include_path ( dirname ( __FILE__ ) . " /include " . PATH_SEPARATOR .
get_include_path ());
2011-12-11 19:59:25 +00:00
2010-11-09 13:33:08 +00:00
define ( 'DISABLE_SESSIONS' , true );
2011-04-15 08:38:11 +00:00
chdir ( dirname ( __FILE__ ));
2010-11-10 10:14:44 +00:00
require_once " functions.php " ;
2011-12-13 12:06:25 +00:00
require_once " rssfuncs.php " ;
2007-03-01 08:54:55 +00:00
require_once " config.php " ;
2013-03-15 11:56:40 +00:00
require_once " sanity_check.php " ;
2007-03-01 08:54:55 +00:00
require_once " db.php " ;
2010-11-09 13:33:08 +00:00
require_once " db-prefs.php " ;
2012-10-23 20:25:56 +00:00
if ( ! defined ( 'PHP_EXECUTABLE' ))
define ( 'PHP_EXECUTABLE' , '/usr/bin/php' );
2012-12-24 05:52:15 +00:00
// Create a database connection.
$link = db_connect ( DB_HOST , DB_USER , DB_PASS , DB_NAME );
init_connection ( $link );
2013-03-21 10:48:47 +00:00
$longopts = array ( " feeds " ,
" feedbrowser " ,
" daemon " ,
" daemon-loop " ,
" task: " ,
" cleanup-tags " ,
" quiet " ,
2013-03-21 10:56:04 +00:00
" log: " ,
2013-03-21 10:48:47 +00:00
" indexes " ,
2013-04-04 15:15:14 +00:00
" update-schema " ,
2013-03-21 10:48:47 +00:00
" convert-filters " ,
" force-update " ,
" list-plugins " ,
" help " );
foreach ( $pluginhost -> get_commands () as $command => $data ) {
2013-03-28 14:37:36 +00:00
array_push ( $longopts , $command . $data [ " suffix " ]);
2013-03-21 10:48:47 +00:00
}
$options = getopt ( " " , $longopts );
2012-10-23 20:25:56 +00:00
2013-03-21 10:48:47 +00:00
if ( count ( $options ) == 0 && ! defined ( 'STDIN' )) {
2012-08-23 09:17:22 +00:00
?> <html>
< head >
2012-10-23 20:25:56 +00:00
< title > Tiny Tiny RSS data update script .</ title >
2012-08-23 09:17:22 +00:00
< meta http - equiv = " Content-Type " content = " text/html; charset=utf-8 " >
< link rel = " stylesheet " type = " text/css " href = " utility.css " >
</ head >
< body >
2013-03-27 06:59:26 +00:00
< div class = " floatingLogo " >< img src = " images/logo_small.png " ></ div >
2012-10-23 20:25:56 +00:00
< h1 >< ? php echo __ ( " Tiny Tiny RSS data update script. " ) ?> </h1>
2012-08-23 09:17:22 +00:00
2012-10-23 20:25:56 +00:00
< ? php print_error ( " Please run this script from the command line. Use option \" -help \" to display command help if this error is displayed erroneously. " ); ?>
2012-08-23 09:17:22 +00:00
</ body ></ html >
< ? php
exit ;
}
2013-03-21 10:48:47 +00:00
if ( count ( $options ) == 0 || isset ( $options [ " help " ]) ) {
2010-11-09 13:33:08 +00:00
print " Tiny Tiny RSS data update script. \n \n " ;
print " Options: \n " ;
2013-03-21 10:48:47 +00:00
print " --feeds - update feeds \n " ;
print " --feedbrowser - update feedbrowser \n " ;
print " --daemon - start single-process update daemon \n " ;
print " --task N - create lockfile using this task id \n " ;
print " --cleanup-tags - perform tags table maintenance \n " ;
2013-03-21 11:05:57 +00:00
print " --quiet - don't output messages to stdout \n " ;
2013-03-21 10:56:04 +00:00
print " --log FILE - log messages to FILE \n " ;
2013-03-21 10:48:47 +00:00
print " --indexes - recreate missing schema indexes \n " ;
2013-04-04 15:15:14 +00:00
print " --update-schema - update database schema \n " ;
2013-03-21 10:48:47 +00:00
print " --convert-filters - convert type1 filters to type2 \n " ;
print " --force-update - force update of all feeds \n " ;
print " --list-plugins - list all available plugins \n " ;
print " --help - show this help \n " ;
2012-12-24 05:52:15 +00:00
print " Plugin options: \n " ;
foreach ( $pluginhost -> get_commands () as $command => $data ) {
2013-03-28 14:37:36 +00:00
$args = $data [ 'arghelp' ];
printf ( " --%-19s - %s \n " , " $command $args " , $data [ " description " ]);
2012-12-24 05:52:15 +00:00
}
2010-11-09 13:33:08 +00:00
return ;
2007-03-01 08:54:55 +00:00
}
2007-05-04 03:15:58 +00:00
2013-04-17 08:36:27 +00:00
if ( ! isset ( $options [ 'daemon' ])) {
require_once " errorhandler.php " ;
}
2013-04-17 08:10:35 +00:00
if ( ! isset ( $options [ 'update-schema' ])) {
$schema_version = get_schema_version ( $link );
if ( $schema_version != SCHEMA_VERSION ) {
die ( " Schema version is wrong, please upgrade the database. \n " );
}
}
2013-03-21 11:05:57 +00:00
define ( 'QUIET' , isset ( $options [ 'quiet' ]));
2013-03-21 10:56:04 +00:00
if ( isset ( $options [ " log " ])) {
_debug ( " Logging to " . $options [ " log " ]);
define ( 'LOGFILE' , $options [ " log " ]);
}
2013-03-21 10:48:47 +00:00
if ( ! isset ( $options [ " daemon " ])) {
2010-11-09 13:33:08 +00:00
$lock_filename = " update.lock " ;
} else {
$lock_filename = " update_daemon.lock " ;
}
2007-02-24 16:46:39 +00:00
2013-03-21 10:48:47 +00:00
if ( isset ( $options [ " task " ])) {
_debug ( " Using task id " . $options [ " task " ]);
$lock_filename = $lock_filename . " -task_ " . $options [ " task " ];
}
2010-11-09 13:33:08 +00:00
$lock_handle = make_lockfile ( $lock_filename );
$must_exit = false ;
2007-02-24 16:46:39 +00:00
2010-11-09 13:33:08 +00:00
// Try to lock a file in order to avoid concurrent update.
if ( ! $lock_handle ) {
die ( " error: Can't create lockfile ( $lock_filename ). " .
" Maybe another update process is already running. \n " );
}
2007-02-24 16:46:39 +00:00
2013-03-21 10:48:47 +00:00
if ( isset ( $options [ " force-update " ])) {
_debug ( " marking all feeds as needing update... " );
db_query ( $link , " UPDATE ttrss_feeds SET last_update_started = '1970-01-01',
last_updated = '1970-01-01' " );
}
if ( isset ( $options [ " feeds " ])) {
2010-11-09 13:33:08 +00:00
// Update all feeds needing a update.
update_daemon_common ( $link );
2011-04-13 11:48:20 +00:00
// Update feedbrowser
$count = update_feedbrowser_cache ( $link );
_debug ( " Feedbrowser updated, $count feeds processed. " );
// Purge orphans and cleanup tags
purge_orphans ( $link , true );
$rc = cleanup_tags ( $link , 14 , 50000 );
_debug ( " Cleaned $rc cached tags. " );
2011-04-21 04:51:59 +00:00
2012-12-24 10:27:15 +00:00
global $pluginhost ;
$pluginhost -> run_hooks ( $pluginhost :: HOOK_UPDATE_TASK , " hook_update_task " , $op );
2010-11-09 13:33:08 +00:00
}
2007-02-24 16:46:39 +00:00
2013-03-21 10:48:47 +00:00
if ( isset ( $options [ " feedbrowser " ])) {
2010-11-09 13:33:08 +00:00
$count = update_feedbrowser_cache ( $link );
print " Finished, $count feeds processed. \n " ;
2007-02-24 16:46:39 +00:00
}
2010-11-09 13:33:08 +00:00
2013-03-21 10:48:47 +00:00
if ( isset ( $options [ " daemon " ])) {
2010-11-09 13:33:08 +00:00
while ( true ) {
2013-04-01 15:51:43 +00:00
$quiet = ( isset ( $options [ " quiet " ])) ? " --quiet " : " " ;
passthru ( PHP_EXECUTABLE . " " . $argv [ 0 ] . " --daemon-loop $quiet " );
2010-11-09 13:33:08 +00:00
_debug ( " Sleeping for " . DAEMON_SLEEP_INTERVAL . " seconds... " );
sleep ( DAEMON_SLEEP_INTERVAL );
2007-02-24 16:46:39 +00:00
}
2007-03-01 08:54:55 +00:00
}
2007-05-05 11:07:38 +00:00
2013-03-21 10:48:47 +00:00
if ( isset ( $options [ " daemon-loop " ])) {
2010-11-09 13:33:08 +00:00
if ( ! make_stampfile ( 'update_daemon.stamp' )) {
2013-03-30 12:28:21 +00:00
_debug ( " warning: unable to create stampfile \n " );
2010-11-09 13:33:08 +00:00
}
2007-05-05 11:07:38 +00:00
2011-04-12 15:33:12 +00:00
// Call to the feed batch update function
2010-11-09 13:33:08 +00:00
// or regenerate feedbrowser cache
2007-05-05 11:07:38 +00:00
2010-11-09 13:33:08 +00:00
if ( rand ( 0 , 100 ) > 30 ) {
update_daemon_common ( $link );
2007-05-05 11:07:38 +00:00
} else {
2010-11-09 13:33:08 +00:00
$count = update_feedbrowser_cache ( $link );
2010-11-13 18:03:31 +00:00
_debug ( " Feedbrowser updated, $count feeds processed. " );
purge_orphans ( $link , true );
2011-04-12 15:33:12 +00:00
2010-11-13 18:03:31 +00:00
$rc = cleanup_tags ( $link , 14 , 50000 );
_debug ( " Cleaned $rc cached tags. " );
2011-04-21 04:51:59 +00:00
2012-12-24 10:27:15 +00:00
global $pluginhost ;
$pluginhost -> run_hooks ( $pluginhost :: HOOK_UPDATE_TASK , " hook_update_task " , $op );
2007-05-05 11:07:38 +00:00
}
2007-03-02 14:08:00 +00:00
2007-02-24 16:46:39 +00:00
}
2013-03-21 10:48:47 +00:00
if ( isset ( $options [ " cleanup-tags " ])) {
2010-11-13 16:59:42 +00:00
$rc = cleanup_tags ( $link , 14 , 50000 );
2012-08-04 18:15:40 +00:00
_debug ( " $rc tags deleted. \n " );
2010-11-13 16:59:42 +00:00
}
2013-03-21 10:48:47 +00:00
if ( isset ( $options [ " indexes " ])) {
2012-08-09 10:20:27 +00:00
_debug ( " PLEASE BACKUP YOUR DATABASE BEFORE PROCEEDING! " );
_debug ( " Type 'yes' to continue. " );
if ( read_stdin () != 'yes' )
exit ;
_debug ( " clearing existing indexes... " );
if ( DB_TYPE == " pgsql " ) {
$result = db_query ( $link , " SELECT relname FROM
pg_catalog . pg_class WHERE relname LIKE 'ttrss_%'
AND relname NOT LIKE '%_pkey'
AND relkind = 'i' " );
} else {
$result = db_query ( $link , " SELECT index_name,table_name FROM
information_schema . statistics WHERE index_name LIKE 'ttrss_%' " );
}
while ( $line = db_fetch_assoc ( $result )) {
if ( DB_TYPE == " pgsql " ) {
$statement = " DROP INDEX " . $line [ " relname " ];
_debug ( $statement );
} else {
$statement = " ALTER TABLE " .
$line [ 'table_name' ] . " DROP INDEX " . $line [ 'index_name' ];
_debug ( $statement );
}
db_query ( $link , $statement , false );
}
_debug ( " reading indexes from schema for: " . DB_TYPE );
$fp = fopen ( " schema/ttrss_schema_ " . DB_TYPE . " .sql " , " r " );
if ( $fp ) {
while ( $line = fgets ( $fp )) {
$matches = array ();
if ( preg_match ( " /^create index ([^ ]+) on ([^ ]+) $ /i " , $line , $matches )) {
$index = $matches [ 1 ];
$table = $matches [ 2 ];
$statement = " CREATE INDEX $index ON $table " ;
_debug ( $statement );
db_query ( $link , $statement );
}
}
fclose ( $fp );
} else {
_debug ( " unable to open schema file. " );
}
_debug ( " all done. " );
}
2013-03-21 10:48:47 +00:00
if ( isset ( $options [ " convert-filters " ])) {
2012-08-30 14:50:56 +00:00
_debug ( " WARNING: this will remove all existing type2 filters. " );
_debug ( " Type 'yes' to continue. " );
if ( read_stdin () != 'yes' )
exit ;
_debug ( " converting filters... " );
db_query ( $link , " DELETE FROM ttrss_filters2 " );
$result = db_query ( $link , " SELECT * FROM ttrss_filters ORDER BY id " );
while ( $line = db_fetch_assoc ( $result )) {
$owner_uid = $line [ " owner_uid " ];
2012-08-31 08:54:37 +00:00
// date filters are removed
if ( $line [ " filter_type " ] != 5 ) {
$filter = array ();
if ( sql_bool_to_bool ( $line [ " cat_filter " ])) {
$feed_id = " CAT: " . ( int ) $line [ " cat_id " ];
} else {
$feed_id = ( int ) $line [ " feed_id " ];
}
2012-08-30 14:50:56 +00:00
2012-08-31 08:54:37 +00:00
$filter [ " enabled " ] = $line [ " enabled " ] ? " on " : " off " ;
$filter [ " rule " ] = array (
json_encode ( array (
" reg_exp " => $line [ " reg_exp " ],
" feed_id " => $feed_id ,
" filter_type " => $line [ " filter_type " ])));
2012-08-30 14:50:56 +00:00
2012-08-31 08:54:37 +00:00
$filter [ " action " ] = array (
json_encode ( array (
" action_id " => $line [ " action_id " ],
" action_param_label " => $line [ " action_param " ],
" action_param " => $line [ " action_param " ])));
2012-08-30 14:50:56 +00:00
2012-08-31 08:54:37 +00:00
// Oh god it's full of hacks
2012-08-31 08:24:13 +00:00
2012-08-31 08:54:37 +00:00
$_REQUEST = $filter ;
$_SESSION [ " uid " ] = $owner_uid ;
2012-08-30 14:50:56 +00:00
2012-08-31 08:54:37 +00:00
$filters = new Pref_Filters ( $link , $_REQUEST );
$filters -> add ();
}
2012-08-30 14:50:56 +00:00
}
}
2013-04-04 15:15:14 +00:00
if ( isset ( $options [ " update-schema " ])) {
_debug ( " checking for updates ( " . DB_TYPE . " )... " );
$updater = new DbUpdater ( $link , DB_TYPE , SCHEMA_VERSION );
if ( $updater -> isUpdateRequired ()) {
_debug ( " schema update required, version " . $updater -> getSchemaVersion () . " to " . SCHEMA_VERSION );
_debug ( " WARNING: please backup your database before continuing. " );
_debug ( " Type 'yes' to continue. " );
if ( read_stdin () != 'yes' )
exit ;
for ( $i = $updater -> getSchemaVersion () + 1 ; $i <= SCHEMA_VERSION ; $i ++ ) {
_debug ( " performing update up to version $i ... " );
$result = $updater -> performUpdateTo ( $i );
_debug ( $result ? " OK! " : " FAILED! " );
if ( ! $result ) return ;
}
} else {
_debug ( " update not required. " );
}
}
2013-03-21 10:48:47 +00:00
if ( isset ( $options [ " list-plugins " ])) {
2012-12-24 11:39:42 +00:00
$tmppluginhost = new PluginHost ( $link );
2012-12-25 06:02:08 +00:00
$tmppluginhost -> load_all ( $tmppluginhost :: KIND_ALL );
2012-12-25 14:57:02 +00:00
$enabled = array_map ( " trim " , explode ( " , " , PLUGINS ));
echo " List of all available plugins: \n " ;
2012-12-24 11:39:42 +00:00
foreach ( $tmppluginhost -> get_plugins () as $name => $plugin ) {
2012-12-25 06:02:08 +00:00
$about = $plugin -> about ();
2012-12-24 11:39:42 +00:00
2012-12-25 14:57:02 +00:00
$status = $about [ 3 ] ? " system " : " user " ;
if ( in_array ( $name , $enabled )) $name .= " * " ;
printf ( " %-50s %-10s v%.2f (by %s) \n %s \n \n " ,
$name , $status , $about [ 0 ], $about [ 2 ], $about [ 1 ]);
2012-12-24 11:39:42 +00:00
}
2012-12-25 14:57:02 +00:00
echo " Plugins marked by * are currently enabled for all users. \n " ;
2012-12-24 11:39:42 +00:00
}
2013-03-21 10:48:47 +00:00
$pluginhost -> run_commands ( $options );
2012-12-24 05:52:15 +00:00
2010-11-09 13:33:08 +00:00
db_close ( $link );
2011-12-11 19:59:25 +00:00
2011-12-07 00:17:23 +00:00
if ( $lock_handle != false ) {
fclose ( $lock_handle );
}
2007-02-24 16:46:39 +00:00
2012-08-23 09:03:39 +00:00
if ( file_exists ( LOCK_DIRECTORY . " / $lock_filename " ))
unlink ( LOCK_DIRECTORY . " / $lock_filename " );
2013-04-12 05:55:41 +00:00
?>