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-26 15:38:28 +00:00
$debug = 1 ;
2013-04-25 13:05:27 +00:00
$error_raise = '' ;
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-25 13:05:27 +00:00
// Function to mail the panel's administrator if something failed
function mail_it (){
2013-04-26 09:53:48 +00:00
global $error_raise , $L_FQDN ;
mail ( " alterncpanel@ $L_FQDN " , 'Script do_actions.php issues' , " \n Errors reporting mail: \n \n $error_raise " );
2013-04-25 13:05:27 +00:00
}
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-26 09:53:48 +00:00
$error_raise .= " Lock file already exists. No process with PID $PID found! Previous cron failed... \n " ;
2013-04-24 10:00:54 +00:00
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
if ( file_put_contents ( $LOCK_FILE , $MY_PID ) === false ){
2013-04-25 13:05:27 +00:00
$error_raise .= " Cannot open/write $LOCK_FILE\n " ;
mail_it ();
exit ( 1 );
2013-04-23 13:32:37 +00:00
}
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-26 15:01:49 +00:00
if ( $c [ " type " ] == " CREATE_FILE " && is_dir ( dirname ( $params [ " file " ])) || $c [ " type " ] == " CREATE_DIR " || $c [ " type " ] == " DELETE " || $c [ " type " ] == " FIXDIR " || $c [ " type " ] == " FIXFILE " ){
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-25 13:05:27 +00:00
$error_raise .= " 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-25 13:05:27 +00:00
$error_raise .= " 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
if ( file_put_contents ( $LOCK_FILE , $MY_PID ) === false ){
2013-04-25 13:05:27 +00:00
$error_raise .= " Cannot open/write $LOCK_FILE\n " ;
mail_it ();
exit ( 1 );
2013-04-23 13:32:37 +00:00
}
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-25 13:05:27 +00:00
// Do we have to do this action with a specific user?
if ( $r [ " user " ] != " root " )
$SU = " su " . $r [ " user " ] . " 2>&1 ; " ;
else
$SU = " " ;
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-26 15:38:28 +00:00
$params =@ unserialize ( $r [ " parameters " ]);
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-19 15:09:34 +00:00
switch ( $r [ " type " ]){
2013-08-08 15:56:09 +00:00
case " FIX_USER " :
// Create the directory and make parent directories as needed
@ exec ( " $FIXPERM -u " . $params [ " uid " ] . " 2>&1 " , $trash , $code );
break ;
2013-04-19 15:09:34 +00:00
case " CREATE_FILE " :
2013-04-24 10:00:54 +00:00
if ( ! file_exists ( $params [ " file " ]))
2013-04-25 13:05:27 +00:00
@ exec ( " $SU touch " . $params [ " file " ] . " 2>&1 ; echo ' " . $params [ " content " ] . " ' > ' " . $params [ " file " ] . " ' 2>&1 " , $output );
2013-04-24 10:00:54 +00:00
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-25 13:05:27 +00:00
@ exec ( " $SU mkdir -p " . $params [ " dir " ] . " 2>&1 " , $output );
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-25 13:05:27 +00:00
@ exec ( " $SU 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 " ]))
2013-04-25 13:05:27 +00:00
@ exec ( " $SU mkdir -p " . $params [ " dst " ] . " 2>&1 " , $output );
if ( ! isset ( $output [ 0 ]))
@ exec ( " $SU mv -f " . $params [ " src " ] . " " . $params [ " dst " ] . " 2>&1 " , $output );
2013-04-19 15:09:34 +00:00
break ;
2013-04-24 10:00:54 +00:00
case " FIXDIR " :
2013-04-26 15:38:28 +00:00
@ exec ( " $FIXPERM -d " . $params [ " dir " ] . " 2>&1 " , $trash , $code );
2013-04-24 10:00:54 +00:00
if ( $code != 0 )
2013-04-26 15:01:49 +00:00
$output [ 0 ] = " Fixperms.sh failed, returned error code : $code " ;
break ;
case " FIXFILE " :
2013-04-26 15:38:28 +00:00
@ exec ( " $FIXPERM -f " . $params [ " file " ] . " 2>&1 " , $trash , $code );
2013-04-26 15:01:49 +00:00
if ( $code != 0 )
2013-04-25 13:05:27 +00:00
$output [ 0 ] = " Fixperms.sh failed, returned error code : $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-25 13:05:27 +00:00
// Get the error (if exists).
if ( isset ( $output [ 0 ])){
2013-04-23 08:06:44 +00:00
$return = $output [ 0 ];
2013-04-25 13:05:27 +00:00
$error_raise .= " Action n° " . $r [ " id " ] . " ' " . $r [ " type " ] . " ' failed! With user: " . $r [ " user " ] . " \n Here is the complete output: \n " . print_r ( $output );
}
2013-04-23 08:06:44 +00:00
// 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-25 13:05:27 +00:00
$error_raise .= " 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
}
2013-04-25 13:05:27 +00:00
// If something have failed, notify it to the admin
2013-04-26 09:53:48 +00:00
if ( $error_raise !== '' )
2013-04-25 13:05:27 +00:00
mail_it ();
2013-04-19 15:09:34 +00:00
// Unlock the script
unlink ( $LOCK_FILE );
2013-04-26 08:11:59 +00:00
2013-04-23 08:06:44 +00:00
// Exit this script
exit ( 0 );
2013-04-19 15:09:34 +00:00
?>