Просмотр файла mpanel/backup.php

Размер файла: 9.1Kb
  1. <?php
  2. #-----------------------------------------------------#
  3. # ********* ROTORCMS ********* #
  4. # Made by : VANTUZ #
  5. # E-mail : visavi.net@mail.ru #
  6. # Site : http://pizdec.ru #
  7. # WAP-Site : http://visavi.net #
  8. # ICQ : 36-44-66 #
  9. # Вы не имеете право вносить изменения в код скрипта #
  10. # для его дальнейшего распространения #
  11. #-----------------------------------------------------#
  12. require_once ('../includes/start.php');
  13. require_once ('../includes/functions.php');
  14. require_once ('../includes/header.php');
  15. include_once ('../themes/header.php');
  16.  
  17. if (function_exists('set_time_limit')) {
  18. set_time_limit(600);
  19. }
  20.  
  21. if (isset($_GET['act'])) {
  22. $act = check($_GET['act']);
  23. } else {
  24. $act = 'index';
  25. }
  26.  
  27. if (is_admin(array(101))) {
  28. show_title('services.png', 'Backup базы данных');
  29. $config['newtitle'] = 'Backup базы данных';
  30.  
  31. switch ($act):
  32. ############################################################################################
  33. ## Главная страница ##
  34. ############################################################################################
  35. case 'index':
  36.  
  37. $globfiles = glob(DATADIR."backup/*.{zip,gz,bz2,sql}", GLOB_BRACE);
  38. $total = count($globfiles);
  39.  
  40. if (is_array($globfiles) && $total > 0) {
  41. arsort($globfiles);
  42.  
  43. foreach($globfiles as $value) {
  44. echo '<img src="../images/img/zip.gif" alt="image" /> <b>'.basename($value).'</b> ('.read_file($value).') (<a href="backup.php?act=del&amp;backup='.basename($value).'&amp;uid='.$_SESSION['token'].'&amp;'.SID.'">Удалить</a>)<br />';
  45. }
  46.  
  47. echo '<br />Всего бэкапов: <b>'.$total.'</b><br /><br />';
  48. } else {
  49. show_error('Бэкапов еще нет!');
  50. }
  51.  
  52. echo '<img src="../images/img/open.gif" alt="image" /> <a href="backup.php?act=choice&amp;'.SID.'">Новый бэкап</a><br />';
  53. break;
  54.  
  55. ############################################################################################
  56. ## Выбор таблиц ##
  57. ############################################################################################
  58. case 'choice':
  59. $q = DB::run() -> query("SHOW TABLE STATUS;");
  60. $tables = $q -> fetchAll();
  61.  
  62. $total = count($tables);
  63.  
  64. if ($total > 0) {
  65. echo 'Всего таблиц: <b>'.$total.'</b><br /><br />';
  66.  
  67. echo '<div class="form">';
  68. echo '<form action="backup.php?act=backup&amp;uid='.$_SESSION['token'].'&amp;'.SID.'" method="post">';
  69.  
  70. echo '<input type="checkbox" id="all" onchange="var o=this.form.elements;for(var i=0;i&lt;o.length;i++)o[i].checked=this.checked" /> <b><label for="all">Отметить все</label></b><hr />';
  71.  
  72. foreach ($tables as $data) {
  73. echo '<input type="checkbox" name="tables[]" value="'.$data['Name'].'" /> ';
  74. echo '<img src="../images/img/database.gif" alt="db" /> <b>'.$data['Name'].'</b> (Записей: '.$data['Rows'].' / Размер: '.formatsize($data['Data_length']).')<br />';
  75. }
  76.  
  77. echo '<br />Метод сжатия:<br />';
  78. echo '<select name="method">';
  79.  
  80. echo '<option value="0">Не сжимать</option>';
  81.  
  82. if (function_exists("gzopen")) {
  83. echo '<option value="1" selected="selected">GZip</option>';
  84. }
  85.  
  86. if (function_exists("bzopen")) {
  87. echo '<option value="2">BZip2</option>';
  88. }
  89.  
  90. echo '</select><br />';
  91.  
  92. $level = array(0 => 'Без сжатия', 1 => '1 (минимальная)', 2 => '2', 3 => '3', 4 => '4', 5 => '5 (средняя)', 6 => '6', 7 => '7 (рекомендуемая)', 8 => '8', 9 => '9 (максимальная)');
  93.  
  94. echo 'Степень сжатия:<br />';
  95. echo '<select name="level">';
  96. foreach($level as $key => $val) {
  97. $selected = ($key == 7) ? ' selected="selected"' : '';
  98. echo '<option value="'.$key.'"'.$selected.'>'.$val.'</option>';
  99. }
  100. echo '</select><br />';
  101.  
  102. echo '<br /><input type="submit" value="Выполнить" /></form></div><br />';
  103. } else {
  104. show_error('Нет таблиц для бэкапа!');
  105. }
  106.  
  107. echo '<img src="../images/img/back.gif" alt="image" /> <a href="backup.php?'.SID.'">Вернуться</a><br />';
  108. break;
  109.  
  110. ############################################################################################
  111. ## Бэкап ##
  112. ############################################################################################
  113. case 'backup':
  114.  
  115. define('BACKUP', date('d-M-Y_H-i-s', SITETIME));
  116.  
  117. if (!empty($_POST['tables'])) {
  118. $tables = check($_POST['tables']);
  119. } else {
  120. $tables = 0;
  121. }
  122. $method = abs(intval($_POST['method']));
  123. $level = abs(intval($_POST['level']));
  124.  
  125. if (is_writeable(DATADIR.'backup')) {
  126. if (!empty($tables)) {
  127. $q = DB::run() -> query("SHOW TABLE STATUS;");
  128. $chktbl = $q -> fetchAll(PDO::FETCH_COLUMN);
  129.  
  130. $diff = array_diff($tables, $chktbl);
  131. if (empty($diff)) {
  132. $file = 'backup_'.BACKUP.'.sql';
  133.  
  134. $fp = fn_open(DATADIR.'backup/'.$file, "w", $method, $level);
  135.  
  136. foreach ($tables as $data) {
  137. DB::run() -> query("LOCK TABLES `{$data}` WRITE;");
  138. $result = DB::run() -> query("SHOW CREATE TABLE `{$data}`;");
  139. $tab = $result -> fetch(PDO::FETCH_NUM);
  140. // $tab = preg_replace('/(default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP|DEFAULT CHARSET=\w+|character set \w+|collate \w+)/i', '/*!40101 \\1 */', $tab);
  141. fn_write($fp, "\n--\n-- Структура таблицы `{$data}`\n--\n\n", $method);
  142. fn_write($fp, "DROP TABLE IF EXISTS `{$data}`;\n{$tab[1]};\n\n", $method);
  143. fn_write($fp, "--\n-- Дамп данных таблицы `{$data}`\n--\n\n", $method);
  144.  
  145. $NumericColumn = array();
  146. $result = DB::run() -> query("SHOW COLUMNS FROM `{$data}`");
  147. $field = 0;
  148. while ($numcol = $result -> fetch(PDO::FETCH_NUM)) {
  149. $NumericColumn[$field++] = preg_match("/^(\w*int|year)/", $numcol[1]) ? 1 : 0;
  150. }
  151. $fields = $field;
  152.  
  153. $num = 0;
  154. $col = DB::run() -> query("SELECT * FROM `{$data}`;");
  155.  
  156. fn_write($fp, "INSERT INTO `{$data}` VALUES ", $method);
  157.  
  158. while ($row = $col -> fetch(PDO::FETCH_NUM)) {
  159. $num++;
  160. for($k = 0; $k < $fields; $k++) {
  161. if ($NumericColumn[$k]) {
  162. $row[$k] = isset($row[$k]) ? $row[$k] : "NULL";
  163. } else {
  164. $row[$k] = isset($row[$k]) ? "'".$row[$k]."'" : "NULL";
  165. }
  166. }
  167. fn_write($fp, ($num == 1 ? '' : ',')."\n(".implode(', ', $row).")", $method);
  168. }
  169.  
  170. fn_write($fp, ";\n", $method);
  171. }
  172.  
  173. DB::run() -> query("UNLOCK TABLES;");
  174.  
  175. fn_close($fp, $method);
  176.  
  177. $_SESSION['note'] = 'База данных успешно обработана и сохранена!';
  178. redirect("backup.php?".SID);
  179.  
  180. } else {
  181. show_error('Ошибка! Некоторые таблицы отсутствуют в базе данных!');
  182. }
  183. } else {
  184. show_error('Ошибка! Не выбраны таблицы для бэкапа!');
  185. }
  186. } else {
  187. show_error('Ошибка! Директория backup недоступна для записи!');
  188. }
  189.  
  190. echo '<img src="../images/img/back.gif" alt="image" /> <a href="backup.php?act=choice&amp;'.SID.'">Вернуться</a><br />';
  191. break;
  192.  
  193. ############################################################################################
  194. ## Удаление бэкапов ##
  195. ############################################################################################
  196. case 'del':
  197.  
  198. $uid = check($_GET['uid']);
  199. $backup = check($_GET['backup']);
  200.  
  201. if ($uid == $_SESSION['token']) {
  202. if (!empty($backup)) {
  203. if (preg_match('|^[\w\.\-]+$|i', $backup)) {
  204. if (file_exists(DATADIR.'backup/'.$backup)) {
  205. unlink (DATADIR.'backup/'.$backup);
  206.  
  207. $_SESSION['note'] = 'Бэкап успешно удален!';
  208. redirect("backup.php?".SID);
  209.  
  210. } else {
  211. show_error('Ошибка! Данного бэкапа не существует!');
  212. }
  213. } else {
  214. show_error('Ошибка! Недопустимое название бэкапа!');
  215. }
  216. } else {
  217. show_error('Ошибка! Вы не выбрали бэкапа для удаления!');
  218. }
  219. } else {
  220. show_error('Ошибка! Неверный идентификатор сессии, повторите действие!');
  221. }
  222.  
  223. echo '<img src="../images/img/back.gif" alt="image" /> <a href="backup.php?'.SID.'">Вернуться</a><br />';
  224. break;
  225.  
  226. default:
  227. redirect("backup.php?".SID);
  228. endswitch;
  229.  
  230. echo '<img src="../images/img/panel.gif" alt="image" /> <a href="index.php?'.SID.'">В админку</a><br />';
  231.  
  232. } else {
  233. redirect(BASEDIR.'index.php?'.SID);
  234. }
  235.  
  236. include_once ('../themes/footer.php');
  237. ?>