2016-06-04 01:10:45 +02:00
< ? php
2014-01-06 05:15:47 +01:00
App :: uses ( 'Folder' , 'Utility' );
App :: uses ( 'File' , 'Utility' );
require_once 'AppShell.php' ;
class ServerShell extends AppShell
{
2019-08-08 11:18:21 +02:00
public $uses = array ( 'Server' , 'Task' , 'Job' , 'User' , 'Feed' );
2016-06-04 01:08:16 +02:00
2019-10-22 20:13:11 +02:00
public function list () {
$res = [ 'servers' => []];
$servers = $this -> Server -> find ( 'all' , [
'fields' => [ 'Server.id' , 'Server.name' , 'Server.url' ],
'recursive' => 0
]);
foreach ( $servers as $server )
$res [ 'servers' ][] = $server [ 'Server' ];
echo json_encode ( $res ) . PHP_EOL ;
}
public function test () {
if ( empty ( $this -> args [ 0 ])) {
die ( 'Usage: ' . $this -> Server -> command_line_functions [ 'console_automation_tasks' ][ 'data' ][ 'Test' ] . PHP_EOL );
}
$serverId = intval ( $this -> args [ 0 ]);
$res = @ $this -> Server -> runConnectionTest ( $serverId );
if ( ! empty ( $res [ 'message' ]))
$res [ 'message' ] = json_decode ( $res [ 'message' ]);
echo json_encode ( $res ) . PHP_EOL ;
}
2019-08-08 11:18:21 +02:00
public function pull () {
if ( empty ( $this -> args [ 0 ]) || empty ( $this -> args [ 1 ])) {
die ( 'Usage: ' . $this -> Server -> command_line_functions [ 'console_automation_tasks' ][ 'data' ][ 'pull' ] . PHP_EOL );
}
$userId = $this -> args [ 0 ];
$user = $this -> User -> getAuthUser ( $userId );
if ( empty ( $this -> args [ 1 ])) die ();
$serverId = $this -> args [ 1 ];
if ( ! empty ( $this -> args [ 2 ])) {
$technique = $this -> args [ 2 ];
} else {
$technique = 'full' ;
}
if ( ! empty ( $this -> args [ 3 ])) {
$jobId = $this -> args [ 3 ];
} else {
$this -> Job -> create ();
$data = array (
'worker' => 'default' ,
'job_type' => 'pull' ,
'job_input' => 'Server: ' . $serverId ,
'status' => 0 ,
'retries' => 0 ,
'org' => $user [ 'Organisation' ][ 'name' ],
'message' => 'Pulling.' ,
);
$this -> Job -> save ( $data );
$jobId = $this -> Job -> id ;
}
$this -> Server -> id = $serverId ;
$server = $this -> Server -> read ( null , $serverId );
$result = $this -> Server -> pull ( $user , $serverId , $technique , $server , $jobId );
$this -> Job -> id = $jobId ;
$this -> Job -> save ( array (
'id' => $jobId ,
'message' => 'Job done.' ,
'progress' => 100 ,
'status' => 4
));
if ( is_array ( $result )) {
2019-11-22 21:53:51 +01:00
$message = sprintf ( __ ( 'Pull completed. %s events pulled, %s events could not be pulled, %s proposals pulled, %s sightings pulled.' , count ( $result [ 0 ]), count ( $result [ 1 ]), $result [ 2 ], $result [ 3 ]));
2019-08-08 11:18:21 +02:00
} else {
$message = sprintf ( __ ( 'ERROR: %s' ), $result );
}
$this -> Job -> saveField ( 'message' , $message );
echo $message . PHP_EOL ;
}
2016-06-04 01:08:16 +02:00
2019-08-08 11:18:21 +02:00
public function push () {
if ( empty ( $this -> args [ 0 ]) || empty ( $this -> args [ 1 ])) {
die ( 'Usage: ' . $this -> Server -> command_line_functions [ 'console_automation_tasks' ][ 'data' ][ 'push' ] . PHP_EOL );
}
$userId = $this -> args [ 0 ];
$user = $this -> User -> getAuthUser ( $userId );
if ( empty ( $user )) die ( 'Invalid user.' . PHP_EOL );
$serverId = $this -> args [ 1 ];
if ( ! empty ( $this -> args [ 2 ])) {
$jobId = $this -> args [ 2 ];
} else {
$this -> Job -> create ();
$data = array (
'worker' => 'default' ,
'job_type' => 'push' ,
'job_input' => 'Server: ' . $serverId ,
'status' => 0 ,
'retries' => 0 ,
'org' => $user [ 'Organisation' ][ 'name' ],
'message' => 'Pushing.' ,
);
$this -> Job -> save ( $data );
$jobId = $this -> Job -> id ;
}
$technique = empty ( $this -> args [ 3 ]) ? 'full' : $this -> args [ 3 ];
$this -> Job -> read ( null , $jobId );
$server = $this -> Server -> read ( null , $serverId );
App :: uses ( 'SyncTool' , 'Tools' );
$syncTool = new SyncTool ();
$HttpSocket = $syncTool -> setupHttpSocket ( $server );
$result = $this -> Server -> push ( $serverId , $technique , $jobId , $HttpSocket , $user );
$message = 'Job done.' ;
if ( $result !== true && ! is_array ( $result )) $message = 'Job failed. Reason: ' . $result ;
$this -> Job -> save ( array (
'id' => $jobId ,
'message' => $message ,
'progress' => 100 ,
'status' => 4
));
if ( isset ( $this -> args [ 4 ])) {
$this -> Task -> id = $this -> args [ 5 ];
$message = 'Job(s) started at ' . date ( 'd/m/Y - H:i:s' ) . '.' ;
$this -> Task -> saveField ( 'message' , $message );
echo $message . PHP_EOL ;
}
}
2016-06-04 01:08:16 +02:00
2016-03-09 02:31:55 +01:00
2019-08-08 11:18:21 +02:00
public function fetchFeed () {
if ( empty ( $this -> args [ 0 ]) || empty ( $this -> args [ 1 ])) {
2019-10-08 09:30:24 +02:00
die ( 'Usage: ' . $this -> Server -> command_line_functions [ 'console_automation_tasks' ][ 'data' ][ 'Fetch feeds as local data' ] . PHP_EOL );
2019-08-08 11:18:21 +02:00
}
$userId = $this -> args [ 0 ];
$user = $this -> User -> getAuthUser ( $userId );
if ( empty ( $user )) {
echo 'Invalid user.' ;
die ();
}
$feedId = $this -> args [ 1 ];
if ( ! empty ( $this -> args [ 2 ])) {
$jobId = $this -> args [ 2 ];
} else {
$this -> Job -> create ();
$data = array (
'worker' => 'default' ,
'job_type' => 'fetch_feeds' ,
'job_input' => 'Feed: ' . $feedId ,
'status' => 0 ,
'retries' => 0 ,
'org' => $user [ 'Organisation' ][ 'name' ],
'message' => 'Starting fetch from Feed.' ,
);
$this -> Job -> save ( $data );
$jobId = $this -> Job -> id ;
}
$this -> Job -> read ( null , $jobId );
$outcome = array (
'id' => $jobId ,
'message' => 'Job done.' ,
'progress' => 100 ,
'status' => 4
);
if ( $feedId == 'all' ) {
$feedIds = $this -> Feed -> find ( 'list' , array (
'fields' => array ( 'Feed.id' , 'Feed.id' ),
'conditions' => array ( 'Feed.enabled' => 1 )
));
$feedIds = array_values ( $feedIds );
$successes = 0 ;
$fails = 0 ;
foreach ( $feedIds as $k => $feedId ) {
$jobStatus = array (
'id' => $jobId ,
'message' => 'Fetching feed: ' . $feedId ,
'progress' => 100 * $k / count ( $feedIds ),
'status' => 0
);
$this -> Job -> id = $jobId ;
$this -> Job -> save ( $jobStatus );
$result = $this -> Feed -> downloadFromFeedInitiator ( $feedId , $user );
if ( $result ) {
$successes ++ ;
} else {
$fails ++ ;
}
}
$outcome [ 'message' ] = 'Job done. ' . $successes . ' feeds pulled successfuly, ' . $fails . ' feeds could not be pulled.' ;
} else {
$temp = $this -> Feed -> find ( 'first' , array (
'fields' => array ( 'Feed.id' , 'Feed.id' ),
'conditions' => array ( 'Feed.enabled' => 1 , 'Feed.id' => $feedId )
));
if ( ! empty ( $temp )) {
$result = $this -> Feed -> downloadFromFeedInitiator ( $feedId , $user , $jobId );
if ( ! $result ) {
$outcome [ 'progress' ] = 0 ;
$outcome [ 'status' ] = 3 ;
$outcome [ 'message' ] = 'Job failed.' ;
}
}
}
$this -> Job -> id = $jobId ;
$this -> Job -> save ( $outcome );
echo $outcome [ 'message' ] . PHP_EOL ;
}
2017-05-08 14:22:27 +02:00
2019-01-18 09:06:23 +01:00
public function cacheServer () {
if ( empty ( $this -> args [ 0 ]) || empty ( $this -> args [ 1 ])) {
die ( 'Usage: ' . $this -> Server -> command_line_functions [ 'console_automation_tasks' ][ 'data' ][ 'cacheServer' ] . PHP_EOL );
}
$userId = $this -> args [ 0 ];
$user = $this -> User -> getAuthUser ( $userId );
if ( empty ( $user )) die ( 'Invalid user.' . PHP_EOL );
$scope = $this -> args [ 1 ];
if ( ! empty ( $this -> args [ 2 ])) {
$jobId = $this -> args [ 2 ];
} else {
$this -> Job -> create ();
$data = array (
'worker' => 'default' ,
'job_type' => 'cache_servers' ,
2019-12-10 09:24:56 +01:00
'job_input' => 'Server: ' . $scopeid ,
2019-01-18 09:06:23 +01:00
'status' => 0 ,
'retries' => 0 ,
'org' => $user [ 'Organisation' ][ 'name' ],
'message' => 'Starting server caching.' ,
);
$this -> Job -> save ( $data );
$jobId = $this -> Job -> id ;
}
$this -> Job -> read ( null , $jobId );
2019-01-18 16:15:22 +01:00
$result = $this -> Server -> cacheServerInitiator ( $user , $scope , $jobId );
2019-01-18 09:06:23 +01:00
$this -> Job -> id = $jobId ;
if ( $result !== true ) {
$message = 'Job Failed. Reason: ' ;
$this -> Job -> save ( array (
'id' => $jobId ,
'message' => $message . $result ,
'progress' => 0 ,
'status' => 3
));
} else {
$message = 'Job done.' ;
$this -> Job -> save ( array (
'id' => $jobId ,
'message' => $message ,
'progress' => 100 ,
'status' => 4
));
}
echo $message . PHP_EOL ;
}
2019-08-08 11:18:21 +02:00
public function cacheFeed () {
if ( empty ( $this -> args [ 0 ]) || empty ( $this -> args [ 1 ])) {
2019-10-08 09:30:24 +02:00
die ( 'Usage: ' . $this -> Server -> command_line_functions [ 'console_automation_tasks' ][ 'data' ][ 'Cache feeds for quick lookups' ] . PHP_EOL );
2019-08-08 11:18:21 +02:00
}
$userId = $this -> args [ 0 ];
$user = $this -> User -> getAuthUser ( $userId );
if ( empty ( $user )) die ( 'Invalid user.' . PHP_EOL );
$scope = $this -> args [ 1 ];
if ( ! empty ( $this -> args [ 2 ])) {
$jobId = $this -> args [ 2 ];
} else {
$this -> Job -> create ();
$data = array (
'worker' => 'default' ,
'job_type' => 'cache_feeds' ,
'job_input' => 'Feed: ' . $scope ,
'status' => 0 ,
'retries' => 0 ,
'org' => $user [ 'Organisation' ][ 'name' ],
'message' => 'Starting feed caching.' ,
);
$this -> Job -> save ( $data );
$jobId = $this -> Job -> id ;
}
$this -> Job -> read ( null , $jobId );
2019-08-28 17:01:07 +02:00
try {
$result = $this -> Feed -> cacheFeedInitiator ( $user , $jobId , $scope );
} catch ( Exception $e ) {
CakeLog :: error ( $e -> getMessage ());
$result = false ;
}
2019-08-08 11:18:21 +02:00
$this -> Job -> id = $jobId ;
if ( $result !== true ) {
2019-08-28 17:01:07 +02:00
$message = 'Job failed. See logs for more details.' ;
2019-08-08 11:18:21 +02:00
$this -> Job -> save ( array (
'id' => $jobId ,
2019-08-28 17:01:07 +02:00
'message' => $message ,
2019-08-08 11:18:21 +02:00
'progress' => 0 ,
'status' => 3
));
} else {
$message = 'Job done.' ;
$this -> Job -> save ( array (
'id' => $jobId ,
'message' => $message ,
'progress' => 100 ,
'status' => 4
));
}
echo $message . PHP_EOL ;
}
2016-06-04 01:08:16 +02:00
2019-08-08 11:18:21 +02:00
public function enqueuePull () {
$timestamp = $this -> args [ 0 ];
$userId = $this -> args [ 1 ];
$taskId = $this -> args [ 2 ];
$task = $this -> Task -> read ( null , $taskId );
if ( $timestamp != $task [ 'Task' ][ 'next_execution_time' ]) {
return ;
}
if ( $task [ 'Task' ][ 'timer' ] > 0 ) $this -> Task -> reQueue ( $task , 'default' , 'ServerShell' , 'enqueuePull' , $userId , $taskId );
$user = $this -> User -> getAuthUser ( $userId );
$servers = $this -> Server -> find ( 'all' , array ( 'recursive' => - 1 , 'conditions' => array ( 'pull' => 1 )));
$count = count ( $servers );
$failCount = 0 ;
foreach ( $servers as $k => $server ) {
$this -> Job -> create ();
$data = array (
'worker' => 'default' ,
'job_type' => 'pull' ,
'job_input' => 'Server: ' . $server [ 'Server' ][ 'id' ],
'retries' => 0 ,
'org' => $user [ 'Organisation' ][ 'name' ],
'org_id' => $user [ 'org_id' ],
'process_id' => 'Part of scheduled pull' ,
'message' => 'Pulling.' ,
);
$this -> Job -> save ( $data );
$jobId = $this -> Job -> id ;
App :: uses ( 'SyncTool' , 'Tools' );
$syncTool = new SyncTool ();
$result = $this -> Server -> pull ( $user , $server [ 'Server' ][ 'id' ], 'full' , $server , $jobId );
$this -> Job -> save ( array (
'id' => $jobId ,
'message' => 'Job done.' ,
'progress' => 100 ,
'status' => 4
));
if ( is_numeric ( $result [ 0 ])) {
switch ( $result [ 0 ]) {
case '1' :
$this -> Job -> saveField ( 'message' , 'Not authorised. This is either due to an invalid auth key, or due to the sync user not having authentication permissions enabled on the remote server.' );
break ;
case '2' :
$this -> Job -> saveField ( 'message' , $result [ 1 ]);
break ;
case '3' :
$this -> Job -> saveField ( 'message' , 'Sorry, incremental pushes are not yet implemented.' );
break ;
case '4' :
$this -> Job -> saveField ( 'message' , 'Invalid technique chosen.' );
break ;
2016-06-04 01:08:16 +02:00
2019-08-08 11:18:21 +02:00
}
$failCount ++ ;
}
}
$this -> Task -> id = $task [ 'Task' ][ 'id' ];
$this -> Task -> saveField ( 'message' , count ( $servers ) . ' job(s) completed at ' . date ( 'd/m/Y - H:i:s' ) . '. Failed jobs: ' . $failCount . '/' . $count );
}
2016-06-04 01:08:16 +02:00
2019-08-08 11:18:21 +02:00
public function enqueueFeedFetch () {
$timestamp = $this -> args [ 0 ];
$userId = $this -> args [ 1 ];
$taskId = $this -> args [ 2 ];
$task = $this -> Task -> read ( null , $taskId );
if ( $timestamp != $task [ 'Task' ][ 'next_execution_time' ]) {
return ;
}
if ( $task [ 'Task' ][ 'timer' ] > 0 ) $this -> Task -> reQueue ( $task , 'default' , 'ServerShell' , 'enqueueFeedFetch' , $userId , $taskId );
$user = $this -> User -> getAuthUser ( $userId );
$failCount = 0 ;
2017-09-13 15:35:24 +02:00
$feeds = $this -> Feed -> find ( 'all' , array (
'recursive' => - 1 ,
'conditions' => array ( 'enabled' => true )
));
foreach ( $feeds as $k => $feed ) {
$this -> Job -> create ();
$data = array (
'worker' => 'default' ,
'job_type' => 'feed_fetch' ,
'job_input' => 'Feed: ' . $feed [ 'Feed' ][ 'id' ],
'retries' => 0 ,
'org' => $user [ 'Organisation' ][ 'name' ],
'org_id' => $user [ 'org_id' ],
'process_id' => 'Part of scheduled feed fetch' ,
'message' => 'Pulling.' ,
);
$this -> Job -> save ( $data );
$jobId = $this -> Job -> id ;
$result = $this -> Feed -> downloadFromFeedInitiator ( $feed [ 'Feed' ][ 'id' ], $user , $jobId );
$this -> Job -> save ( array (
'message' => 'Job done.' ,
'progress' => 100 ,
'status' => 4
));
if ( $result !== true ) {
$this -> Job -> saveField ( 'message' , 'Could not fetch feed.' );
$failCount ++ ;
}
}
$this -> Task -> id = $task [ 'Task' ][ 'id' ];
$this -> Task -> saveField ( 'message' , count ( $feeds ) . ' job(s) completed at ' . date ( 'd/m/Y - H:i:s' ) . '. Failed jobs: ' . $failCount . '/' . count ( $feeds ));
2019-08-08 11:18:21 +02:00
}
2017-08-25 14:38:32 +02:00
2019-08-08 11:18:21 +02:00
public function enqueueFeedCache () {
2017-09-13 15:35:24 +02:00
$timestamp = $this -> args [ 0 ];
$userId = $this -> args [ 1 ];
$taskId = $this -> args [ 2 ];
$task = $this -> Task -> read ( null , $taskId );
if ( $timestamp != $task [ 'Task' ][ 'next_execution_time' ]) {
return ;
}
2019-08-08 11:18:21 +02:00
if ( $task [ 'Task' ][ 'timer' ] > 0 ) $this -> Task -> reQueue ( $task , 'default' , 'ServerShell' , 'enqueueFeedCache' , $userId , $taskId );
2017-09-13 15:35:24 +02:00
$user = $this -> User -> getAuthUser ( $userId );
$this -> Job -> create ();
$data = array (
'worker' => 'default' ,
'job_type' => 'feed_cache' ,
2018-01-16 23:22:56 +01:00
'job_input' => '' ,
2017-09-13 15:35:24 +02:00
'retries' => 0 ,
'org' => $user [ 'Organisation' ][ 'name' ],
'org_id' => $user [ 'org_id' ],
'process_id' => 'Part of scheduled feed caching' ,
'message' => 'Caching.' ,
);
$this -> Job -> save ( $data );
$jobId = $this -> Job -> id ;
2019-09-02 20:37:18 +02:00
try {
$result = $this -> Feed -> cacheFeedInitiator ( $user , $jobId , 'all' );
} catch ( Exception $e ) {
CakeLog :: error ( $e -> getMessage ());
$result = false ;
}
if ( $result ) {
$this -> Job -> save ( array (
'message' => 'Job done.' ,
'progress' => 100 ,
'status' => 4
));
} else {
$this -> Job -> save ( array (
'message' => 'Job failed. See logs for more details.' ,
'progress' => 100 ,
'status' => 3 ,
));
}
2017-09-13 15:35:24 +02:00
$this -> Task -> id = $task [ 'Task' ][ 'id' ];
$this -> Task -> saveField ( 'message' , 'Job completed at ' . date ( 'd/m/Y - H:i:s' ));
}
2017-08-25 14:38:32 +02:00
2019-08-08 11:18:21 +02:00
public function enqueuePush () {
$timestamp = $this -> args [ 0 ];
$taskId = $this -> args [ 1 ];
$userId = $this -> args [ 2 ];
$this -> Task -> id = $taskId ;
$task = $this -> Task -> read ( null , $taskId );
if ( $timestamp != $task [ 'Task' ][ 'next_execution_time' ]) {
return ;
}
if ( $task [ 'Task' ][ 'timer' ] > 0 ) $this -> Task -> reQueue ( $task , 'default' , 'ServerShell' , 'enqueuePush' , $userId , $taskId );
2016-06-04 01:08:16 +02:00
2019-08-08 11:18:21 +02:00
$this -> User -> recursive = - 1 ;
$user = $this -> User -> getAuthUser ( $userId );
$servers = $this -> Server -> find ( 'all' , array ( 'recursive' => - 1 , 'conditions' => array ( 'push' => 1 )));
foreach ( $servers as $k => $server ) {
$this -> Job -> create ();
$data = array (
'worker' => 'default' ,
'job_type' => 'push' ,
'job_input' => 'Server: ' . $server [ 'Server' ][ 'id' ],
'retries' => 0 ,
'org' => $user [ 'Organisation' ][ 'name' ],
'org_id' => $user [ 'org_id' ],
'process_id' => 'Part of scheduled push' ,
'message' => 'Pushing.' ,
);
$this -> Job -> save ( $data );
$jobId = $this -> Job -> id ;
App :: uses ( 'SyncTool' , 'Tools' );
$syncTool = new SyncTool ();
$HttpSocket = $syncTool -> setupHttpSocket ( $server );
$result = $this -> Server -> push ( $server [ 'Server' ][ 'id' ], 'full' , $jobId , $HttpSocket , $user );
}
$this -> Task -> id = $task [ 'Task' ][ 'id' ];
$this -> Task -> saveField ( 'message' , count ( $servers ) . ' job(s) completed at ' . date ( 'd/m/Y - H:i:s' ) . '.' );
}
2019-04-26 09:45:03 +02:00
2014-01-06 05:15:47 +01:00
}