# Contact me on IRC in #linux-stats, #archlinux, #archlinux.de, #s9y on irc.freenode.net @serendipity_plugin_api::load_language(dirname(__FILE__)); ######################################################################################### class serendipity_event_backup extends serendipity_event { var $debug; function introspect(&$propbag) { global $serendipity; $propbag->add('name', PLUGIN_BACKUP_TITLE); $propbag->add('description', PLUGIN_BACKUP_DESC); $propbag->add('requirements', array( 'serendipity' => '0.8', 'smarty' => '2.6.7', 'php' => '4.1.0' )); $propbag->add('version', '0.15.2'); $propbag->add('author', 'Alexander \'dma147\' Mieland'); $propbag->add('stackable', false); $propbag->add('event_hooks', array( 'frontend_footer' => true, 'external_plugin' => true, 'backend_sidebar_entries' => true, 'backend_sidebar_admin' => true, 'backend_sidebar_entries_event_display_backup' => true, 'css_backend' => true ) ); $propbag->add('configuration', array( 'abspath_backupdir' ) ); $propbag->add('groups', array('FRONTEND_FULL_MODS', 'BACKEND_FEATURES')); $this->dependencies = array('serendipity_event_entryproperties' => 'keep'); } function introspect_config_item($name, &$propbag) { global $serendipity; $below_docroot = preg_replace("`(.*)\/[^\/]*`i", "\\1", $_SERVER['DOCUMENT_ROOT']); switch($name) { case 'abspath_backupdir' : $propbag->add('type', 'string'); $propbag->add('name', PLUGIN_BACKUP_ABSPATH_BACKUPDIR); $propbag->add('description', PLUGIN_BACKUP_ABSPATH_BACKUPDIR_BLAHBLAH); $propbag->add('default', $below_docroot.'/backups'); break; default: return false; } return true; } function selected() { global $serendipity; if ($serendipity['GET']['subpage'] == $this->get_config('pageurl') || preg_match('@^' . preg_quote($this->get_config('permalink')) . '@i', $serendipity['GET']['subpage'])) { return true; } return false; } function setupDB() { global $serendipity; $q = "CREATE TABLE {$serendipity['dbPrefix']}dma_sqlbackup ( auto_backup int(2) NOT NULL default '0', time_backup int(10) NOT NULL default '0', last_backup int(10) NOT NULL default '0', data_backup text NOT NULL, auto_backdel int(2) NOT NULL default '0', time_backdel int(10) NOT NULL default '0', last_backdel int(10) NOT NULL default '0' )"; $sql = serendipity_db_schema_import($q); $q = "CREATE TABLE {$serendipity['dbPrefix']}dma_htmlbackup ( auto_backup int(2) NOT NULL default '0', time_backup int(10) NOT NULL default '0', last_backup int(10) NOT NULL default '0', data_backup text NOT NULL, auto_backdel int(2) NOT NULL default '0', time_backdel int(10) NOT NULL default '0', last_backdel int(10) NOT NULL default '0' )"; $sql = serendipity_db_schema_import($q); $q = "TRUNCATE TABLE {$serendipity['dbPrefix']}dma_sqlbackup"; $sql = serendipity_db_schema_import($q); $q = "TRUNCATE TABLE {$serendipity['dbPrefix']}dma_htmlbackup"; $sql = serendipity_db_schema_import($q); $q = "INSERT INTO {$serendipity['dbPrefix']}dma_sqlbackup ( auto_backup, time_backup, last_backup, data_backup, auto_backdel, time_backdel, last_backdel ) VALUES ( '0', '0', '0', '', '0', '0', '0' )"; $sql = serendipity_db_schema_import($q); $q = "INSERT INTO {$serendipity['dbPrefix']}dma_htmlbackup ( auto_backup, time_backup, last_backup, data_backup, auto_backdel, time_backdel, last_backdel ) VALUES ( '0', '0', '0', '', '0', '0', '0' )"; $sql = serendipity_db_schema_import($q); } function uninstall(&$propbag) { global $serendipity; serendipity_db_query("DROP TABLE {$serendipity['dbPrefix']}dma_sqlbackup"); serendipity_db_query("DROP TABLE {$serendipity['dbPrefix']}dma_htmlbackup"); } function getRelPath() { global $serendipity; $c_path = dirname(__FILE__); $b_path = $serendipity['serendipityPath']; if ($b_path[(strlen($b_path)-1)] == "/") $b_path = substr($b_path, 0, strlen($b_path)-1); $r_path = ".".str_replace($b_path, "", $c_path); return $r_path; } function calcFilesize($filesize) { $array = array( 'YB' => 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024, 'ZB' => 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024, 'EB' => 1024 * 1024 * 1024 * 1024 * 1024 * 1024, 'PB' => 1024 * 1024 * 1024 * 1024 * 1024, 'TB' => 1024 * 1024 * 1024 * 1024, 'GB' => 1024 * 1024 * 1024, 'MB' => 1024 * 1024, 'KB' => 1024, ); if($filesize <= 1024) { $filesize = $filesize . ' Bytes'; } foreach($array AS $name => $size) { if($filesize > $size || $filesize == $size) { $filesize = round((round($filesize / $size * 100) / 100), 2) . ' ' . $name; } } return $filesize; } function MakeHTMLBackup($dir_to_backup="", $exclude=NULL) { global $serendipity; $BACKUPDIR = $this->get_config('abspath_backupdir'); $backupscript = dirname(__FILE__) . '/backup.sh'; @chmod($backupscript, 0777); $excludes = ""; if (is_array($exclude) && count($exclude) >= 1) { for($a=0, $b=count($exclude); $a<$b; $a++) { if ($excludes != "") { $excludes .= " "; } $excludes .= "\"".$exclude[$a]."\""; } } passthru($backupscript." \"".$dir_to_backup."\" \"".$BACKUPDIR."\" ".$excludes); } function MakeSQLBackup($complete=1, $tables="", $what="data", $drop=1) { global $serendipity; $BACKUPDIR = $this->get_config('abspath_backupdir'); $filetime = date("Y-m-d-H-i",time()); $success = 0; @ignore_user_abort(1); @set_time_limit(0); if ($complete == 1) { unset($tables); $QUERY = serendipity_db_query("SHOW TABLES"); foreach ($QUERY AS $THISTABLE) { $tables[] = $THISTABLE[0]; } } for ($q=0;$q0) { $pri_text = " PRIMARY KEY ("; for ($tr=0; $tr0) { $mul_text = " KEY ("; for ($tr=0; $tr0) { $full_text = " FULLTEXT KEY ("; for ($tr=0; $tr0) { $uni_text = " UNIQUE KEY ("; for ($tr=0; $tr= 1) { foreach ($R2 AS $THIS) { $insert_text .= "INSERT INTO ".$table." ("; @reset ($THIS); unset($key); unset($val); $insert_text1 = ''; $insert_text2 = ''; foreach ($THIS as $key => $val) { if (!intval($key) AND $key != "0") { $insert_text1 .= "".$key.","; $insert_text2 .= "'".addslashes($val)."',"; } } $insert_text1 = substr($insert_text1, 0, (strlen($insert_text1)-1)); $insert_text2 = substr($insert_text2, 0, (strlen($insert_text2)-1)); $insert_text .= $insert_text1.") VALUES (".$insert_text2.");\n"; } } } if ($create_text != "") { $create_text = $sqltext.$create_text; if ($TXT=fopen($dateidir.$filetime."_CREATE_".$dateiname, "w")) { fputs($TXT,$create_text); fclose($TXT); chmod($dateidir.$filetime."_CREATE_".$dateiname, 0666); } } if ($insert_text != "") { $insert_text = $sqltext.$insert_text; if ($TXT=fopen($dateidir.$filetime."_INSERT_".$dateiname, "w")) { fputs($TXT,$insert_text); fclose($TXT); chmod($dateidir.$filetime."_INSERT_".$dateiname, 0666); } } } } function CheckAutoHTMLBackup() { global $serendipity; $BACKUPDIR = $this->get_config('abspath_backupdir'); if (!file_exists($BACKUPDIR)) { @mkdir($BACKUPDIR, 0777); @chmod($BACKUPDIR, 0777); } $retconf = serendipity_db_query("SELECT * FROM {$serendipity['dbPrefix']}dma_htmlbackup"); foreach ($retconf[0] as $key => $val) { $backupconfig[$key] = stripslashes(trim($val)); } $backupdata_array = explode("|^|", $backupconfig['data_backup']); $dir_to_backup = trim($backupdata_array[0]); if (substr($dir_to_backup, strlen($dir_to_backup)-1, strlen($dir_to_backup)) == "/") { $dir_to_backup = substr($dir_to_backup, 0, strlen($dir_to_backup)-1); } $exclude = unserialize(trim($backupdata_array[1])); if ($backupconfig['auto_backup'] == 1) { $now = time(); @ignore_user_abort(1); @set_time_limit(0); if (($backupconfig['last_backup']+$backupconfig['time_backup']) <= $now) { $UPDATECONF = "UPDATE {$serendipity['dbPrefix']}dma_htmlbackup SET "; $UPDATECONF .= " last_backup='".$now."' "; $backupconfig['last_backup'] = $now; serendipity_db_query($UPDATECONF); $this->MakeHTMLBackup($dir_to_backup, $exclude); } } return true; } function getTar() { if (@include_once(dirname(__FILE__)."/bundled-libs/Tar.php")) { return true; } if (@include_once("Tar.php")) { return true; } if (@include_once("/bundled-libs/Tar.php")) { return true; } if (@include_once(S9Y_INCLUDE_PATH . "/bundled-libs/Tar.php")) { return true; } } function CheckAutoSQLBackup() { global $serendipity; $BACKUPDIR = $this->get_config('abspath_backupdir'); $TEMPDIR = $BACKUPDIR."/tmp"; $ARCHIVDIR = $BACKUPDIR; if (!file_exists($BACKUPDIR)) { @mkdir($BACKUPDIR, 0777); @chmod($BACKUPDIR, 0777); } if (!file_exists($BACKUPDIR."/tmp")) { @mkdir($BACKUPDIR."/tmp", 0777); @chmod($BACKUPDIR."/tmp", 0777); } if (!file_exists($BACKUPDIR."/tmp/last_backup")) { @mkdir($BACKUPDIR."/tmp/last_backup", 0777); @chmod($BACKUPDIR."/tmp/last_backup", 0777); } $retconf = serendipity_db_query("SELECT * FROM {$serendipity['dbPrefix']}dma_sqlbackup"); foreach ($retconf[0] as $key => $val) { $backupconfig[$key] = stripslashes(trim($val)); } $backupdata_array = explode("|^|", $backupconfig['data_backup']); $complete = intval($backupdata_array[0]); $tables = unserialize($backupdata_array[1]); $data = $backupdata_array[2]; $drop = intval($backupdata_array[3]); $pack = intval($backupdata_array[4]); if ($backupconfig['auto_backup'] == 1) { $now = time(); @ignore_user_abort(1); @set_time_limit(0); if (($backupconfig['last_backup']+$backupconfig['time_backup']) <= $now) { if ($backupconfig['data_backup'] != "") { $UPDATECONF = "UPDATE {$serendipity['dbPrefix']}dma_sqlbackup SET "; $UPDATECONF .= " last_backup='".$now."' "; $backupconfig['last_backup'] = $now; serendipity_db_query($UPDATECONF); $DATA_BACKUP = explode("|^|", $backupconfig['data_backup']); $complete = $DATA_BACKUP[0]; $tables = unserialize(stripslashes($DATA_BACKUP[1])); $data = $DATA_BACKUP[2]; $drop = $DATA_BACKUP[3]; $pack = $DATA_BACKUP[4]; if (isset($complete) && $complete == 1) { $this->MakeSQLBackup(1,NULL, $data, $drop); } else { $this->MakeSQLBackup(0, $tables, $data, $drop); } if ($pack == 1) { $archiv = "../".date("Y-m-d-H-i",time())."_sqlbackup.tar.gz"; chdir($TEMPDIR); if (file_exists($archiv)) { unlink($archiv); } $this->getTar(); $tar_object = new Archive_Tar($archiv, "gz"); $tar_object->setErrorHandling(PEAR_ERROR_RETURN); $filelist[0]="./last_backup"; $tar_object->create($filelist); chmod($archiv, 0666); chdir($serendipity['serendipityPath']); } else { $archiv = "../".date("Y-m-d-H-i",time())."__sqlbackup.tar"; chdir($TEMPDIR); if (file_exists($archiv)) { unlink($archiv); } $this->getTar(); $tar_object = new Archive_Tar($archiv, FALSE); $tar_object->setErrorHandling(PEAR_ERROR_RETURN); $filelist[0]="./last_backup"; $tar_object->create($filelist); chmod($archiv, 0666); chdir($serendipity['serendipityPath']); } $fe = opendir($TEMPDIR."/last_backup"); while ($file = readdir($fe)) { if ($file != "." && $file != ".." && $file != "index.php" && $file != "cvs" && $file != "CVS") { unlink($TEMPDIR."/last_backup/".$file); } } closedir($fe); } else { return false; } } } return true; } function CheckAutoDelHTMLBackup() { global $serendipity; $BACKUPDIR = $this->get_config('abspath_backupdir'); $backupdir = $BACKUPDIR; if (!file_exists($BACKUPDIR)) { @mkdir($BACKUPDIR, 0777); @chmod($BACKUPDIR, 0777); } $retconf = serendipity_db_query("SELECT * FROM {$serendipity['dbPrefix']}dma_htmlbackup"); foreach ($retconf[0] as $key => $val) { $backupconfig[$key] = stripslashes(trim($val)); } $backupdata_array = explode("|^|", $backupconfig['data_backup']); $dir_to_backup = trim($backupdata_array[0]); if (substr($dir_to_backup, strlen($dir_to_backup)-1, strlen($dir_to_backup)) == "/") { $dir_to_backup = substr($dir_to_backup, 0, strlen($dir_to_backup)-1); } $exclude = unserialize(trim($backupdata_array[1])); if ($backupconfig['auto_backdel'] == 1) { @ignore_user_abort(1); @set_time_limit(0); $now = time(); $fe = opendir($backupdir); while ($file = readdir($fe)) { if (preg_match("@htmlbackup@", $file)) { if (filemtime($backupdir."/".$file) <= ($now - $backupconfig['time_backdel'])) { unlink($backupdir."/".$file); } } } closedir($fe); } return true; } function CheckAutoDelSQLBackup() { global $serendipity; $BACKUPDIR = $this->get_config('abspath_backupdir'); $backupdir = $BACKUPDIR; if (!file_exists($BACKUPDIR)) { @mkdir($BACKUPDIR, 0777); @chmod($BACKUPDIR, 0777); } if (!file_exists($BACKUPDIR."/tmp")) { @mkdir($BACKUPDIR."/tmp", 0777); @chmod($BACKUPDIR."/tmp", 0777); } if (!file_exists($BACKUPDIR."/tmp/last_backup")) { @mkdir($BACKUPDIR."/tmp/last_backup", 0777); @chmod($BACKUPDIR."/tmp/last_backup", 0777); } $retconf = serendipity_db_query("SELECT * FROM {$serendipity['dbPrefix']}dma_sqlbackup"); foreach ($retconf[0] as $key => $val) { $backupconfig[$key] = stripslashes(trim($val)); } $backupdata_array = explode("|^|", $backupconfig['data_backup']); $complete = intval($backupdata_array[0]); $tables = unserialize($backupdata_array[1]); $data = $backupdata_array[2]; $drop = intval($backupdata_array[3]); $pack = intval($backupdata_array[4]); if ($backupconfig['auto_backdel'] == 1) { @ignore_user_abort(1); @set_time_limit(0); $now = time(); $fe = opendir($backupdir); while ($file = readdir($fe)) { if (preg_match("@sqlbackup@", $file)) { if (filemtime($backupdir."/".$file) <= ($now - $backupconfig['time_backdel'])) { unlink($backupdir."/".$file); } } } closedir($fe); } return true; } function RecoverSQLBackup($backupfile) { global $serendipity; $BACKUPDIR = $this->get_config('abspath_backupdir'); $backupdir = $BACKUPDIR; $pbackupfile = $BACKUPDIR."/".basename($backupfile); $recoverdir = $BACKUPDIR."/tmp/last_backup"; if (!file_exists($BACKUPDIR)) { @mkdir($BACKUPDIR, 0777); @chmod($BACKUPDIR, 0777); } if (!file_exists($BACKUPDIR."/tmp")) { @mkdir($BACKUPDIR."/tmp", 0777); @chmod($BACKUPDIR."/tmp", 0777); } if (!file_exists($BACKUPDIR."/tmp/last_backup")) { @mkdir($BACKUPDIR."/tmp/last_backup", 0777); @chmod($BACKUPDIR."/tmp/last_backup", 0777); } $retconf = serendipity_db_query("SELECT * FROM {$serendipity['dbPrefix']}dma_sqlbackup"); foreach ($retconf[0] as $key => $val) { $backupconfig[$key] = stripslashes(trim($val)); } $backupdata_array = explode("|^|", $backupconfig['data_backup']); $complete = intval($backupdata_array[0]); $tables = unserialize($backupdata_array[1]); $data = $backupdata_array[2]; $drop = intval($backupdata_array[3]); $pack = intval($backupdata_array[4]); if (!file_exists($pbackupfile)) { return PLUGIN_BACKUP_NOT_FOUND; } $this->getTar(); if (preg_match("@.gz$@", $backupfile)) { $zipped = TRUE; } else { $zipped = FALSE; } $tar_object = new Archive_Tar($pbackupfile, $zipped); $tar_object->setErrorHandling(PEAR_ERROR_RETURN); $tar_object->extract($backupdir."/tmp"); $fe = opendir($recoverdir); chdir($recoverdir); while ($file = readdir($fe)) { if (ereg("_CREATE_", $file)) { unset($rec); $drop = ""; $create = ""; $rec = file($file); for ($a=0;$a".preg_replace("|(`;([\ \\r\\n]{0,})$)|","`",$drop).""); } serendipity_db_query(preg_replace("|(\)([\ (TYPE=MyISAM)]{0,});([\ \\r\\n]{0,})$)|",")",$create)); #print("
".preg_replace("|(\)([\ (TYPE=MyISAM)]{0,});([\ \\r\\n]{0,})$)|",")",$create)."
"); } } chdir("../../../"); closedir($fe); $fe = opendir($recoverdir); chdir($recoverdir); while ($file = readdir($fe)) { if (ereg("_INSERT_", $file)) { unset($rec); $insert = ""; $fop = fopen($file, "r"); $rec = fread($fop, filesize($file)); fclose($fop); $insert = explode("\nINSERT INTO", $rec); for ($blu=0;$blu= 1) { serendipity_db_query("INSERT INTO".preg_replace("|(\);([\ \\r\\n]{0,})$)|",")",$insert[$blu])); #print("
INSERT INTO".preg_replace("|(\);([\ \\r\\n]{0,})$)|",")",$insert[$blu])."
"); } } } } chdir("../../../"); closedir($fe); $fe = opendir($recoverdir); while ($file = readdir($fe)) { if ($file != "." && $file != ".." && $file != "index.".$_SESSION['SUFFIX'] && $file != "cvs" && $file != "CVS") { unlink($recoverdir."/".$file); } } closedir($fe); return PLUGIN_BACKUP_SQL_RECOVERED; } function backup_interface() { global $serendipity; $BACKUPDIR = $this->get_config('abspath_backupdir'); $TEMPDIR = $BACKUPDIR."/tmp"; $ARCHIVDIR = $BACKUPDIR; $TITLE = ""; $TITLE .= "

