252 lines
8.3 KiB
PHP
Executable File
252 lines
8.3 KiB
PHP
Executable File
<?php
|
|
|
|
/**
|
|
* @class cron
|
|
* @brief Manage, edit, add, delete, test Cronjobs
|
|
*
|
|
* @author Benjamin Mercier
|
|
* @data 12/08/2009
|
|
* @version 0.1
|
|
*/
|
|
class cron
|
|
{
|
|
|
|
private $cron_records = null;
|
|
|
|
/**
|
|
* @brief List crons for the current hosting
|
|
* @param hosting_id ID of the current hosting
|
|
* @param start First record to extract (optional)
|
|
* @param extract_number Number of record to extract (optional)
|
|
* @return array or null if empty
|
|
*/
|
|
public function userListCrons( $hosting_id, $start = null, $extract_number = null)
|
|
{
|
|
$hosting_id = $_SESSION['database']->clearString($hosting_id);
|
|
|
|
if ( !is_null($start) and !is_null($extract_number)) {
|
|
$start = $_SESSION['database']->clearString($start);
|
|
$extract_number = $_SESSION['database']->clearString($extract_number);
|
|
$limit = " LIMIT $start, $extract_number";
|
|
} else $limit = null;
|
|
|
|
$req = "SELECT id, address, UNIX_TIMESTAMP(created_at) AS created_at, execute_every, UNIX_TIMESTAMP(executed_at) AS executed_at, is_active
|
|
FROM service_cron WHERE hosting_id = '$hosting_id' ORDER BY created_at DESC$limit";
|
|
$query = $_SESSION['database']->fetchObject($req);
|
|
return $query;
|
|
}
|
|
|
|
/**
|
|
* @brief add a Cronjob for current user
|
|
* @param address Url of the script to call
|
|
* @param frequency Frequency of the task execution
|
|
* @param first_start Date/Time for the first execution
|
|
* @return 0 : Address is not openable
|
|
* @return 1 : Cronjob added
|
|
* @return 2 : Limit of cronjob for the current offer is reached
|
|
*
|
|
* @todo Manage the 'first_start' parameter
|
|
*/
|
|
public function userAddCron( $address, $frequency, $first_start, $active=true )
|
|
{
|
|
// Check Time for executing
|
|
$frequency = intval($frequency);
|
|
if ( $frequency == CRON_NO_SPECIFIED_TIME ) {
|
|
$active=false;
|
|
} elseif ( $frequency < CRON_MIN_TIME ) {
|
|
$frequency = CRON_MIN_TIME;
|
|
}
|
|
// Check if address is openable
|
|
$address_test = $this->checkAddress($address);
|
|
if ( !$address_test ) return 0;
|
|
// Check quota
|
|
if ( $_SESSION['hosting']->information_hosting->offer_crons_number >= 0 ) {
|
|
$current_number_crons = $this->countCronjobs( $_SESSION['hosting']->information_hosting->id );
|
|
if ( $current_number_crons >= $_SESSION['hosting']->information_hosting->offer_crons_number ) return 2;
|
|
}
|
|
// Get the ID of the current hosting
|
|
$hosting_id = $_SESSION['hosting']->information_hosting->id;
|
|
$this->addCron( $hosting_id, $address, $frequency, true);
|
|
return true;
|
|
} // End of userAddCron
|
|
|
|
|
|
/**
|
|
* @brief Active an deactivated cron
|
|
* @param cron_id ID of the cron
|
|
* @return : 0 Cron is not found
|
|
* @return : 1 Cron activated
|
|
* @return : 2 Cron is already activated
|
|
*/
|
|
public function userActiveCron( $cron_id )
|
|
{
|
|
$cron = $_SESSION['database']->clearString($cron_id);
|
|
$req = "SELECT hosting_id, is_active FROM service_cron WHERE id = '$cron'";
|
|
$query = $_SESSION['database']->fetchObject($req);
|
|
if ( count($query) == 0 ) return 0;
|
|
if( $query[0]->hosting_id != $_SESSION['hosting']->information_hosting->id )
|
|
throw new myException('Hosting_id is not attribued for this cron');
|
|
if ( $query[0]->is_active == 'true' ) return 2;
|
|
$req = "UPDATE service_cron SET is_active = 'true' WHERE id = '$cron'";
|
|
$_SESSION['database']->execRequest($req);
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* @brief Deactivate a cron
|
|
* @param cron_id : ID of the cron
|
|
* @return : 0 Cron is not found
|
|
* @return : 1 Cron deactivated
|
|
* @return : 2 Cron is already deactivated
|
|
*/
|
|
public function userDeactiveCron( $cron_id )
|
|
{
|
|
$cron = $_SESSION['database']->clearString($cron_id);
|
|
$req = "SELECT hosting_id, is_active FROM service_cron WHERE id = '$cron'";
|
|
$query = $_SESSION['database']->fetchObject($req);
|
|
if ( count($query) == 0 ) return 0;
|
|
if( $query[0]->hosting_id != $_SESSION['hosting']->information_hosting->id )
|
|
throw new myException('Hosting_id is not attribued for this cron');
|
|
if ( $query[0]->is_active == 'false' ) return 2;
|
|
$req = "UPDATE service_cron SET is_active = 'false' WHERE id = '$cron'";
|
|
$_SESSION['database']->execRequest($req);
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* @brief Delete a cron for the current hosting
|
|
* @param cron_id Id of the cron to delete
|
|
* @return True or false if not found
|
|
*/
|
|
public function userDeleteCron( $cron_id )
|
|
{
|
|
$cron_id_s = $_SESSION['database']->clearString($cron_id);
|
|
$req = "SELECT hosting_id FROM service_cron WHERE id ='$cron_id_s'";
|
|
$query = $_SESSION['database']->fetchObject($req);
|
|
if ( count($query) == 0 ) return false;
|
|
if ( $query[0]->hosting_id != $_SESSION['hosting']->information_hosting->id )
|
|
throw new myException('Hosting_id is not attribued for this cron');
|
|
$this->deleteCron( $cron_id );
|
|
return true;
|
|
} // End of userDeleteCron
|
|
|
|
/**
|
|
* @brief try to open an url by fsockopen.
|
|
* @param address web Address
|
|
* @return true Web respond
|
|
* @return false Web did not respond or not ready
|
|
*/
|
|
public function checkAddress( $address )
|
|
{
|
|
if ( !textVerification::verifUrl($address) ) return false;
|
|
|
|
$url_info = parse_url($address);
|
|
if ( $url_info['scheme'] == 'http' ) $port = 80;
|
|
elseif ( $url_info['scheme'] == 'https' ) $port = 443;
|
|
else $port = 80;
|
|
|
|
$handle = fsockopen( $url_info['host'], $port, $errno, $errstr, CRON_TIMEOUT);
|
|
if ($handle !== false) {
|
|
fclose($handle);
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
} // End of checkAddress
|
|
|
|
/**
|
|
* @brief Select all cronjob to execute. For server.
|
|
* @todo make this function when the daemons are dev.
|
|
*/
|
|
public function serverListToTestCrons()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* @brief Count total cronjobs for a user
|
|
* @param hosting_id : ID of the hosting to count
|
|
* @param (optionnal) active_cron : True of False, count only active jobs, or count total jobs
|
|
* @return Total of cronjobs
|
|
*/
|
|
private function countCronJobs( $hosting_id, $only_active = false )
|
|
{
|
|
$hosting_id = $_SESSION['database']->clearString($hosting_id);
|
|
if ( $only_active ) $clause = " AND is_active = 'true'";
|
|
else $clause = null;
|
|
$req = "SELECT COUNT(id) AS total FROM service_cron WHERE hosting_id = '$hosting_id'$clause";
|
|
$query = $_SESSION['database']->fetchObject($req);
|
|
return $query[0]->total;
|
|
}
|
|
|
|
/**
|
|
* @brief adding Cron
|
|
* @param hosting_id Id of the hosting
|
|
* @param address Address to cron
|
|
* @param time Time in seconds to re-execute
|
|
* @param is_active Activation of the cron (true/false)
|
|
*/
|
|
private function addCron( $hosting_id, $address, $time, $is_active)
|
|
{
|
|
$hosting_id = $_SESSION['database']->clearString($hosting_id);
|
|
$address = $_SESSION['database']->clearString($address);
|
|
$time = $_SESSION['database']->clearString($time);
|
|
|
|
if ( $is_active ) $is_active = 'true';
|
|
else $is_active = 'false';
|
|
|
|
$req = "INSERT INTO service_cron
|
|
SET
|
|
hosting_id = '$hosting_id',
|
|
address = '$address',
|
|
created_at = NOW(),
|
|
execute_every = '$time',
|
|
is_active = '$is_active'";
|
|
$query = $_SESSION['database']->execRequest($req);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @brief delete cron identified by id
|
|
* @param cron_id Id of the cron
|
|
* @return true
|
|
*/
|
|
private function deleteCron( $cron_id )
|
|
{
|
|
$cron_id = $_SESSION['database']->clearString($cron_id);
|
|
$req = "DELETE FROM service_cron WHERE id = '$cron_id'";
|
|
$_SESSION['database']->execRequest($req);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @brief Get number of all crontab records for the current hosting
|
|
* @return number of history records registered for the user
|
|
*/
|
|
public function userCountCronRecords()
|
|
{
|
|
if( !is_null($this->cron_records) ) {
|
|
return $this->cron_records;
|
|
}
|
|
$hosting_id = $_SESSION['hosting']->information_hosting->id;
|
|
$req = "SELECT COUNT(id) AS total FROM service_cron WHERE hosting_id = '$hosting_id'";
|
|
$result = $_SESSION['database']->fetchObject($req);
|
|
$this->cron_records = $result[0]->total;
|
|
return $this->cron_records;
|
|
}
|
|
|
|
/**
|
|
* @brief Get number of crons records pages, regarding the total count of records and the count of items to be shown per page
|
|
* @return number of pages availables
|
|
*/
|
|
public function userCountTotalPages()
|
|
{
|
|
$items_count = $this->userCountCronRecords();
|
|
$pages_count = intval($items_count / RECORD_BY_PAGE);
|
|
if ( ($items_count % RECORD_BY_PAGE) != 0 ) {
|
|
$pages_count++;
|
|
}
|
|
return $pages_count;
|
|
}
|
|
|
|
}
|
|
?>
|