HB/htdocs/cron/webcronsave.php

690 lines
19 KiB
PHP
Raw Normal View History

2008-11-03 11:00:00 +00:00
<?
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<EFBFBD>es et d'administration doivent <EFBFBD>tre saisis lors de la premi<EFBFBD>re configuration.
Lors des autres acc<EFBFBD>s <EFBFBD> l'administration, laissez-les en blanc, sauf si vous d<EFBFBD>sirez les changer.<BR>
Nous conseillons le mode d'identification 'basic', mais il se peut qu'il ne fonctionne pas sur certains syst<EFBFBD>mes.
Utilisez alors le mode 'par URL'.<br>
<B>Si vous <EFBFBD>tes oblig<EFBFBD> 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<EFBFBD>ez une t<EFBFBD>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<63>ation/<2F>dition d'une t<EFBFBD>che.
<LI>identification par URL : cr<EFBFBD>ez une t<EFBFBD>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<EFBFBD>ation/<EFBFBD>dition d'une t<EFBFBD>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<EFBFBD>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<EFBFBD>me :</td>
<td><input type="text" name="EMAIL" value="<?=$_CONFIG['EMAIL']?>"></td>
</tr>
<tr bgcolor="#CCCCFF">
<td align="right">Login d'acc<63>s <20> 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<63>s <20> 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<63>s <20> 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<63>s <20> 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<62>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<6E>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 <20>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<6E>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 <20>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<63>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<62>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<73> (algorithme GZIP)';
else $ext_f='Fichier non compress<73>';
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<63>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<73>cifique
switch($action)
{
//webcron sauvegarde automatique
case 'savewebcron':
if (!saveData()) {
mail($_CONFIG['EMAIL'],'Probl<62>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 <20>t<EFBFBD> sauvegard<72>e',"message");
showMessage('V<>rification de la connexion de la base de donn<6E>es','message');
if (!checkMysql()) showMessage('Probl<62>me de connexion Mysql '.mysql_error(),'error');
else showMessage('La connexion est bien configur<75>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 <20>t<EFBFBD> effectu<74>e avec succ<63>s','message');
}
else
showMessage('Probl<62>me de cr<63>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<62>me de requ<71>te Mysql '.mysql_error(),'error');
else showMessage('Restauration effectu<74>e avec succ<63>s','message');
showFooterPage();
break;
//saisie de l'identification par URL
case 'demandermdp':
showHeaderPage();
showIdentifPage();
showFooterPage();
break;
//gestion par d<>faut
default:
break;
}
?>