" . PLUGIN_BACKUP_TITLE . "

\n"; $TITLE .= "" . PLUGIN_BACKUP_DESC . "\n"; if (!file_exists($BACKUPDIR)) { @mkdir($BACKUPDIR, 0777); @chmod($BACKUPDIR, 0777); } if (!file_exists($BACKUPDIR."/tmp")) { @mkdir($BACKUPDIR."/tmp", 0777); @chmod($BACKUPDIR."/tmp", 0777); } if (!file_exists($BACKUPDIR."/tmp/last_backup")) { @mkdir($BACKUPDIR."/tmp/last_backup", 0777); @chmod($BACKUPDIR."/tmp/last_backup", 0777); } if (isset($serendipity['POST']['action']) && $serendipity['POST']['action'] == "makesqlbackup") { $STATUSMSG = ''; unset($UPDATECONF); if (!isset($serendipity['POST']['complete']) || $serendipity['POST']['complete'] != 1){$serendipity['POST']['complete'] = 0;} if (!isset($serendipity['POST']['drop']) || $serendipity['POST']['drop'] != 1){$serendipity['POST']['drop'] = 0;} if (!isset($serendipity['POST']['pack']) || $serendipity['POST']['pack'] != 1){$serendipity['POST']['pack'] = 0;} $DATA_BACKUP = $serendipity['POST']['complete']; $DATA_BACKUP .= "|^|"; $DATA_BACKUP .= (isset($serendipity['POST']['complete'])&&$serendipity['POST']['complete']==1?serialize(array()):serialize($serendipity['POST']['tables'])); $DATA_BACKUP .= "|^|"; $DATA_BACKUP .= $serendipity['POST']['data']; $DATA_BACKUP .= "|^|"; $DATA_BACKUP .= $serendipity['POST']['drop']; $DATA_BACKUP .= "|^|"; $DATA_BACKUP .= $serendipity['POST']['pack']; if (!isset($serendipity['POST']['delete']) && isset($serendipity['POST']['bakautomatik']) && $serendipity['POST']['bakautomatik'] == 1) { $UPDATECONF = "UPDATE {$serendipity['dbPrefix']}dma_sqlbackup SET "; $UPDATECONF .= " auto_backup='1', "; $UPDATECONF .= " time_backup='".$serendipity['POST']['interval']."', "; $UPDATECONF .= " last_backup='".time()."', "; $UPDATECONF .= " data_backup='".addslashes($DATA_BACKUP)."' "; $STATUSMSG .= "" . PLUGIN_BACKUP_AUTO_SQL_BACKUP_STARTED . ''; } elseif (!isset($serendipity['POST']['delete']) && (count($serendipity['POST']) >= 1 && !isset($serendipity['POST']['bakautomatik']))) { $UPDATECONF = "UPDATE {$serendipity['dbPrefix']}dma_sqlbackup SET "; $UPDATECONF .= " auto_backup='0', "; $UPDATECONF .= " time_backup='0', "; $UPDATECONF .= " last_backup='0', "; $UPDATECONF .= " data_backup='".addslashes($DATA_BACKUP)."' "; $STATUSMSG .= "" . PLUGIN_BACKUP_AUTO_SQL_BACKUP_STOPPED . ''; } if (isset($UPDATECONF)) { serendipity_db_query($UPDATECONF); } unset($UPDATECONF); if (!isset($serendipity['POST']['delete']) && isset($serendipity['POST']['delautomatik']) && $serendipity['POST']['delautomatik'] == 1) { $UPDATECONF = "UPDATE {$serendipity['dbPrefix']}dma_sqlbackup SET "; $UPDATECONF .= " auto_backdel='1', "; $UPDATECONF .= " time_backdel='".$serendipity['POST']['delage']."', "; $UPDATECONF .= " last_backdel='".time()."' "; $STATUSMSG .= "" . PLUGIN_BACKUP_AUTO_SQL_DELETE_STARTED . ''; } elseif (!isset($serendipity['POST']['delete']) && (count($serendipity['POST']) >= 1 && !isset($serendipity['POST']['delautomatik']))) { $UPDATECONF = "UPDATE {$serendipity['dbPrefix']}dma_sqlbackup SET "; $UPDATECONF .= " auto_backdel='0', "; $UPDATECONF .= " time_backdel='0', "; $UPDATECONF .= " last_backdel='0' "; $STATUSMSG .= "" . PLUGIN_BACKUP_AUTO_SQL_DELETE_STOPPED . ''; } if (isset($UPDATECONF)) { serendipity_db_query($UPDATECONF); } if (isset($serendipity['POST']['backup']) && $serendipity['POST']['backup'] == 1) { if (isset($serendipity['POST']['complete']) && $serendipity['POST']['complete'] == 1) { $this->MakeSQLBackup(1,NULL, $serendipity['POST']['data'], $serendipity['POST']['drop']); } else { $this->MakeSQLBackup(0, $serendipity['POST']['tables'], $serendipity['POST']['data'], $serendipity['POST']['drop']); } if ($serendipity['POST']['pack'] == 1) { $archiv = "../".date("Y-m-d-H-i",time())."_sqlbackup.tar.gz"; chdir($TEMPDIR); if (file_exists($archiv)) { unlink($archiv); } $this->getTar(); $tar_object = new Archive_Tar($archiv, "gz"); $tar_object->setErrorHandling(PEAR_ERROR_RETURN); $filelist[0]="./last_backup"; $tar_object->create($filelist); chmod($archiv, 0666); chdir($serendipity['serendipityPath']); } else { $archiv = "../".date("Y-m-d-H-i",time())."_sqlbackup.tar"; chdir($TEMPDIR); if (file_exists($archiv)) { unlink($archiv); } $this->getTar(); $tar_object = new Archive_Tar($archiv, FALSE); $tar_object->setErrorHandling(PEAR_ERROR_RETURN); $filelist[0]="./last_backup"; $tar_object->create($filelist); chmod($archiv, 0666); chdir($serendipity['serendipityPath']); } $fe = opendir($TEMPDIR."/last_backup"); while ($file = readdir($fe)) { if ($file != "." && $file != ".." && $file != "index.php" && $file != "cvs" && $file != "CVS") { unlink($TEMPDIR."/last_backup/".$file); } } closedir($fe); $STATUSMSG .= "" . PLUGIN_BACKUP_SQL_SAVED . ''; } } if (isset($serendipity['POST']['action']) && $serendipity['POST']['action'] == "makehtmlbackup") { $STATUSMSG = ''; unset($UPDATECONF); if (!isset($serendipity['POST']['complete']) || $serendipity['POST']['complete'] != 1){$serendipity['POST']['complete'] = 0;} $DATA_BACKUP = $serendipity['serendipityPath']; $DATA_BACKUP .= "|^|"; $s9ypath = trim($serendipity['serendipityPath']); $s9ydir = preg_replace("`^.*\/([^\/]*)\/$`", "\\1", $s9ypath); if (substr($s9ypath, strlen($s9ypath)-1, strlen($s9ypath)) == "/") { $s9ypath = substr($s9ypath, 0, strlen($s9ypath)-1); } $dirs_to_exclude = array(); $fd = opendir($s9ypath); while ($dir = readdir($fd)) { if (is_dir($dir) && $dir != "." && $dir != "..") { if (is_array($serendipity['POST']['dirs']) && !in_array($dir, $serendipity['POST']['dirs'])) { $dirs_to_exclude[] = $dir; } } } closedir($fd); $DATA_BACKUP .= (isset($serendipity['POST']['complete'])&&$serendipity['POST']['complete']==1?serialize(array()):serialize($dirs_to_exclude)); if (!isset($serendipity['POST']['delete']) && isset($serendipity['POST']['bakautomatik']) && $serendipity['POST']['bakautomatik'] == 1) { $UPDATECONF = "UPDATE {$serendipity['dbPrefix']}dma_htmlbackup SET "; $UPDATECONF .= " auto_backup='1', "; $UPDATECONF .= " time_backup='".$serendipity['POST']['interval']."', "; $UPDATECONF .= " last_backup='".time()."', "; $UPDATECONF .= " data_backup='".addslashes($DATA_BACKUP)."' "; $STATUSMSG .= "" . PLUGIN_BACKUP_AUTO_HTML_BACKUP_STARTED . ''; } elseif (!isset($serendipity['POST']['delete']) && (count($serendipity['POST']) >= 1 && !isset($serendipity['POST']['bakautomatik']))) { $UPDATECONF = "UPDATE {$serendipity['dbPrefix']}dma_htmlbackup SET "; $UPDATECONF .= " auto_backup='0', "; $UPDATECONF .= " time_backup='0', "; $UPDATECONF .= " last_backup='0', "; $UPDATECONF .= " data_backup='".addslashes($DATA_BACKUP)."' "; $STATUSMSG .= "" . PLUGIN_BACKUP_AUTO_HTML_BACKUP_STOPPED . ''; } if (isset($UPDATECONF)) { serendipity_db_query($UPDATECONF); } unset($UPDATECONF); if (!isset($serendipity['POST']['delete']) && isset($serendipity['POST']['delautomatik']) && $serendipity['POST']['delautomatik'] == 1) { $UPDATECONF = "UPDATE {$serendipity['dbPrefix']}dma_htmlbackup SET "; $UPDATECONF .= " auto_backdel='1', "; $UPDATECONF .= " time_backdel='".$serendipity['POST']['delage']."', "; $UPDATECONF .= " last_backdel='".time()."' "; $STATUSMSG .= "" . PLUGIN_BACKUP_AUTO_HTML_DELETE_STARTED . ''; } elseif (!isset($serendipity['POST']['delete']) && (count($serendipity['POST']) >= 1 && !isset($serendipity['POST']['delautomatik']))) { $UPDATECONF = "UPDATE {$serendipity['dbPrefix']}dma_htmlbackup SET "; $UPDATECONF .= " auto_backdel='0', "; $UPDATECONF .= " time_backdel='0', "; $UPDATECONF .= " last_backdel='0' "; $STATUSMSG .= "" . PLUGIN_BACKUP_AUTO_HTML_DELETE_STOPPED . ''; } if (isset($UPDATECONF)) { serendipity_db_query($UPDATECONF); } if (isset($serendipity['POST']['backup']) && $serendipity['POST']['backup'] == 1) { if (isset($serendipity['POST']['complete']) && $serendipity['POST']['complete'] == 1) { $this->MakeHTMLBackup($s9ypath); } else { $this->MakeHTMLBackup($s9ypath, $dirs_to_exclude); } $STATUSMSG .= "" . PLUGIN_BACKUP_HTML_SAVED . ''; } } if (isset($serendipity['POST']['del']) and count($serendipity['POST']['del']) >= 1) { for ($a=0;$aRecoverSQLBackup($_GET['backup']); } elseif (isset($_GET['download']) && isset($_GET['backup']) && $_GET['download'] == 1 && trim($_GET['backup']) != "") { $file = $BACKUPDIR."/".basename($_GET['backup']); $fp = fopen($file,"r"); if (preg_match("@.gz$@", $_GET['backup'])) { header("Content-Type: application/x-gzip-compressed"); } elseif (preg_match("@.tar$@", $_GET['backup'])) { header("Content-Type: application/x-tar-compressed"); } header("Content-Transfer-Encoding: Binary"); header("Content-length: ".filesize($BACKUPDIR."/".$_GET['backup'])); header("Content-disposition: attachment; filename=".basename($_GET['backup'])); while (!feof($fp)) { $buff = fread($fp,4096); print $buff; } } $retconfs = serendipity_db_query("SELECT * FROM {$serendipity['dbPrefix']}dma_sqlbackup"); foreach ($retconfs[0] as $key => $val) { $backupconfig[$key] = stripslashes(trim($val)); } $backupdatas_array = explode("|^|", $backupconfig['data_backup']); $complete = intval($backupdatas_array[0]); $tables = unserialize($backupdatas_array[1]); $data = $backupdatas_array[2]; $drop = intval($backupdatas_array[3]); $pack = intval($backupdatas_array[4]); $BACKUPFORM = "

