2013-04-19 15:09:34 +00:00
#!/usr/bin/php -q
< ? php
/*
$Id : do_actions . php , v 1.0 2013 / 04 / 19 13 : 40 : 32 axel Exp $
----------------------------------------------------------------------
AlternC - Web Hosting System
Copyright ( C ) 2002 by the AlternC Development Team .
http :// alternc . org /
----------------------------------------------------------------------
Based on :
Valentin Lacambre ' s web hosting softwares : http :// altern . org /
----------------------------------------------------------------------
LICENSE
This program is free software ; you can redistribute it and / or
modify it under the terms of the GNU General Public License ( GPL )
as published by the Free Software Foundation ; either version 2
of the License , or ( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
To read the license please visit http :// www . gnu . org / copyleft / gpl . html
----------------------------------------------------------------------
Original Author of file : Axel Roger
Purpose of file : Do planed actions on files / directories .
----------------------------------------------------------------------
*/
/**
* This script check the MySQL DB for actions to do , and do them one by one .
*
* @ copyright AlternC - Team 2002 - 2013 http :// alternc . org /
*/
2013-04-23 13:32:37 +00:00
// Put this var to 1 if you want to enable debug prints
2013-04-23 15:00:23 +00:00
$debug = 0 ;
2013-04-23 13:32:37 +00:00
// Debug function that print infos
function d ( $mess ){
global $debug ;
if ( $debug == 1 )
echo " $mess\n " ;
}
2013-04-19 15:09:34 +00:00
require_once ( " /usr/share/alternc/panel/class/config_nochk.php " );
$LOCK_FILE = '/var/run/alternc/do_actions_cron.lock' ;
2013-04-23 08:06:44 +00:00
$SCRIPT = '/usr/bin/php do_actions.php' ;
2013-04-19 15:09:34 +00:00
$MY_PID = getmypid ();
2013-04-24 10:00:54 +00:00
$FIXPERM = '/usr/lib/alternc/fixperms.sh' ;
2013-04-19 15:09:34 +00:00
// Check if script isn't already running
2013-04-23 08:06:44 +00:00
if ( file_exists ( $LOCK_FILE ) !== false ){
2013-04-23 13:32:37 +00:00
d ( " Lock file already exists. " );
2013-04-19 15:09:34 +00:00
// Check if file is in process list
2013-04-23 08:06:44 +00:00
$PID = file_get_contents ( $LOCK_FILE );
2013-04-23 13:32:37 +00:00
d ( " My PID is $MY_PID , PID in the lock file is $PID " );
if ( $PID == exec ( " pidof $SCRIPT | tr ' ' ' \n ' | grep -v $MY_PID " )){
2013-04-19 15:09:34 +00:00
// Previous cron is not finished yet, just exit
2013-04-23 13:32:37 +00:00
d ( " Previous cron is already running, we just exit and let it finish :-) " );
2013-04-23 08:06:44 +00:00
exit ( 0 );
2013-04-19 15:09:34 +00:00
} else {
// Previous cron failed!
2013-04-24 10:00:54 +00:00
echo " No process with PID $PID found! Previous cron failed... \n " ;
d ( " Removing lock file and trying to process the failed action... " );
2013-04-19 15:09:34 +00:00
// Delete the lock and continue to the next action
unlink ( $LOCK_FILE );
2013-04-23 13:32:37 +00:00
// Lock with the current script's PID
d ( " Lock the script... " );
if ( file_put_contents ( $LOCK_FILE , $MY_PID ) === false ){
die ( " Cannot open/write $LOCK_FILE " );
}
2013-04-23 15:00:23 +00:00
// Get the action(s) that was processing when previous script failed
// (Normally, there will be at most 1 job pending... but who know?)
2013-04-23 13:32:37 +00:00
while ( $cc = $action -> get_job ()){
$c = $cc [ 0 ];
2013-04-24 10:00:54 +00:00
$params = unserialize ( $c [ " parameters " ]);
2013-04-23 13:32:37 +00:00
// We can resume these types of action, so we reset the job to process it later
d ( " Previous job was the n° " . $c [ " id " ] . " : ' " . $c [ " type " ] . " ' " );
2013-04-24 10:00:54 +00:00
if ( $c [ " type " ] == " CREATE_FILE " && is_dir ( dirname ( $params [ " file " ])) || $c [ " type " ] == " CREATE_DIR " || $c [ " type " ] == " DELETE " || $c [ " type " ] == " FIXDIR " ){
2013-04-23 13:32:37 +00:00
d ( " Reset of the job! So it will be resumed... " );
$action -> reset_job ( $c [ " id " ]);
} else {
// We can't resume the others types, notify the fail and finish this action
2013-04-24 10:00:54 +00:00
echo " Can't resume the job n° " . $c [ " id " ] . " action ' " . $c [ " type " ] . " ', finishing it with a fail status. \n " ;
2013-04-23 13:32:37 +00:00
if ( ! $action -> finish ( $c [ " id " ], " Fail: Previous script crashed while processing this action, cannot resume it. " )){
2013-04-24 10:00:54 +00:00
echo " Cannot finish the action! Error while inserting the error value in the DB for action n° " . $c [ " id " ] . " : action ' " . $c [ " type " ] . " ' \n " ;
2013-04-23 13:32:37 +00:00
break ; // Else we go into an infinite loop... AAAAHHHHHH
}
}
}
}
} else {
// Lock with the current script's PID
d ( " Lock the script... " );
if ( file_put_contents ( $LOCK_FILE , $MY_PID ) === false ){
die ( " Cannot open/write $LOCK_FILE " );
}
2013-04-19 15:09:34 +00:00
}
//We get the next action to do
2013-04-23 08:06:44 +00:00
while ( $rr = $action -> get_action ()){
$r = $rr [ 0 ];
$return = " OK " ;
2013-04-24 10:00:54 +00:00
unset ( $output );
2013-04-19 15:09:34 +00:00
// We lock the action
2013-04-23 13:32:37 +00:00
d ( " ----------- \n Beginning action n° " . $r [ " id " ]);
2013-04-19 15:14:34 +00:00
$action -> begin ( $r [ " id " ]);
2013-04-19 15:09:34 +00:00
// We process it
2013-04-23 08:06:44 +00:00
$params = unserialize ( $r [ " parameters " ]);
// Remove all previous error message...
@ trigger_error ( " " );
2013-04-19 15:09:34 +00:00
// We exec with the specified user
2013-04-23 13:32:37 +00:00
d ( " Executing action ' " . $r [ " type " ] . " ' with user ' " . $r [ " user " ] . " ' " );
2013-04-23 08:06:44 +00:00
// For now, this script only work for user 'root'
if ( $r [ " user " ] != " root " ){
2013-04-24 10:00:54 +00:00
// TODO
2013-04-23 08:06:44 +00:00
}
2013-04-19 15:09:34 +00:00
switch ( $r [ " type " ]){
case " CREATE_FILE " :
2013-04-24 10:00:54 +00:00
if ( ! file_exists ( $params [ " file " ]))
@ file_put_contents ( $params [ " file " ], $params [ " content " ]);
else
$output = array ( " Fail: file already exists " );
2013-04-19 15:09:34 +00:00
break ;
case " CREATE_DIR " :
2013-04-23 13:32:37 +00:00
// Create the directory and make parent directories as needed
2013-04-23 08:06:44 +00:00
@ mkdir ( $params [ " dir " ], 0777 , true );
2013-04-19 15:09:34 +00:00
break ;
case " DELETE " :
2013-04-23 13:32:37 +00:00
// Delete file/directory and its contents recursively
2013-04-23 08:06:44 +00:00
@ exec ( " rm -rf " . $params [ " dir " ] . " 2>&1 " , $output );
2013-04-19 15:09:34 +00:00
break ;
case " MOVE " :
2013-04-23 08:06:44 +00:00
// If destination dir does not exists, create it
if ( ! is_dir ( $params [ " dst " ]))
@ mkdir ( $params [ " dst " ], 0777 , true );
@ exec ( " mv -f " . $params [ " src " ] . " " . $params [ " dst " ] . " 2>&1 " , $output );
2013-04-24 10:00:54 +00:00
// If MOVE failed, we have to notify the cron
if ( isset ( $output [ 0 ]))
echo " Action n° " . $r [ " id " ] . " 'MOVE' failed! \n user: " . $r [ " user " ] . " \n source: " . $params [ " src " ] . " \n destination: " . $params [ " dst " ] . " \n " ;
2013-04-19 15:09:34 +00:00
break ;
2013-04-24 10:00:54 +00:00
case " FIXDIR " :
@ exec ( " $FIXPERM -f " . $params [ " dir " ] . " 2>&1 " , $trash , $code );
if ( $code != 0 )
$output [ 0 ] = $code ;
2013-04-22 08:06:48 +00:00
break ;
2013-04-19 15:09:34 +00:00
default :
2013-04-24 10:00:54 +00:00
$output = array ( " Fail: Sorry dude, i do not know this type of action " );
2013-04-19 15:09:34 +00:00
break ;
}
2013-04-23 08:06:44 +00:00
// Get the last error if exists.
if ( isset ( $output [ 0 ]))
$return = $output [ 0 ];
else
if ( $error = error_get_last ())
if ( $error [ " message " ] != " " )
$return = $error [ " message " ];
// We finished the action, notify the DB.
2013-04-23 13:32:37 +00:00
d ( " Finishing... return value is : $return\n " );
if ( ! $action -> finish ( $r [ " id " ], addslashes ( $return ))){
2013-04-24 10:00:54 +00:00
echo " Cannot finish the action! Error while inserting the error value in the DB for action n° " . $c [ " id " ] . " : action ' " . $c [ " type " ] . " ' \n Return value: " . addslashes ( $return ) . " \n " ;
2013-04-23 13:32:37 +00:00
break ; // Else we go into an infinite loop... AAAAHHHHHH
}
2013-04-19 15:09:34 +00:00
}
// Unlock the script
2013-04-23 13:32:37 +00:00
d ( " Unlock the script... " );
2013-04-19 15:09:34 +00:00
unlink ( $LOCK_FILE );
2013-04-23 08:06:44 +00:00
// Exit this script
exit ( 0 );
2013-04-19 15:09:34 +00:00
?>