HB/htdocs/cron/webcronsave.php

690 lines
19 KiB
PHP

<?
function showHeaderPage()
{
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>WebcronSave V1.41</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15"/>
<meta http-equiv="expires" content="0">
<style type="text/css">
<!--
body { background: #FFFFFF; }
#topnav {
background-color: #003399;
padding: 1px;
}
#topnav li {
display : inline;
width: 100%;
background-color: #FFFFFF;
margin: 1 0px 1 0px;
}
#topnav a {
color: #003399;
}
#topnav a {
color: #003399;
}
.message {
color: black;
font_weight:bold;
}
.error {
color: red;
font_weight:bold;
}
//-->
</style>
</head>
<body>
<?
}
// 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)
{
?>
<div class="<?=$class?>">
<?=$message?>
</div>
<?
}
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;
?>
<H1>CONFIGURATION</H1>
<B>ATTENTION !</B><BR />
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.<BR>
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'.<br>
<B>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.</B>
<BR><BR>
<B>Utilisation de Webcronsave avec webcron.org :</B><br>
<UL>
<LI>identification basic : créez une tâche quotidienne avec l'url :<BR>
<i>http://monsite.com/webcronsave.php?action=savewebcron</i><BR>
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.
<LI>identification par URL : créez une tâche quotidienne avec l'url :<BR>
<i>http://monsite.com/webcronsave.php?action=savewebcron&login=monlogin&pass=monpass</i><BR>
mais laissez vides les login et mot de passe de la création/édition d'une tâche.
</UL>
<form action=<?=moimeme()?> method="POST">
<input type="hidden" name="action" value="saveconfig">
<TABLE border=1 cellpadding="3" align="center">
<tr bgcolor="#FFFFCC"><td colspan="2" align = "center" ><b>BASE DE DONNEES</b></td></tr>
<TR bgcolor="#FFFFCC">
<td align="right">Nom du serveur :</td>
<td><input type="text" name="SERVER" value="<?=$_CONFIG['SERVER']?>"></td>
</tr>
<tr bgcolor="#FFFFCC">
<td align="right">Login utilisateur :</td>
<td><input type="text" name="USER" value="<?=$_CONFIG['USER']?>"></td>
</tr>
<tr bgcolor="#FFFFCC">
<td align="right">Nouveau mot de passe utilisateur :</td>
<td><input type="text" name="PASS"></td>
</tr>
<tr bgcolor="#FFFFCC">
<td align="right">Nom de la base de données :</td>
<td><input type="text" name="BASE" value="<?=$_CONFIG['BASE']?>"></td>
</tr>
<tr bgcolor="#CCCCFF"><td colspan="2" align = "center"><b>ADMINISTRATION</b></td></tr>
<tr bgcolor="#CCCCFF">
<td align="right">Email en cas de problème :</td>
<td><input type="text" name="EMAIL" value="<?=$_CONFIG['EMAIL']?>"></td>
</tr>
<tr bgcolor="#CCCCFF">
<td align="right">Login d'accès à l'admin :</td>
<td><input type="text" name="LOGIN_HTTP" value="<?=$_CONFIG['LOGIN_HTTP']?>"></td>
</tr>
<tr bgcolor="#CCCCFF">
<td align="right">Nouveau mot de passe d'accès à l'admin :</td>
<td><input type="text" name="PASS_HTTP"></td>
</tr>
<tr bgcolor="#CCCCFF">
<td align="right">Mode d'identification :</td>
<td>
basic : <input type="radio" name="IDENTIF" value="basic"<? echo $_CONFIG['IDENTIF']!='basic'?'':'CHECKED'?>>
par URL : <input type="radio" name="IDENTIF" value="url"<? echo $_CONFIG['IDENTIF']=='basic'?'':'CHECKED'?>>
</td>
</tr>
<tr bgcolor="#CCFFFF">
<td colspan="2" align="center"><b>LISTE DES SAUVEGARDES A FAIRE</b</td>
</tr>
<tr bgcolor="#CCFFFF">
<td align="right"> sauvegarde du 1er du mois : </td>
<td><input type="radio" name="MONTH" value="1" <?=($_CONFIG['MONTH']==1)?"CHECKED":""?>> Oui <input type="radio" name="MONTH" value="0" <?=($_CONFIG['MONTH']==0)?"CHECKED":""?>> Non </td>
</tr>
<tr bgcolor="#CCFFFF">
<td align="right">sauvegarde du dimanche : </td>
<td><input type="radio" name="WEEK" value="1" <?=($_CONFIG['WEEK']==1)?"CHECKED":""?>> Oui <input type="radio" name="WEEK" value="0" <?=($_CONFIG['WEEK']==0)?"CHECKED":""?>> Non </td>
</tr>
<tr bgcolor="#CCFFFF">
<td align="right">sauvegarde de la veille : </td>
<td><input type="radio" name="YESTERDAY" value="1" <?=($_CONFIG['YESTERDAY']==1)?"CHECKED":""?>> Oui <input type="radio" name="YESTERDAY" value="0" <?=($_CONFIG['YESTERDAY']==0)?"CHECKED":""?>> Non </td>
</tr>
<tr bgcolor="#CCFFFF">
<td align="right">sauvegarde du jour : </td>
<td><input type="radio" name="TODAY" value="1" <?=($_CONFIG['TODAY']==1)?"CHECKED":""?>> Oui <input type="radio" name="TODAY" value="0" <?=($_CONFIG['TODAY']==0)?"CHECKED":""?>> Non </td>
</tr>
<? if (isset($_CONFIG["BASE"]) && isset($_CONFIG["SERVER"]) && isset($_CONFIG["USER"]) && isset($_CONFIG["PASS"])) {
if (checkMysql())
{
$list=listTable();
?>
<tr bgcolor="#CCCCFF">
<td colspan="2" align="center"><b>LISTE DES TABLES A SAUVEGARDER</b</td>
</tr>
<?
foreach($list as $table)
{
if (!isset($_CONFIG['TABLE_'.$table['nom']])) $_CONFIG['TABLE_'.$table['nom']]=1;
?>
<tr bgcolor="#CCFFFF">
<td align="right">table <b><?=$table['nom']?></b></td>
<td><input type="radio" name="TABLE_<?=$table['nom']?>" value="1" <?=($_CONFIG['TABLE_'.$table['nom']]==1)?"CHECKED":""?>> Oui <input type="radio" name="TABLE_<?=$table['nom']?>" value="0" <?=($_CONFIG['TABLE_'.$table['nom']]==0)?"CHECKED":""?>> Non </td>
</tr>
<?
}
?>
<? } else {?>
<tr bgcolor="#CCCCFF">
<td colspan="2" align="center"><b>TOUTES LES TABLES SONT SAUVEGARDEES</b</td>
</tr>
<? } } else { ?>
<tr bgcolor="#CCCCFF">
<td colspan="2" align="center"><b>TOUTES LES TABLES SONT SAUVEGARDEES</b</td>
</tr>
<? } ?>
<TR>
<td colspan="2" align="center"><input type="submit" name="submit" value="Valider"></td>
</tr>
</table>
</form>
<?
}
function showFooterPage()
{
?>
</body>
</html>
<?
}
function showMenu()
{
?>
<ul id="topnav">
<li>&nbsp;<a href=<?=moimeme('?action=config')?>>Configuration</a>&nbsp;</li>
<li>&nbsp;<a href=<?=moimeme('?action=save')?>>Sauvegarde Manuelle</a>&nbsp;</li>
<li>&nbsp;<a href=<?=moimeme('?action=restore')?>>Restauration</a>&nbsp;</li>
<li>&nbsp;<a href="http://www.webcron.org">Webcron</a>&nbsp;</li>
</ul>
<?
}
function showIdentifPage()
{
global $_CONFIG;
?>
<H1>IDENTIFICATION</H1>
<FORM align="center" method="GET" action="<?=$_SERVER['PHP_SELF']?>">
<TABLE border=1 cellpadding="3" align="center">
<tr bgcolor="#CCCCFF">
<td align="right">Login d'accès à l'admin :</td>
<td><input type="text" name="login" value="<?=$_CONFIG['LOGIN_HTTP']?>"></td>
</tr>
<tr bgcolor="#CCCCFF">
<td align="right">Mot de passe d'accès à l'admin :</td>
<td><input type="text" name="pass"></td>
</tr>
<TR>
<td colspan="2" align="center"><input type="submit" name="submit" value="Valider"></td>
</tr>
</TABLE>
</FORM>
<?
}
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<strlen($s);$i++)
{
$current=$s[$i];
if ($current=="'" && $old!='\\')
$inChamp=!$inChamp;
if ($current==';' && $inChamp==false)
{
$query=$buffer;
if (!mysql_query($query))
{
showMessage('Problème de requete <b>'.htmlentities($query).'</b> 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().'<br>');
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().'<br>');
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().'<br>');
// $tmpfile=tempnam(ini_get("session.save_path"),"webcronsave_");
if (!$res)
{
echo 'Erreur Mysql '.mysql_error().'<br>';
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,"<?php\n");
foreach($data as $key => $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 '<ul id="list_archive">';
foreach($list_f as $val)
{
echo '<li>&nbsp;<a href='.moimeme('?action=dorestore&file='.urlencode($val)).'>Restaurer</a>&nbsp;'.fileData($val).'</li>';
}
echo '</ul>';
}
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) :<BR>';
$lst= ListFileSave();
for ($k= 0; $k < count($lst); $k++) {
echo htmlentities($lst[$k]),'<BR>';
}
} //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;
}
?>