".PLUGIN_BACKUP_SQL_BACKUP."

\n"; $BACKUPFORM .= '
'; $BACKUPFORM .= '
'; $BACKUPFORM .= ' '; $BACKUPFORM .= "\n"; $BACKUPFORM .= "\n"; $BACKUPFORM .= '
'; $BACKUPFORM .= '
'; if (isset($drop) && $drop == 1) { $BACKUPFORM .= '
'; } elseif (isset($drop) && $drop == "0") { $BACKUPFORM .= '
'; } elseif (!isset($drop)) { $BACKUPFORM .= '
'; } if (isset($pack) && $pack == 1) { $BACKUPFORM .= '
'; } elseif (isset($pack) && $pack == "0") { $BACKUPFORM .= '
'; } elseif (!isset($pack)) { $BACKUPFORM .= '
'; } if (isset($complete) && $complete == 1) { $BACKUPFORM .= '
'; } elseif (isset($complete) && $complete == "0") { $BACKUPFORM .= '
'; } elseif (!isset($complete)) { $BACKUPFORM .= '
'; } if ($backupconfig['auto_backup'] == 1) { $C_automatik = ' checked'; } else { $C_automatik = ''; } if ($backupconfig['auto_backdel'] == 1) { $C_delmatik = ' checked'; } else { $C_delmatik = ''; } $BAKAUTO['TIME'] = array(600,3600,7200,21600,43200,86400,172800,345600,604800,1209600,2419200); $BAKAUTO['TEXT'] = array('10 '.PLUGIN_BACKUP_MINUTES, PLUGIN_BACKUP_EVERY.' '.PLUGIN_BACKUP_HOUR,PLUGIN_BACKUP_EVERY.' 2 '.PLUGIN_BACKUP_HOURS,PLUGIN_BACKUP_EVERY.' 6 '.PLUGIN_BACKUP_HOURS,PLUGIN_BACKUP_EVERY.' 12 '.PLUGIN_BACKUP_HOURS,PLUGIN_BACKUP_EVERY.' 24 '.PLUGIN_BACKUP_HOURS,PLUGIN_BACKUP_EVERY.' 2 '.PLUGIN_BACKUP_DAYS,PLUGIN_BACKUP_EVERY.' 4 '.PLUGIN_BACKUP_DAYS,PLUGIN_BACKUP_EVERY.' 7 '.PLUGIN_BACKUP_DAYS,PLUGIN_BACKUP_EVERY.' 2 '.PLUGIN_BACKUP_WEEKS,PLUGIN_BACKUP_EVERY.' 4 '.PLUGIN_BACKUP_WEEKS); $DELAUTO['TIME'] = array(43200,86400,172800,345600,604800,1209600,2419200,4838400,14515200); $DELAUTO['TEXT'] = array('12 '.PLUGIN_BACKUP_HOURS,' 24 '.PLUGIN_BACKUP_HOURS,'2 '.PLUGIN_BACKUP_DAYS,'4 '.PLUGIN_BACKUP_DAYS,'7 '.PLUGIN_BACKUP_DAYS,'2 '.PLUGIN_BACKUP_WEEKS,'4 '.PLUGIN_BACKUP_WEEKS,'2 '.PLUGIN_BACKUP_MONTHS,'6 '.PLUGIN_BACKUP_MONTHS); $BACKUPFORM .= '
' . PLUGIN_BACKUP_AUTO_BACKUP . '
'; $BACKUPFORM .= '
' . PLUGIN_BACKUP_DEL_OLD_BACKUPS . '
'; $BACKUPFORM .= '
'; $BACKUPFORM .= '
'; $BACKUPFORM .= '
'; unset($BACKUPS); $retconfh = serendipity_db_query("SELECT * FROM {$serendipity['dbPrefix']}dma_htmlbackup"); foreach ($retconfh[0] as $key => $val) { $htmlbackupconfig[$key] = stripslashes(trim($val)); } $backupdatah_array = explode("|^|", $htmlbackupconfig['data_backup']); $dir_to_backup = trim($backupdata_array[0]); if (substr($dir_to_backup, strlen($dir_to_backup)-1, strlen($dir_to_backup)) == "/") { $dir_to_backup = substr($dir_to_backup, 0, strlen($dir_to_backup)-1); } $exclude = unserialize(trim($backupdatah_array[1])); $BACKUPFORM .= "

