WebcronSave V1.41
}
// recup chaine de get, post ou cookie avec ou sans stripslashes selon magic_quotes_gpc
function RecupChaine($chaine) {
if (get_magic_quotes_gpc()==1) return stripslashes($chaine); // il y avait magic
return $chaine; // il n'y avait pas magic
}
function showMessage($message,$class)
{
?>
=$message?>
}
function moimeme($paramget='') {
global $_CONFIG;
$ret=rtrim($_SERVER['PHP_SELF'],'/');
$ret .=$paramget;
if ($_CONFIG['IDENTIF'] != 'basic') {
$ret .= empty($paramget)?'?':'&';
$ret .= 'login='.urlencode($_CONFIG['LOGIN_HTTP']);
$ret .= '&pass='.urlencode($_CONFIG['PASS_HTTP']);
}
return '"'.$ret.'"';
}
function showFormConfig()
{
global $_CONFIG;
?>
CONFIGURATION
ATTENTION !
Les mots de passe de base de données et d'administration doivent être saisis lors de la première configuration.
Lors des autres accès à l'administration, laissez-les en blanc, sauf si vous désirez les changer.
Nous conseillons le mode d'identification 'basic', mais il se peut qu'il ne fonctionne pas sur certains systèmes.
Utilisez alors le mode 'par URL'. Si vous êtes obligé d'utiliser le mode 'par URL' et que d'autres personnes utilisent votre machine, videz l'historique de
votre browser sinon d'autres personnes pourront retrouver vos login et mot de passe.
Utilisation de Webcronsave avec webcron.org :
identification basic : créez une tâche quotidienne avec l'url : http://monsite.com/webcronsave.php?action=savewebcron
et mettez le login et le mot de passe d'administration dans les login et mot de passe de la création/édition d'une tâche.
identification par URL : créez une tâche quotidienne avec l'url : http://monsite.com/webcronsave.php?action=savewebcron&login=monlogin&pass=monpass
mais laissez vides les login et mot de passe de la création/édition d'une tâche.
}
function showFooterPage()
{
?>
}
function showMenu()
{
?>
}
function showIdentifPage()
{
global $_CONFIG;
?>
IDENTIFICATION
}
function checkMysql()
{
global $_CONFIG;
include('./webcronsave/config.php');
if (!$my=mysql_connect($_CONFIG['SERVER'],$_CONFIG['USER'],$_CONFIG['PASS']))
return false;
else
{
if (!mysql_select_db($_CONFIG['BASE']))
return false;
}
return true;
}
function saveData()
{
global $_CONFIG;
checkMysql();
$fname=date('Y-m-d')."_".$_CONFIG['BASE'];
$list=listTable();
if (!function_exists('gzopen'))
$fp=fopen('./webcronsave/'.$fname.'.sql','w');
else
$fp=gzopen('./webcronsave/'.$fname.'.gz','w');
if ($fp)
{
foreach($list as $table)
{
if (isset($_CONFIG['TABLE_'.$table['nom']]))
{
if ($_CONFIG['TABLE_'.$table['nom']]=='1')
{
dumpTable($fp,$table);
}
}
else dumpTable($fp,$table);
}
return true;
}
else
return false;
}
function restoreFile($file)
{
showMessage('Restauration en cours','message');
checkMysql();
list($name,$ext)=explode('.',$file);
if ($ext=='gz')
$pref='gz';
else
$pref='f';
$open=$pref.'open';
$gets=$pref.'gets';
$eof=$pref.'eof';
$close=$pref.'close';
$fp=$open($dir='./webcronsave/'.$file,'r');
if ($fp)
{
$buffer='';
$inChamp=false;
while (!$eof($fp)) {
$s=$gets($fp, 4096);
$old='';
for($i=0;$i'.htmlentities($query).' Mysql '.mysql_error(),'error');
return false;
}
$buffer='';
}
else
{
$buffer.=$current;
}
$old=$current;
}
}
$close($fp);
return true;
}
else return false;
}
function dumpTable($fp,$table)
{
global $_CONFIG;
$nomtable=$table['nom'];
if (!function_exists('gzopen'))
$fwrite='fwrite';
else
$fwrite='gzwrite';
$fwrite($fp,'#sauvegarde base mysql '.$_CONFIG['BASE']."\n\n");
$fwrite($fp,"DROP TABLE IF EXISTS `$nomtable`;\n\n");
$sql='SET SQL_QUOTE_SHOW_CREATE=1';
$res=mysql_query($sql); // pas fatal
$sql="SHOW CREATE TABLE `$nomtable`";
$res=mysql_query($sql) or die ('Erreur Mysql '.mysql_error().' ');
while($res && $row=mysql_fetch_row($res))
{
if (is_numeric($table['autoinc'])) $row[1] .= ' AUTO_INCREMENT='.$table['autoinc'];
$fwrite($fp,$row[1].";\n");
}
$fwrite($fp,"\n\n");
$res = mysql_query("SELECT * FROM `$nomtable`") or die ('Erreur Mysql '.mysql_error().' ');
while ($row = mysql_fetch_assoc($res)){
$strFieldsNames = '';
$strFieldsValues = '';
foreach ($row as $field_name => $field_value){
if ($strFieldsNames) $strFieldsNames .= ', ';
$strFieldsNames .= "`$field_name`";
if($strFieldsValues) $strFieldsValues .= ', ';
$strFieldsValues .= "'" . addslashes($field_value) . "'";
}
$fwrite($fp,"INSERT INTO `$nomtable` ($strFieldsNames) values($strFieldsValues);\n");
}
$fwrite($fp,"\n\n");
}
function listTable()
{
global $_CONFIG;
$list_table=array();
$list_autoinc =array();
$res=mysql_query('SHOW TABLE STATUS') or die ('Erreur Mysql '.mysql_error().' ');
// $tmpfile=tempnam(ini_get("session.save_path"),"webcronsave_");
if (!$res)
{
echo 'Erreur Mysql '.mysql_error().' ';
die;
}
else
{
while($row=mysql_fetch_array($res))
{
$list_table[]=array('nom'=>$row['Name'],'autoinc'=>$row['Auto_increment']);
}
}
return $list_table;
}
function saveConfig($data)
{
global $_CONFIG;
// on vérifie si config correcte
if (empty($data['PASS'])) {
if (empty($_CONFIG['PASS'])) {
showMessage ('Le mot de passe de la base de données est vide.','error');
showMessage ('Ceci n\'est acceptable que si vous faites un essai en local','error');
$_CONFIG['PASS']='';
}
$data['PASS']=$_CONFIG['PASS']; // prise en compte nouveau mot de passe bdd
}
if (empty($data['PASS_HTTP'])) {
if (empty($_CONFIG['PASS_HTTP'])) {
return 'le mot de passe admin ne doit pas être vide'; // mot de passe admin vide interdit
}
$data['PASS_HTTP']=$_CONFIG['PASS_HTTP']; // prise en compte nouveau mot de passe admin
}
if (empty($data['USER'])) {
showMessage ('Le nom d\'utilisateur de la base de données est vide.','error');
showMessage ('Ceci n\'est acceptable que si vous faites un essai en local','error');
}
if (empty($data['LOGIN_HTTP'])) {
return 'le nom d\'utilisateur admin ne doit pas être vide';
}
if($fd = fopen('./webcronsave/config.php','w'))
{
fputs($fd," $val)
{
fputs($fd,"\$_CONFIG[\"$key\"]=".var_export(recupchaine($val),true).";\n");
$_CONFIG[$key]=$val;
}
fputs($fd,'?','>');
fclose($fd);
//je crée un htaccess pour ne pas que les gens viennent chercher les fichiers en direct
if($fd = @fopen('./webcronsave/.htaccess','w'))
{
$str="order deny,allow\ndeny from all\n";
fputs($fd,$str);
fclose($fd);
}
return '';
}
else
return 'Problème de droits : impossible de sauvegarder le fichier de config';
}
function getFileSize($size) {
$units = array(' B', ' KB', ' MB', ' GB', ' TB');
for ($i = 0; $size > 1024; $i++) { $size /= 1024; }
return round($size, 2).$units[$i];
}
function fileData($file)
{
global $_CONFIG;
$dir='./webcronsave/';
list($name,$ext)=explode('.',$file);
list($date,$db)=explode('_',$name);
list($year,$month,$day)=explode('-',$date);
if ($ext=='gz') $ext_f='Fichier compressé (algorithme GZIP)';
else $ext_f='Fichier non compressé';
return 'sauvegarde du '.$day.'/'.$month.'/'.$year.' '.getFileSize(filesize($dir.$file)).' '.$ext_f;
}
function checkFile()
{
global $_CONFIG;
if (!function_exists('gzopen'))
$ext='.sql';
else
$ext='.gz';
//sauvegarde du jour
if ($_CONFIG['TODAY']=='1') $names[date('Y-m-d').'_'.$_CONFIG['BASE'].$ext]=date('Y-m-d').'_'.$_CONFIG['BASE'].$ext;
//sauvegarde de la veille
if ($_CONFIG['YESTERDAY']=='1') $names[date('Y-m-d',time()-86400).'_'.$_CONFIG['BASE'].$ext]=date('Y-m-d',time()-86400).'_'.$_CONFIG['BASE'].$ext;
//sauvegarde du debut du mois
if ($_CONFIG['MONTH']=='1') $names[date('Y-m-01').'_'.$_CONFIG['BASE'].$ext]=date('Y-m-01').'_'.$_CONFIG['BASE'].$ext;
//sauvegarde du dimanche
if ($_CONFIG['WEEK']=='1') $names[date('Y-m-d',time()-date('w')*86400).'_'.$_CONFIG['BASE'].$ext]=date('Y-m-d',time()-date("w")*86400)."_".$_CONFIG['BASE'].$ext;
//var_dump($names);
$list_f=listFileSave();
foreach($list_f as $file)
{
if (!in_array($file,$names)) unlink('./webcronsave/'.$file);
}
}
function listFileSave()
{
$dir='./webcronsave/';
$list_f=array();
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if (!in_array($file,array('.','..','config.php','.htaccess')))
{
$list_f[]=$file;
}
}
closedir($dh);
}
}
return $list_f;
}
function listeSave()
{
global $_CONFIG;
$list_f=listFileSave();
echo '
';
}
function readConfig()
{
global $_CONFIG;
$rsrc=@opendir( './webcronsave');
if ($rsrc===false) return false;
closedir ($rsrc);
if (file_exists('./webcronsave/config.php'))
include_once('./webcronsave/config.php');
if (!isset($_CONFIG['TODAY'])) $_CONFIG['TODAY']=0;
if (!isset($_CONFIG['YESTERDAY'])) $_CONFIG['YESTERDAY']=0;
if (!isset($_CONFIG['MONTH'])) $_CONFIG['MONTH']=1;
if (!isset($_CONFIG['WEEK'])) $_CONFIG['WEEK']=0;
if (!isset($_CONFIG['SERVER'])) $_CONFIG['SERVER']='localhost';
if (!isset($_CONFIG['USER'])) $_CONFIG['USER']='';
if (!isset($_CONFIG['PASS'])) $_CONFIG['PASS']='';
if (!isset($_CONFIG['BASE'])) $_CONFIG['BASE']='';
if (!isset($_CONFIG['EMAIL'])) $_CONFIG['EMAIL']='';
if (!isset($_CONFIG['LOGIN_HTTP'])) $_CONFIG['LOGIN_HTTP']='';
if (!isset($_CONFIG['PASS_HTTP'])) $_CONFIG['PASS_HTTP']='';
if (!isset($_CONFIG['IDENTIF'])) $_CONFIG['IDENTIF']='basic';
return true;
} // function readConfig()
function AfficherListe() {
echo 'sauvegarde(s) disponible(s) : ';
$lst= ListFileSave();
for ($k= 0; $k < count($lst); $k++) {
echo htmlentities($lst[$k]),' ';
}
} //function AfficherListe()
//GESTION DE LA PAGE
if (isset($_POST['action']) && strlen($_POST['action'])>0) $action=recupchaine($_POST['action']);
else if (isset($_GET['action']) && strlen($_GET['action'])>0) $action=recupchaine($_GET['action']);
//par défaut l'action est la configuration
else $action='config';
if (!readConfig())
{
$action='error';
$errorMessage='Veuillez créer le repertoire \'webcronsave\' pour sauvegarder votre config et vos sauvegardes.';
}
else
{
if (!empty($_CONFIG['LOGIN_HTTP']) && !empty($_CONFIG['PASS_HTTP']))
{
if ($_CONFIG['IDENTIF']!='basic') {
if (empty($_GET['login']) || empty($_GET['pass'])) // identification non fournie
$action='demandermdp';
else if ((recupchaine($_GET['login']) != $_CONFIG['LOGIN_HTTP']) ||
(recupchaine($_GET['pass']) != $_CONFIG['PASS_HTTP']) ) // identif incorrecte
$action='demandermdp';
} // fin identif par url
else { // identif par basic
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="WebCronSave"');
header('HTTP/1.0 401 Unauthorized');
exit;
} else {
if ($_SERVER['PHP_AUTH_USER']!=$_CONFIG['LOGIN_HTTP'] || $_SERVER['PHP_AUTH_PW']!=$_CONFIG['PASS_HTTP'])
{
header('WWW-Authenticate: Basic realm="WebCronSave"');
header('HTTP/1.0 401 Unauthorized');
exit;
}
}
} // fin identif par basic
}
}
checkFile();
//traitement spécifique
switch($action)
{
//webcron sauvegarde automatique
case 'savewebcron':
if (!saveData()) {
mail($_CONFIG['EMAIL'],'Problème avec votre sauvegarde','Veuillez vérifier votre configuration : http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."\n");
echo 'pb sauvegarde';
} else {
checkFile();
AfficherListe();
}
break;
//Affichage de la config
case 'config':
showHeaderPage();
showMenu();
showFormConfig();
break;
//sauvegarde de la config
case 'saveconfig':
showHeaderPage();
$diag=saveConfig($_POST);
showMenu();
if ($diag!='')
{
showMessage($diag,'error');
}
else
{
showMessage('La configuration a été sauvegardée',"message");
showMessage('Vérification de la connexion de la base de données','message');
if (!checkMysql()) showMessage('Problème de connexion Mysql '.mysql_error(),'error');
else showMessage('La connexion est bien configurée !','message');
}
break;
//Affichage d'une erreur
case 'error':
showHeaderPage();
showMenu();
showMessage($errorMessage,'error');
showFooterPage();
break;
//Gestion de la sauvegarde manuel
case 'save':
showHeaderPage();
showMenu();
if (saveData())
{
showMessage('La sauvegarde a été effectuée avec succès','message');
}
else
showMessage('Problème de création de fichier','error');
showFooterPage();
break;
//gestion de la restauration
case 'restore':
showHeaderPage();
showMenu();
listeSave();
showFooterPage();
break;
//gestion de la restauration
case 'dorestore':
showHeaderPage();
showMenu();
$file=recupchaine($_GET['file']);
if (!restoreFile($file)) showMessage('Problème de requête Mysql '.mysql_error(),'error');
else showMessage('Restauration effectuée avec succès','message');
showFooterPage();
break;
//saisie de l'identification par URL
case 'demandermdp':
showHeaderPage();
showIdentifPage();
showFooterPage();
break;
//gestion par défaut
default:
break;
}
?>