old = $old;
$this->new = $new;
if(!is_string($ext) || !ereg("^\..*", $ext))
exit('Error: Please specify a valid backup extension - for example ".bak"');
$this->ext = $ext;
set_error_handler($this->patchErrorHandler);
}
function apply($simulate=true)
{
# On vérifie les droits sur les fichiers:
if(!$this->is_patchable($this->new, $this->old))
exit();
# Backupons:
if(file_exists($this->old.$this->ext))
trigger_error("Previous backup file $old$this->ext has been found. It was overwritten!", E_USER_NOTICE);
if(!$simulate && file_exists($this->old))
copy($this->old, $this->old.$this->ext);
# Patchons:
if(!$simulate)
{
copy($this->new, $this->old);
trigger_error("$this->old patched! [OK]", E_USER_NOTICE);
}
}
function unapply($simulate=true)
{
# On vérifie les droits sur les fichiers:
if(!$this->is_patchable($this->old.$this->ext, $this->old))
break;
# Dé-patchons:
if(!$simulate)
{
if(file_exists($this->old.$this->ext))
{
copy($this->old.$this->ext, $this->old);
trigger_error("$this->old unpatched! [OK]", E_USER_NOTICE);
}
else
{
trigger_error("$this->old couldn't be unpatched no backup of it was found!", E_USER_WARNING);
}
}
# Dé-backupons:
if(!file_exists($this->old.$this->ext))
trigger_error("Backup file $this->old$this->ext already deleted!", E_USER_WARNING);
!$simulate && unlink($this->old.$this->ext);
}
function is_patchable($source, $dest)
{
# Accès en lecture aux fichiers: les 2 devant etre 'readable' sauf si $dest n'existe pas
if(!is_readable($source) || (file_exists($dest) && !is_readable($dest)))
{
trigger_error("At least one of the files is not readable!", E_USER_ERROR);
return false;
}
# Accès en écriture au dossier de destination:
$dest_dir = dirname($dest);
if(!is_writable($dest_dir))
{
trigger_error("Error: The destination directory $dest_dir is not writable!", E_USER_ERROR);
return false;
}
return true;
}
function patchErrorHandler($errno, $errstr, $errfile, $errline)
{
switch ($errno) {
case E_USER_ERROR:
echo "Patch error [$errno] $errstr
\n";
echo " Fatal error on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")
\n";
echo "Aborting...
\n";
exit(1);
break;
case E_USER_WARNING:
echo "My WARNING [$errno] $errstr
\n";
break;
case E_USER_NOTICE:
echo "My NOTICE [$errno] $errstr
\n";
break;
default:
echo "Unknown error type: [$errno] $errstr
\n";
break;
}
/* Don't execute PHP internal error handler */
return true;
}
}
?>