" . PLUGIN_BACKUP_HTML_BACKUP . "

\n"; $BACKUPFORM .= '
'; $BACKUPFORM .= '
'; $BACKUPFORM .= ' '; $BACKUPFORM .= "\n"; $BACKUPFORM .= "\n"; $BACKUPFORM .= '
'; $BACKUPFORM .= '
'; if (!is_array($exclude) || count($exclude) <= 0) { $BACKUPFORM .= ' '; } else { $BACKUPFORM .= ' '; } $BACKUPFORM .= '
'; if ($htmlbackupconfig['auto_backup'] == 1) { $C_automatik = ' checked'; } else { $C_automatik = ''; } if ($htmlbackupconfig['auto_backdel'] == 1) { $C_delmatik = ' checked'; } else { $C_delmatik = ''; } $BACKUPFORM .= '
' . PLUGIN_BACKUP_AUTO_BACKUP . '
'; $BACKUPFORM .= '
' . PLUGIN_BACKUP_DEL_OLD_BACKUPS . '
'; $BACKUPFORM .= '
'; $BACKUPFORM .= '
'; $BACKUPFORM .= '
'; unset($BACKUPS); $bc = 0; $fd = opendir($BACKUPDIR); while ($backup = readdir($fd)) { if (preg_match("@backup@", $backup)) { $BACKUPS['NAME'][$bc] = $backup; $BACKUPS['FILE'][$bc] = $BACKUPDIR."/".$backup; $BACKUPS['TIME'][$bc] = filemtime($BACKUPDIR."/".$backup); $BACKUPS['SIZE'][$bc] = filesize($BACKUPDIR."/".$backup); $bc++; } } closedir($fd); @reset($BACKUPS); @array_multisort($BACKUPS['TIME'], SORT_DESC, SORT_NUMERIC, $BACKUPS['NAME'], $BACKUPS['FILE'], $BACKUPS['SIZE']); if (count($BACKUPS['NAME']) >= 1) { $BACKUPFORM .= '

' . PLUGIN_BACKUP_LABEL_BACKUPS . '

' . "\n"; $BACKUPFORM .= '
'."\n"; $BACKUPFORM .= ' '."\n"; $BACKUPFORM .= "\n"; $BACKUPFORM .= "\n"; $BACKUPFORM .= '
'."\n"; $BACKUPFORM .= ''."\n"; $BACKUPFORM .= ''."\n"; $BACKUPFORM .= ''."\n"; $BACKUPFORM .= ''."\n"; $BACKUPFORM .= ''."\n"; $BACKUPFORM .= ''."\n"; $BACKUPFORM .= ''."\n"; $BACKUPFORM .= ''."\n"; $BACKUPFORM .= ''."\n"; $BACKUPFORM .= ''."\n"; for ($bco=0;$bco ' . $BACKUPS['NAME'][$bco] . ''."\n"; $BACKUPFORM .= ''."\n"; $BACKUPFORM .= ''."\n"; $BACKUPFORM .= ''."\n"; $BACKUPFORM .= ''."\n"; } $BACKUPFORM .= '' . "\n"; $BACKUPFORM .= '
' . PLUGIN_BACKUP_FILENAME . '' . PLUGIN_BACKUP_FILESIZE . '' . PLUGIN_BACKUP_DATE . '' . PLUGIN_BACKUP_OPTION . '
' . $this->calcFilesize($BACKUPS['SIZE'][$bco]) . '' . date("d.m.Y, H:i",$BACKUPS['TIME'][$bco]) . '' . "\n"; if (preg_match("@htmlbackup@", $BACKUPS['NAME'][$bco])) { $BACKUPFORM .= " "; } else { $BACKUPFORM .= "" . PLUGIN_BACKUP_RECOVER . ""; } $BACKUPFORM .= '
' . "\n"; $BACKUPFORM .= '
' . "\n"; $BACKUPFORM .= '
' . "\n"; $BACKUPFORM .= '
' . "\n"; } else { $BACKUPFORM .= "" . PLUGIN_BACKUP_NO_BACKUPS . "\n"; } echo $TITLE; if (isset($STATUSMSG) && trim($STATUSMSG) != "") { echo $STATUSMSG; } echo $BACKUPFORM; } function generate_content(&$title) { $title = PLUGIN_BACKUP_TITLE.' ('.$this->get_config('pageurl').')'; } function install() { $this->setupDB(); } function event_hook($event, &$bag, &$eventData, $addData = null) { global $serendipity; $hooks = &$bag->get('event_hooks'); if (isset($hooks[$event])) { switch($event) { case 'backend_sidebar_entries': if ($serendipity['version'][0] == '1') { if ($serendipity['serendipityUserlevel'] >= USERLEVEL_ADMIN && ($serendipity['dbType'] == 'mysql' || $serendipity['dbType'] == 'mysqli')) { ?>
  • backup_interface(); break; case 'frontend_footer': echo "\"\""; break; case 'css_backend': echo file_get_contents(dirname(__FILE__) . '/backup_backend.css'); break; case 'external_plugin': $uri_parts = explode('?', str_replace('&', '&', $eventData)); // Try to get request parameters from eventData name if (!empty($uri_parts[1])) { $reqs = explode('&', $uri_parts[1]); foreach($reqs AS $id => $req) { $val = explode('=', $req); if (empty($_REQUEST[$val[0]])) { $_REQUEST[$val[0]] = $val[1]; } } } $parts = explode('_', $uri_parts[0]); switch($parts[0]) { case 'checkautobackup': $this->CheckAutoSQLBackup(); $this->CheckAutoDelSQLBackup(); $this->CheckAutoHTMLBackup(); $this->CheckAutoDelHTMLBackup(); break; case 'dlbackup': $BACKUPDIR = $this->get_config('abspath_backupdir'); $file = str_replace(array("\\", "/", "dlbackup_"), array("", "", ""), $uri_parts[0]); $file = basename($file); $dlfile = $BACKUPDIR."/".$file; $fnar = explode(".", $file); $ext = $fnar[(count($fnar)-1)]; if ($ext == "tar") { $contenttype = "application/x-tar"; } else { $contenttype = "application/x-zip-compressed"; } $filename = $file; $path = $BACKUPDIR; $sysname = $file; $filesize = filesize($dlfile); if (function_exists("getallheaders")) { $headers = getallheaders(); } if (substr($headers["Range"], 0, 6) == "bytes=") { header("HTTP/1.1 206 Partial Content"); header("Content-Type: $contenttype"); header("Content-Disposition: attachment; filename=".$filename); header("Accept-Ranges: bytes"); header("Connection: close"); $bytes = explode("=",$headers["Range"]); $bytes = $bytes[1]; if (preg_match("@^-([0-9]+)@", $bytes, $bytes_len)) { $bytes_len = $bytes_len[1]; $bytes_start = $filesize - $bytes_len; $bytes_end = $filesize - 1; header("Content-Length: ".$bytes_len); } elseif (preg_match("@([0-9]+)-$@", $bytes, $bytes_start)) { $bytes_start = $bytes_start[1]; $bytes_end = $filesize - 1; $bytes_len = $filesize - $bytes_start; header("Content-Length: $bytes_len"); } elseif (preg_match("@^([0-9]+)-([0-9]+)$@", $bytes, $bytes_pos)) { $bytes_start = $bytes_pos[0]; $bytes_end = $bytes_pos[1]; if ($bytes_start < 0 || $bytes_start > ($filesize - 1)) { $bytes_start = 0; } if ($bytes_end < $bytes_start || $bytes_end > ($filesize - 1)) { $bytes_end = $filesize - 1; } $bytes_len = $bytes_end - $bytes_start + 1; header("Content-Length: $bytes_len"); } else { $bytes_start = 0; $bytes_end = $filesize - 1; $bytes_len = $bytes_end - $bytes_start + 1; header("Content-Length: $bytes_len"); } header("Content-Range: bytes $bytes_start-$bytes_end/".$filesize); $fp = fopen($path."/".$sysname,"rb"); fseek($fp, $bytes_start); $contents = fread ($fp, $bytes_len ); fclose($fp); echo $contents; } else { $fp = fopen($path."/".$sysname,"rb"); $contents = fread ($fp, $filesize); fclose($fp); header("Content-Type: $contenttype"); header("Content-Disposition: attachment; filename=".$filename); header("Accept-Ranges: bytes"); header("Content-Length: " . strlen($contents)); header("Connection: close"); echo $contents; } break; } return true; break; } } return true; } } /* vim: set sts=4 ts=4 expandtab : */