├── CHANGES ├── COPYING ├── FAQ ├── README ├── TODO ├── VERSION ├── cfg_example ├── cfg_example_sql ├── cfg_example_users ├── contrib ├── CONTRIB.txt ├── backup_arc │ ├── double_mirror.sh │ ├── double_tar.sh │ ├── double_tar3.sh │ └── rsync_backup.exclude ├── curl_backup │ └── curl_backup.sh ├── dir_sync │ ├── create_dir_list.pl │ └── restore_dir.pl ├── fsbackup.cron ├── fsfind.pl ├── ib_backup.pl ├── psql_hourly │ ├── daily_sql_backup.sh │ └── hourly_sql_backup.sh ├── psql_wal │ ├── daily_pgsql_backup.sh │ └── daily_pgsql_rotate.pl ├── restore_path │ ├── README │ ├── fsbackup.patch │ └── restore_path.sh └── rsync_sample │ ├── README │ ├── local_rsync │ ├── rsync_backup.exclude │ └── rsync_backup.sh │ └── remote_rsync │ ├── rsync.exclude │ └── rsync_backup.sh ├── create_backup.sh ├── fsbackup.pl ├── fsbackup_eng_guide.txt ├── install.pl ├── modules ├── DB_File-1.77.tar.gz ├── Digest-MD5-2.13.tar.gz ├── Digest-Perl-MD5-1.5.tar.gz ├── freebsd_inst.txt ├── libnet-1.0703.tar.gz └── linux_inst.txt ├── rpms ├── fsbackup-1.2-pl2.noarch.rpm └── fsbackup-1.2-pl2.src.rpm └── scripts ├── fsrestore.sh ├── mount-windows-share.sh ├── mysql_backup.sh ├── pgsql_backup.sh ├── sqlite_backup.sh ├── sysbackup.sh └── sysrestore.sh /CHANGES: -------------------------------------------------------------------------------- 1 | Major changes between version 1.2pl2 and 1.2pl4 2 | * Конвертирование charset'а проекта из KOI8-R в UTF-8 3 | * Удаление файлов cfg_example_local и cfg_example_root, как ненужные примеры 4 | * Добавление cfg_example_sql, как пример для бакапа SQL дампов 5 | * Добавление скрипта scripts/mount-windows-share.sh и параметра 'mount_winshare' 6 | в create_backup.sh 7 | * Добавление в scripts/mysql_backup.sh параметра: backup_mysqlhost 8 | * Добавление в scripts/pgsql_backup.sh параметров: 9 | - backup_sqluser 10 | - backup_sqlpassword 11 | - backup_sqlhost 12 | - backup_sqlport 13 | - backup_suuser 14 | - wal_backup 15 | (описание этих параметров в самом скрипте) 16 | * Добавление двух скриптов в contrib/psql_wal папку, позволяющих бакапить 17 | WAL-логи Postgres'а 18 | * Обновление install.pl: 19 | - инсталяция нового скрипта 20 | - фикс с несозданием папки для man-файлов 21 | * Обновление fsbackup.pl в части pod2man 22 | - некоторые фиксы 23 | - добавление описания scripts/mount-windows-share.sh 24 | 25 | 26 | Major changes between version 1.2pl1 and 1.2pl2 27 | ----------------------------------------------- 28 | * Патч от Руслана Стельмаченко с исправлением досадной ошибки 29 | в скрипте mysql_backup.sh, приводящей к невключению в дамп блоков 30 | СREATE DATABASE и USE перед каждой БД, в случае использования типов MySQL 31 | бэкапа "db" и "notdb". 32 | 33 | * Патч от Victor A. Prylipko с исправлением проблемы неправильного 34 | подсчета чиста инкрементов бэкапа, при локальном методе хранения и размещении 35 | нескольких бэкапов в одной директории. Напомню, что для методов хранения ftp и ssh, 36 | каждый бэкап обязательно должен быть в отдельной директории. 37 | 38 | * В списке масок бэкапа теперь автоматически удаляются граничные пробелы 39 | и символы табуляции после маски и перед ней. Кроме того, появилась возможность 40 | указания в комментария в строке с маской (игнорируется все что после символа "#"). 41 | Например, "!/var/log # исключаем логи". 42 | 43 | * В create_backup.sh добавлена простейшая проверка для предотвращения 44 | повторного запуска двух копий fsbackup.pl. 45 | 46 | * Добавлено три дополнительных примера конфигурации: cfg_example_local, 47 | cfg_example_root, cfg_example_users. 48 | 49 | * В списке с размерами файлов (.lsize) теперь указан номер тома в который 50 | помещен текущий файл (формат: "размер файл номер_тома"). 51 | 52 | * В sysbackup.sh расширено число сохраняемых параметров. Добавлено сохранение 53 | таблицы дисковых разделов, информации о маршрутизации и т.д. Дополнения 54 | приветствуются. 55 | 56 | * В директорию contrib/rsync_sample добавлены примеры использования rsync для 57 | синхронизации рабочей системы на запасной жесткий диск. 58 | 59 | * В директорию contrib/curl_backup добавлен пример использования curl для бэкапа. 60 | 61 | * В директорию contrib/psql_hourly добавлен пример ежечасового бэкапа выборочных 62 | PostgreSQL таблиц с ротацией бэкапа. 63 | 64 | * В директорию contrib/backup_arc добавлены примеры дополнительного архивирования 65 | резервных копий на сервере бэкапов. 66 | 67 | * В директорию contrib/dir_sync добавлен скрипт create_dir_list.pl для создания 68 | списка всех директорий в системе и скрипт restore_dir.pl для восстановления 69 | структуры дерева каталогов (создает недостающие директории). 70 | Удобно использовать в связке со скриптами rsync_sample. 71 | 72 | 73 | Major changes between version 1.2 and 1.2pl1 74 | -------------------------------------------- 75 | * Скрипт pgsql_backup.sh модифицирован для поддержки бэкапа с исключением 76 | таблиц для последних версий PostgreSQL (изменился формат вывода команды \d). 77 | 78 | * Патч от Ignacio Alles : 79 | если не определено символьное имя пользователя и группы - пишем в файл 80 | воссоздания дерева директорий цифровое. 81 | 82 | * 'list' файл теперь дополнительно создается для каждого тома архива, 83 | чтобы посмотреть в каком именно томе находится искомый файл. 84 | 85 | * В вызове find заменен оператор -not на !, так как некоторые версии find не 86 | воспринимают конструкции с "-not". 87 | 88 | * В pgsql_backup.sh закомментирован вызов pg_dumpall -s для отдельного создания 89 | схемы данных, так как в PostgreSQL 7.3 ключ "-s" для pg_dumpall был убран. 90 | 91 | * Введена переменная конфигурации $cfg_remote_ftp_mode для определения режима 92 | соединения с FTP сервером (пассивный или активный). Некоторые ftp сервера 93 | или настройки фаервола не позволяют использовать активный режим FTP соединения, 94 | применяемый ранее по умолчанию. 95 | 96 | * Исправлено неправильное толкование директивы $cfg_root_path, fsbackup теперь 97 | работает не с абсолютными путями относительно /, а только с относительными путями 98 | относительно $cfg_root_path. 99 | 100 | * В fsrestore.sh к параметрам tar добавлен ключ "-p", для более правильного 101 | восстановления прав доступа. 102 | 103 | * Модуль sqlite_backup.sh для бэкапа SQLite таблиц. 104 | 105 | Major changes between version 1.1pl2 and 1.2 106 | -------------------------------------------- 107 | * Исправлена недоработка при бэкапе символических ссылок, если используются 108 | MD5 контрольные суммы содержимого файла. 109 | 110 | * В mysql_backup.sh и pgsql_backup.sh добавлена поддержка бэкапа не только 111 | всей базы целиком, но и выбранных таблиц из баз. Например, таблица для 112 | включения или исключения из архива указывается в виде (traffic - имя БД, 113 | users, passwords - таблицы): backup_db_list="traffic:users traffic:passwords" 114 | 115 | * Дополнительные скрипты для fsbackup от Alex Sokoloff : 116 | contrib/fsbackup.cron - альтернатива для запуска бэкапа из cron. 117 | contrib/fsfind.pl - поиска файла в архивах. 118 | contrib/ib_backup.pl бэкапа Interbase баз. 119 | 120 | * При бэкапе sql таблиц (mysql_backup.sh и pgsql_backup.sh) структура всех 121 | таблиц копируется в *-struct-* файл, в начало файлов *-mysql или -pgsql 122 | копируется только структура заданных баз. 123 | 124 | * Директива исключения из бэкапа '!' теперь действует не только для директорий, 125 | но и для файлов. 126 | 127 | * Исправлены ошибки в скрипте fsrestore.sh 128 | 129 | 130 | Major changes between version 1.1pl1 and 1.1pl2. 131 | -------------------------------------------- 132 | * Введена директива $cfg_stopdir_prune, для отключения рекурсивного просмотра 133 | директорий, запрещаемых для помещения в бэкап (увеличивается скорость бэкапа, 134 | уменьшает гибкость настройки). 135 | 136 | Major changes between version 1.1 and 1.1pl1. 137 | -------------------------------------------- 138 | * Добавлены лидирующие нули в новом формате наименования файлов в бэкапе. 139 | 140 | * При восстановлении дерева директорий добавлен учет времени их создания. 141 | 142 | Major changes between version 1.0rc1 and 1.1. 143 | -------------------------------------------- 144 | * Исправлена интерпретация оператора исключения пути, теперь путь исключается 145 | не по маске, а по директории. т.е. !/u не будет исключать директорию /usr; 146 | 147 | * Исправлена ошибка при вычислении уровня инкрементальности при локальном типе 148 | бэкапа; 149 | 150 | * Добавлен ключ --all-databases в mysql_backup.sh, для варианта полного архива; 151 | 152 | * Скрипт sysbackup.sh теперь создает файл install.cfg - сценарий установки 153 | для sysinstall в FreeBSD; 154 | 155 | * Значительно расширено число системных сообщений и улучшен анализ ошибок, 156 | введен уровень "говорливости" ($cfg_verbose в конф. файле); 157 | 158 | * Проверена работа над улучшением безопасности fsbackup, в частности исправлены 159 | некоторые ошибки в скриптах восстановления из резервной копии, добавлено 160 | экранирование опасных символов в именах файлов для бэкапа, изменился формат 161 | .del файлов. 162 | 163 | * Переработаны системы синхронизации директорий и восстановления бэкапа 164 | после сбоя; 165 | 166 | * Изменился формат записи имени инкрементального бэкапа 167 | с имя_бэкапа-число_секунд_c_1970_года.tar.gz 168 | на имя_бэкапа-YYYY.MM.DD.HH.MM.SS-номер_тома.tar.gz; 169 | 170 | * Добавлено разбиение бэкапа на блоки в зависимости от суммарного размера 171 | резервируемых данных. Полезно при создании гигантских архивов не влезающих 172 | в ограничение файловой системы или при последующей записи архивов на CD-ROM 173 | или другие накопители небольшого размера. ($cfg_maximum_archive_size в конф. 174 | файле); 175 | 176 | * Добавлено сохранение предыдущей версии полного бэкапа перед инкрементальной 177 | ротацией или заменой текущего неинкрементального бэкапа новой версией. Старая 178 | версия помещается в подкаталог OLD. ($cfg_save_old_backup в конф. файле); 179 | 180 | * Добавлен FAQ с ответами на наиболее часто задаваемые вопросы. 181 | -------------------------------------------------------------------------------- /COPYING: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc. 5 | 675 Mass Ave, Cambridge, MA 02139, USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Library General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | Appendix: How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 19yy 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License 307 | along with this program; if not, write to the Free Software 308 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) 19yy name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Library General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /FAQ: -------------------------------------------------------------------------------- 1 | FAQ - ОТВЕТЫ НА ЧАСТО-ЗАДАВАЕМЫЕ ВОПРОСЫ 2 | 3 | ------------------------------------------------------------------------------- 4 | Как увеличить быстродействие и снизить нагрузку на процессор при шифровании 5 | бэкапа ? 6 | 7 | При использовании шифрования через gpg, рекомендуется установить значение 8 | $prog_gzip="" (т.е. отключить сжатие архива), так как gpg перед шифрованием 9 | самостоятельно сжимает данные. Использование gzip приведет к двойному 10 | сжатию и лишней нагрузке на CPU. 11 | 12 | ------------------------------------------------------------------------------- 13 | Возникло опасение, что при большом количестве файлов fsbackup съест все ОЗУ. 14 | 15 | Ничего подобного, одним из достоинств fsbackup является очень экономные 16 | требования к памяти, за счет использования для хранения хэшей библиотеки 17 | DBM. По умолчанию, используется не более 4 Мб ОЗУ. 18 | 19 | ------------------------------------------------------------------------------- 20 | Как увеличить быстродействие и оптимизировать распределение памяти для 21 | бэкапа ? 22 | 23 | По умолчанию в памяти находится только 4 Мб индексов, остальное сбрасывается 24 | на диск. Быстродействие создания бэкапа можно _на_порядок_ увеличить, за 25 | счет увеличения размер кэша для размещения хэш таблицы в памяти. 26 | Для этого в fsbackup.pl нужно изменить значения константы: 27 | use constant DB_DEF_CACHE_SIZE => размер_кэша_в_байтах; 28 | Чем больше DB_DEF_CACHE_SIZE - тем лучше. 29 | 30 | ------------------------------------------------------------------------------- 31 | Собрался сменить fsbackup 1.0 на 1.1 (1.2). Не будет ли проблем с существующей 32 | конфигурацией, при переходе на новую версию ? 33 | 34 | Можно смело оставить старые файлы конфигурации, заменив только скрипты. 35 | При желании активировать новинки, появившиеся в 1.1 (1.2), загляните в CHANGES 36 | и добавьте новые переменные в старые конфиги. 37 | 38 | ------------------------------------------------------------------------------- 39 | Зачем было создавать свою систему бэкапа SQL таблиц, когда есть pg_dump и 40 | mysqldump ? 41 | 42 | Ни тот ни другой не умеют бэкапить все базы, с пропуском нескольких. 43 | Например, бэкап всех баз на MySQL сервере, кроме ненужной гигобайтовой базы 44 | словоформ для поисковика. fsbackup же опирается на три кита: полный бэкап 45 | всех баз, бэкап только указанных в backup_db_list баз данных и бэкап всех 46 | баз, кроме указанных в backup_db_list. Начиная с версии 1.2 fsbackup умеет 47 | производить бэкап (или исключать из бэкапа) не только отдельные базы, но 48 | и таблицы. 49 | 50 | ------------------------------------------------------------------------------- 51 | Как наиболее грамотно организовать бэкап сервера и большим объемом данных ? 52 | 53 | Рекомендуется, описать бэкап разных участков файловой системы в нескольких 54 | файлах конфигурации. 55 | Например, создать следующие конфигурации: 56 | server_etc.conf - описывает создание бэкапа директории /etc и секретных 57 | данных с использованием PGP шифрования; 58 | server_local.conf - бэкап /usr/local, за исключением временных файлов. 59 | server_sql.conf - бэкап БД. 60 | server_home.conf - бэкап директорий пользователей (/home или /usr/home) 61 | server_soft.conf - бэкап архива программ (без сжатия) 62 | 63 | Внимание, директории для сохранения бэкапа в каждом конфигурационном файле 64 | должны отличаться ($cfg_remote_path, $cfg_local_path), сохранение в одной и 65 | той же директории нескольких, описанных разными .conf файлами, бэкапов не 66 | допустимо. 67 | 68 | ------------------------------------------------------------------------------- 69 | Почему при указании переменной $cfg_maximum_archive_size=100, несжатые 70 | тома архива оказываются размером немного больше или меньше 100 Кб ? 71 | 72 | Переменная $cfg_maximum_archive_size учитывает реальный размер данных 73 | в файлах плюс примерный размер атрибутов файла или директории. При этом 74 | том завершается когда значение счетчика байт больше указанного в 75 | конфигурации значения. Например, если последним добавляется файл размером 70Кб 76 | и размер уже скомпонованного тома равен 90 Кб, то будет создан архивный 77 | файл размером 90 Кб, а файл размером 70 Кб. будет помещен в следующий том. 78 | Т.е. система старается создавать архивные тома размером чуть меньше, чем 79 | размер указанный в файле конфигурации, за исключением случая наличия файла 80 | размер которого больше лимита накладываемого на размер тома, в этом случае 81 | файл целиком помещается в архивный том, несмотря на его большой размер. 82 | Предотвратить создание архивных томов не помещающихся на накопитель, 83 | используемый для резервирования, можно определив максимально возможный 84 | размер файла для помещения в архив ($cfg_size_limit). 85 | 86 | ------------------------------------------------------------------------------- 87 | Как мне не архивировать файлы из таких - то каталогов, причем сами каталоги 88 | должны быть. Например, почтовые каталоги qmail, задаю маску: =!Maildir/cur/* 89 | в результате не создает в архиве каталогов cur в профилях пользователя. 90 | 91 | Достаточно указать: 92 | =!.*/Maildir/new/.* 93 | тогда все файлы внутри /Maildir/new/ не будут помещены в архив, а директория 94 | будет добавлена в .dir файл и при восстановлении будет воссоздана. В tar архив 95 | пустые директории не помещаются, только в .dir список. 96 | 97 | ------------------------------------------------------------------------------- 98 | Почему fsbackup не делает backup каталогов, если в них нет файлов ? 99 | 100 | Пустые каталоги просто не отражены в tar архиве (ровно как и права доступа 101 | на все каталоги). Для хранения полного списка каталогов и прав доступа к ним, 102 | используется .dir файл, выполненный в виде обычного shell сценария. При 103 | восстановлении данных из backup, необходимо не только раскрыть .tar архив, но 104 | и выполнить .dir сценарий. 105 | 106 | ------------------------------------------------------------------------------- 107 | Что можете порекомендовать для бэкапа нескольких серверов ? 108 | 109 | - Выделить старую машину с большим диском под backup-сервер. 110 | - Вынести backup-сервер с тех. площадки, рекомендуется в другое здание 111 | (например в удаленный офис), на случай пожара, грабежа и других 112 | форс-мажорных обстоятельств. Или периодически скидывать бэкапы с 113 | backup-сервера на переносной носитель (лента, CDROM и т.д.) и уносить 114 | домой. 115 | - Рекомендую производить бэкап по FTP, при грамотной организации, не менее 116 | безопасно, чем по SSH (при использовании PGP шифрования бэкапа и 117 | предотвращении возможности сниффинга), а главное более быстрый и 118 | менее ресурсоемкий способ. 119 | - На каждом из серверов, с которых будет производится бэкап, разграничить 120 | области файловой системы в зависимости от важности и объема данных. 121 | Каждую область описать в отдельном файле конфигурации (см. вопросы выше). 122 | Для самых важных данных (например, файлы паролей, секретная информация 123 | представляющая коммерческую тайну и т.д.), используйте PGP шифрование. 124 | Для текстовых данных большого объема и не требующих частого поднятия из 125 | бэкапа - используйте gzip сжатие. Если потребность в доступе к данным 126 | в бэкапе велика, можно ограничиться обычным tar архивом без сжатия. 127 | - Настроить ftp-сервер с доступом только c хостов с которых производится 128 | бэкап (например, через /etc/hosts.allow) и закрытым для внешнего мира. 129 | В конфигурации ftp сервера запретите выход за пределы домашней 130 | директории (/etc/ftpchroot). Дополнительно, через crontab, пропишите 131 | еженедельное дублирование резервной копии на бэкап-сервере на 132 | соседний диск (резервирование бэкапа). 133 | 134 | ------------------------------------------------------------------------------- 135 | Почему при создании бэкапа по FTP скрипт бэкапа "зависает" или вываливается по 136 | таймауту ? FTP сервер (windows, nowell netware) на первый взгляд работает. 137 | 138 | Некоторые ftp сервера или настройки фаервола не позволяют использовать 139 | активный режим FTP соединения, применяемый по умолчанию. Установите 140 | $cfg_remote_ftp_mode=1 в файле конфигурации. 141 | 142 | ------------------------------------------------------------------------------- 143 | Не получается создать бэкап с использованием pgp-шифрования. 144 | На удаленной и локальной машине создал\экспортировал\импортировал ключи так, 145 | как написано в README на локальной машине (с которой сливается бэкап) 146 | gpg --list-secret-key выдает: 147 | pub 1024D/06E192F6 2002-08-20 Aleksey 148 | sub 1024g/C3750174 2002-08-20 149 | А когда запускаю fsbackup картина следующая: 150 | PGP: enabled 151 | ...... 152 | gpg: backup: skipped: public key not found 153 | gpg: [stdin]: encryption failed: public key not found 154 | 155 | 156 | Судя по всему ваш ключ назван "Aleksey", а в файле конфигурации 157 | (директива конфигурации $cfg_pgp_userid) в качестве имени публичного ключа 158 | указан "backup". Еще одна частая ошибка - забывают заверить публичный ключ 159 | (подписать, gpg --sign-key) на машине где производится бэкап. 160 | 161 | ------------------------------------------------------------------------------- 162 | Как посмотреть размер файлов и атрибутов помещенных в архив ? 163 | Архив получился слишком большой, нужно выяснить из-за какого файла так вырос 164 | размер. 165 | 166 | db_dump .hash 167 | db_dump185 .hash 168 | db2_dump .hash 169 | 170 | ------------------------------------------------------------------------------- 171 | Почему в архив не помещаются файлы примонтированных через samba или netware дисков. 172 | 173 | Попробуйте поместить в fsbackup.pl, после "use File::Find;" строку: 174 | 175 | $File::Find::dont_use_nlink = 1; 176 | 177 | 178 | ------------------------------------------------------------------------------- 179 | Можно ли реализовать через fsbackup архив файлов конфигурации. Т.е. бэкапить не 180 | раз в день, а допустим проверять раз в 5 минут и если есть изменения делать 181 | бэкап отражая в имени файла время изменения, в противном случае ничего не трогать ? 182 | 183 | Настройте работу в режиме инкрементального бэкапа и укажите заведомо большое 184 | число итераций (например, $cfg_increment_level=99999). 185 | fsbackup, если нет изменений по сравнению с прошлым инкрементом, сругается, 186 | что бэкапить нечего и не будет создавать лишних файлов. 187 | 188 | 189 | ------------------------------------------------------------------------------- 190 | Если задать бэкап по /, будут ли помещены в бэкап все примонтированные 191 | файловые системы ? 192 | 193 | Нет, нужно перечислить в конфигурации все точки монитрования. 194 | 195 | ------------------------------------------------------------------------------- 196 | На одной машине невозможно закачать по FTP архив (разбитый на тома по 800Мб) 197 | суммарным размером больше 2 Гб. 198 | 199 | Обновите версию perl модуля Net::FTP. 200 | 201 | 202 | ------------------------------------------------------------------------------- 203 | Почему файл с именем /tmp/test/c:\trace_b.txt не помещается в архив, пишет: 204 | /bin/tar: tmp/test/c\:\trace_b.txt: Cannot stat: No such file or direct 205 | 206 | Боюсь, что с этим трудно бороться, \t вполне резонно может быть воспринят как 207 | табуляция. Список файлов в tar передается как есть, без экранирования, и уже сам 208 | tar разбирая файл со списком принимает решение об экранировании при помещении в 209 | архив (что видно на примере экранирования ":"). 210 | 211 | Нужно почитать спецификацию на тип используемой вами файловой системы, вполне 212 | вероятно, что символ \ не может быть использован в имени файла. 213 | 214 | 215 | 216 | ------------------------------------------------------------------------------- 217 | fsbackup в сравнении с BackupPC ? 218 | 219 | Насколько я понимаю, это продукты для разных задач. Задача fsbackup 220 | - организовать бэкап только выборочных данных (гибкость задание 221 | масок) используя ftp или ssh, а BackupPC - ведение полного архива 222 | (прежде всего windows машин) на backup сервере на котором 223 | установлено специальное серверное ПО. Для Web-интерфейса BackupPC 224 | нужен suidperl, что не безопасно. И главное: fsbackup работает на 225 | стороне клиента (отправка с клиента на сервер бэкапа), а BackupPC 226 | на стороне сервера (сервер инициирует процесс бэкапа, на клиенте 227 | софт не устанавливается (rsync или tar через ssh/rsh/nfs), т.е. 228 | получив доступ к серверу бэкапа - автоматически получает полный 229 | доступ ко всем клиентам). 230 | 231 | ------------------------------------------------------------------------------- 232 | Хочу исключить из бэкапа файлы находящиеся в директории /etc/tinydns/log/main/. 233 | Использую правило "f!/etc/tinydns/log/main/.*", но файлы все равно помещаются 234 | в бэкап. 235 | 236 | "f[~!]" - маска только для имени файла, без директории, "d[~!]" - маска только 237 | для директории, '=[~!]' - маска для пути, '!' - исключение пути (не маска). 238 | 239 | Например, есть файл "/dir/file.txt". "f" видит только "file.txt", "d" видит только 240 | "/dir", а "=" видит "/dir/file.txt". 241 | 242 | Примеры правильного решения: 243 | !/etc/tinydns/log/main 244 | =!/etc/tinydns/log/main/.* 245 | 246 | ------------------------------------------------------------------------------- 247 | При создании архива с PGP-шифрованием из cron создаётся пустой tar (0 байт), почему? 248 | 249 | Опишу Вам для информации (может быть пригодится для FAQ) решение моей 250 | проблемы с шифрованием архива gpg по запуску из cron. 251 | Заметил что в корне системы есть папка .gnupg (теор. не должно быть ?) с 252 | пустым pubring. Переделал её в ссылку на ~/.gnupg, после чего файлы 253 | стали нормально создаваться (не пустые). 254 | Вывод: gpg, запускаемая cron из скрипта, не может обратиться к рутовой 255 | pubring, а обращается к корневой (общей ?). 256 | 257 | ------------------------------------------------------------------------------- 258 | install.pl ругается при установке одного из Perl модулей под AltLinux Master 2.4 259 | 260 | В комплекте идут старые версии необходимых perl модулей, поэтому 261 | рекомендуется перед запуском скрипта установки, вручную становить 262 | более новые версии всех модулей: 263 | 264 | File::Find - входит в базовую поставку Perl (perl-base) 265 | Digest::MD5 - входит в базовую поставку Perl (perl-base) или в пакет perl-Digest-MD5 266 | Net::FTP - пакет perl-libnet 267 | DB_File - пакет perl-DBM 268 | 269 | ------------------------------------------------------------------------------- 270 | Если я указываю параметр config_files="cfg_files1 cfg_files2", 271 | то делается backup по конфигу cfg_files1 и скрипт висит не выполняя ни 272 | каких действий(backup cfg_files2 не выполняется). Если отдельно 273 | прописывать по одному эти файлы конфигурации, то все ок. 274 | 275 | В скрипте create_backup.sh между запусками fsbackup стоит задержка в 10 276 | минут. Закомментируйте строку "sleep 600" в конце файла. 277 | 278 | ------------------------------------------------------------------------------- 279 | Можно ли исключать MySQL таблицы из бэкапа по маске. Имена "tbl_01_2007" (по датам). 280 | 281 | 282 | В скрипте mysql_backup.sh для определения факта исключения используется 283 | строка: 284 | 285 | if [ "_$cur_ignore" = "_$cur_db:$cur_db_table" ]; then 286 | 287 | можно попробовать заменить ее например на 288 | 289 | grep_flag2=`echo "$cur_ignore"| grep -E "$cur_db:$cur_db_table"` 290 | if [ -n "$grep_flag2" ]; then 291 | 292 | Параметры задать как: 293 | backup_db_list='base2:tbl_[0-9][0-9]_20[0-9][0-9]' 294 | 295 | ------------------------------------------------------------------------------- 296 | Восстановление полного бэкапа всей системы в корень. Установил минимальный вариант FreeBSD. 297 | Явно указываю в /scripts/fsrestore.sh название моего бэкапа; место, где его брать и место, 298 | куда класть потом ("/"). Уже присутствующие файлы не заменяются новыми. 299 | Подозреваю, что не получается восстановиться именно потому, что я ведь загрузил систему freebsd. 300 | Корень её считается "/". И развернуть fsbackup пытается тоже в "/". Получается, что он пытается 301 | перезаписать файлы, которые банально открыты системой и у него не получается. 302 | 303 | Суть восстановления сводится к команде "tar -xpzf arc.tar.gz -C restore_path" 304 | и запуску .dir файлов как shell скриптов. 305 | 306 | Я не уверен, что вашем tar нет защиты от перетирания существующих 307 | файлов (в BSD tar нужно указывать опцию "-U") (не удивлюсь если в 308 | некоторых Linux дистрибутивах в пакет с tar включены патчи для защиты от 309 | раскрытия архива в корень). Попробуйте добавить в строку вызова tar в 310 | скрипте fsrestore.sh добавить опцию -U, например "tar -xpUzf". 311 | 312 | Но я бы восстановил бэкап в /var/backup, а потом аккуратно перенес 313 | оттуда частями в корень (не перенося /bin, /sbin и прочие уже 314 | установленные системные файлы). 315 | 316 | Самый правильный вариант - загрузиться с LiveCD (например штатный 317 | FreeBSD resque или Frenzy), разбить и отформатировать дисковые разделы 318 | руками, примонтировать в /mnt, скачать туда по ftp fsrestore.sh и архивы бэкапа, 319 | а затем запустить восстановление в /mnt. 320 | 321 | ------------------------------------------------------------------------------- 322 | Может ли fsbackup на FTP скопировать файлы не одним архивом, а по отдельности 323 | без архивирования. 324 | 325 | Возможно режим синхронизации можно для этого использовать, но он работает 326 | через ssh, так как по сути тот же tar передает, но только с раскрытием 327 | на удаленной стороне. 328 | 329 | На первый взгляд, я бы сделал копирование одним файлом, но на удаленной 330 | стороне в cron повесил скрипт, который бы следил за появлением новых 331 | файлов или обновлением существующих и затем разархивировал что нужно. 332 | 333 | Если просто синхронизировать нужно группу файлов, то лучше 334 | использовать rsync. fsbackup для синхронизации подходит только в 335 | ограниченных случаях, когда нужна особенно большая гибкость в выборе 336 | файлов или есть необходимость подключить свой обработчик копирования 337 | или фильтр. 338 | 339 | ------------------------------------------------------------------------------- 340 | Почему fsbackup не работает с tar из состава OpenBSD ? 341 | 342 | Для OpenBSD tar необходимо использовать вместо ключа -T ключ -l. 343 | Замените все строки "$prog_tar -c -f - -T" в fsbackup.pl на 344 | "$prog_tar -c -f - -l ". 345 | 346 | ------------------------------------------------------------------------------- 347 | После запуска скрипта для бэкапа СУБД, дамп базы оставляются локально, 348 | т.е. получается, что директории с дампом нужно дополнительно указывать 349 | в конфигурации fsbackup.pl для загрузки на удаленный сервер бэкапа ? 350 | 351 | Да, конечно. По умолчанию дампы в директорию fsbackup/sys_backup складываются, 352 | и бэкапятся вместе с fsbackup. В конфиге явно должно быть: 353 | __DATA__ 354 | ... 355 | /usr/local/fsbackup/sys_backup 356 | или 357 | /usr/local/fsbackup 358 | 359 | ------------------------------------------------------------------------------- 360 | При запуске ./fsbackup.pl my_cfg выдает ошибку: 361 | "my_cfg did not return a true value at ./fsbackup.pl line 78" 362 | В чем может быть проблема ? 363 | 364 | Посмотрите пример конфигурации, там чуть раньше блока __DATA__, есть 365 | строка "1;". В вашем конфигурационном файле, она, судя по всему, удалена. 366 | 367 | ------------------------------------------------------------------------------- 368 | Можно ли сделать, так чтоб бекап mysql вместе с остальными данными 369 | копировался по сети, а не сохранялся в катологе sys_backup ? 370 | 371 | Подразумевается, что каталог sys_backup должен быть включен в бэкап копируемый по сети, 372 | если вы конечно строку из примера файла конфигурации не удалили. 373 | Т.е. резервирование баз проходит в два этапа: 374 | 1. Помещаем дамп базы в sys_backup 375 | 2. Копируем содержимое sys_backup на сервер бэкапов. 376 | По моему опыту, чаще всего на сервере с СУД требуется последняя версия дампа 377 | базы, поэтому он и оставляется на локалньой машине. 378 | 379 | ------------------------------------------------------------------------------- 380 | Поддерживает ли fsbackup ACL и сохранение данных о расширенных атрибутах ФС ? 381 | 382 | Поддерживает ровно настолько, насколько их поддерживает tar, 383 | установленный в вашей системе. Все операции по архивированию выполняются 384 | через вызов программы tar. Из альтернативных реализаций tar, star точно 385 | поддерживает ACL. 386 | 387 | ------------------------------------------------------------------------------- 388 | Как сохранять в архиве директории с исключённым содержимым? 389 | 390 | Как вариант исключать не через !/dir/, а через более мягкий оператор 391 | исключения "d!/dir/.*". При этом исключенные директории будут учтены в 392 | .dir файле. Другой вариант, использовать contrib/dir_sync. 393 | 394 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | FSBACKUP - file system backup and synchronization utility. 2 | 3 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY WARRANTIES * 4 | 5 | For english documentation type 'perldoc fsbackip.pl' 6 | 7 | --------------------------------------------------------------------------- 8 | 9 | FSBACKUP - система инкрементального резервного копирования и синхронизации ФС. 10 | http://www.opennet.ru/dev/fsbackup/ 11 | 12 | По всем вопросам обращайтесь к автору: Maxim Chirkov 13 | 14 | --------------------------------------------------------------------------- 15 | СОДЕРЖАНИЕ: 16 | Назначение. 17 | Комплект поставки. 18 | Выполняемые функции. 19 | Установка. 20 | Файл конфигурации. 21 | Восстановление данных. 22 | Виды бэкапа. 23 | Типы хранилища для архива бэкапа. 24 | Шифрование бэкапа. 25 | Благодарности. 26 | 27 | --------------------------------------------------------------------------- 28 | Назначение: 29 | 30 | Система fsbackup была создана для обеспечения резервного копирования серверов 31 | разного масштаба на специально отведенном сервере бэкапа. 32 | 33 | Достоинствами метода резервного копирования на специально отведенном сервере, 34 | с использованием fsbackup, является: 35 | - высокая производительность (скорость передачи по 100Мбит сети намного 36 | выше скорости записи на ленточный накопитель), низкая себестоимость 37 | (цена Мб на современных жестких IDE дисках достаточно низкая); 38 | 39 | - надежность (возможность параллельного хранения нескольких резервных 40 | копий за разные моменты времени); 41 | 42 | - безопасность (применение PGP шифрования резервных копий перед записью на 43 | бэкап сервер); 44 | 45 | - автономность (один раз настроив систему бэкап будет производится 46 | автоматически, не нужно обслуживать стриммер), 47 | 48 | - возможность сохранения только измененных с последнего бэкапа данных, без 49 | затрат на копирования не изменившейся информации. 50 | 51 | - простота настройки и установки (как правило система способна 52 | функционировать сразу после запуска инсталляционного скрипта) 53 | 54 | - простота восстановления (открытый формат для хранения резервных копий 55 | (tar), позволяет восстановить данные без использования входящих в 56 | комплект утилит восстановления). 57 | 58 | - гибкость задания масок для помещения файлов и каталогов в архив. 59 | 60 | - поддержка бэкапа баз данных хранимых в MySQL и PostgreSQL. 61 | 62 | fsbackup может выполнять создание как полного образа сервера, так и резервных 63 | копий основных подсистем, исключая операционную систему. В случае полного бэкапа, 64 | полное восстановление работоспособности происходит в течении нескольких десятков 65 | минут, в случае частичного бэкапа для восстановления требуется несколько часов. 66 | 67 | В отличие от многих систем автоматического резервного копирования, в fsbackup 68 | применяется гибкая система построения масок (с использованием regex) для 69 | принятия решения о помещении файлов в бэкап. 70 | 71 | 72 | --------------------------------------------------------------------------- 73 | Комплект поставки: 74 | 75 | create_backup.sh 76 | Скрипт для периодического запуска всей подсистемы резервного 77 | копирования из crontab. 78 | 79 | install.pl 80 | Скрипт для установки программы и всех недостающих Perl модулей. 81 | 82 | fsbackup.pl 83 | Основной скрипт для бэкапа и синхронизации. 84 | 85 | cfg_example 86 | Пример файла конфигурации и документация по всем конфигурационным 87 | директивам. 88 | 89 | cache/ 90 | Образ директории для помещения временных хэшей. 91 | 92 | sys_backup/ 93 | Образ директории для помещения бэкапов созданных sysbackup.sh. 94 | 95 | modules/ 96 | Perl модули которые требуются для функционирования fsbackup.pl. 97 | 98 | scripts/ 99 | Директория со вспомогательными скриптами. 100 | 101 | scripts/mysql_backup.sh 102 | scripts/pgsql_backup.sh 103 | Скрипты для создания полного и частичного бэкапа базы данных 104 | хранимой в PostgreSQL или MySQL. 105 | Поддерживаются режимы работы: 106 | 1. полный бэкап всех баз и структур; 107 | 2. полный бэкап структур всех баз + бэкап данных в избранных базах/таблицах; 108 | 3. полный бэкап структур всех баз + бэкап данных во всех базах, 109 | кроме избранных баз/таблиц; 110 | 111 | scripts/sysbackup.sh 112 | Скрипт для сохранения списка всех установленных в системе пакетов 113 | для FreeBSD и Linux, для Linux использующих rpm - сохранение файлов 114 | конфигурации всех установленных в системе пакетов. 115 | 116 | scripts/sysrestore.sh 117 | Скрипт для автоматической установки всех пакетов, список которых 118 | был сохранен скриптом sysbackup.sh, в свеже-установленной системе. 119 | 120 | scripts/fsrestore.sh 121 | Скрипт для восстановления данных из инкрементального бэкапа. 122 | 123 | --------------------------------------------------------------------------- 124 | Выполняемые функции: 125 | 126 | - 2 метода вычисления контрольных сумм: 127 | timesize - по атрибутам (дата, время, размер, права доступа...) 128 | md5 - по содержимому файла. 129 | 130 | - 4 вида бэкапа: 131 | backup - инкрементальный бэкап в архив (т.е. копируются только 132 | изменившиеся с момента последнего бэкапа файлы). 133 | full_backup - полный бэкап в архив, без хэша (т.е. всегда копируются 134 | все файлы). 135 | sync - синхронизация дерева. 136 | hash - только генерация хэша, без помещения файлов в архив (может 137 | использоваться для определения какие файлы были изменены) 138 | 139 | - 3 типа хранилища бэкапа: 140 | local - хранение бэкапа в локальной файловой системе. 141 | remote_ssh - копирование бэкапа на удаленную машину с использованием SSH 142 | remote_ftp - копирование бэкапа на удаленную машину по FTP. 143 | 144 | - 8 встроенных операторов (можно использовать regex) для описания 145 | помещаемых в бэкап (или игнорируемых для помещения в бэкап) файлов: 146 | /dir[/file] - путь к файлу/директории для бэкапа. 147 | !/dir[/file] - отрицание пути, не помещать в бэкап (не маска, а реальный путь). 148 | # - комментарий 149 | =~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ. 150 | f~ - маска для файла. Первый или второй символ. 151 | d~ - маска для директории. Первый или второй символ. 152 | =! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ. 153 | f! - "НЕ" маска для файла. Первый или второй символ. 154 | d! - "НЕ" маска для директории. Первый или второй символ. 155 | Ограничен по времени создания и размеру 156 | 157 | - Возможность шифрования бэкапа с помощью PGP. 158 | 159 | - Гибкое задание уровня инкрементальности. Например, при = 7 - 6 раз 160 | будут помещаться только изменения, на 7 раз бэкап будет объединен в 161 | один файл. 162 | 163 | - Скрипт для сохранения списка всех установленных в системе пакетов 164 | для FreeBSD и Linux. 165 | 166 | - Скрипты для создания полного и частичного бэкапа базы данных 167 | хранимой в PostgreSQL или MySQL. Поддерживаются режимы работы: 168 | - полный бэкап всех баз и структур; 169 | - полный бэкап структур всех баз + бэкап данных в избранных базах; 170 | - полный бэкап структур всех баз + бэкап данных во всех базах, 171 | кроме избранных баз; 172 | 173 | 174 | --------------------------------------------------------------------------- 175 | Установка: 176 | 177 | Для установки достаточно запустить скрипт ./install.pl 178 | Программа автоматически скопируется в заданный директивой --prefix каталог, 179 | по умолчанию установка производится в каталог /usr/local/fsbackup. 180 | 181 | После установки достаточно переименовать и отредактировать файл конфигурации 182 | cfg_example, следуя приведенным внутри cfg_example инструкциям. 183 | Затем, отредактируйте скрипт запуска "create_backup.sh", при необходимости 184 | измените путь к хранилищу бэкапа и название список используемых файлов 185 | конфигурации. 186 | Активируйте периодический запуск подсистема бэкапа в crontab: 187 | 18 4 * * * /usr/local/fsbackup/create_backup.sh| mail -s"`uname -n` backup report" root 188 | При использовании бэкапа SQL сервера или системы отредактируйте скрипты 189 | в директории ./scripts (mysql_backup.sh, pgsql_backup.sh, sysbackup.sh). 190 | 191 | Например: 192 | >su 193 | # ./install.pl 194 | # cd /usr/local/fsbackup 195 | # vi cfg_example 196 | # mv cfg_example server_backup.conf 197 | # vi create_backup.sh 198 | # crontab -e 199 | # cd scripts 200 | # vi sysbackup.sh 201 | # vi pgsql_backup.sh 202 | # exit 203 | > 204 | 205 | -------------------------------------------------------------------------- 206 | Файл конфигурации: 207 | 208 | Подробное описание всех параметров файла конфигурации смотрите в файле 209 | cfg_example. 210 | 211 | Внимание, при описании директорий для бэкапа нельзя указывать путь к символической 212 | ссылке, только полный путь к реальной директории. Например, если указано 213 | /home, а это символическая ссылка на /usr/home, то в бэкап будет помещены 214 | данные о символической ссылке, а не содержание директории. 215 | 216 | Рекомендуется, описать бэкап разных участков файловой системы в нескольких 217 | файлах конфигурации. Например, мной используется следующие несколько файлов 218 | конфигурации: 219 | server_etc.conf - описывает создание бэкапа директории /etc и секретных 220 | данных с использованием PGP шифрования; 221 | server_local.conf - бэкап /usr/local, за исключением временных файлов, 222 | бэкап БД. 223 | server_home.conf - бэкап директорий пользователей (/home или /usr/home) 224 | 225 | Внимание, директории для сохранения бэкапа в каждом конфигурационном файле 226 | должны отличаться ($cfg_remote_path, $cfg_local_path), сохранение в одной и 227 | той же директории нескольких, описанных разными .conf файлами, бэкапов не 228 | допустимо. 229 | 230 | --------------------------------------------------------------------------- 231 | Восстановление данных: 232 | 233 | Полная резервная копия может быть восстановлена в короткий промежуток времени 234 | без использования дополнительных, входящих в комплект fsbackup утилит. 235 | Например, если архив бэкапа сохранен в директории /mnt/full_backup, для полного 236 | восстановления достаточно набрать: 237 | # cd / 238 | # tar xzf /mnt/full_backup/full_backup.tar.gz 239 | # sh /mnt/full_backup/full_backup.dir 240 | 241 | Для полного восстановления данных из инкрементального бэкапа может 242 | использоваться скрипт scripts/fsrestore.sh, для восстановления просто 243 | отредактируйте пути внутри скрипта и запустите его. 244 | 245 | В случае частичного бэкапа файловой системы, без бэкапа файлов операционный 246 | системы, восстановить исходный набор установленных в момент бэкапа пакетов 247 | (должен быть разрешен запуск scripts/sysbackup.sh в create_backup.sh) поможет 248 | скрипт scripts/sysrestore.sh. После установки ОС, скрипт автоматически 249 | установит недостающие пакеты для FreeBSD и Linux. 250 | 251 | При бэкапе данных с SQL сервера PostgreSQL или Mysql, восстановление производится 252 | командами: psql -d template1 -f sqlbackupfile или mysql < sqlbackupfile. 253 | 254 | Таким образом можно привести типовой процесс полного восстановления системы: 255 | - базовая установка ОС (без дополнительных пакетов) 256 | - монтирование диска с бэкапом. 257 | - редактирование путей и запуск scripts/sysrestore.sh для установки нужных 258 | пакетов. 259 | - редактирование путей и запуск scripts/fsrestore.sh 260 | - запуск SQL сервера и восстановление баз. 261 | 262 | 263 | Назначение файлов при инкрементальном бэкапе (для не инкрементального - формат 264 | "имя.ext"): 265 | имя-время-том.tar.gz архив - бэкапа 266 | (имя_бэкапа-YYYY.MM.DD.HH.MM.SS-номер_тома.tar.gz). 267 | имя-время.del список удаленных с момента предыдущего бэкапа файлов 268 | имя-время.hash хэш таблица с контрольными суммами. 269 | имя-время.list список файлов в архиве. 270 | имя-время.dir команды для восстановления прав доступа и пустых директорий. 271 | 272 | 273 | --------------------------------------------------------------------------- 274 | Виды бэкапа: 275 | 276 | 277 | Вид бэкапа в файле конфигурации определяется параметром $cfg_backup_style: 278 | backup - инкрементальный бэкап в архив. Копируются только 279 | изменившиеся с момента последнего бэкапа файлы, уровень 280 | инкрементальности задается параметром $cfg_increment_level, 281 | параметр определяет через какого числа итераций файлы с 282 | инкрементальными копиями будут объединены в один файл. Например, 283 | при $cfg_increment_level = 7 - 6 раз будут помещаться только 284 | изменения, на 7 раз бэкап будет объединен в один файл. 285 | 0 - сколько угодно раз, без объединения. Достоинства - возможность 286 | отследить изменения (и восстановить данные) на любой момент со 287 | времени первой итерации, в архив копируются только измененные и 288 | новые данные, что значительно экономит трафик и место на диске. 289 | Подходит для ежедневного бэкапа динамично меняющейся или критичной 290 | к потере информации. 291 | 292 | full_backup - полный бэкап в архив, без хэша. В бэкап всегда помещаются 293 | все файлы отмеченные в файле конфигурации для резервного 294 | копирования). На сервере где сохраняется бэкап рекомендуется 295 | проводить вторичное резервирование, например, в crontab раз 296 | в неделю дублировать бэкап в другую директорию. Недостатки - 297 | огромный трафик для копирования бэкапа по сети и высокие 298 | требования к объему хранилища бэкапа. Достоинство - экономия 299 | процессорных ресурсов и памяти на создание и поддерживание хэша. 300 | Прекрасно подходит для бэкапа маломощных машин с ограниченными 301 | ресурсами или при статичности резервируемых данных (например, 302 | бэкап выносных рутеров раз в месяц). 303 | 304 | sync - синхронизация дерева (только для типа хранилища ssh или local). 305 | Почти то же, что и full_backup или backup (в зависимости от задания 306 | ключа -c при запуске fsbackup.pl), за исключением того, что копия 307 | не хранится в архиве, а область файловой системы отмеченная для 308 | бэкапа полностью воссоздается в заданной директории на бэкап сервере. 309 | Предназначено для параллельного хранения (синхронизации дерева) 310 | исходных текстов, содержимого web-сервера, синхронизации проектов 311 | с рабочей машины разработчика на сервер и т.д. 312 | 313 | hash - только генерация хэша, без помещения файлов в архив (опция -h). 314 | Может применяться для пометки помещения файлов в бэкап, без 315 | физического их перемещения, для отслеживания изменений в файловой 316 | системе для обнаружения подмены файлов злоумышленниками и т.д. 317 | 318 | 319 | Скрипт fsbackup.pl, поддерживает ряд ключей задаваемых в командной строке: 320 | fsbackup.pl [-n|-f|-h|-c] файл_конфигурации 321 | -n - создаем новый архив независимо от состояния хэша. 322 | -f - full_backup - полный бэкап в архив, без хэша. 323 | -h - hash - только генерация хэша, без помещения файлов в архив. 324 | -c - clean - очистка хранилища с инкрементальным бэкапом и создание 325 | нового бэкапа. 326 | 327 | --------------------------------------------------------------------------- 328 | Типы хранилища для архива бэкапа: 329 | 330 | Определение типа хранилища для бэкапа определяется в файле конфигурации 331 | переменной $cfg_type. Поддерживается 3 типа хранилищ: local, remote_ssh 332 | и remote_ftp. 333 | 334 | - local - сохранение бэкапа в локальной файловой системе. 335 | Конфигурация: 336 | $cfg_type="local"; 337 | $cfg_local_path="/var/backup"; # Путь к хранилищу. 338 | 339 | - remote_ssh - сохранение бэкапа на удаленном компьютере, данные передаются 340 | через шифрованное соединение организованное с использованием SSH. 341 | На системе с которой производится бэкап должен быть установлен ssh клиент, 342 | на удаленном - ssh сервер. Метод remote_ssh является наиболее защищенным, 343 | но и достаточно ресурсоемким. Предварительно необходимо настроить доступ 344 | бэкап клиента на сервер с использованием шифрованных ключей, без ввода 345 | пароля. Это делается следующим образом: 346 | 347 | Примем: локальная машина - машина с которой будет производиться бэкап и 348 | на которой будем запускать скрипт fsbackup.pl. Удаленная машина - машина 349 | на которую будут копироваться файлы с бэкапом. 350 | Запускаем на локальной машине программу ssh-keygen, на все задаваемые 351 | вопросы принимаем значения по умолчанию (поле passphrase оставляем 352 | пустым). Далее, запускаем программу ssh-copy-id user@remotehost, где 353 | user - пользователь удаленной машины remotehost - адрес удаленной машины, 354 | ( или вручную, на удаленной машине в директории ~/.ssh, создаем файл 355 | authorized_keys, куда копируем содержимое файла identity.pub с локальной 356 | машины). Для увеличения безопасности в файл ~/.ssh/authorized_keys на 357 | удаленной машине добавляем перед ключом (разделив пробелом) строку 358 | from="localhost", где localhost - адрес локальной машины 359 | (from="localhost" 1024 23 1343.....). 360 | 361 | Конфигурация: 362 | 363 | $cfg_type="remote_ssh"; 364 | $cfg_remote_host="server.remote.ru"; # Сервер на который будет копироваться бэкап. 365 | $cfg_remote_login="backup_login"; # Логин под которым будет сохранятся бэкап. 366 | $cfg_remote_path="/home/backup_login/backup"; # Директория куда должны помещаться файлы бэкапа, директория должна присутствовать. 367 | 368 | - remote_ftp - сохранение бэкапа на удаленном компьютере, данные передаются 369 | по протоколу ftp, на удаленном хосте должен быть запущен ftp сервер. 370 | Так как пароль хранится в файле конфигурации в открытом виде, желательно 371 | ограничить доступ к хосту к удаленному хосту через tcpwrapper или firewall, 372 | а так же ограничить вход пользователя, под которым будет храниться бэкап, 373 | только через chroot ftp. Положительными сторонами копирования по ftp, 374 | является высокая производительность закачки и небольшая нагрузка на CPU. 375 | 376 | Конфигурация: 377 | 378 | $cfg_type="remote_ftp"; 379 | $cfg_remote_host="server.remote.ru"; # Сервер на который будет копироваться бэкап. 380 | $cfg_remote_password="Test1234"; # пароль для входа по ftp. 381 | $cfg_remote_login="backup_login"; # Логин под которым будет сохранятся бэкап. 382 | $cfg_remote_path="/home/backup_login/backup"; # Директория куда должны помещаться файлы бэкапа, директория должна присутствовать. 383 | $cfg_remote_ftp_mode=0; # Active (0) или Passive (1) соединение. 384 | 385 | --------------------------------------------------------------------------- 386 | Шифрование бэкапа: 387 | 388 | Для шифрования бэкапа в системе должна быть установлена программа PGP шифрования 389 | GnuPG: http://www.gnupg.org (рекомендуется) или PGP: http://www.pgpi.org 390 | 391 | Далее: 392 | Локальная машина - машина на которой производится резервное копирование. 393 | Удаленная машина - машина куда сохраняется архив бэкапа. 394 | 395 | Рекомендации по работе с PGP программами для создания шифрованного бэкапа 396 | (для pgp2.6, pgp5.0, gnupg): 397 | 398 | Для создания публичного и секретного ключей наберите (на удаленной машине): 399 | pgp2.6> pgp -kg 400 | pgp5.0> pgpk -g 401 | gnupg> gpg --gen-key # если генерация ключа занимает слишком много времени 402 | воспользуйтесь ключом gpg --quick-random 403 | 404 | Экспортируйте созданный публичный ключ в файл (на удаленной машине): 405 | pgp2.6> pgp -akx <файл куда будет записан ключ> 406 | pgp5.0> pgpk -ax <файл куда будет записан ключ> 407 | gnupg> gpg --export -a > <файл куда будет записан ключ> 408 | 409 | Затем, добавте созданный публичный ключ (на локальной машине): 410 | pgp2.6>pgp -ka <файл с ключом с удаленной машины> 411 | pgp5.0>pgpk -a <файл с ключом с удаленной машины> 412 | gnupg>gpg --import <файл куда будет записан ключ> 413 | # Для pgupg необходимо заверить ключ (gpg --gen-key на локльной машине не забудте): 414 | gnupg>gpg --sign-key <имя ключа> 415 | 416 | Для расшифровки необходимо запустить (на удаленной машине): 417 | pgp2.6>cat encrypted.tar.gz | pgp -f -z'пароль' > расшифрованный.tar.gz 418 | pgp5.0>cat encrypted.tar.gz | pgpv -f -z'пароль' > расшифрованный.tar.gz 419 | gnupg>cat encrypted.tar.gz | gpg --decrypt > расшифрованный.tar.gz 420 | 421 | Для шифрования используется (на локальной машине): 422 | pgp2.6>cat input| pgp -ef userid > output 423 | pgp5.0>cat input| pgpe -f userid > output 424 | gnupg>cat input| gpg -e -r userid > output 425 | 426 | 427 | 428 | --------------------------------------------------------------------------- 429 | Благодарности: 430 | Alex Sokoloff. 431 | - Предложение о введении уровней говорливости (verbose mode). 432 | - Изменить запуск программы (ввести проверку на длину 433 | письма), вынести ее в файл fsbackup.cron. 434 | - Написал небольшой скрипт fsfind.pl для поиска файла в архивах он 435 | просматривает файлы list в директории с архивами. Может кому-то 436 | будет полезен. Работает с локальными архивами. 437 | - скрипт для бэкапа Interbase баз. 438 | 439 | Oleg S. Gints : 440 | - Предложение по введению дополнительного резервирования при 441 | использовании инкрементального бэкапа. 442 | - Обнаружение ошибки в mysql_backup.sh (для варианта полного архива 443 | пропущен ключ --all-databases) 444 | - Сообщение о неправильном определении уровня инкрементальности для 445 | локального бэкапа. 446 | - Замечание об отсутствии лидирующих нулей в новом формате именования 447 | файлов в бэкапе. 448 | 449 | Носков Илья , Сергей Баукин : 450 | - Идея разбивки слишком больших файлов на несколько частей, 451 | предложения и патчи по создания архивов занимающих несколько Гб. 452 | 453 | Aleksey Kuznetsov 454 | - Сообщение о пропуске ключа --all-databases в mysql_backup.sh 455 | 456 | Pavel Stoliarov 457 | - Исправление ошибки приводящей к некорректной работе при локальном 458 | бэкапе. 459 | - Предложение по сохранению старых бэкапов после инкремента. 460 | 461 | Alexandr Zhukov 462 | - Замечание по неправильной работе правила для исключения 463 | директории из бэкапа. 464 | 465 | Zherdev Anatoly 466 | - Патч и идея введения директивы $cfg_stopdir_prune, для отключения 467 | рекурсивного просмотра директорий, запрещаемых для помещения в бэкап. 468 | 469 | Priamikov Alexei 470 | - Обнаружение ошибки в fsrestore.sh 471 | 472 | Valeriy Zavolodko 473 | - Сообщение о недоработке при установке $cfg_root_path отличных от "/". 474 | 475 | Руслан Стельмаченко 476 | - Исправление досадной ошибки в скрипте бэкапа MySQL таблиц. 477 | -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | принять патчи от Juri Bazhenov 2 | 3 | 4 | Ниже список идей, на реализацию которых у меня нет времени. 5 | ---------------------------------------------------------- 6 | 7 | - Для OpenBSD tar вместо ключа -T ключ -l 8 | 9 | - В бэкапе СУБД возможность раздельного сохранения таблиц по отдельным 10 | директориям ($db_dir/$table_file). Скрипт для парсинга единого дампа для 11 | выявления таблицы. 12 | 13 | - При инкрементальном бэкапе хотелось бы видеть в имени файла уровень 14 | бэкапа, а не только дату и время. 15 | 16 | - Транспорт SFTP 17 | 18 | - Локи на момент запуска, на случай если бэкап не будет выполнен за сутки или 19 | встретится проблемный cron демон периодически сходящий с ума (видел такой). 20 | По идее fsbackup будет и так ждать на flock, но лучше сделать красиво. 21 | (в 1.2pl2 добавлена примитивная защита от двойного запуска). 22 | 23 | - Режим полного архива изменений: инкрементальный бэкап с бесконечным числом изменений 24 | и удобной структурой файлов (иерархия директорий /год/месяц/) 25 | 26 | - Отладочный режим, list файл содержащий параметры файла (как для хешей) и код 27 | причины помещения или не помещения файла в бэкап. (размер уже поместил.) 28 | 29 | 30 | - Поддержка bzip2 из коробки. 31 | 32 | - Поддержка solaris, убрать -z ключ из tar (не помню, но похоже давно сделано). 33 | 34 | - Вынос некорых параметров (как пример, размер активного хеша) в конфиг. 35 | 36 | - Возможность задания в конфиге, для одного бэкапа, указывания сразу нескольких 37 | назначений. Вполне вероятно, что люди захотят хранить одну копию бэкапа локально, 38 | а вторую на сервере резервного копирования (через ssh), а еще одну копию через 39 | ftp еще на одном сервере. (сейчас решается созданием нескольких конфигов, 40 | для бэкапа бэкапов) 41 | 42 | - Бэкап в samba mounts, дикектива для разрешения следования по симлинкам 43 | find (\&add_to_backup, $cur_pathitem); 44 | find ({ wanted => \&add_to_backup, follow => 1}, $cur_pathitem); 45 | $File::Find::dont_use_nlink = 1; 46 | 47 | 48 | ------------------------------------------------------- 49 | 50 | -? --quote-names в скрипт бэкапа mysql 51 | 52 | -? в файле бэкапа директорий "mkdir" заменить на "mkdir -p" ? (несовместимо) 53 | 54 | -? воссоздание дерева директорий или одной директории, содержимое 55 | которой не помещается в архив. 56 | 57 | -? Особенности режима синхронизации: если появилась новая пустая 58 | директория и нет новых или измененных файлов, то новая директория не 59 | синхронизируется. Вопрос удаления директорий при синхронизации. 60 | 61 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | 1.2pl4 2 | -------------------------------------------------------------------------------- /cfg_example: -------------------------------------------------------------------------------- 1 | # Example of configuration file. 2 | # Пример файла конфигурации. 3 | # 4 | # http://www.opennet.ru/dev/fsbackup/ 5 | # Copyright (c) 2001 by Maxim Chirkov. 6 | # 7 | 8 | #------------------- 9 | # Name of backup, single word. 10 | # Имя для бэкапа, строка состоящая из латинских букв, цифр и символа подчеркивания. 11 | #------------------- 12 | 13 | $cfg_backup_name = "test_host"; 14 | 15 | 16 | #------------------- 17 | # Path of internal cache directory for local backup method. 18 | # Директория для помещения текущих хэшей для локального метода бэкапа, или 19 | # временных хешей для других методов. 20 | #------------------- 21 | 22 | $cfg_cache_dir = "/usr/local/fsbackup/cache"; 23 | 24 | 25 | #------------------- 26 | # Full path of some external program running from C. 27 | # $prog_gzip = "" - not use compression, $prog_pgp = "" - not use encryption. 28 | # Пути к запускаемым в процессе выполнения бэкапа программам. Рекомендуется 29 | # не полениться и прописать полный путь к каждой программе. 30 | # Внимание ! При использовании шифрования через gpg, рекомендуется 31 | # установить значение $prog_gzip="", так как gpg перед шифрованием сжимает 32 | # данные, использование gzip приведет к двойному сжатию и лишней нагрузке на CPU. 33 | #------------------- 34 | 35 | $prog_md5sum = "md5sum -b"; 36 | $prog_tar = "tar"; 37 | $prog_ssh = "ssh"; 38 | $prog_rm = "rm"; 39 | $prog_gzip = "gzip"; # Если равно "", то не использовать сжатие. 40 | $prog_pgp = "gpg"; # Если равно "", то не применять шифрование. 41 | 42 | 43 | #------------------- 44 | # Checksum method: 45 | # timesize - checksum of file attributes (default, best speed) 46 | # md5 - checksum of file attributes + MD5 checksum of file content. 47 | # Метод вычисления контрольных сумм для определения изменений в файле. 48 | # timesize - учитывается время последнего изменения файла, его размер, 49 | # атрибуты файла, но не учитывается содержимое. Как правило 50 | # учета данных факторов достаточно для определения необходимости 51 | # обновления файла в бэкапе. Наиболее быстрый метод. 52 | # md5 - все параметры timesize + контрольная сумма содержимого 53 | # файла. Наиболее ресурсоемкий и медленный метод. 54 | #------------------- 55 | 56 | $cfg_checksum = "timesize"; 57 | 58 | 59 | #------------------- 60 | # Backup style: 61 | # backup - incremental backup (copy only new and changed files). 62 | # full_backup - full backup (copy all files). 63 | # sync - file tree synchronization. 64 | # hash - hash creation without storing archive (spying for new or changed files). 65 | # Определение типа операции, вида бэкапа. 66 | # backup - инкрементальный бэкап в архив (т.е. копируются только 67 | # изменившиеся с момента последнего бэкапа файлы).. 68 | # full_backup - полный бэкап в архив, без хэша (т.е. всегда копируются 69 | # все файлы). 70 | # sync - синхронизация дерева (только для типа хранилища ssh или local). 71 | # hash - только генерация хэша, без помещения файлов в архив 72 | # (пометка помещения файлов в бэкап, без физического перемещения) 73 | #------------------- 74 | 75 | $cfg_backup_style = "backup"; 76 | 77 | 78 | #------------------- 79 | # Incremental level (after how many incremental copy make full refresh of backup) 80 | # Число копий бэкапа, при инкрементальном бэкапе, после которых производится 81 | # полный бэкап. Например, при = 7 - 6 раз будут помещаться только изменения, 82 | # на 7 раз бэкап будет объединен в один файл. 0 - сколько угодно раз. 83 | #------------------- 84 | 85 | $cfg_increment_level = 7; 86 | 87 | 88 | #------------------- 89 | # Save previous backup to OLD directory before rotation or before storing 90 | # full backup. 91 | # 0 - don't save old backup 92 | # 1 - save old backup. 93 | # Сохранение предыдущей версии полного бэкапа перед инкрементальной ротацией или 94 | # заменой текущего неинкрементального бэкапа новой версией. 95 | # Старая версия помещается в подкаталог OLD. 96 | # 0 - не сохранять предыдущую версию. 97 | # 1 - сохранять предыдущую версию 98 | #------------------- 99 | 100 | $cfg_save_old_backup = 1; 101 | 102 | 103 | #------------------- 104 | # Type of backup storage: 105 | # local - store backup on local file system. 106 | # remote_ssh - store backup on remote host over SSH connection. 107 | # remote_ftp - store backup on remote FTP server. 108 | # Тип хранилища для бэкапа. Описание см. в файле README. 109 | # local - хранение бэкапа в локальной файловой системе. 110 | # remote_ssh - копирование бэкапа на удаленную машину с использованием SSH 111 | # remote_ftp - копирование бэкапа на удаленную машину по FTP 112 | #------------------- 113 | 114 | $cfg_type = "local"; 115 | 116 | 117 | #------------------- 118 | # Connection parameters for remote_ssh storage type. 119 | # Параметры необходимые для копирования бэкапа через ssh и ftp: 120 | #------------------- 121 | 122 | $cfg_remote_host = "backup-server.test.ru"; 123 | $cfg_remote_login = "backup_login"; 124 | $cfg_remote_path = "/home/backup_login/backup"; 125 | 126 | #------------------- 127 | # FTP transfer mode. If set to a non-zero value then all data transfers will 128 | # be done using passive mode. This is not usually required except for some dumb 129 | # servers, and some firewall configurations. 130 | # Режим соединения с FTP сервером (пассивный или активный). 131 | # 0 - Active режим. 132 | # 1 - Passive режим (для специфичных ftp серверов или особых настроек фаерволов). 133 | #------------------- 134 | 135 | $cfg_remote_ftp_mode = 0; 136 | 137 | #------------------- 138 | # Password of remote login for remote_ftp storage type. 139 | # Параметры необходимые для копирования бэкапа по ftp: 140 | #------------------- 141 | 142 | $cfg_remote_password = "Test1234"; 143 | 144 | 145 | #------------------- 146 | # Path of directory to store backup on local file system for local storage type. 147 | # Параметры необходимые для хранения бэкапа на локальной ФС: 148 | # Бэкап не должен быть в одной директории с кэшем. Создайте отдельную директорию, 149 | # например, archive. 150 | #------------------- 151 | 152 | $cfg_local_path = "/usr/local/fsbackup/archive"; 153 | 154 | 155 | #------------------- 156 | # Limit of file creation time in days. 157 | # If not 0, don't backup files created or modified later then $cfg_time_limit days. 158 | # Время в днях, файлы созданные ранее которого не будут помещаться в бэкап. 159 | # 0 - помещаем все фалы независимо от времени их создания. 160 | #------------------- 161 | 162 | $cfg_time_limit = 0; 163 | 164 | 165 | #------------------- 166 | # Limit of maximum file size. 167 | # If not 0, don't backup files witch size more then $cfg_time_limit kilobytes. 168 | # Максимально допустимый размер файла в Kb для помещения в бэкап. 169 | # 0 - помещаем все фалы независимо от их размера. 170 | #------------------- 171 | 172 | $cfg_size_limit = 0; 173 | 174 | #------------------- 175 | # Size of maximum size (in KiloBytes) of single unpacked archive file (volume). 176 | # 0 - unlimited file size. 177 | # Максимальный размер (в Kb) несжатого архива с бэкапом, размещенного в одном 178 | # файле, т.е. размер тома. Полезно при создании гиганских архивов не влезающих 179 | # в ограничение файловой системы или при последующей записи архивов на CD-ROM 180 | # или другие накопители небольшого размера. 181 | # При превышении заданного размера, запись продолжается в следующий файл c 182 | # идентификатором '-2', '-3' и т.д. 183 | # 0 - размер архива не ограничен. 184 | #------------------- 185 | 186 | $cfg_maximum_archive_size = 0; 187 | 188 | 189 | #------------------- 190 | # Root path for initial chdir. 191 | # Корневая директория, относительно которой файлы помещаются в бэкап и 192 | # относительно которой описаны пути для помещения файлов. 193 | #------------------- 194 | 195 | $cfg_root_path = "/"; 196 | 197 | 198 | #------------------- 199 | # Name of user in public key ring with public key will be used for PGP encryption. 200 | # Not use encryption if not set. 201 | # Шифрования бэкапа с помощью PGP. 202 | # Если поле не заполнено, то pgp не применяется. 203 | # Иначе поле содержит UserId записи в public key ring. 204 | #------------------- 205 | 206 | # $cfg_pgp_userid = "backup"; 207 | 208 | 209 | #------------------- 210 | # Verbose level. 211 | # 0 - Silent mode, suspend all output, except fatal configuration 212 | # errors. 213 | # 1 - Output errors and warnings. 214 | # 2 - Output all the available data. 215 | # 216 | # Уровень "говорливости", регулирует объем выводимых программой сообщений. 217 | # 0 - Подавить вывод любых сообщений. 218 | # 1 - Выводить сообщения об ошибках и предупреждения 219 | # 2 - Выводить все сообщения 220 | #------------------- 221 | 222 | $cfg_verbose = 2; 223 | 224 | #------------------- 225 | # Recursive review of the prohibited directories. 226 | # 0 - Recursively to view all contents of directories marked for 227 | # backup, including contents of directories prohibited by 228 | # '!', '!d' and '=! rules. 229 | # 1 - not use a recursive entrance to directory prohibited for 230 | # backup (speed is increased, reduces flexibility of customization). 231 | # 232 | # Рекурсивный просмотр запрещенных директорий. 233 | # 0 - рекурсивно просматривать все содержимое директорий помеченных 234 | # для бэкапа, в том числе и содержимое директорий запрещенных 235 | # правилами '!', '!d' и '=!'. 236 | # 1 - не использовать рекурсивный вход в запрещенные для 237 | # бэкапа директории (увеличивается скорость бэкапа, уменьшает 238 | # гибкость настройки). 239 | #------------------- 240 | 241 | $cfg_stopdir_prune=0; 242 | 243 | 1; 244 | #------------------- 245 | # List of backuped path and regexp mask. 246 | # /dir[/file] - backup file or directory. 247 | # !/dir[/file] - NOT include this file or directory to backup. 248 | # # - ignore this line. 249 | # Mask: 250 | # =~ - regexp mask for include file or directory to backup. 251 | # f~ - regexp file mask for include file to backup. 252 | # d~ - regexp directory mask for include directory to backup. 253 | # =! - regexp mask for NOT include file or directory to backup. 254 | # f! - regexp file mask for NOT include file to backup. 255 | # d! - regexp directory mask for NOT include directory to backup. 256 | # 257 | # 258 | # 259 | # Список файлов и условий для помещения в бэкап. 260 | # (описываются после директивы __DATA__): 261 | # /dir[/file] - путь к файлу/директории для бэкапа. 262 | # !/dir[/file] - отрицание пути, не помещать в бэкап. Не маска, а реальный путь. 263 | # # - комментарий 264 | # Маски: 265 | # =~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ. 266 | # f~ - маска для файла. Первый или второй символ. 267 | # d~ - маска для директории. Первый или второй символ. 268 | # Маски отрицания: 269 | # =! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ. 270 | # f! - "НЕ" маска для файла. Первый или второй символ. 271 | # d! - "НЕ" маска для директории. Первый или второй символ. 272 | # 273 | # 274 | # Бэкап проходит только в рамках директорий и файлов описанных в путях. 275 | # Отрицания путей имеют более высокий приоритет чем пути. 276 | # Маски имеют более высокий приоритет, чем пути или отрицание путей, 277 | # маски "НЕ" имеют более высокий приоритет, чем обычные маски: 278 | # 279 | # 280 | # Таблица приоритетов: 281 | # Operation priority: 282 | # 283 | # 1. =! 284 | # 2. f! 285 | # 3. f~ 286 | # 4. d! 287 | # 5. =~ 288 | # 6. d~ 289 | # 7. ! 290 | # 8. path 291 | # 292 | # Пример: 293 | # /usr/home # Объявляем /usr/home как пустой путь, 294 | # !/usr/home # для работы масок. 295 | # d~public_html 296 | # /var 297 | # d!var/log 298 | # f~netconf\.log.* 299 | # 300 | # при этом только /usr/home/*/public_html будет добавлено в архив, 301 | # а файлы директории /var/log/var/log/, за исключением messages, нет. 302 | # Но, /usr/local/home/user/public_html добавлено в 303 | # архив не будет ! Для поиска только по маскам нужно объявить: 304 | # / 305 | # !/ 306 | # d~public_html 307 | # d~cgi-bin 308 | # d~/etc/ 309 | #------------------- 310 | 311 | __DATA__ 312 | /usr/local/fsbackup 313 | !/usr/local/fsbackup/cache 314 | f!\.core$ 315 | f!^core$ 316 | f!\.o$ 317 | f!\.log$ 318 | #d~public_html 319 | #d!/log 320 | #f~netconf\.log.* 321 | 322 | # Linux 323 | /usr/src/linux/.config 324 | 325 | # BSD 326 | /var/db/pkg 327 | /usr/src/sys/i386/conf 328 | 329 | # Users 330 | /home 331 | /root 332 | !/home/ftp 333 | =!\.netscape/cache/ 334 | =!\.mozilla/.*/Cache/ 335 | =!\.mozilla/.*/NewCache/ 336 | =!\.mozilla/.*/News/ 337 | f!.*\.avi$ 338 | f!.*\.mpeg$ 339 | f!.*\.mpg$ 340 | f!.*\.mp3$ 341 | f!\.~$ 342 | f!\.swp$ 343 | 344 | # System configuration 345 | /etc 346 | /var/cron/tabs 347 | /var/spool/cron 348 | /var/spool/atjobs 349 | /var/spool/atspool 350 | /usr/local/etc 351 | 352 | # Installed packages 353 | /usr/local/bin 354 | /usr/local/include 355 | /usr/local/lib 356 | /usr/local/libdata 357 | /usr/local/libexec 358 | /usr/local/sbin 359 | /usr/local/share 360 | /var/ucd-snmp 361 | 362 | # Programs from source 363 | /usr/local/apache/bin 364 | /usr/local/apache/conf 365 | /usr/local/apache/cgi-bin 366 | /usr/local/apache/htdocs 367 | /usr/local/apache/libexec 368 | /usr/local/apache/src 369 | /usr/local/www 370 | /usr/local/mysql/bin 371 | /usr/local/mysql/include 372 | /usr/local/mysql/lib 373 | /usr/local/mysql/libexec 374 | /usr/local/mysql/var/mysql 375 | /usr/local/pgsql/bin 376 | /usr/local/pgsql/share 377 | /usr/local/pgsql/lib 378 | /usr/local/pgsql/include 379 | /usr/local/pgsql/data 380 | !/usr/local/pgsql/data/base 381 | !/usr/local/pgsql/data/pg_xlog 382 | !/usr/local/pgsql/data/pg_clog 383 | /usr/local/squid/bin 384 | /usr/local/squid/etc 385 | /usr/local/news/etc 386 | /usr/local/news/bin 387 | /usr/local/news/lib 388 | /usr/local/samba/bin 389 | /usr/local/samba/lib 390 | /usr/local/src 391 | /usr/local/uucp 392 | 393 | -------------------------------------------------------------------------------- /cfg_example_sql: -------------------------------------------------------------------------------- 1 | # Example of configuration file. 2 | # Пример файла конфигурации. 3 | # 4 | # http://www.opennet.ru/dev/fsbackup/ 5 | # Copyright (c) 2001 by Maxim Chirkov. 6 | # 7 | 8 | #------------------- 9 | # Name of backup, single word. 10 | # Имя для бэкапа, строка состоящая из латинских букв, цифр и символа подчеркивания. 11 | #------------------- 12 | 13 | $cfg_backup_name = "hostname_pgsql"; 14 | 15 | 16 | #------------------- 17 | # Path of internal cache directory for local backup method. 18 | # Директория для помещения текущих хэшей для локального метода бэкапа, или 19 | # временных хешей для других методов. 20 | #------------------- 21 | 22 | $cfg_cache_dir = "/usr/local/fsbackup/cache"; 23 | 24 | 25 | #------------------- 26 | # Full path of some external program running from C. 27 | # $prog_gzip = "" - not use compression, $prog_pgp = "" - not use encryption. 28 | # Пути к запускаемым в процессе выполнения бэкапа программам. Рекомендуется 29 | # не полениться и прописать полный путь к каждой программе. 30 | # Внимание ! При использовании шифрования через gpg, рекомендуется 31 | # установить значение $prog_gzip="", так как gpg перед шифрованием сжимает 32 | # данные, использование gzip приведет к двойному сжатию и лишней нагрузке на CPU. 33 | #------------------- 34 | 35 | $prog_md5sum = "/usr/bin/md5sum -b"; 36 | $prog_tar = "/bin/tar"; 37 | $prog_ssh = "/usr/bin/ssh"; 38 | $prog_rm = "/bin/rm"; 39 | $prog_gzip = "/usr/bin/gzip"; # Если равно "", то не использовать сжатие. 40 | #$prog_gzip = ""; 41 | #$prog_pgp = "/usr/bin/gpg"; # Если равно "", то не применять шифрование. 42 | $prog_pgp = ""; 43 | 44 | 45 | #------------------- 46 | # Checksum method: 47 | # timesize - checksum of file attributes (default, best speed) 48 | # md5 - checksum of file attributes + MD5 checksum of file content. 49 | # Метод вычисления контрольных сумм для определения изменений в файле. 50 | # timesize - учитывается время последнего изменения файла, его размер, 51 | # атрибуты файла, но не учитывается содержимое. Как правило 52 | # учета данных факторов достаточно для определения необходимости 53 | # обновления файла в бэкапе. Наиболее быстрый метод. 54 | # md5 - все параметры timesize + контрольная сумма содержимого 55 | # файла. Наиболее ресурсоемкий и медленный метод. 56 | #------------------- 57 | 58 | $cfg_checksum = "timesize"; 59 | 60 | 61 | #------------------- 62 | # Backup style: 63 | # backup - incremental backup (copy only new and changed files). 64 | # full_backup - full backup (copy all files). 65 | # sync - file tree synchronization. 66 | # hash - hash creation without storing archive (spying for new or changed files). 67 | # Определение типа операции, вида бэкапа. 68 | # backup - инкрементальный бэкап в архив (т.е. копируются только 69 | # изменившиеся с момента последнего бэкапа файлы).. 70 | # full_backup - полный бэкап в архив, без хэша (т.е. всегда копируются 71 | # все файлы). 72 | # sync - синхронизация дерева (только для типа хранилища ssh или local). 73 | # hash - только генерация хэша, без помещения файлов в архив 74 | # (пометка помещения файлов в бэкап, без физического перемещения) 75 | #------------------- 76 | 77 | $cfg_backup_style = "full_backup"; 78 | 79 | 80 | #------------------- 81 | # Incremental level (after how many incremental copy make full refresh of backup) 82 | # Число копий бэкапа, при инкрементальном бэкапе, после которых производится 83 | # полный бэкап. Например, при = 7 - 6 раз будут помещаться только изменения, 84 | # на 7 раз бэкап будет объединен в один файл. 0 - сколько угодно раз. 85 | #------------------- 86 | 87 | $cfg_increment_level = 4; 88 | 89 | 90 | #------------------- 91 | # Save previous backup to OLD directory before rotation or before storing 92 | # full backup. 93 | # 0 - don't save old backup 94 | # 1 - save old backup. 95 | # Сохранение предыдущей версии полного бэкапа перед инкрементальной ротацией или 96 | # заменой текущего неинкрементального бэкапа новой версией. 97 | # Старая версия помещается в подкаталог OLD. 98 | # 0 - не сохранять предыдущую версию. 99 | # 1 - сохранять предыдущую версию 100 | #------------------- 101 | 102 | $cfg_save_old_backup = 1; 103 | 104 | 105 | #------------------- 106 | # Type of backup storage: 107 | # local - store backup on local file system. 108 | # remote_ssh - store backup on remote host over SSH connection. 109 | # remote_ftp - store backup on remote FTP server. 110 | # Тип хранилища для бэкапа. Описание см. в файле README. 111 | # local - хранение бэкапа в локальной файловой системе. 112 | # remote_ssh - копирование бэкапа на удаленную машину с использованием SSH 113 | # remote_ftp - копирование бэкапа на удаленную машину по FTP 114 | #------------------- 115 | 116 | $cfg_type = "remote_ftp"; 117 | 118 | 119 | #------------------- 120 | # Connection parameters for remote_ssh storage type. 121 | # Параметры необходимые для копирования бэкапа через ssh и ftp: 122 | #------------------- 123 | 124 | $cfg_remote_host = "fsbackup.company.net"; 125 | $cfg_remote_login = "fsbackup"; 126 | $cfg_remote_path = "/hostname_pgsql"; 127 | 128 | #------------------- 129 | # FTP transfer mode. If set to a non-zero value then all data transfers will 130 | # be done using passive mode. This is not usually required except for some dumb 131 | # servers, and some firewall configurations. 132 | # Режим соединения с FTP сервером (пассивный или активный). 133 | # 0 - Active режим. 134 | # 1 - Passive режим (для специфичных ftp серверов или особых настроек фаерволов). 135 | #------------------- 136 | 137 | $cfg_remote_ftp_mode = 1; 138 | 139 | #------------------- 140 | # Password of remote login for remote_ftp storage type. 141 | # Параметры необходимые для копирования бэкапа по ftp: 142 | #------------------- 143 | 144 | $cfg_remote_password = "Test1234"; 145 | 146 | 147 | #------------------- 148 | # Path of directory to store backup on local file system for local storage type. 149 | # Параметры необходимые для хранения бэкапа на локальной ФС: 150 | # Бэкап не должен быть в одной директории с кэшем. Создайте отдельную директорию, 151 | # например, archive. 152 | #------------------- 153 | 154 | $cfg_local_path = "/usr/local/fsbackup/archive"; 155 | 156 | 157 | #------------------- 158 | # Limit of file creation time in days. 159 | # If not 0, don't backup files created or modified later then $cfg_time_limit days. 160 | # Время в днях, файлы созданные ранее которого не будут помещаться в бэкап. 161 | # 0 - помещаем все фалы независимо от времени их создания. 162 | #------------------- 163 | 164 | $cfg_time_limit = 0; 165 | 166 | 167 | #------------------- 168 | # Limit of maximum file size. 169 | # If not 0, don't backup files witch size more then $cfg_time_limit kilobytes. 170 | # Максимально допустимый размер файла в Kb для помещения в бэкап. 171 | # 0 - помещаем все фалы независимо от их размера. 172 | #------------------- 173 | 174 | $cfg_size_limit = 0; 175 | 176 | #------------------- 177 | # Size of maximum size (in KiloBytes) of single unpacked archive file (volume). 178 | # 0 - unlimited file size. 179 | # Максимальный размер (в Kb) несжатого архива с бэкапом, размещенного в одном 180 | # файле, т.е. размер тома. Полезно при создании гиганских архивов не влезающих 181 | # в ограничение файловой системы или при последующей записи архивов на CD-ROM 182 | # или другие накопители небольшого размера. 183 | # При превышении заданного размера, запись продолжается в следующий файл c 184 | # идентификатором '-2', '-3' и т.д. 185 | # 0 - размер архива не ограничен. 186 | #------------------- 187 | 188 | $cfg_maximum_archive_size = 0; 189 | 190 | 191 | #------------------- 192 | # Root path for initial chdir. 193 | # Корневая директория, относительно которой файлы помещаются в бэкап и 194 | # относительно которой описаны пути для помещения файлов. 195 | #------------------- 196 | 197 | $cfg_root_path = "/"; 198 | 199 | 200 | #------------------- 201 | # Name of user in public key ring with public key will be used for PGP encryption. 202 | # Not use encryption if not set. 203 | # Шифрования бэкапа с помощью PGP. 204 | # Если поле не заполнено, то pgp не применяется. 205 | # Иначе поле содержит UserId записи в public key ring. 206 | #------------------- 207 | 208 | # $cfg_pgp_userid = "backup"; 209 | 210 | 211 | #------------------- 212 | # Verbose level. 213 | # 0 - Silent mode, suspend all output, except fatal configuration 214 | # errors. 215 | # 1 - Output errors and warnings. 216 | # 2 - Output all the available data. 217 | # 218 | # Уровень "говорливости", регулирует объем выводимых программой сообщений. 219 | # 0 - Подавить вывод любых сообщений. 220 | # 1 - Выводить сообщения об ошибках и предупреждения 221 | # 2 - Выводить все сообщения 222 | #------------------- 223 | 224 | $cfg_verbose = 2; 225 | 226 | #------------------- 227 | # Recursive review of the prohibited directories. 228 | # 0 - Recursively to view all contents of directories marked for 229 | # backup, including contents of directories prohibited by 230 | # '!', '!d' and '=! rules. 231 | # 1 - not use a recursive entrance to directory prohibited for 232 | # backup (speed is increased, reduces flexibility of customization). 233 | # 234 | # Рекурсивный просмотр запрещенных директорий. 235 | # 0 - рекурсивно просматривать все содержимое директорий помеченных 236 | # для бэкапа, в том числе и содержимое директорий запрещенных 237 | # правилами '!', '!d' и '=!'. 238 | # 1 - не использовать рекурсивный вход в запрещенные для 239 | # бэкапа директории (увеличивается скорость бэкапа, уменьшает 240 | # гибкость настройки). 241 | #------------------- 242 | 243 | $cfg_stopdir_prune=1; 244 | 245 | 1; 246 | #------------------- 247 | # List of backuped path and regexp mask. 248 | # /dir[/file] - backup file or directory. 249 | # !/dir[/file] - NOT include this file or directory to backup. 250 | # # - ignore this line. 251 | # Mask: 252 | # =~ - regexp mask for include file or directory to backup. 253 | # f~ - regexp file mask for include file to backup. 254 | # d~ - regexp directory mask for include directory to backup. 255 | # =! - regexp mask for NOT include file or directory to backup. 256 | # f! - regexp file mask for NOT include file to backup. 257 | # d! - regexp directory mask for NOT include directory to backup. 258 | # 259 | # 260 | # 261 | # Список файлов и условий для помещения в бэкап. 262 | # (описываются после директивы __DATA__): 263 | # /dir[/file] - путь к файлу/директории для бэкапа. 264 | # !/dir[/file] - отрицание пути, не помещать в бэкап. Не маска, а реальный путь. 265 | # # - комментарий 266 | # Маски: 267 | # =~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ. 268 | # f~ - маска для файла. Первый или второй символ. 269 | # d~ - маска для директории. Первый или второй символ. 270 | # Маски отрицания: 271 | # =! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ. 272 | # f! - "НЕ" маска для файла. Первый или второй символ. 273 | # d! - "НЕ" маска для директории. Первый или второй символ. 274 | # 275 | # 276 | # Бэкап проходит только в рамках директорий и файлов описанных в путях. 277 | # Отрицания путей имеют более высокий приоритет чем пути. 278 | # Маски имеют более высокий приоритет, чем пути или отрицание путей, 279 | # маски "НЕ" имеют более высокий приоритет, чем обычные маски: 280 | # 281 | # 282 | # Таблица приоритетов: 283 | # Operation priority: 284 | # 285 | # 1. =! 286 | # 2. f! 287 | # 3. f~ 288 | # 4. d! 289 | # 5. =~ 290 | # 6. d~ 291 | # 7. ! 292 | # 8. path 293 | # 294 | # Пример: 295 | # /usr/home # Объявляем /usr/home как пустой путь, 296 | # !/usr/home # для работы масок. 297 | # d~public_html 298 | # /var 299 | # d!var/log 300 | # f~netconf\.log.* 301 | # 302 | # при этом только /usr/home/*/public_html будет добавлено в архив, 303 | # а файлы директории /var/log/var/log/, за исключением messages, нет. 304 | # Но, /usr/local/home/user/public_html добавлено в 305 | # архив не будет ! Для поиска только по маскам нужно объявить: 306 | # / 307 | # !/ 308 | # d~public_html 309 | # d~cgi-bin 310 | # d~/etc/ 311 | #------------------- 312 | 313 | __DATA__ 314 | # SQL data 315 | /usr/local/fsbackup/sys_backup 316 | 317 | /etc/mysql 318 | /usr/local/etc/mysql 319 | 320 | /var/lib/pgsql/data/PG_VERSION 321 | /var/lib/pgsql/data/pg_hba.conf 322 | /var/lib/pgsql/data/pg_ident.conf 323 | /var/lib/pgsql/data/postgresql.conf 324 | /var/lib/pgsql/data/postmaster.opts 325 | /usr/local/pgsql/data 326 | !/usr/local/pgsql/data/base 327 | !/usr/local/pgsql/data/pg_xlog 328 | !/usr/local/pgsql/data/pg_clog 329 | 330 | -------------------------------------------------------------------------------- /cfg_example_users: -------------------------------------------------------------------------------- 1 | # Example of configuration file. 2 | # Пример файла конфигурации. 3 | # 4 | # http://www.opennet.ru/dev/fsbackup/ 5 | # Copyright (c) 2001 by Maxim Chirkov. 6 | # 7 | 8 | #------------------- 9 | # Name of backup, single word. 10 | # Имя для бэкапа, строка состоящая из латинских букв, цифр и символа подчеркивания. 11 | #------------------- 12 | 13 | $cfg_backup_name = "testhost_users"; 14 | 15 | 16 | #------------------- 17 | # Path of internal cache directory for local backup method. 18 | # Директория для помещения текущих хэшей для локального метода бэкапа, или 19 | # временных хешей для других методов. 20 | #------------------- 21 | 22 | $cfg_cache_dir = "/usr/local/fsbackup/cache"; 23 | 24 | 25 | #------------------- 26 | # Full path of some external program running from C. 27 | # $prog_gzip = "" - not use compression, $prog_pgp = "" - not use encryption. 28 | # Пути к запускаемым в процессе выполнения бэкапа программам. Рекомендуется 29 | # не полениться и прописать полный путь к каждой программе. 30 | # Внимание ! При использовании шифрования через gpg, рекомендуется 31 | # установить значение $prog_gzip="", так как gpg перед шифрованием сжимает 32 | # данные, использование gzip приведет к двойному сжатию и лишней нагрузке на CPU. 33 | #------------------- 34 | 35 | $prog_md5sum = "md5sum -b"; 36 | $prog_tar = "/usr/bin/tar"; 37 | $prog_ssh = "/usr/bin/ssh"; 38 | $prog_rm = "/bin/rm"; 39 | $prog_gzip = "/usr/bin/gzip"; # Если равно "", то не использовать сжатие. 40 | #$prog_pgp = "/usr/local/bin/gpg"; # Если равно "", то не применять шифрование. 41 | 42 | 43 | #------------------- 44 | # Checksum method: 45 | # timesize - checksum of file attributes (default, best speed) 46 | # md5 - checksum of file attributes + MD5 checksum of file content. 47 | # Метод вычисления контрольных сумм для определения изменений в файле. 48 | # timesize - учитывается время последнего изменения файла, его размер, 49 | # атрибуты файла, но не учитывается содержимое. Как правило 50 | # учета данных факторов достаточно для определения необходимости 51 | # обновления файла в бэкапе. Наиболее быстрый метод. 52 | # md5 - все параметры timesize + контрольная сумма содержимого 53 | # файла. Наиболее ресурсоемкий и медленный метод. 54 | #------------------- 55 | 56 | $cfg_checksum = "timesize"; 57 | 58 | 59 | #------------------- 60 | # Backup style: 61 | # backup - incremental backup (copy only new and changed files). 62 | # full_backup - full backup (copy all files). 63 | # sync - file tree synchronization. 64 | # hash - hash creation without storing archive (spying for new or changed files). 65 | # Определение типа операции, вида бэкапа. 66 | # backup - инкрементальный бэкап в архив (т.е. копируются только 67 | # изменившиеся с момента последнего бэкапа файлы).. 68 | # full_backup - полный бэкап в архив, без хэша (т.е. всегда копируются 69 | # все файлы). 70 | # sync - синхронизация дерева (только для типа хранилища ssh или local). 71 | # hash - только генерация хэша, без помещения файлов в архив 72 | # (пометка помещения файлов в бэкап, без физического перемещения) 73 | #------------------- 74 | 75 | $cfg_backup_style = "backup"; 76 | 77 | 78 | #------------------- 79 | # Incremental level (after how many incremental copy make full refresh of backup) 80 | # Число копий бэкапа, при инкрементальном бэкапе, после которых производится 81 | # полный бэкап. Например, при = 7 - 6 раз будут помещаться только изменения, 82 | # на 7 раз бэкап будет объединен в один файл. 0 - сколько угодно раз. 83 | #------------------- 84 | 85 | $cfg_increment_level = 2; 86 | 87 | 88 | #------------------- 89 | # Save previous backup to OLD directory before rotation or before storing 90 | # full backup. 91 | # 0 - don't save old backup 92 | # 1 - save old backup. 93 | # Сохранение предыдущей версии полного бэкапа перед инкрементальной ротацией или 94 | # заменой текущего неинкрементального бэкапа новой версией. 95 | # Старая версия помещается в подкаталог OLD. 96 | # 0 - не сохранять предыдущую версию. 97 | # 1 - сохранять предыдущую версию 98 | #------------------- 99 | 100 | $cfg_save_old_backup = 0; 101 | 102 | 103 | #------------------- 104 | # Type of backup storage: 105 | # local - store backup on local file system. 106 | # remote_ssh - store backup on remote host over SSH connection. 107 | # remote_ftp - store backup on remote FTP server. 108 | # Тип хранилища для бэкапа. Описание см. в файле README. 109 | # local - хранение бэкапа в локальной файловой системе. 110 | # remote_ssh - копирование бэкапа на удаленную машину с использованием SSH 111 | # remote_ftp - копирование бэкапа на удаленную машину по FTP 112 | #------------------- 113 | 114 | $cfg_type = "remote_ftp"; 115 | 116 | 117 | #------------------- 118 | # Connection parameters for remote_ssh storage type. 119 | # Параметры необходимые для копирования бэкапа через ssh и ftp: 120 | #------------------- 121 | 122 | $cfg_remote_host = "backupserver.ru"; 123 | $cfg_remote_login = "backup_testhost"; 124 | $cfg_remote_path = "/backup_users"; 125 | 126 | #------------------- 127 | # FTP transfer mode. If set to a non-zero value then all data transfers will 128 | # be done using passive mode. This is not usually required except for some dumb 129 | # servers, and some firewall configurations. 130 | # Режим соединения с FTP сервером (пассивный или активный). 131 | # 0 - Active режим. 132 | # 1 - Passive режим (для специфичных ftp серверов или особых настроек фаерволов). 133 | #------------------- 134 | 135 | $cfg_remote_ftp_mode = 0; 136 | 137 | #------------------- 138 | # Password of remote login for remote_ftp storage type. 139 | # Параметры необходимые для копирования бэкапа по ftp: 140 | #------------------- 141 | 142 | $cfg_remote_password = "Test1234"; 143 | 144 | 145 | #------------------- 146 | # Path of directory to store backup on local file system for local storage type. 147 | # Параметры необходимые для хранения бэкапа на локальной ФС: 148 | # Бэкап не должен быть в одной директории с кэшем. Создайте отдельную директорию, 149 | # например, archive. 150 | #------------------- 151 | 152 | $cfg_local_path = "/usr/local/fsbackup/archive"; 153 | 154 | 155 | #------------------- 156 | # Limit of file creation time in days. 157 | # If not 0, don't backup files created or modified later then $cfg_time_limit days. 158 | # Время в днях, файлы созданные ранее которого не будут помещаться в бэкап. 159 | # 0 - помещаем все фалы независимо от времени их создания. 160 | #------------------- 161 | 162 | $cfg_time_limit = 0; 163 | 164 | 165 | #------------------- 166 | # Limit of maximum file size. 167 | # If not 0, don't backup files witch size more then $cfg_time_limit kilobytes. 168 | # Максимально допустимый размер файла в Kb для помещения в бэкап. 169 | # 0 - помещаем все фалы независимо от их размера. 170 | #------------------- 171 | 172 | # 10Mb~ 173 | $cfg_size_limit = 10000; 174 | 175 | #------------------- 176 | # Size of maximum size (in KiloBytes) of single unpacked archive file (volume). 177 | # 0 - unlimited file size. 178 | # Максимальный размер (в Kb) несжатого архива с бэкапом, размещенного в одном 179 | # файле, т.е. размер тома. Полезно при создании гиганских архивов не влезающих 180 | # в ограничение файловой системы или при последующей записи архивов на CD-ROM 181 | # или другие накопители небольшого размера. 182 | # При превышении заданного размера, запись продолжается в следующий файл c 183 | # идентификатором '-2', '-3' и т.д. 184 | # 0 - размер архива не ограничен. 185 | #------------------- 186 | 187 | $cfg_maximum_archive_size = 0; 188 | 189 | 190 | #------------------- 191 | # Root path for initial chdir. 192 | # Корневая директория, относительно которой файлы помещаются в бэкап и 193 | # относительно которой описаны пути для помещения файлов. 194 | #------------------- 195 | 196 | $cfg_root_path = "/"; 197 | 198 | 199 | #------------------- 200 | # Name of user in public key ring with public key will be used for PGP encryption. 201 | # Not use encryption if not set. 202 | # Шифрования бэкапа с помощью PGP. 203 | # Если поле не заполнено, то pgp не применяется. 204 | # Иначе поле содержит UserId записи в public key ring. 205 | #------------------- 206 | 207 | $cfg_pgp_userid = "backup"; 208 | 209 | 210 | #------------------- 211 | # Verbose level. 212 | # 0 - Silent mode, suspend all output, except fatal configuration 213 | # errors. 214 | # 1 - Output errors and warnings. 215 | # 2 - Output all the available data. 216 | # 217 | # Уровень "говорливости", регулирует объем выводимых программой сообщений. 218 | # 0 - Подавить вывод любых сообщений. 219 | # 1 - Выводить сообщения об ошибках и предупреждения 220 | # 2 - Выводить все сообщения 221 | #------------------- 222 | 223 | $cfg_verbose = 2; 224 | 225 | #------------------- 226 | # Recursive review of the prohibited directories. 227 | # 0 - Recursively to view all contents of directories marked for 228 | # backup, including contents of directories prohibited by 229 | # '!', '!d' and '=! rules. 230 | # 1 - not use a recursive entrance to directory prohibited for 231 | # backup (speed is increased, reduces flexibility of customization). 232 | # 233 | # Рекурсивный просмотр запрещенных директорий. 234 | # 0 - рекурсивно просматривать все содержимое директорий помеченных 235 | # для бэкапа, в том числе и содержимое директорий запрещенных 236 | # правилами '!', '!d' и '=!'. 237 | # 1 - не использовать рекурсивный вход в запрещенные для 238 | # бэкапа директории (увеличивается скорость бэкапа, уменьшает 239 | # гибкость настройки). 240 | #------------------- 241 | 242 | $cfg_stopdir_prune=0; 243 | 244 | 1; 245 | #------------------- 246 | # List of backuped path and regexp mask. 247 | # /dir[/file] - backup file or directory. 248 | # !/dir[/file] - NOT include this file or directory to backup. 249 | # # - ignore this line. 250 | # Mask: 251 | # =~ - regexp mask for include file or directory to backup. 252 | # f~ - regexp file mask for include file to backup. 253 | # d~ - regexp directory mask for include directory to backup. 254 | # =! - regexp mask for NOT include file or directory to backup. 255 | # f! - regexp file mask for NOT include file to backup. 256 | # d! - regexp directory mask for NOT include directory to backup. 257 | # 258 | # 259 | # 260 | # Список файлов и условий для помещения в бэкап. 261 | # (описываются после директивы __DATA__): 262 | # /dir[/file] - путь к файлу/директории для бэкапа. 263 | # !/dir[/file] - отрицание пути, не помещать в бэкап. Не маска, а реальный путь. 264 | # # - комментарий 265 | # Маски: 266 | # =~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ. 267 | # f~ - маска для файла. Первый или второй символ. 268 | # d~ - маска для директории. Первый или второй символ. 269 | # Маски отрицания: 270 | # =! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ. 271 | # f! - "НЕ" маска для файла. Первый или второй символ. 272 | # d! - "НЕ" маска для директории. Первый или второй символ. 273 | # 274 | # 275 | # Бэкап проходит только в рамках директорий и файлов описанных в путях. 276 | # Отрицания путей имеют более высокий приоритет чем пути. 277 | # Маски имеют более высокий приоритет, чем пути или отрицание путей, 278 | # маски "НЕ" имеют более высокий приоритет, чем обычные маски: 279 | # 280 | # 281 | # Таблица приоритетов: 282 | # Operation priority: 283 | # 284 | # 1. =! 285 | # 2. f! 286 | # 3. f~ 287 | # 4. d! 288 | # 5. =~ 289 | # 6. d~ 290 | # 7. ! 291 | # 8. path 292 | # 293 | # Пример: 294 | # /usr/home # Объявляем /usr/home как пустой путь, 295 | # !/usr/home # для работы масок. 296 | # d~public_html 297 | # /var 298 | # d!var/log 299 | # f~netconf\.log.* 300 | # 301 | # при этом только /usr/home/*/public_html будет добавлено в архив, 302 | # а файлы директории /var/log/var/log/, за исключением messages, нет. 303 | # Но, /usr/local/home/user/public_html добавлено в 304 | # архив не будет ! Для поиска только по маскам нужно объявить: 305 | # / 306 | # !/ 307 | # d~public_html 308 | # d~cgi-bin 309 | # d~/etc/ 310 | #------------------- 311 | 312 | __DATA__ 313 | f!\.core$ 314 | f!^core$ 315 | f!\.o$ 316 | f!\.([aA][vV][iI]|[mM][pP][eE]?[gG]|[mM][pP]3)$ 317 | 318 | /home 319 | /root 320 | /var/mail 321 | -------------------------------------------------------------------------------- /contrib/CONTRIB.txt: -------------------------------------------------------------------------------- 1 | fsbackup.cron by Alex Sokoloff. 2 | 3 | Если поставить параметр $cfg_verbose = 0, и использовать приведенную 4 | в файле строку для crontab: 5 | 18 4 * * * /opt/fsbackup/create_backup.sh| mail -s"`name -n` backup report" root 6 | получаем 2 письма, одно пустое от root, второе от Cron Daemon с 7 | сообщением "Null message body; hope that's ok" 8 | 9 | Предлагаю немного изменить запуск программы (ввести проверку на длину 10 | письма), вынести ее в файл fsbackup.cron (вариант файла в атаче). 11 | 12 | ===================================== 13 | fsfind.pl by Alex Sokoloff. 14 | 15 | Я написал небольшой скрипт fsfind.pl для поиска файла в архивах он просматривает 16 | файлы list в директории с архивами. Может кому-то будет полезен. Работает с 17 | локальными архивами, с ftp и ssh не делал т.к. нет необходимости, но 18 | можно подумать. 19 | 20 | ===================================== 21 | ib_backup.pl by Alex Sokoloff. 22 | 23 | Написал маленький скриптец для бэкапа Interbase баз. 24 | 25 | -------------------------------------------------------------------------------- /contrib/backup_arc/double_mirror.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Зеркалирование /home в /backup2 3 | # 8 18 * * * /usr/local/etc/backup/double_mirror.sh >/var/log/rsync.log 4 | 5 | date 6 | /usr/local/bin/rsync -a -v --delete --delete-excluded --backup --exclude-from=/usr/local/etc/rsync_backup.exclude / /backup2/rsync 7 | 8 | RETCODE=$? 9 | if [ $RETCODE -ne 0 -a $RETCODE -ne 24 ]; then 10 | echo "Err code=$RETCODE"| mail -s "FATAL RSYNC BACKUP" admins@test.ru 11 | fi 12 | echo RET: $RETCODE 13 | date 14 | -------------------------------------------------------------------------------- /contrib/backup_arc/double_tar.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Копирование /home с бэкапами на запасной диск. 4 | # Удаление на запасной диске "OLD" директорий. 5 | # 8 23 5,20 * * /usr/local/etc/backup/double_tar.sh 6 | 7 | rm -rf /backup/reserv.0 8 | mkdir /backup/reserv.0 9 | cp -Rfp /home /backup/reserv.0 10 | 11 | find /backup/reserv.0 -name OLD -type d -exec rm -rf {} \; 12 | -------------------------------------------------------------------------------- /contrib/backup_arc/double_tar3.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Копирование /home/backup_* с бэкапами на запасной диск и тройная ротация на 3 диска. 4 | # Удаление на запасной диске "OLD" директорий. 5 | # 8 23 5,20 * * /usr/local/etc/backup/double_tar3.sh 6 | 7 | reserv0="/backup/reserv.0" 8 | reserv1="/backup2/backup_reserv/reserv.1" 9 | reserv2="/backup3/reserv.2" 10 | 11 | 12 | rm -rf $reserv2 13 | mv -f $reserv1 $reserv2 14 | mv -f $reserv0 $reserv1 15 | 16 | mkdir $reserv0 17 | cp -Rfp /home/backup_* $reserv0 18 | find $reserv0 -name OLD -type d -exec rm -rf {} \; 19 | 20 | -------------------------------------------------------------------------------- /contrib/backup_arc/rsync_backup.exclude: -------------------------------------------------------------------------------- 1 | /backup* 2 | /usr/local/etc/backup/cache 3 | */OLD/* 4 | /cdrom 5 | /mnt 6 | /proc 7 | /tmp 8 | /var/log 9 | /var/mail 10 | /var/spool/postfix 11 | /usr/obj 12 | /usr/src 13 | /usr/tmp 14 | /usr/ports 15 | /usr/local/apache/logs 16 | /var/run/log 17 | 18 | -------------------------------------------------------------------------------- /contrib/curl_backup/curl_backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Пример простейшего скрипта для закачки архива на FTP средствами curl 4 | # Используется при невозможности установить на машину Perl (например, рутер на Flash). 5 | 6 | hour=`date +%H` 7 | ftp_host=192.168.1.1 8 | ftp_auth="логин:пароль" 9 | ftp_backup_store_path="/var/backups" 10 | 11 | backup_dirs="/etc /usr/local/fsbackup" 12 | backup_name="backup_router1" 13 | 14 | tar czf - $backup_dirs | curl --upload-file - --user $ftp_auth ftp://$ftp_host/$ftp_backup_path/$backup_name-$hour.tar.gz 15 | -------------------------------------------------------------------------------- /contrib/dir_sync/create_dir_list.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | # Скрипт для построения полного списка поддиректорий и симлинков для заданной директории. 3 | # (c) Maxim Chirkov 4 | # 5 | # Формат использования: create_dir_list.pl /dir > list.txt 6 | 7 | use strict; 8 | use File::Find; 9 | my $cfg_exclude_mask='\/backup\/.*'; 10 | my %uid_hash=(); 11 | my %gid_hash=(); 12 | 13 | if (defined $ARGV[0] && -d $ARGV[0]){ 14 | find(\&process_dirs, $ARGV[0]); 15 | exit; 16 | } else { 17 | die "Usage: create_dir_list.pl "; 18 | } 19 | 20 | exit; 21 | 22 | 23 | sub process_dirs{ 24 | my $file_name = $_; 25 | my $full_path = $File::Find::name; 26 | my $full_dir = $File::Find::dir; 27 | 28 | if ( (-d $full_path || -l $full_path ) && $file_name !~ /^\.\.?$/ && $full_path !~ /^$cfg_exclude_mask$/){ 29 | my (undef, undef, $stat_mode, undef, $stat_uid, $stat_gid, undef, undef, undef, $stat_mtime, $stat_time) = stat($full_path); 30 | # $stat_mode = sprintf ("%04o", $stat_mode & 07777); 31 | if (! defined $uid_hash{$stat_uid}){ 32 | $uid_hash{$stat_uid} = getpwuid($stat_uid) || $stat_uid; 33 | } 34 | if (! defined $gid_hash{$stat_gid}){ 35 | $gid_hash{$stat_gid} = getgrgid($stat_gid) || $stat_gid; 36 | } 37 | 38 | if (-d $full_path){ 39 | print "dir\t$full_path\t$stat_mode\t$uid_hash{$stat_uid}\t$gid_hash{$stat_gid}\t$stat_mtime\t$stat_time\t\n"; 40 | } elsif (-l $full_path){ 41 | my $link_dest = readlink($full_path); 42 | print "symlink\t$full_path\t$stat_mode\t$uid_hash{$stat_uid}\t$uid_hash{$stat_gid}\t$stat_mtime\t$stat_time\t$link_dest\n"; 43 | } 44 | } 45 | return 0; 46 | } 47 | -------------------------------------------------------------------------------- /contrib/dir_sync/restore_dir.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | # Скрипт создающий недастоющие директории и симлинки в пункте назначения по общему списку. 3 | # Список директорий подается во входной поток. 4 | # (c) Maxim Chirkov 5 | # 6 | # Формат использования: cat list.txt |./restore_dir.pl /корень_для_восстановления 7 | 8 | use strict; 9 | 10 | my %uid_hash=(); 11 | my %gid_hash=(); 12 | 13 | if (! defined $ARGV[0] || ! -d $ARGV[0]){ 14 | die "Usage: restore_dir.pl "; 15 | } 16 | my $root_path = $ARGV[0]; 17 | 18 | while (){ 19 | chomp; 20 | my ($s_type, $s_path, $s_mode, $s_uid, $s_gid, $s_mtime, $s_time, $s_link_dest) = split(/\t/); 21 | my $stat_mode = sprintf ("%04o", $s_mode & 07777); 22 | 23 | if ($s_path !~ /^\Q$root_path\E/){ 24 | print "ERROR: Outside dir: $s_path\n"; 25 | next; 26 | } 27 | if (-e $s_path){next;} 28 | 29 | if (! defined $uid_hash{$s_uid}){ 30 | $uid_hash{$s_uid} = getpwnam($s_uid) || $s_uid; 31 | } 32 | if (! defined $gid_hash{$s_gid}){ 33 | $gid_hash{$s_gid} = getgrnam($s_gid) || $s_gid; 34 | } 35 | 36 | if ($s_type eq "dir"){ 37 | 38 | mkdir($s_path, 0777); 39 | chmod(oct($stat_mode), $s_path); 40 | chown ($uid_hash{$s_uid}, $gid_hash{$s_gid}, $s_path); 41 | utime ($s_mtime, $s_mtime, $s_path); 42 | print "Restoring dir: $s_path\n"; 43 | 44 | } elsif ($s_type eq "symlink"){ 45 | 46 | symlink($s_link_dest, $s_path); 47 | print "Restoring symlink: $s_path\n"; 48 | 49 | } elsif ($s_type ne ""){ 50 | print "ERROR: Bogus line: $_\n"; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /contrib/fsbackup.cron: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Backup planner running from crontab. 3 | # Скрипт для запуска backup подсистемы из crontab. 4 | # 5 | # 6 | # Пример строки для crontab: 18 4 * * * /opt/fsbackup/fs_backup.cron 7 | # 8 | 9 | letter="`/opt/fsbackup/create_backup.sh` " 10 | 11 | if [ "$letter" ]; then 12 | echo "$letter " | mail -s"`uname -n` backup report" root 13 | fi 14 | -------------------------------------------------------------------------------- /contrib/fsfind.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | # Скрипт для поиска файлов в архивах созданных программой fsbackup 4 | # Copyright (c) 2001 by Alex Sokoloff. 5 | # 6 | # Написан для fsbackup 7 | # http://www.opennet.ru/dev/fsbackup/ 8 | # Copyright (c) 2001 by Maxim Chirkov. 9 | 10 | ############################################# 11 | 12 | my $type="list"; 13 | my $extract=0; 14 | $cfg_cache_dir = "./"; 15 | my $findfile; 16 | 17 | # Обработка параметров командной строки 18 | while (@ARGV){ 19 | $arg= shift (@ARGV); 20 | if ($arg eq "-h" or $arg eq "--help") {&help} 21 | elsif ($arg eq "-d" or $arg eq "--del") { $type="del"} 22 | elsif ($arg eq "-c" or $arg eq "--cfgfile") { 23 | $config = shift (@ARGV); 24 | require "$config" if ( -f $config ); 25 | } 26 | elsif ($arg eq "-p" or $arg eq "--path") { 27 | $cfg_cache_dir=shift (@ARGV); 28 | } 29 | elsif ($arg eq "-m" or $arg eq "--mask") { 30 | $cfg_backup_name = shift (@ARGV); 31 | } 32 | else {$findfile="$arg"} 33 | } 34 | 35 | if ($findfile eq '') { 36 | print "Не указан искомый файл\n"; 37 | &help; 38 | } 39 | 40 | if ( ! -d $cfg_cache_dir ) {print "Дирректория: $cfg_cache_dir не найдена\n"; &help} 41 | 42 | @files=sort {$b cmp $a} glob("$cfg_cache_dir/$cfg_backup_name*.$type" ); 43 | if ($#files <0) { 44 | print "В дирректории $cfg_cache_dir не найден ни один файл $cfg_backup_name.$type\n"; 45 | exit; 46 | } 47 | 48 | # Переводим регулярные выражения 49 | $findfile=~ s/\./\\\./g; 50 | $findfile=~ s/\*/\.\+/g; 51 | $findfile=~ s/\_/\./g; 52 | 53 | # Собственно поиск и печать результатов 54 | foreach $f (@files){ 55 | open (FILE, "$f"); 56 | $tmp ="$f\n"; 57 | 58 | while (){ 59 | chomp; 60 | if (/$findfile/i){ $tmp.="\t$_\n";} 61 | } 62 | 63 | if ($tmp ne "$f\n" ){ 64 | $tmp=~ s/^$cfg_cache_dir\///; 65 | print "$tmp\n"; 66 | } 67 | } 68 | 69 | exit; 70 | 71 | sub help{ 72 | print qq|Usage: fsfind [OPTION]... FILE 73 | Ищет FILE в архивах созданных в fsbackup, В имени файла допускается 74 | использование регулярных выражений: 75 | * любое количество любых символов 76 | _ любой одиночный символ 77 | 78 | Опции: 79 | -d, --del искать удаленные файлы 80 | -p, --path ПУТЬ путь к дирректории с архивами, если не указано, 81 | то поиск ведется в текущей дирректории 82 | -m, --mask Маска для имен файлов архивов в которых производится 83 | поиск 84 | -c, --cfgfile ФАЙЛ файл конфигурации fsbackup в котором прописана 85 | дирректория с архивами и имя файла архива 86 | -h, --help вывести эту подсказку и выйти 87 | 88 | |; 89 | exit; 90 | } 91 | 92 | -------------------------------------------------------------------------------- /contrib/ib_backup.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | # Script for backup SQL tables from InterBase 3 | # Скрипт для бэкапа данных хранимых в InterBase 4 | # Copyright (c) 2001 by Alex Sokoloff. 5 | # 6 | # Написан для fsbackup 7 | # http://www.opennet.ru/dev/fsbackup/ 8 | # Copyright (c) 2001 by Maxim Chirkov. 9 | # 10 | # 11 | 12 | #------------------- 13 | # Directory to store SQL backup. You must have enought free disk space to store 14 | # all data from you SQL server. 15 | # Директория куда будет помещен бэкап данных с SQL сервера. 16 | # Внимание !!! Дожно быть достаточно свободного места для бэкапа всех 17 | # выбранных БД. 18 | #------------------- 19 | 20 | $backup_path="/opt/fsbackup"; 21 | 22 | #------------------- 23 | # List of databases and it's 24 | # names of backup, single word. 25 | # Список включаемых в бэкап баз, и имена бэкапов. 26 | #------------------- 27 | 28 | %db_list=( 29 | 30 | "/interbase/base1.gdb", "base1.gbk", 31 | "/interbase/base2.gdb", "base2.gbk" 32 | 33 | ); 34 | 35 | 36 | #------------------- 37 | # Auth information for MySQL. 38 | # Имя пользователя и пароль для содинения с Mysql, для InterBase скрипт 39 | # должен запускаться из-под пользователя с правами полного боступа к базам InterBase. 40 | #------------------- 41 | 42 | #backup_ibuser="" 43 | #backup_ibpassword="" 44 | 45 | 46 | #------------------- 47 | # Full path of InterBase backup program (gbak). 48 | # Путь к программе InterBase backup (gbak). 49 | #------------------- 50 | 51 | $backup_progdump="/opt/interbase/bin/gbak"; 52 | 53 | #------------------- 54 | # Verbose level. 55 | # 0 - Silent mode, suspend all output, except fatal configuration 56 | # errors. 57 | # 1 - Output errors and warnings. 58 | # 2 - Output all the available data. 59 | # 60 | # Уровень "говорливости", регулирует объем выводимых программой сообщений. 61 | # 0 - Подавить вывод любых сообщений. 62 | # 1 - Выводить сообщения об ошибках и предупреждения 63 | # 2 - Выводить все сообщения 64 | #------------------- 65 | 66 | $cfg_verbose = 2; 67 | 68 | #------------------- 69 | # Full path of some external program running from C. 70 | # $prog_gzip = "" - not use compression. 71 | # Пути к запускаемым в процессе выполнения бэкапа программам. Рекомендуется 72 | # не полениться и прописать полный путь к каждой программе. 73 | #------------------- 74 | 75 | $prog_gzip="/bin/gzip"; # Если равно "", или программа не найдена, 76 | # то не использовать сжатие. 77 | 78 | ############################################################################ 79 | if ($cfg_verbose > 1) {$gbak_verbose="-v";}; 80 | # Определяем есть ли файл соответствующий $prog_gzip 81 | 82 | if ( -f $prog_gzip ) { 83 | $add_ext=".gz"; 84 | $prog_gzip="stdout | $prog_gzip >"; 85 | } 86 | else { 87 | print "WARRNING: Programm $prog_gzip not found!\n" if ($prog_gzip and $cfg_verbose > 0 ); 88 | $prog_gzip=""; 89 | } 90 | 91 | #--------------------------------------------------------------------------- 92 | # Бэкап указанных баз для InterBase 93 | foreach (keys %db_list){ 94 | if ( not -f $_){ 95 | print "ERROR: Source file $_ not found!\n" if ($cfg_verbose >0); 96 | next; 97 | }; 98 | print "Dumping $_ in $backup_path/$db_list{$_}...\n" if ($cfg_verbose > 1); 99 | 100 | `$backup_progdump -B $gbak_verbose $_ $prog_gzip $backup_path/$db_list{$_}$add_ext\n`; 101 | } 102 | 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /contrib/psql_hourly/daily_sql_backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Ротация почасовых бэкапов SQL за день 3 | 4 | # cron: 5 | # 43 0 * * * /usr/local/fsbackup/scripts/daily_sql_backup.sh >/dev/null 6 | 7 | backup_path="/backup/.DB" 8 | backup_path2="/backup/.DB.last" 9 | backup_path3="/backup/.DB.last2" 10 | 11 | #/sbin/mount -u -w /backup 12 | #/bin/mount -o remount,rw /backup 13 | 14 | rm -rf $backup_path3 15 | mv -f $backup_path2 $backup_path3 16 | mv -f $backup_path $backup_path2 17 | mkdir $backup_path 18 | 19 | #sync; sync; sync 20 | #sleep 5 21 | #/sbin/mount -u -r /backup 22 | #/bin/mount -o remount,ro /backup 23 | -------------------------------------------------------------------------------- /contrib/psql_hourly/hourly_sql_backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Ежечасный бэкап наиболее критичных данных на SQL сервере. 3 | # cron: 4 | # 53 */1 * * * /usr/local/fsbackup/scripts/hourly_sql_backup.sh >/dev/null 5 | 6 | backup_database="testbase" 7 | 8 | usefull_table_list="table1 table2 table3" 9 | 10 | backup_path="/backup/.DB" 11 | 12 | backup_progdump_path="/usr/local/pgsql/bin" 13 | 14 | ############################################################################ 15 | #/sbin/mount -u -w /backup 16 | #/bin/mount -o remount,rw /backup 17 | 18 | if [ ! -d "$backup_path" ]; then 19 | mkdir $backup_path 20 | fi 21 | 22 | backup_iteration=`date \+\%H` 23 | backup_path="$backup_path/$backup_iteration" 24 | 25 | if [ ! -d "$backup_path" ]; then 26 | mkdir $backup_path 27 | fi 28 | 29 | 30 | #------------------------------------------------------------------------- 31 | # Бэкап указанных баз для Postgresql 32 | 33 | 34 | for cur_table in $usefull_table_list; do 35 | echo "Dumping $cur_table..." 36 | ${backup_progdump_path}/pg_dump -a -t $cur_table $backup_database > $backup_path/$cur_table.sql 37 | /bin/chmod 0600 $backup_path/$cur_table.sql 38 | done 39 | 40 | #sync; sync; sync 41 | #sleep 5 42 | #/sbin/mount -u -w /backup 43 | #/bin/mount -o remount,rw /backup 44 | -------------------------------------------------------------------------------- /contrib/psql_wal/daily_pgsql_backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Created by Molchanov Alexander 2010 4 | # ver 0.2 5 | # 6 | # Этот скрипт переносит WAL-файлы (Write-Ahead Logs) Postgres'а на FTP backup сервер. 7 | # WAL-файлы - это SQL история всех изменений которые делает Postgres и которые пишутся ПОСТОЯННО. 8 | 9 | # Для работы данного скрипта необходимо 10 | # 1) Установить ncftp (http://www.ncftp.com/) 11 | # For gentoo: emerge -v net-ftp/ncftp 12 | # 2) 13 | # $ mkdir -p /home/require_for_sql_backup/pgsql_wal /home/require_for_sql_backup/tmp_wal 14 | # $ chown postgres -R /home/require_for_sql_backup 15 | # 3) добавить следующую строку в postgresql.conf и перезапустить postgres: 16 | # archive_command = 'cp -i %p /home/require_for_sql_backup/pgsql_wal/%f < /dev/null' 17 | 18 | # Скрипт daily_pgsql_backup.sh рекомендуется запускать каждый час. 19 | # Пример строки для cron: 47 */1 * * * /usr/local/fsbackup/scripts/daily_pgsql_backup.sh| mail -s "`uname -n` WAL backup report" root 20 | 21 | ############################## 22 | # Полезные ссылки: 23 | # http://www.postgresql.org/docs/current/static/continuous-archiving.html 24 | # http://wiki.opennet.ru/HotBackupPostgreSQL 25 | # 26 | # Как восстанавливать из WAL-файлов читайте в конце этого скрипта 27 | #------------------------------------------------- 28 | 29 | 30 | backup_name="hostname_pgsql_daily" 31 | backup_suuser="postgres" 32 | # можно просто использовать: backup_db="template1" 33 | backup_db="dbname" 34 | wal_dir="/home/require_for_sql_backup/pgsql_wal" 35 | tmp_dir="/home/require_for_sql_backup/tmp_wal" 36 | 37 | cfg_remote_host="fsbackupserver.company.net" 38 | cfg_remote_login="fsbackup" 39 | cfg_remote_path="/$backup_name" 40 | cfg_remote_password="xxxxxxxxxxx" 41 | 42 | #### 43 | #---------------------------------------------------------------- 44 | 45 | date=`date +%F` 46 | 47 | # test running fsbackup backup 48 | if ps auxw | grep create_backup.sh | grep -v grep >/dev/null 49 | then 50 | if [ x"$1" != "xforce" ] 51 | then 52 | echo "Finded running create_backup.sh. Exit now." 53 | exit 1 54 | fi 55 | fi 56 | 57 | # 58 | 59 | count="1" 60 | 61 | tarfile="${backup_name}_${date}-${count}.tar.gz" 62 | while [ x`ncftpls -1 -u $cfg_remote_login -p $cfg_remote_password -F ftp://$cfg_remote_host/$cfg_remote_path/ | grep "$tarfile"` != x ] 63 | do 64 | count=$(($count+1)) 65 | tarfile="${backup_name}_${date}-${count}.tar.gz" 66 | done 67 | 68 | echo "Creating daily backup of WAL (Write-Ahead Logs) PostgreSQL databases." 69 | echo "$tarfile :" 70 | 71 | su - ${backup_suuser} -c "psql -c \"SELECT pg_start_backup('${backup_name}_${date}');\" ${backup_db}" 72 | su - ${backup_suuser} -c "psql -c \"SELECT pg_stop_backup();\" ${backup_db}" 73 | 74 | mv $wal_dir/* $tmp_dir 75 | sleep 3 76 | cd $tmp_dir 77 | lastfile=`ls -1 | sort | tail -n 1` 78 | echo "CHECKPOINT TIME: `LC_ALL=C date`" > ${lastfile}.backup 79 | tar cvzf - * | ncftpput -u $cfg_remote_login -p $cfg_remote_password -F -c $cfg_remote_host $cfg_remote_path/$tarfile 80 | if [ $? -eq 0 ] 81 | then 82 | rm -vf $tmp_dir/* 83 | else 84 | echo "Some error during create WAL-tarfile and upload it to ftp server" 85 | fi 86 | 87 | date 88 | echo "daily_pgsql_backup.sh done." 89 | exit 0 90 | 91 | #################################################### 92 | # Как восстанавливать из WAL-файлов: 93 | # Recovering using a Continuous Archive Backup (WAL) 94 | 95 | ########## 96 | # simple: 97 | 98 | # 1. restore pgSQL from fsbackup backup 99 | # 2. untar all daily backups to /home/require_for_sql_backup/pgsql_wal 100 | # 3. create recovery.conf with: restore_command = 'cp /home/require_for_sql_backup/pgsql_wal/%f %p' 101 | # 4. restart postgres 102 | # 5. wait file recovery.done 103 | 104 | ########## 105 | # full info: 106 | 107 | # Stop the server, if it's running. 108 | 109 | # If you have the space to do so, copy the whole cluster data directory and any tablespaces to a temporary location in case you need them later. Note that this precaution will require that you have enough free space on your system to hold two copies of your existing database. If you do not have enough space, you need at the least to copy the contents of the pg_xlog subdirectory of the cluster data directory, as it might contain logs which were not archived before the system went down. 110 | 111 | # Clean out all existing files and subdirectories under the cluster data directory and under the root directories of any tablespaces you are using. 112 | 113 | # Restore the database files from your base backup. Be careful that they are restored with the right ownership (the database system user, not root!) and with the right permissions. If you are using tablespaces, you should verify that the symbolic links in pg_tblspc/ were correctly restored. 114 | 115 | # Remove any files present in pg_xlog/; these came from the backup dump and are therefore probably obsolete rather than current. If you didn't archive pg_xlog/ at all, then recreate it, being careful to ensure that you re-establish it as a symbolic link if you had it set up that way before. 116 | 117 | # If you had unarchived WAL segment files that you saved in step 2, copy them into pg_xlog/. (It is best to copy them, not move them, so that you still have the unmodified files if a problem occurs and you have to start over.) 118 | 119 | # Create a recovery command file recovery.conf in the cluster data directory (see Recovery Settings). You might also want to temporarily modify pg_hba.conf to prevent ordinary users from connecting until you are sure the recovery has worked. 120 | 121 | # Start the server. The server will go into recovery mode and proceed to read through the archived WAL files it needs. Should the recovery be terminated because of an external error, the server can simply be restarted and it will continue recovery. Upon completion of the recovery process, the server will rename recovery.conf to recovery.done (to prevent accidentally re-entering recovery mode in case of a crash later) and then commence normal database operations. 122 | 123 | # Inspect the contents of the database to ensure you have recovered to where you want to be. If not, return to step 1. If all is well, let in your users by restoring pg_hba.conf to normal. 124 | 125 | # Example recovery.conf: restore_command = 'cp /mnt/server/archivedir/%f %p' 126 | 127 | ########## 128 | 129 | 130 | -------------------------------------------------------------------------------- /contrib/psql_wal/daily_pgsql_rotate.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | # 3 | # Created by Molchanov Alexander 2010 4 | # ver: 0.2 5 | # 6 | # Делает ротацию WAL (Write-Ahead Logs) на FTP backup сервере в папку $cfg_remote_path/OLD 7 | # Это нужно сделать сразу после полного бакапа PG SQL 8 | # Этот скрипт вызывается автоматически из pgsql_backup.sh 9 | 10 | use strict; 11 | 12 | use POSIX; 13 | use Net::FTP; 14 | use DB_File; 15 | 16 | my $ftp; 17 | my $cur_dir; 18 | 19 | my $cfg_remote_host = "fsbackupserver.company.net"; 20 | my $cfg_remote_login = "fsbackup"; 21 | my $cfg_remote_path = "/hostname_pgsql_daily"; 22 | my $cfg_remote_ftp_mode = 1; 23 | my $cfg_remote_password = "xxxxxxxxxxx"; 24 | ####### 25 | 26 | # protect from Lmaos 27 | 28 | if ($ARGV[0] ne "do") 29 | { 30 | printf "Usage: daily_pgsql_rotate.pl do\n"; 31 | printf "Do not run this script by hand if not sure." 32 | exit 0; 33 | } 34 | 35 | # 36 | 37 | $ftp = Net::FTP->new($cfg_remote_host, Timeout => 30, Debug => 0, Passive => $cfg_remote_ftp_mode) || die "Can't connect to ftp server.\n"; 38 | $ftp->login($cfg_remote_login, $cfg_remote_password) || die "Can't login to ftp server.\n"; 39 | $ftp->binary(); 40 | 41 | $ftp->cwd($cfg_remote_path) || die "Path $cfg_remote_path not found on ftp server.\n"; 42 | 43 | # delete/create OLD dir 44 | $ftp->mkdir("$cfg_remote_path/OLD"); 45 | $ftp->cwd("$cfg_remote_path/OLD"); 46 | foreach $cur_dir ($ftp->ls()){ 47 | $ftp->delete($cur_dir); 48 | } 49 | 50 | # move old files to "OLD" dir 51 | $ftp->cwd("$cfg_remote_path"); 52 | foreach $cur_dir ($ftp->ls()){ 53 | if ($cur_dir !~ /OLD/){ 54 | #printf "$cur_dir\n"; 55 | $ftp->rename($cur_dir,"OLD/$cur_dir"); 56 | } 57 | } 58 | # for control delete 59 | $ftp->cwd("$cfg_remote_path"); 60 | foreach $cur_dir ($ftp->ls()){ 61 | if ($cur_dir !~ /OLD/){ 62 | $ftp->delete($cur_dir); 63 | } 64 | } 65 | 66 | $ftp->quit; 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /contrib/restore_path/README: -------------------------------------------------------------------------------- 1 | Для работы в fsbackup.pl появилась одна дополнительная строка (см. 2 | fsbackup.patch) 3 | 4 | Usage: restore_path.sh [DIR] 5 | PATH - абсолютный путь, файл или директория, которую надо восстановить 6 | DIR - абсолютный путь куда складывать найденное 7 | если DIR нет, то восстановление будет происходить непосредственно туда, 8 | откуда брали во время бэкапа 9 | 10 | -- 11 | Sergey Baukin 12 | baukin@ripn.net 13 | 14 | -------------------------------------------------------------------------------- /contrib/restore_path/fsbackup.patch: -------------------------------------------------------------------------------- 1 | --- fsbackup.pl.orig Fri May 27 16:10:18 2005 2 | +++ fsbackup.pl Thu May 26 20:40:26 2005 3 | @@ -443,6 +443,7 @@ if ( $cfg_type eq "local"){ 4 | # Обрабатываем разбиение на тома 5 | for ($arc_block_level=0; $arc_block_level <= $#volume_position; $arc_block_level++){ 6 | my $tmp_list_file = crate_tmp_list($arc_block_level, $volume_position[$arc_block_level], $volume_position[$arc_block_level+1], "$cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.list"); 7 | + system( "cat $tmp_list_file | $prog_ssh -l $cfg_remote_login $cfg_remote_host 'cat - > $cfg_remote_path/$backup_file_base-$arc_block_level.tlist'"); 8 | system( "$prog_tar -c -f - -T $tmp_list_file $prog_gzip_filter $prog_pgp_filter| $prog_ssh -l $cfg_remote_login $cfg_remote_host 'cat - > $cfg_remote_path/$backup_file_base-$arc_block_level.tar${arc_ext}'") == 0 || print "SSH connection failed (tar): $?\n"; 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /contrib/restore_path/restore_path.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | backup_path="/usr/local/fsbackup" 4 | config_file="cfg_home" 5 | 6 | [ $# -ne 1 ] && [ $# -ne 2 ] && { 7 | echo "Usage: $0 [path to store]" 8 | exit 1 9 | } 10 | 11 | restore_path=$1 12 | [ $# -eq 2 ] && rdir=$2 || rdir='/' 13 | 14 | 15 | [ "${restore_path:0:1}" != "/" ] && { 16 | echo "Absolute path required" 17 | exit 1 18 | } 19 | 20 | [ "${rdir:0:1}" != "/" ] && { 21 | echo "Absolute path required" 22 | exit 1 23 | } 24 | 25 | restore_path=`echo $restore_path | sed 's/\/$//'` 26 | rdir=`echo $rdir | sed 's/\/$//'` 27 | 28 | [ -f $rdir ] && { 29 | echo "Can't store to file, directory needed" 30 | exit 1 31 | } 32 | 33 | function getvar() ( 34 | [ $# -ne 1 ] && return '' 35 | str=$1 36 | grep $str $config_file | sed 's/^[^\"][^\"]*\"\([^\"][^\"]*\)\".*$/\1/' | head -n 1 37 | ) 38 | 39 | function makedirs() ( 40 | [ $# -ne 2 ] && return 1 41 | dir=$1 42 | arch=$2 43 | [ "${dir:0:1}" != . ] && return 1 44 | [ "$dir" = "." ] && return 0 45 | makedirs `dirname $dir` $arch 46 | [ $? -eq 1 ] && return 1 47 | ssh $cfg_remote_login@$cfg_remote_host grep "\'$dir\'" $arch | sh 48 | [ $? -ne 0 ] && return 1 49 | return 0 50 | ) 51 | 52 | function ssh_restore() { 53 | [ $# -ne 1 ] && return 1 54 | n=$1 55 | i=0 56 | for date in $dates 57 | do 58 | i=$[$i+1] 59 | [ $i -eq $n ] && arch=$cfg_remote_path/$cfg_backup_name-$date 60 | done 61 | arch_list=`ssh $cfg_remote_login@$cfg_remote_host grep -l .$restore_path $arch*\.tlist` 62 | isdir=`ssh $cfg_remote_login@$cfg_remote_host grep \'\.$restore_path\' $arch.dir` 63 | [ -d $rdir ] || mkdir -p -m 755 $rdir 64 | cd $rdir 65 | [ -z "$isdir" ] && ( 66 | archgz=`echo $arch_list | sed 's/tlist$/tar.gz/'` 67 | makedirs .`dirname $restore_path` $arch.dir 68 | ssh $cfg_remote_login@$cfg_remote_host tar -C $cfg_remote_path/restore -xzf $archgz .$restore_path 69 | # scp $cfg_remote_login@$cfg_remote_host:$cfg_remote_path/restore/$restore_path $rdir$restore_path 70 | ssh $cfg_remote_login@$cfg_remote_host tar -C $cfg_remote_path/restore`dirname $restore_path` -cf - . | tar -C $rdir`dirname $restore_path` -xf - 71 | return 0 72 | ) || ( 73 | makedirs .$restore_path $arch.dir 74 | ssh $cfg_remote_login@$cfg_remote_host grep "\'\.$restore_path" $arch.dir | sh 75 | for arch in $arch_list 76 | do 77 | arch=`echo $arch | sed 's/tlist$/tar.gz/'` 78 | ssh $cfg_remote_login@$cfg_remote_host tar -C $cfg_remote_path/restore -xzf $arch .$restore_path 79 | 80 | done 81 | ssh $cfg_remote_login@$cfg_remote_host tar -C $cfg_remote_path/restore$restore_path -cf - . | tar -C $rdir$restore_path -xf - 82 | return 0 83 | ) 84 | } 85 | 86 | cd $backup_path 87 | cfg_type=`getvar cfg_type` 88 | 89 | [ "$cfg_type" = "remote_ssh" ] && ( 90 | cfg_remote_host=`getvar cfg_remote_host` 91 | cfg_remote_login=`getvar cfg_remote_login` 92 | cfg_remote_path=`getvar cfg_remote_path` 93 | 94 | arch_list=`ssh $cfg_remote_login@$cfg_remote_host grep -l "^.$restore_path$" $cfg_remote_path/*\.list | sort` 95 | [ -z "$arch_list" ] && arch_list=`ssh $cfg_remote_login@$cfg_remote_host grep -l "^\.$restore_path/" $cfg_remote_path/*\.list | sort` 96 | [ -z "$arch_list" ] && { 97 | echo "Not found" 98 | exit 0 99 | } 100 | cfg_backup_name=`getvar cfg_backup_name` 101 | i=0 102 | for arch in $arch_list 103 | do 104 | i=$[$i+1] 105 | date=`echo $arch | sed "s#^$cfg_remote_path/$cfg_backup_name-##" | sed 's/\.list$//'` 106 | dates="$dates $date" 107 | echo "$i) $date" 108 | done 109 | i=$[$i+1] 110 | echo "$i) All in order by date" 111 | n=0 112 | while [ $n -eq 0 ] 113 | do 114 | read n 115 | [ $n -gt $i ] || [ $n -lt 1 ] && { 116 | echo "Wrong number" 117 | n=0 118 | } 119 | done 120 | [ $n -eq $i ] && { 121 | j=1 122 | i=$[$i-1] 123 | while [ $j -le $i ] 124 | do 125 | ssh_restore $j 126 | j=$[$j+1] 127 | done 128 | exit 0 129 | } 130 | ssh_restore $n 131 | ) 132 | 133 | -------------------------------------------------------------------------------- /contrib/rsync_sample/README: -------------------------------------------------------------------------------- 1 | Несколько примеров использования rsync для полной синхронизации всей системы 2 | на запасной жесткий диск, с которого можно загрузиться после краха основного. 3 | -------------------------------------------------------------------------------- /contrib/rsync_sample/local_rsync/rsync_backup.exclude: -------------------------------------------------------------------------------- 1 | /backup 2 | /cdrom 3 | /mnt 4 | /proc 5 | /tmp 6 | /var/log 7 | /var/tmp 8 | /var/account 9 | /var/mail 10 | /var/spool/postfix 11 | /usr/obj 12 | /usr/src 13 | /usr/tmp 14 | /usr/ports 15 | /usr/local/alertmon/toplogs 16 | /usr/local/apache/logs 17 | /usr/local/pgsql/data/base 18 | /usr/local/pgsql/data/global 19 | /usr/local/pgsql/data/pg_xlog 20 | /usr/local/pgsql/data/pg_clog 21 | /var/run/log 22 | /usr/local/fsbackup/cache 23 | -------------------------------------------------------------------------------- /contrib/rsync_sample/local_rsync/rsync_backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Полный бэкап системы на запасной диск 3 | 4 | # Предотвращаем съедание процессом всей памяти. 5 | ulimit -v 200000 6 | 7 | # Исключаем одновременный запуск двух rsync процессов. 8 | IDLE=`ps -auxwww | grep -E "root.*rsync" | grep -vE "grep|rsync_backup"` 9 | if [ "$IDLE" != "" ]; then 10 | echo "FATAL DUP"| mail -s "FATAL RSYNC BACKUP DUP" admins@testhost.ru 11 | exit 12 | fi 13 | 14 | date 15 | #/sbin/mount -u -w /backup 16 | #/bin/mount -o remount,rw /backup 17 | 18 | #Сохраняем список всех директорий и их параметров 19 | /usr/local/fsbackup/scripts/create_dir_list.pl / > /usr/local/fsbackup/sys_backup/dir_list.txt 20 | 21 | #/usr/local/bin/rsync -a -v --delete --delete-excluded --backup --exclude-from=/etc/rsync_backup.exclude / /backup 22 | /usr/local/bin/rsync -a -v --delete --backup --exclude-from=/etc/rsync_backup.exclude / /backup 23 | 24 | RETCODE=$? 25 | if [ $RETCODE -ne 0 -a $RETCODE -ne 24 ]; then 26 | echo "Err code=$RETCODE"| mail -s "FATAL RSYNC BACKUP" admins@testhost.ru 27 | fi 28 | echo RET: $RETCODE 29 | 30 | # Дополнительный бэкап почтовых ящиков (без резервирования старых копий) 31 | /usr/local/bin/rsync -a -v --delete /var/mail /backup/var/ 32 | 33 | /bin/chmod 0700 /backup 34 | #/sbin/mount -u -r /backup 35 | #/bin/mount -o remount,rw /backup 36 | 37 | date 38 | 39 | -------------------------------------------------------------------------------- /contrib/rsync_sample/remote_rsync/rsync.exclude: -------------------------------------------------------------------------------- 1 | + /arc/test/ 2 | - /arc/* 3 | /htdocs/cache/ 4 | /.* 5 | /.ssh 6 | /tmp/ 7 | -------------------------------------------------------------------------------- /contrib/rsync_sample/remote_rsync/rsync_backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Синхронизация домашней директории пользователя "user_name" и 3 | # базы "database_name" на удаленный хост. 4 | 5 | CUR_PATH=/home/user/backup_rsync 6 | date 7 | 8 | # Предотвращаем съедание процессом всей памяти. 9 | ulimit -v 200000 10 | 11 | # Исключаем одновременный запуск двух rsync процессов. 12 | IDLE=`ps -auxwww | grep "rsync" | grep -vE "grep|rsync_backup"` 13 | if [ "$IDLE" != "" ]; then 14 | echo "FATAL DUP"| mail -s "FATAL RSYNC BACKUP DUP" admins@testhost.ru 15 | exit 16 | fi 17 | 18 | 19 | /usr/local/pgsql/bin/pg_dump -c database_name |/usr/bin/gzip > ~/sql_dump.sql.gz 20 | 21 | export RSYNC_RSH="ssh -c arcfour -o Compression=no -x" 22 | 23 | # -n 24 | /usr/local/bin/rsync -a -z -v --delete --max-delete=600 --bwlimit=50 \ 25 | --backup --backup-dir=/home/backup_user/BACKUP_OLD_user_name \ 26 | --exclude-from=$CUR_PATH/rsync.exclude \ 27 | /home/user_name/ backup_user@backuphost.ru:/home/backup_user/BACKUP_user_name/ 28 | 29 | 30 | RETCODE=$? 31 | if [ $RETCODE -ne 0 -a $RETCODE -ne 24 ]; then 32 | echo "Err code=$RETCODE"| mail -s "FATAL RSYNC BACKUP" admin@testhost.ru 33 | fi 34 | echo RET: $RETCODE 35 | date 36 | -------------------------------------------------------------------------------- /create_backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Backup planner running from crontab. 3 | # Скрипт для запуска backup подсистемы из crontab. 4 | # 5 | # http://www.opennet.ru/dev/fsbackup/ 6 | # Copyright (c) 2001 by Maxim Chirkov. 7 | # 8 | # Пример строки для crontab: 9 | # 10 | #18 4 * * * /usr/local/fsbackup/create_backup.sh| mail -s "`uname -n` backup report" root 11 | 12 | #-------------------------------------- 13 | # Path where fsbackup installed. 14 | # Директория где установлена программа. 15 | #-------------------------------------- 16 | 17 | backup_path="/usr/local/fsbackup" 18 | 19 | 20 | #-------------------------------------- 21 | # List of fsbackup configuration files, delimited by spaces. 22 | # Directories for saving backup in each configuration file should differ 23 | # ($cfg_remote_path, $cfg_local_path). 24 | # 25 | # Список файлов конфигурации, разделенных пробелом. 26 | # Директории для сохранения бэкапа в каждом конфигурационном файле 27 | # должны отличаться ($cfg_remote_path, $cfg_local_path), сохранение в одной и 28 | # тойже директории нескольких, описанных разными .conf файлами, бэкапов не 29 | # допустимо. 30 | 31 | #-------------------------------------- 32 | 33 | config_files="cfg_example cfg_example_users cfg_example_sql" 34 | 35 | 36 | #-------------------------------------- 37 | # 1 - run mysql_backup.sh script (you need edit mysql_backup.sh first!), 0 - not run. 38 | # Флаг бэкапа MySQL таблиц, запускается требующий предварительной настройки 39 | # скрипт ./scripts/mysql_backup.sh, 1 - запускать, 0 - не запускать. 40 | #-------------------------------------- 41 | 42 | backup_mysql=0 43 | 44 | #-------------------------------------- 45 | # 1 - run pgsql_backup.sh script (you need edit pgsql_backup.sh first!), 0 - not run. 46 | # Флаг бэкапа PostgreSQL таблиц, запускается требующий предварительной настройки 47 | # скрипт ./scripts/pgsql_backup.sh, 1 - запускать, 0 - не запускать. 48 | #-------------------------------------- 49 | 50 | backup_pgsql=0 51 | 52 | #-------------------------------------- 53 | # 1 - run sqlite_backup.sh script (you need edit sqlite_backup.sh first!), 0 - not run. 54 | # Флаг бэкапа SQLite таблиц, запускается требующий предварительной настройки 55 | # скрипт ./scripts/sqlite_backup.sh, 1 - запускать, 0 - не запускать. 56 | #-------------------------------------- 57 | 58 | backup_sqlite=0 59 | 60 | 61 | #-------------------------------------- 62 | # 1 - run sysbackup.sh script (you need edit sysbackup.sh first!), 0 - not run. 63 | # Флаг бэкапа параметров системы, запускается требующий предварительной 64 | # настройки скрипт ./scripts/sysbackup.sh, 1 - запускать, 0 - не запускать. 65 | #-------------------------------------- 66 | 67 | backup_sys=0 68 | 69 | #-------------------------------------- 70 | # 1 - run mount-windows-share.sh script (you need edit mount-windows-share.sh first!), 0 - not run. 71 | # 72 | # Флаг запуска скрипта, который маунтит расшаренную папку Windows. 73 | # Требуется предварительная настройка скрипта ./scripts/mount-windows-share.sh, 74 | # 1 - запускать, 0 - не запускать. 75 | #-------------------------------------- 76 | mount_winshare=0 77 | 78 | ############################################################################# 79 | # Защита от повторного запуска двух копий fsbackup.pl 80 | IDLE=`ps auxwww | grep fsbackup.pl | grep -v grep` 81 | if [ "$IDLE" != "" ]; then 82 | echo "!!!!!!!!!!!!!!! `date` Backup dup" 83 | exit 84 | fi 85 | 86 | 87 | cd $backup_path 88 | 89 | # Оставил ulimit после тестирования, на всякий случай. 90 | #ulimit -f 512000;ulimit -d 20000;ulimit -c 100;ulimit -m 25000;ulimit -l 15000 91 | 92 | # Сохраняем MySQL базы 93 | if [ $backup_mysql -eq 1 ]; then 94 | ./scripts/mysql_backup.sh 95 | fi 96 | 97 | # Сохраняем PostgreSQL базы 98 | if [ $backup_pgsql -eq 1 ]; then 99 | ./scripts/pgsql_backup.sh 100 | fi 101 | 102 | # Сохраняем SQLite базы 103 | if [ $backup_sqlite -eq 1 ]; then 104 | ./scripts/sqlite_backup.sh 105 | fi 106 | 107 | # Сохраняем системные параметры 108 | if [ $backup_sys -eq 1 ]; then 109 | ./scripts/sysbackup.sh 110 | fi 111 | 112 | # Маунтим Windows шару (ждём пока она появится) 113 | if [ $mount_winshare -eq 1 ]; then 114 | ./scripts/mount-windows-share.sh || exit 1 115 | fi 116 | 117 | # Бэкап. 118 | for cur_conf in $config_files; do 119 | ./fsbackup.pl ./$cur_conf 120 | next_iter=`echo "$config_files"| grep "$cur_conf "` 121 | if [ -n "$next_iter" ]; then 122 | sleep 600 # Засыпаем на 10 минут, даем процессору остыть :-) 123 | fi 124 | done 125 | 126 | # Отмаунчиваем Windows шару 127 | if [ $mount_winshare -eq 1 ]; then 128 | ./scripts/mount-windows-share.sh umount 129 | fi 130 | 131 | -------------------------------------------------------------------------------- /fsbackup_eng_guide.txt: -------------------------------------------------------------------------------- 1 | Step-by-step guide by kubrack 2 | 3 | Install & Config 4 | ----------------------------------------------------- 5 | 1) Log in system as root 6 | 7 | 2) wget http://www.opennet.ru/dev/fsbackup/src/fsbackup-1.2pl1.tar.gz 8 | If you have not wget you can download this file in any browser. 9 | 10 | 3) tar -zvxf fsbackup-1.2pl1.tar.gz 11 | 12 | 4) cd fsbackup-1.2pl1/ 13 | 14 | 5) ./install.pl 15 | If you want to install fsbackup in other directory 16 | (/usr/local/fsbackup/ by default), you may owerride it by --prefix 17 | directive, for example: ./install.pl --prefix /usr/fsbackup/ 18 | 19 | You may answer by default on all script questions (simply Enter) 20 | You will see 'Installation complete' message after install done. 21 | 22 | 6) Now, you have fsbackup installed fully in /usr/local/fsbackup (or 23 | other --prefix ) directory. It consist scripts, config example and docs 24 | in some directories. 25 | 26 | Main script is create_backup.sh. It must be run periodicy via cron, or 27 | manualy, if necessary. In this one, you may determine one or more 28 | config files. Every config file will describe one set of backups. 29 | 30 | First, save original files: 31 | 32 | cd /usr/local/fsbackup/ 33 | cp -v create_backup.sh create_backup.sh.orig 34 | cp -v cfg_example my_backup1.cfg 35 | 36 | 7) Edit them: 37 | joe create_backup.sh 38 | (I like a joe, but you may be have other favorites, as vi or ed :) 39 | In create_backup.sh, we must change only "config_files" perameter (row 33). Set it to 40 | 41 | config_files="my_backup1.cfg" 42 | 43 | end examine others: 44 | 45 | backup_path="/usr/local/fsbackup" - leave untouched, if you don't use --prefix option for install.pl 46 | backup_mysql=0 47 | backup_pgsql=0 48 | backup_sqlite=0 49 | backup_sys=0 50 | 51 | - if we dont want to backup databases and sysconfigs. Otherwise, we must 52 | edit scripts/* too. Write me pls if you want it. 53 | 54 | Save it end exit from editor. 55 | 56 | 8) joe my_backup1.cfg 57 | 58 | row 13: $cfg_backup_name - simply tag of backup. Hostname by 59 | default. May contain [a-z,A-Z,0-9,_] only. 60 | 61 | row 22: $cfg_cache_dir - backup cache directory. If possible, leave 62 | "/usr/local/fsbackup/cache" 63 | 64 | rows 36-40: $prog_* - may be checked, but usually true for RH. 65 | 66 | NOTES: 67 | 68 | * if you dont want enscryption, set $prog_pgp = "". Be sure: it about 69 | enscryption of entry archive, NOT simply protect it for transfer to 70 | network backup server (SSH will describe below). It may eat many 71 | resources for big backups. 72 | 73 | * if you want enscryption and set $prog_pgp = "/usr/bin/gpg", set 74 | $prog_gzip = "", because gpg will already compress it. 75 | 76 | row 56: $cfg_checksum - used for incremental backup, "timesize" recomended. 77 | 78 | row 75: $cfg_backup_style - "backup" for incremental backup 79 | 80 | row 85: $cfg_increment_level - as described, after how many 81 | incremental copy make full refresh of backup. If 0, don't make full refresh. 82 | 83 | row 100: $cfg_save_old_backup - save or not OLD backup. 84 | 85 | row 114: $cfg_type - for local part of your project, must be 86 | "local". Use dedicated HD for backup destination is recommended. 87 | 88 | For you demands, must be created two configs (and placed into create_backup.sh): 89 | 90 | * first, for backup all demanded dirs or files, with $cfg_type="local" 91 | 92 | * other, for move first backup to another server, with $cfg_type= 93 | "remote_ssh" or "remote_ftp", in which result of first backup 94 | ($cfg_local_path) described as backuped dir. 95 | 96 | About methods: ssh is more secure, but ftp is more quickly. If both 97 | servers are placed in one ethernet segment, with trusted hosts only, use 98 | ftp. Otherwise, ssh. 99 | 100 | For ssh method certificate must be generated on backup destination 101 | server and placed into user's home on another server. 102 | 103 | row 122-124: $cfg_remote* - settings for remote cfg_types. 104 | 105 | row 135: $cfg_remote_ftp_mode - 1 if you have problem with firewalls between servers. 106 | 107 | row 142: $cfg_remote_password - for ftp login to remote server. 108 | 109 | row 152: $cfg_local_path - if $cfg_type=local, backups will be 110 | placed here. Not the some with cache! Must be already created. Dont 111 | forget exclude it from directories for backup below. 112 | 113 | row 162: $cfg_time_limit - as described, 0 for all. 114 | 115 | row 172: $cfg_size_limit - as described, in KB 116 | 117 | row 186: $cfg_maximum_archive_size - BEFORE compression! 118 | 119 | row 195: $cfg_root_path - change it if you want describe all not from root dir. 120 | 121 | row 206: $cfg_pgp_userid - as described, for enscryption. 122 | 123 | row 222: $cfg_verbose - verbose level 124 | 125 | row 241: $cfg_stopdir_prune - leave untouched 126 | 127 | So, for local backup I have change next setting: 128 | 129 | $prog_pgp = ""; 130 | 131 | Below, you have a list of backuped files & directories. For Linux, 132 | comment out strings 326,327 (BSD pkgs & kernel), and edit other for your 133 | directories. 134 | 135 | My list: 136 | 137 | __DATA__ 138 | /usr/local/fsbackup 139 | !/usr/local/fsbackup/cache 140 | !/usr/local/fsbackup/archive 141 | f!\.core$ 142 | f!^core$ 143 | f!\.o$ 144 | f!\.log$ 145 | 146 | # Linux 147 | /usr/src/linux/.config 148 | 149 | # Users 150 | /home 151 | /root 152 | !/home/ftp 153 | =!\.netscape/cache/ 154 | =!\.mozilla/.*/Cache/ 155 | =!\.mozilla/.*/NewCache/ 156 | =!\.mozilla/.*/News/ 157 | f!.*\.avi$ 158 | f!.*\.mpeg$ 159 | f!.*\.mpg$ 160 | f!.*\.mp3$ 161 | 162 | # System configuration 163 | /etc 164 | /var/cron/tabs 165 | /var/spool/cron 166 | /usr/local/etc 167 | 168 | NOTE: I have dedicated HDD mount to /usr/local/fsbackup/archive 169 | 170 | 8) Creating the local backup dir & protect it: 171 | 172 | mkdir -p /usr/local/fsbackup/archive 173 | chmod 700 /usr/local/fsbackup/archive 174 | 175 | 9) Planning of backup: 176 | 177 | joe /etc/crontab 178 | 179 | add string: 180 | 181 | 1 1 * * 1 root /usr/local/fsbackup/create_backup.sh 182 | 183 | for weekly backup, or 184 | 185 | 1 1 * * * root /usr/local/fsbackup/create_backup.sh 186 | 187 | for daily backup. You can run it as "nice -n 5 /usr/local/fsbackup/create_backup.sh" 188 | if you want decrease CPU load by backup for other apps. 189 | 190 | 10) Testing fsbackup: 191 | 192 | # /usr/local/fsbackup/create_backup.sh 193 | Creating local backup: router_ap01 194 | Current increment number: 0 195 | Adding /usr/local/fsbackup.... 196 | done 197 | Adding /usr/src/linux/.config.... 198 | done 199 | Adding /home.... 200 | done 201 | Adding /root.... 202 | done 203 | Adding /etc.... 204 | done 205 | Adding /var/cron/tabs.... 206 | done 207 | Adding /var/spool/cron.... 208 | done 209 | Adding /usr/local/etc.... 210 | done 211 | Storing local backup... 212 | ***** Backup successful complete. 213 | 214 | 11) And verify: 215 | 216 | # ls -l /usr/local/fsbackup/archive 217 | total 11088 218 | -rw-r--r-- 1 root root 11091270 Sep 10 02:23 router_ap01-2005.09.10.02.23.00-0.tar.gz 219 | -rw-r--r-- 1 root root 0 Sep 10 02:23 router_ap01-2005.09.10.02.23.00.del 220 | -rw-r--r-- 1 root root 28874 Sep 10 02:23 router_ap01-2005.09.10.02.23.00.dir 221 | -rw-r--r-- 1 root root 172032 Sep 10 02:23 router_ap01-2005.09.10.02.23.00.hash 222 | -rw-r--r-- 1 root root 36191 Sep 10 02:23 router_ap01-2005.09.10.02.23.00.list 223 | -rw-r--r-- 1 root root 41787 Sep 10 02:23 router_ap01-2005.09.10.02.23.00.lsize 224 | 225 | 226 | --- Write me your questions pls. Answers & about restore from backup in 227 | next mail. 228 | 229 | 230 | Restoring 231 | ----------------------------------------------------- 232 | 233 | For restoring data from the backup, we can use script 234 | /usr/local/fsbackup/scripts/fsrestore.sh 235 | 236 | May be you want to save this file separately, simply in backup dir, for 237 | more quickly restoring: 238 | 239 | cp -v /usr/local/fsbackup/scripts/fsrestore.sh /usr/local/fsbackup/archive/ 240 | 241 | 1) Make some changes: 242 | 243 | joe /usr/local/fsbackup/scripts/fsrestore.sh 244 | there are 3 options here: 245 | 246 | * backup_name 247 | tag of data for extract (if you have more than 1 config for fsbackup, 248 | you can restore it separately) 249 | 250 | * backup_path 251 | in our fsbackup config we have "/usr/local/fsbackup/archive", but may 252 | be after crash you will want mount dedicated HD to other point.. 253 | 254 | * restore_path 255 | this dir will be "root point" for the extracted data. 256 | 257 | 2) do restoring process: 258 | /usr/local/fsbackup/scripts/fsrestore.sh 259 | 260 | Removing deleted files for router_ap01-2005.09.10.02.23.00-0.tar.gz... 261 | Restoring router_ap01-2005.09.10.02.23.00-0.tar.gz... 262 | Fixing directory permissions for router_ap01-2005.09.10.02.23.00-0.tar.gz... 263 | mkdir: cannot create directory `./usr/local/fsbackup': File exists 264 | mkdir: cannot create directory `./usr/local/fsbackup/scripts': File exists 265 | mkdir: cannot create directory `./root': File exists 266 | ... 267 | 268 | dont worry about "mkdir: cannot create directory" warnings: it simple 269 | try to create already created dirs in second pass of restoring. 270 | 271 | fsrestore.sh will create all your data from base & all increments of 272 | archive. Check it! 273 | 274 | 275 | FAQ 276 | ----------------------------------------------------- 277 | 278 | > Q: Local Backup done! Worked like a charm .. your instructions 279 | > were great. So my plan is to do a local backup every day (incremental 280 | > everyday and a full backup every 7 days). 281 | 282 | A: For auto-run fsbackup every day we need put 283 | /usr/local/fsbackup/create_backup.sh into Unix sheduler (/etc/crontab): 284 | 285 | cat >> /etc/crontab <<_END_ 286 | 1 1 * * * root /usr/local/fsbackup/create_backup.sh 287 | _END_ 288 | 289 | now your backup will be run every day at 1:01 AM. 290 | Behaviour of incremental-full backup determining into row 85 of /usr/local/fsbackup/my_backup1.cfg: 291 | 292 | $cfg_increment_level = 7; 293 | 7 = 1 full backup after every 6 incremental backups 294 | 295 | > Q: However, to copy backups to remote system, I am thinking of using "rsync 296 | > over ssh" rather than using another config file with fs_backup. What do you 297 | > think about that ? Will that work ? 298 | 299 | A: Yes, but fsbackup can do it itself via ssh. Configuring this below: 300 | 301 | Lets HOST_FROM is machine which from we need secure coping files, and 302 | HOST_TO is machine which to we will to copy (server). 303 | 304 | (1) Make ssh serificate on HOST_FROM: 305 | 306 | Login as root (because this user must have permissions for access to 307 | backuped files in this host, may be some other, if no need to backup 308 | system dirs); 309 | 310 | root@HOST_FROM# ssh-keygen -t rsa ; 311 | answer questions ; 312 | root@HOST_FROM# ssh-keygen -t dsa ; 313 | answer questions ; 314 | root@HOST_FROM# cat ~/.ssh/id_rsa.pub ; 315 | root@HOST_FROM# cat ~/.ssh/id_dsa.pub ; 316 | copy anywhere result of two last command (2 rows) ; 317 | 318 | (2) On host HOST_TO: 319 | (2.1)Make sure to exist & uncomment next lines in your sshd config (usualy /etc/ssh/sshd_config) : 320 | 321 | RSAAuthentication yes 322 | PubkeyAuthentication yes 323 | AuthorizedKeysFile .ssh/authorized_keys 324 | 325 | If no, add its and restart sshd (/etc/init.d/sshd restart) 326 | 327 | (2.2) Create .ssh directory in home of user, who will be owner to 328 | fsbackup repository. Usually he is ordinate user, not root, for security 329 | reason. 330 | 331 | Make ~/.ssh/authorized_keys file there, and grant permissions: 332 | 333 | root@HOST_TO# su - someuser 334 | someuser@HOST_TO> mkdir ~/.ssh 335 | someuser@HOST_TO> touch ~/.ssh/authorized_keys 336 | someuser@HOST_TO> chmod 700 ~/.ssh 337 | someuser@HOST_TO> chmod 600 ~/.ssh/authorized_keys 338 | 339 | (2.3) Put two rows from previons step (content of /root/.ssh/id_rsa.pub, 340 | /root/.ssh/id_dsa.pub from HOST_FROM) into the ~/.ssh/authorized_keys 341 | 342 | (3) Test of public key authentication: 343 | 344 | As root@HOST_FROM, try: 345 | 346 | root@HOST_FROM# ssh someuser@HOST_TO 347 | 348 | you will logged as 'someuser' to 'HOST_TO', without password. 349 | 350 | (4) If step 3 successful, configure fsbackup on HOST_FROM for store 351 | backup to repository on HOST_TO. 352 | 353 | NOTE: you not need to install and run fsbackup on HOST_TO. 354 | (4.1) Make repository on HOST_TO owned by 'someuser' and set permissions: 355 | 356 | someuser@HOST_TO> mkdir ~/backup_from_HOST_FROM 357 | someuser@HOST_TO> chmod 700 ~/backup_from_HOST_FROM 358 | 359 | (4.2) Configure fsbackup on HOST_FROM: 360 | 361 | root@HOST_FROM# joe /usr/local/fsbackup/my_backup1.cfg 362 | 363 | change next rows: 364 | 365 | $cfg_type = "remote_ssh"; 366 | $cfg_remote_host = "HOST_TO"; 367 | $cfg_remote_login = "someuser"; 368 | $cfg_remote_path = "/home_of_someuser/backup_from_HOST_FROM"; 369 | 370 | (4.3) run the fsbackup and check result: 371 | 372 | root@HOST_FROM# /usr/local/fsbackup/create_backup.sh 373 | someuser@HOST_TO> ls -l ~/backup_from_HOST_FROM/ 374 | 375 | (4.3) dont forget to place to /etc/crontab on HOST_FROM next row for everyday backup: 376 | 377 | 1 1 * * * root /usr/local/fsbackup/create_backup.sh 378 | 379 | > Q: Do you have any script to test if the backup completed successfully 380 | > every day ? I want to plug that script into my nagios so that I know that the 381 | > backup happened everyday. So if I run the backup script everyday, I can have 382 | > this script check for it. If for any reason, the backup failed, my nagios will 383 | > alert me. 384 | 385 | A: Hmm.. if you have fsbackup runned from /etc/crontab as root, as 386 | described above, cron will send to root all output of script as mail 387 | every day. It is most full method of backup control, because logical 388 | mistakes are possible, as empty directories or missed directories to 389 | backup, etc. But if you want to trace some certain moments, tell me and 390 | we will try to resolve it. 391 | 392 | > Q: I forgot one small thing. One of my systems has mysql on it. You mentioned this: 393 | > - if we dont want to backup databases and sysconfigs. Otherwise, we 394 | > must edit scripts/* too. Write me pls if you want it. 395 | > 396 | > Would it be too difficult to give me instructions to backup mysql databases ? 397 | 398 | A: For setup to backup mysql database, we need to: 399 | 400 | (1) edit /usr/local/fsbackup/scripts/mysql_backup.sh: 401 | 402 | row 17: backup_name="some_name" 403 | 404 | row 43: backup_method="full" - all databases 405 | 406 | row 52: backup_db_list - list of databases - not used if 407 | backup_method="full", aplied if backup_method= "db" or "notdb" 408 | 409 | row 61,62: backup_mysqluser,backup_mysqlpassword - auth information for MySQL 410 | 411 | row 73: backup_path - mysql backups will be placed here. 412 | 413 | row 81: backup_progdump_path="/usr/local/bin" - path to "mysqldump" 414 | 415 | row 93: extra_mysqldump_flag="--complete-insert" - extra mysqldump 416 | flags. See man mysqldump to find what you want. 417 | 418 | (2) edit the backup run script, /usr/local/fsbackup/create_backup.sh: 419 | joe /usr/local/fsbackup/create_backup.sh 420 | in line 42, set: 421 | backup_mysql=1 422 | 423 | (3) test your mysql_backup script: 424 | /usr/local/fsbackup/scripts/mysql_backup.sh 425 | and all system: 426 | /usr/local/fsbackup/create_backup.sh 427 | 428 | 429 | > Q: Also, what do you mean by "sysconfigs" ? 430 | 431 | A: As sysconfigs here is meant are information about installed packages, 432 | for opportunity to quick restore all non-system (installed by packages) 433 | services. 434 | 435 | 436 | > Q: I am backing up /etc directory. Are there system configs besides /etc directory ? 437 | 438 | A: Some thrid-party services stored config files in /usr/local/etc dir 439 | too. And there are some important config data which stored in Linux in 440 | /var, as named's zone files. 441 | 442 | -------------------------------------------------------------------------------- /install.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | # Script to install fsbackup package and some required perl modules 3 | # --prefix=install path, default /usr/local/fsbackup 4 | # --prefix-man=manual path location, default /usr/local/man/man1 5 | # 6 | # Скрипт для установки программы и всех недостающих Perl модулей. 7 | # --prefix=путь куда устаналивать программу, по умолчанию /usr/local/fsbackup 8 | # --prefix-man=путь куда скопировать системное руководство для программы. 9 | # 10 | # http://www.opennet.ru/dev/fsbackup/ 11 | # Copyright (c) 2001 by Maxim Chirkov. 12 | 13 | $default_install_path = "/usr/local/fsbackup"; 14 | $default_install_man = "/usr/local/man/man1"; 15 | 16 | ######################################################################### 17 | %module_list = ( 18 | "Digest/MD5.pm" => "Digest-MD5-2.13.tar.gz", 19 | "DB_File.pm" => "DB_File-1.77.tar.gz", 20 | "Net/FTP.pm" => "libnet-1.0703.tar.gz", 21 | ); 22 | 23 | #----------------------------------------------------------------------- 24 | use Getopt::Long; 25 | 26 | GetOptions("prefix=s", \$prefix, "prefix-man=s", \$prefix_man); 27 | 28 | $prefix = defined($prefix) ? $prefix : $default_install_path; 29 | $prefix_man = defined($prefix_man) ? $prefix_man : $default_install_man; 30 | print "Installing to $prefix (man to $prefix_man)\n"; 31 | 32 | chomp($prog_md5sum = `which md5sum`); 33 | chomp($prog_tar = `which tar`); 34 | chomp($prog_ssh = `which ssh`); 35 | chomp($prog_rm = `which rm`); 36 | chomp($prog_gzip = `which gzip`); 37 | chomp($prog_pgp = `which gpg`); 38 | chomp($prog_sqlite = `which sqlite`); 39 | $prog_pg_dump = `which pg_dump` || "/usr/local/pgsql/bin/pg_dump"; 40 | $prog_pg_dump =~ s/^(.*)\/[^\/]+$/$1/; 41 | chomp($prog_pg_dump); 42 | $prog_mysqldump = `which mysqldump` || "/usr/local/mysql/bin/mysqldump"; 43 | $prog_mysqldump =~ s/^(.*)\/[^\/]+$/$1/; 44 | chomp($prog_mysqldump); 45 | chomp($backup_name = `uname -n|tr '.' '_'`); 46 | 47 | print "Makeing man page...\n"; 48 | system ("pod2man fsbackup.pl > fsbackup.1"); 49 | print "Installing man page to $prefix_man...\n"; 50 | system ("mkdir -p $prefix_man"); 51 | system ("cp -f fsbackup.1 $prefix_man/fsbackup.1"); 52 | system ("chmod 644 $prefix_man/fsbackup.1"); 53 | 54 | print "Creation directory tree in $prefix...\n"; 55 | 56 | if (! -d $prefix){ 57 | system ("mkdir $prefix"); 58 | system ("chmod 755 $prefix"); 59 | } 60 | system ("mkdir $prefix/cache"); 61 | system ("chmod 700 $prefix/cache"); 62 | system ("mkdir $prefix/scripts"); 63 | system ("chmod 700 $prefix/scripts"); 64 | system ("mkdir $prefix/sys_backup"); 65 | system ("chmod 700 $prefix/sys_backup"); 66 | 67 | print "Installing fsbackup in $prefix...\n"; 68 | 69 | system ("cp -f FAQ $prefix/FAQ"); 70 | system ("chmod 644 $prefix/FAQ"); 71 | system ("cp -f README $prefix/README"); 72 | system ("chmod 644 $prefix/README"); 73 | system ("cp -f VERSION $prefix/VERSION"); 74 | system ("chmod 644 $prefix/VERSION"); 75 | system ("cp -f fsbackup.1 $prefix/fsbackup.1"); 76 | system ("chmod 644 $prefix/fsbackup.1"); 77 | 78 | copyfile("fsbackup.pl", "$prefix/fsbackup.pl"); 79 | system ("chmod 711 $prefix/fsbackup.pl"); 80 | copyfile("cfg_example", "$prefix/cfg_example"); 81 | system ("chmod 600 $prefix/cfg_example"); 82 | copyfile("cfg_example_users", "$prefix/cfg_example_users"); 83 | system ("chmod 600 $prefix/cfg_example_users"); 84 | copyfile("cfg_example_users", "$prefix/cfg_example_sql"); 85 | system ("chmod 600 $prefix/cfg_example_sql"); 86 | copyfile("create_backup.sh", "$prefix/create_backup.sh"); 87 | system ("chmod 711 $prefix/create_backup.sh"); 88 | copyfile("scripts/mysql_backup.sh", "$prefix/scripts/mysql_backup.sh"); 89 | system ("chmod 711 $prefix/scripts/mysql_backup.sh"); 90 | copyfile("scripts/sysbackup.sh", "$prefix/scripts/sysbackup.sh"); 91 | system ("chmod 711 $prefix/scripts/sysbackup.sh"); 92 | copyfile("scripts/fsrestore.sh", "$prefix/scripts/fsrestore.sh"); 93 | system ("chmod 711 $prefix/scripts/fsrestore.sh"); 94 | copyfile("scripts/pgsql_backup.sh", "$prefix/scripts/pgsql_backup.sh"); 95 | system ("chmod 711 $prefix/scripts/pgsql_backup.sh"); 96 | copyfile("scripts/sysrestore.sh", "$prefix/scripts/sysrestore.sh"); 97 | system ("chmod 711 $prefix/scripts/sysrestore.sh"); 98 | copyfile("scripts/sqlite_backup.sh", "$prefix/scripts/sqlite_backup.sh"); 99 | system ("chmod 711 $prefix/scripts/sqlite_backup.sh"); 100 | copyfile("scripts/mount-windows-share.sh", "$prefix/scripts/mount-windows-share.sh"); 101 | system ("chmod 711 $prefix/scripts/mount-windows-share.sh"); 102 | 103 | print "* If you system not support MD5, please manually install module ./modules/Digest-Perl-MD5-1.5.tar.gz\n"; 104 | print "* If Berkeley DB not installed and failed compilation of DB_File-1.77.tar.gz, please manually install DB from http://www.sleepycat.com.\n"; 105 | 106 | while (($cur_module_path, $cur_archive)= each(%module_list)) { 107 | 108 | $cur_module = $cur_module_path; 109 | $cur_module =~ s/\//::/g; 110 | print "Checking for module $cur_module...\n"; 111 | $installed_flag = 0; 112 | foreach $prefix (@INC) { 113 | if (-f "$prefix/$cur_module_path") { 114 | $installed_flag = 1; 115 | last; 116 | } 117 | } 118 | if ($installed_flag == 1){ 119 | print "Module $cur_module already installed, skiping installation procedure.\n"; 120 | } else { 121 | install_module($cur_module, $cur_archive); 122 | } 123 | print "\n"; 124 | } 125 | 126 | 127 | print "Installation complete.\n"; 128 | exit; 129 | ############################################################# 130 | # Процедура для копирования файлов с изменениями 131 | 132 | sub copyfile{ 133 | my ($from_file, $to_file) = @_; 134 | 135 | open(FROM_FILE, "<$from_file")||die "Can't open $from_file\n"; 136 | flock(FROM_FILE, 1); 137 | open(TO_FILE, ">$to_file")||die "Can't create $to_file\n"; 138 | flock(TO_FILE, 2); 139 | while(){ 140 | $line = $_; 141 | if ($prog_md5sum ne "" && $prog_md5sum !~ /\s/){ 142 | $line =~ s/"md5sum -b"/"$prog_md5sum -b"/; 143 | } 144 | if ($prog_tar ne "" && $prog_tar !~ /\s/){ 145 | $line =~ s/"tar"/"$prog_tar"/; 146 | } 147 | if ($prog_ssh ne "" && $prog_ssh !~ /\s/){ 148 | $line =~ s/"ssh"/"$prog_ssh"/; 149 | } 150 | if ($prog_rm ne "" && $prog_rm !~ /\s/){ 151 | $line =~ s/"rm"/"$prog_rm"/; 152 | } 153 | if ($prog_gzip ne "" && $prog_gzip !~ /\s/){ 154 | $line =~ s/"gzip"/"$prog_gzip"/; 155 | } 156 | if ($prog_pgp ne "" && $prog_pgp !~ /\s/){ 157 | $line =~ s/"gpg"/"$prog_pgp"/; 158 | } 159 | if ($prog_pg_dump ne "" && $prog_pg_dump !~ /\s/){ 160 | $line =~ s/"\/usr\/local\/pgsql\/bin"/"$prog_pg_dump"/; 161 | } 162 | if ($prog_mysqldump ne "" && $prog_mysqldump !~ /\s/){ 163 | $line =~ s/"\/usr\/local\/mysql\/bin"/"$prog_mysqldump"/; 164 | } 165 | if ($backup_name ne ""){ 166 | $line =~ s/"test_host"/"$backup_name"/; 167 | } 168 | 169 | if ($prefix ne "/usr/local/fsbackup"){ 170 | $line =~ s/\/usr\/local\/fsbackup/$prefix/; 171 | } 172 | print TO_FILE $line; 173 | } 174 | close(TO_FILE); 175 | close(FROM_FILE); 176 | } 177 | ###################################################################### 178 | # Процедура для автоматической установки модулей. 179 | sub install_module{ 180 | my($module_name, $module_archive) = @_; 181 | my ($module_dir); 182 | 183 | $module_archive =~ /^(.+)\.tar\.gz$/; 184 | $module_dir = $1; 185 | print "Unpcking archive $module_archive..\n"; 186 | print "Installing module $module_name..\n"; 187 | system ("tar -xzf ./modules/$module_archive -C ./modules/"); 188 | chdir ("./modules/$module_dir"); 189 | system "perl Makefile.PL; make; make install"; 190 | print "Installation of module $module_name successfully complete.\n"; 191 | chdir ("../../"); 192 | } 193 | -------------------------------------------------------------------------------- /modules/DB_File-1.77.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opennet/FSBackup/254442cee6273eff040006d8f082319b4fe649fa/modules/DB_File-1.77.tar.gz -------------------------------------------------------------------------------- /modules/Digest-MD5-2.13.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opennet/FSBackup/254442cee6273eff040006d8f082319b4fe649fa/modules/Digest-MD5-2.13.tar.gz -------------------------------------------------------------------------------- /modules/Digest-Perl-MD5-1.5.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opennet/FSBackup/254442cee6273eff040006d8f082319b4fe649fa/modules/Digest-Perl-MD5-1.5.tar.gz -------------------------------------------------------------------------------- /modules/freebsd_inst.txt: -------------------------------------------------------------------------------- 1 | cd /usr/ports/net/p5-Net/ && make && make install 2 | cd /usr/ports/security/p5-Digest-MD5 && make && make install 3 | cd /usr/ports/databases/db3 && make && make install 4 | -------------------------------------------------------------------------------- /modules/libnet-1.0703.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opennet/FSBackup/254442cee6273eff040006d8f082319b4fe649fa/modules/libnet-1.0703.tar.gz -------------------------------------------------------------------------------- /modules/linux_inst.txt: -------------------------------------------------------------------------------- 1 | Fedora, Debian... - необходимые модули входят в базовый пакет Perl 5.8.x 2 | 3 | AltLinux: 4 | apt-get install perl-libnet 5 | apt-get install perl-DBM 6 | 7 | Gentoo: 8 | emerge -v perl-core/Digest-MD5 perl-core/DB_File dev-perl/DBD-mysql dev-perl/DBI dev-perl/Net-Daemon mysql perl-core/libnet dev-perl/MLDBM 9 | -------------------------------------------------------------------------------- /rpms/fsbackup-1.2-pl2.noarch.rpm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opennet/FSBackup/254442cee6273eff040006d8f082319b4fe649fa/rpms/fsbackup-1.2-pl2.noarch.rpm -------------------------------------------------------------------------------- /rpms/fsbackup-1.2-pl2.src.rpm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opennet/FSBackup/254442cee6273eff040006d8f082319b4fe649fa/rpms/fsbackup-1.2-pl2.src.rpm -------------------------------------------------------------------------------- /scripts/fsrestore.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Script for restore files backuped by fsbackup.pl 3 | # Восстановление данных из инкрементального бэкапа. 4 | # Внимание, данные предварительно должны быть расшифрованы в случае использования PGP 5 | # 6 | # http://www.opennet.ru/dev/fsbackup/ 7 | # Copyright (c) 2001 by Maxim Chirkov. 8 | 9 | #------------------- 10 | # Name of backup, single word. 11 | # Имя бэкапа. 12 | #------------------- 13 | 14 | backup_name="test_host" 15 | 16 | 17 | #------------------- 18 | # Directory with content of incremental backup. 19 | # Директория где находится бэкап. 20 | #------------------- 21 | 22 | backup_path="/mnt/backup" 23 | 24 | 25 | #------------------- 26 | # Directory to save restored data. 27 | # Корневая директория куда будут помещены данные восстановленные из бэкапа. 28 | #------------------- 29 | 30 | restore_path="/var/backup" 31 | 32 | 33 | ########################################################################### 34 | old_path=`pwd` 35 | cd $backup_path 36 | 37 | for cur_arc in `ls *.tar* | sort -n`; do 38 | del_file="`echo \"$cur_arc\"| sed 's/\-0.tar\(.gz\)*$//'`.del" 39 | dir_file="`echo \"$cur_arc\"| sed 's/\-0.tar\(.gz\)*$//'`.dir" 40 | if [ -e "$del_file" ]; then 41 | echo "Removing deleted files for $cur_arc..." 42 | cd $restore_path 43 | sh $backup_path/$del_file 44 | cd $backup_path 45 | fi 46 | echo "Restoring $cur_arc..." 47 | gzip_type=`ls $cur_arc|grep '.gz'` 48 | if [ -n "$gzip_type" ]; then 49 | tar -xpzf $cur_arc -C $restore_path 50 | else 51 | tar -xpf $cur_arc -C $restore_path 52 | fi 53 | if [ -e "$dir_file" ]; then 54 | echo "Fixing directory permissions for $cur_arc..." 55 | cd $restore_path 56 | sh $backup_path/$dir_file 57 | cd $backup_path 58 | fi 59 | done 60 | 61 | cd $old_path 62 | 63 | 64 | -------------------------------------------------------------------------------- /scripts/mount-windows-share.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # ver 0.3 4 | # by Molchanov Alexander 5 | # 6 | # This script mounts Windows share. 7 | # Этот скрипт маунтит разшаренную папку у Windows. 8 | # В конфигах fsbackup должны быть параметры: 9 | # $cfg_type = "local"; 10 | # $cfg_local_path = "/usr/local/fsbackup/archive"; 11 | # 12 | # Нужна установленная Samba с поддержкой CIFS и netcat. Require: 13 | # * for gentoo: USE="ads client smbclient" emerge -v net-fs/samba net-analyzer/netcat 14 | # * for Debian-10: apt install cifs-utils smbclient netcat-traditional 15 | # 16 | 17 | # параметры windows хоста 18 | SMB_HOST=192.168.1.44 19 | SMB_SHARE=BACKUP 20 | SMB_USER=backup 21 | SMB_PASS=somepassword 22 | SMB_CHECK_PORT=135 23 | 24 | LOCAL_MNT_DIR=/usr/local/fsbackup/archive 25 | 26 | # ------------------------------------------------ 27 | if [ _"$1" = _"umount" ]; then 28 | echo "Ok. Backup done. Unmount share and exit..." 29 | if ! umount $LOCAL_MNT_DIR ; then 30 | echo "Fail umount share '$LOCAL_MNT_DIR'." 31 | exit 1 32 | fi 33 | 34 | echo "Umount '$LOCAL_MNT_DIR' success." 35 | exit 0 36 | fi 37 | 38 | # ------------------------------------------------ 39 | 40 | echo "Check and wait availability Windows shared directory at '$SMB_HOST:$SMB_CHECK_PORT'" 41 | nc -z $SMB_HOST $SMB_CHECK_PORT 42 | res=$? 43 | 44 | # Ждём доступность Windows хоста (к примеру, это может быть 45 | # пользовательский хост, который включается только днём). 46 | # Wait while SMB is UP 47 | while [ $res -ne 0 ] 48 | do 49 | nc -z $SMB_HOST $SMB_CHECK_PORT 50 | res=$? 51 | 52 | # sleep for waiting up all services on windows PC 53 | # and don't annoy by checks very often 54 | sleep 300 55 | done 56 | 57 | # check if share already mounted 58 | if [ -n "`/bin/df -h | egrep \"//$SMB_HOST/$SMB_SHARE\"`" ] 59 | then 60 | echo "Error! '//$SMB_HOST/$SMB_SHARE' already mounted (check mounts). Exit." 61 | exit 2 62 | fi 63 | 64 | echo "Sleep 20sec for waiting up all services on windows PC" 65 | sleep 20 66 | echo "Ok, try to mount..." 67 | 68 | if mount.cifs //$SMB_HOST/$SMB_SHARE $LOCAL_MNT_DIR -o user=$SMB_USER,pass=$SMB_PASS 69 | then 70 | echo "Share mount success. Now begining backup." 71 | 72 | sleep 1 73 | exit 0 74 | else 75 | 76 | echo "Fail mount //$SMB_HOST/$SMB_SHARE share. Exit." 77 | exit 1 78 | fi 79 | 80 | -------------------------------------------------------------------------------- /scripts/mysql_backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Script for backup SQL tables from MySQL 3 | # Скрипт для бэкапа данных хранимых в Mysql. 4 | # 5 | # http://www.opennet.ru/dev/fsbackup/ 6 | # Copyright (c) 2001 by Maxim Chirkov. 7 | # 8 | # For restore data type: 9 | # Восстановление производится с помощью команды: mysql < backupfile 10 | # 11 | 12 | #------------------- 13 | # Name of backup, single word. 14 | # Имя бэкапа. 15 | #------------------- 16 | 17 | backup_name="test_host" 18 | 19 | 20 | #------------------- 21 | # Backup method: 22 | # full - backup full DB's structure and data. 23 | # db - backup full DB's structure and data only for 'backup_db_list' databases. 24 | # notdb- backup full DB's structure and data for all DB's, except 25 | # data of 'backup_db_list' databases. 26 | # 27 | # Метод бэкапа: 28 | # full - полный бэкап всех баз (рекомендуется), 29 | # аналог запуска pg_dumpall или mysqldump --all-databases --all 30 | # 31 | # db - бэкап только указанных в backup_db_list баз данных, записи по 32 | # реконструкции баз и таблиц записываются для всех баз на SQL сервере. 33 | # notdb - бэкап всех баз, кроме указанных в backup_db_list, записи по 34 | # реконструкции баз и таблиц записываются для всех баз на SQL сервере. 35 | # Возможно исключение из бэкапа выборочных таблиц, тогда формат 36 | # списка исключаемых таблиц задается в виде: 37 | # "trash_db1 trash_db2:table1 trash_db2:table2" 38 | # - производим бэкап всех баз, коме базы trash_db1 и таблиц table1 и 39 | # table2 базы trash_db2. 40 | # 41 | #------------------- 42 | 43 | backup_method="notdb" 44 | 45 | 46 | #------------------- 47 | # List of databases (delimited by spaces) 48 | # Список включаемых или исключаемых из бэкапа баз, через пробел. 49 | # Таблицы указываются в виде: имя_базы:имя_таблицы 50 | #------------------- 51 | 52 | backup_db_list="aspseek trash:cache_table1 trash:cache_table2 mnogosearch" 53 | 54 | 55 | #------------------- 56 | # Auth information for MySQL. 57 | # Имя пользователя и пароль для соединения с Mysql, для PostgreSQL скрипт 58 | # должен запускаться из-под пользователя с правами полного доступа к базам PostgreSQL. 59 | #------------------- 60 | 61 | backup_mysqluser="" 62 | backup_mysqlpassword="" 63 | backup_mysqlhost="localhost" 64 | 65 | 66 | #------------------- 67 | # Directory to store SQL backup. You must have enought free disk space to store 68 | # all data from you SQL server. 69 | # Директория куда будет помещен бэкап данных с SQL сервера. 70 | # Внимание !!! Должно быть достаточно свободного места для бэкапа всех 71 | # выбранных БД. 72 | #------------------- 73 | 74 | backup_path="/usr/local/fsbackup/sys_backup" 75 | 76 | 77 | #------------------- 78 | # Full path of mysql programs. 79 | # Путь к программам mysql 80 | #------------------- 81 | 82 | backup_progdump_path="/usr/local/mysql/bin" 83 | 84 | #------------------- 85 | # Extra flags for mysqldump program. 86 | # -c (--complete-insert) - Use complete insert statements. 87 | # Дополнительные параметры для pg_dump 88 | # -c - формировать бэкап данных в виде INSERT комманд, с указанием названий 89 | # столбцов. Если скорость восстановления из бэкапа и размер бэкапа 90 | # более важны, и совместимостью с другими СУБД можно пренебречь, 91 | # используйте: extra_mysqldump_flag="" 92 | #------------------- 93 | 94 | extra_mysqldump_flag="--complete-insert" 95 | 96 | ############################################################################ 97 | 98 | if [ -n "$backup_progdump_path" ]; then 99 | backup_progdump_path="$backup_progdump_path/" 100 | fi 101 | 102 | #------------------------------------------------------------------------- 103 | # Полный бэкап для Mysql 104 | if [ "_$backup_method" = "_full" ]; then 105 | echo "Creating full backup of all MySQL databases." 106 | ${backup_progdump_path}mysqldump --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser --host=$backup_mysqlhost > $backup_path/$backup_name-struct-mysql 107 | ${backup_progdump_path}mysqldump --all-databases --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser --host=$backup_mysqlhost |gzip > $backup_path/$backup_name-mysql.gz 108 | exit 109 | fi 110 | 111 | #------------------------------------------------------------------------- 112 | # Бэкап указанных баз для Mysql 113 | if [ "_$backup_method" = "_db" ]; then 114 | echo "Creating full backup of $backup_db_list MySQL databases." 115 | ${backup_progdump_path}mysqldump --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser --host=$backup_mysqlhost > $backup_path/$backup_name-struct-mysql 116 | cat /dev/null > $backup_path/$backup_name-mysql 117 | 118 | for cur_db in $backup_db_list; do 119 | echo "Dumping $cur_db..." 120 | cur_db=`echo "$cur_db" | awk -F':' '{if (\$2 != ""){print \$1, \$2}else{print \$1}}'` 121 | ${backup_progdump_path}mysqldump --add-drop-table --databases --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser --host=$backup_mysqlhost $cur_db >> $backup_path/$backup_name-mysql 122 | done 123 | gzip -f $backup_path/$backup_name-mysql 124 | exit 125 | fi 126 | 127 | #------------------------------------------------------------------------- 128 | # Бэкап всех баз кроме указанных для Mysql 129 | if [ "_$backup_method" = "_notdb" ]; then 130 | echo "Creating full backup of all MySQL databases except databases $backup_db_list." 131 | ${backup_progdump_path}mysqldump --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser --host=$backup_mysqlhost > $backup_path/$backup_name-struct-mysql 132 | cat /dev/null > $backup_path/$backup_name-mysql 133 | 134 | for cur_db in `${backup_progdump_path}mysqlshow --password=$backup_mysqlpassword --user=$backup_mysqluser --host=$backup_mysqlhost | tr -d ' |'|grep -v -E '^Databases$|^\+\-\-\-'`; do 135 | 136 | grep_flag=`echo " $backup_db_list"| grep " $cur_db:"` 137 | if [ -n "$grep_flag" ]; then 138 | # Исключение таблиц для данной базы 139 | ${backup_progdump_path}mysqldump --add-drop-table --databases --no-create-info --no-data --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser --host=$backup_mysqlhost $cur_db >> $backup_path/$backup_name-mysql 140 | 141 | for cur_db_table in `${backup_progdump_path}mysqlshow --password=$backup_mysqlpassword --user=$backup_mysqluser --host=$backup_mysqlhost $cur_db| tr -d ' |'|grep -v -E '^Tables$|^Database\:|^\+\-\-\-'`; do 142 | 143 | flag=1 144 | for cur_ignore in $backup_db_list; do 145 | if [ "_$cur_ignore" = "_$cur_db:$cur_db_table" ]; then 146 | flag=0 147 | fi 148 | done 149 | 150 | if [ $flag -gt 0 ]; then 151 | echo "Dumping $cur_db:$cur_db_table..." 152 | ${backup_progdump_path}mysqldump --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser --host=$backup_mysqlhost $cur_db $cur_db_table >> $backup_path/$backup_name-mysql 153 | 154 | else 155 | echo "Skiping $cur_db:$cur_db_table..." 156 | fi 157 | done 158 | else 159 | # Исключение базы 160 | flag=1 161 | for cur_ignore in $backup_db_list; do 162 | if [ "_$cur_ignore" = "_$cur_db" ]; then 163 | flag=0 164 | fi 165 | done 166 | 167 | if [ $flag -gt 0 ]; then 168 | echo "Dumping $cur_db..." 169 | ${backup_progdump_path}mysqldump --all --add-drop-table --databases --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser --host=$backup_mysqlhost $cur_db >> $backup_path/$backup_name-mysql 170 | else 171 | echo "Skiping $cur_db..." 172 | fi 173 | fi 174 | done 175 | gzip -f $backup_path/$backup_name-mysql 176 | exit 177 | fi 178 | 179 | echo "Configuration error. Not valid parameters in backup_method or backup_sqltype." 180 | 181 | 182 | -------------------------------------------------------------------------------- /scripts/pgsql_backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # http://www.opennet.ru/dev/fsbackup/ 4 | # Copyright (c) 2001 by Maxim Chirkov. 5 | # Changed by Molchanov Alexander $PGPASS_FILE 138 | chmod 0600 $PGPASS_FILE 139 | 140 | # добавляем авторизацию в параметры 141 | extra_pg_dump_flag="$extra_pg_dump_flag -U $backup_sqluser" 142 | if [ "_$backup_sqlhost" != "_" ]; then 143 | extra_pg_dump_flag="$extra_pg_dump_flag -h $backup_sqlhost" 144 | fi 145 | if [ "_$backup_sqlport" != "_" ]; then 146 | extra_pg_dump_flag="$extra_pg_dump_flag -p $backup_sqlport" 147 | fi 148 | fi 149 | 150 | if [ "_$backup_suuser" != "_" ] && [ $chown_by_suuser -eq 1 ]; then 151 | chown -R $backup_suuser $backup_path 152 | chown $backup_suuser $PGPASS_FILE 153 | fi 154 | 155 | if [ -n "$backup_progdump_path" ]; then 156 | backup_progdump_path="$backup_progdump_path/" 157 | fi 158 | 159 | #------------------------ 160 | 161 | if [ $wal_backup -eq 1 ]; then 162 | echo "Creating last daily backup before new full backup" 163 | /usr/local/fsbackup/scripts/daily_pgsql_backup.sh "force" 164 | fi 165 | 166 | #------------------------------------------------------------------------- 167 | # Полный бэкап для Postgresql 168 | if [ "_$backup_method" = "_full" ]; then 169 | echo "Creating full backup of all PostgreSQL databases." 170 | if [ "_$backup_sqluser" = "_" ]; then 171 | ${backup_progdump_path}pg_dumpall $extra_pg_dump_flag -s > $backup_path/$backup_name-struct-pgsql 172 | fi 173 | if [ "_$backup_suuser" != "_" ]; then 174 | su - ${backup_suuser} -c ${backup_progdump_path}/pg_dumpall $extra_pg_dump_flag > $backup_path/$backup_name-pgsql 175 | else 176 | ${backup_progdump_path}/pg_dumpall $extra_pg_dump_flag > $backup_path/$backup_name-pgsql 177 | fi 178 | 179 | #------------------------------------------------------------------------- 180 | # Бэкап указанных баз для Postgresql 181 | elif [ "_$backup_method" = "_db" ]; then 182 | echo "Creating full backup of $backup_db_list PostgreSQL databases." 183 | if [ "_$backup_sqluser" = "_" ]; then 184 | ${backup_progdump_path}pg_dumpall $extra_pg_dump_flag -s > $backup_path/$backup_name-struct-pgsql 185 | fi 186 | cat /dev/null > $backup_path/$backup_name-pgsql 187 | 188 | for cur_db in $backup_db_list; do 189 | echo "Dumping $cur_db..." 190 | cur_db=`echo "$cur_db" | awk -F':' '{if (\$2 != ""){print "-t", \$2, \$1}else{print \$1}}'` 191 | if [ "_$backup_suuser" != "_" ]; then 192 | chown $backup_suuser $backup_path/$backup_name-pgsql 193 | su - ${backup_suuser} -c ${backup_progdump_path}pg_dump $extra_pg_dump_flag $cur_db >> $backup_path/$backup_name-pgsql 194 | else 195 | ${backup_progdump_path}pg_dump $extra_pg_dump_flag $cur_db >> $backup_path/$backup_name-pgsql 196 | fi 197 | done 198 | gzip -f $backup_path/$backup_name-pgsql 199 | 200 | #------------------------------------------------------------------------- 201 | # Бэкап всех баз кроме указанных для Postgresql 202 | elif [ "_$backup_method" = "_notdb" ]; then 203 | echo "Creating full backup of all PostgreSQL databases except databases $backup_db_list." 204 | if [ "_$backup_suuser" != "_" ]; then 205 | # TODO: нужно доделать это место ниже... а пока заглушка: 206 | echo "The '$backup_method' method does not support the 'backup_suuser' parameter, yet. Sorry, exit..." 207 | exit 1 208 | fi 209 | if [ "_$backup_sqluser" = "_" ]; then 210 | ${backup_progdump_path}pg_dumpall $extra_pg_dump_flag -s > $backup_path/$backup_name-struct-pgsql 211 | fi 212 | cat /dev/null > $backup_path/$backup_name-pgsql 213 | 214 | for cur_db in `${backup_progdump_path}psql -A -q -t -c "select datname from pg_database" template1 | grep -v '^template[01]$' `; do 215 | 216 | grep_flag=`echo " $backup_db_list"| grep " $cur_db:"` 217 | if [ -n "$grep_flag" ]; then 218 | # Исключение таблиц для данной базы 219 | for cur_db_table in `${backup_progdump_path}psql -A -q -t -c "select tablename from pg_tables WHERE tablename NOT LIKE 'pg\_%' AND tablename NOT LIKE 'sql\_%';" $cur_db`; do 220 | 221 | flag=1 222 | for cur_ignore in $backup_db_list; do 223 | if [ "_$cur_ignore" = "_$cur_db:$cur_db_table" ]; then 224 | flag=0 225 | fi 226 | done 227 | 228 | if [ $flag -gt 0 ]; then 229 | echo "Dumping $cur_db:$cur_db_table..." 230 | ${backup_progdump_path}pg_dump $extra_pg_dump_flag -t $cur_db_table $cur_db >> $backup_path/$backup_name-pgsql 231 | else 232 | echo "Skiping $cur_db:$cur_db_table..." 233 | fi 234 | done 235 | else 236 | # Исключение базы 237 | flag=1 238 | for cur_ignore in $backup_db_list; do 239 | if [ "_$cur_ignore" = "_$cur_db" ]; then 240 | flag=0 241 | fi 242 | done 243 | 244 | if [ $flag -gt 0 ]; then 245 | echo "Dumping $cur_db..." 246 | ${backup_progdump_path}pg_dump $extra_pg_dump_flag $cur_db >> $backup_path/$backup_name-pgsql 247 | else 248 | echo "Skiping $cur_db..." 249 | fi 250 | fi 251 | done 252 | gzip -f $backup_path/$backup_name-pgsql 253 | else 254 | # Unknown $backup_method 255 | echo "Configuration error. Not valid parameters in backup_method." 256 | exit 1 257 | fi 258 | 259 | if [ $wal_backup -eq 1 ]; then 260 | # rotate daily backups (prepare for new WAL files) 261 | /usr/local/fsbackup/scripts/daily_pgsql_rotate.pl "do" 262 | fi 263 | 264 | -------------------------------------------------------------------------------- /scripts/sqlite_backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Script for backup SQL tables from SQLite 3 | # Скрипт для бэкапа данных хранимых в SQLite 4 | # 5 | # http://www.opennet.ru/dev/fsbackup/ 6 | # Copyright (c) 2001-2004 by Maxim Chirkov. 7 | # 8 | # For restore data type: 9 | # Восстановление производится с помощью команды: 10 | # cat |sqlite 11 | # 12 | 13 | #------------------- 14 | # Name of backup, single word. 15 | # Имя бэкапа. 16 | #------------------- 17 | 18 | backup_name="test_host" 19 | 20 | #------------------- 21 | # Backup method: 22 | # full - backup full DB's structure and data. 23 | # db - backup full DB's structure and data only for 'backup_db_list' databases. 24 | # notdb- backup full DB's structure and data for all DB's, except 25 | # data of 'backup_db_list' databases. 26 | # 27 | # Метод бэкапа: 28 | # full - полный бэкап всех баз (рекомендуется), 29 | # аналог запуска pg_dumpall или mysqldump --all-databases --all 30 | # 31 | # db - бэкап только указанных в backup_db_list баз данных, записи по 32 | # реконструкции баз и таблиц записываются для всех баз на SQL сервере. 33 | # notdb - бэкап всех баз, кроме указанных в backup_db_list, записи по 34 | # реконструкции баз и таблиц записываются для всех баз на SQL сервере. 35 | # Возможно исключение из бэкапа выборочных таблиц, тогда формат 36 | # списка исключаемых таблиц задается в виде: 37 | # "trash_db1 trash_db2:table1 trash_db2:table2" 38 | # - производим бэкап всех баз, коме базы trash_db1 и таблиц table1 и 39 | # table2 базы trash_db2. 40 | # 41 | # 42 | #------------------- 43 | 44 | backup_method="notdb" 45 | 46 | #------------------- 47 | # List of databases (full path delimited by spaces) 48 | # Список включаемых или исключаемых из бэкапа баз (полный путь к базе), через пробел. 49 | # Таблицы указываются в в переменной backup_tables_list в виде: имя_базы:имя_таблицы 50 | # Внимание, при выборе метода "db" требует полное перечисление всех 51 | # помещаемых в бэкап баз и таблиц в переменную backup_tables_list 52 | #------------------- 53 | 54 | backup_db_list="/home/test/test /home/web/work_db /home/rt/rt3" 55 | backup_tables_list="test rt3:Links" 56 | 57 | #------------------- 58 | # Directory to store SQL backup. You must have enought free disk space to store 59 | # all data from you SQL server. 60 | # Директория куда будет помещен бэкап данных с SQL сервера. 61 | # Внимание !!! Должно быть достаточно свободного места для бэкапа всех 62 | # выбранных БД. 63 | #------------------- 64 | 65 | backup_path="/usr/local/fsbackup/sys_backup" 66 | 67 | #------------------- 68 | # Full path of sqlite program. 69 | # Путь к программе sqlite 70 | #------------------- 71 | 72 | backup_progdump_path="/usr/local/bin" 73 | 74 | ############################################################################ 75 | 76 | if [ -n "$backup_progdump_path" ]; then 77 | backup_progdump_path="$backup_progdump_path/" 78 | fi 79 | 80 | #------------------------------------------------------------------------- 81 | # Полный бэкап для SQLite 82 | 83 | if [ "_$backup_method" = "_full" ]; then 84 | echo "Creating full backup of all SQLite databases." 85 | for cur_db in $backup_db_list; do 86 | cur_db_name=`basename $cur_db` 87 | if [ -f "$cur_db" ]; then 88 | ${backup_progdump_path}sqlite $cur_db .dump |gzip > $backup_path/$backup_name-$cur_db_name-sqlite.gz 89 | else 90 | echo "DB $cur_db not found" 91 | fi 92 | done 93 | exit 94 | 95 | fi 96 | 97 | #------------------------------------------------------------------------- 98 | # Бэкап указанных баз для SQLite 99 | if [ "_$backup_method" = "_db" ]; then 100 | echo "Creating full backup of $backup_tables_list SQLite databases." 101 | 102 | for cur_db in $backup_db_list; do 103 | cur_db_name=`basename $cur_db` 104 | if [ -f "$cur_db" ]; then 105 | echo "Proccessing $cur_db" 106 | flag=0 107 | for cur_acl in $backup_tables_list; do 108 | if [ "_$cur_acl" = "_$cur_db_name" ]; then 109 | flag=1 110 | fi 111 | done 112 | 113 | if [ $flag -eq 1 ]; then 114 | echo "Dumping $cur_db_name" 115 | ${backup_progdump_path}sqlite $cur_db .dump |gzip > $backup_path/$backup_name-$cur_db_name-sqlite.gz 116 | else 117 | rm -f $backup_path/$backup_name-$cur_db_name-sqlite 118 | for cur_db_table in `${backup_progdump_path}sqlite $cur_db .tables`; do 119 | for cur_acl in $backup_tables_list; do 120 | if [ "_$cur_acl" = "_$cur_db_name:$cur_db_table" ]; then 121 | echo " Dumping $cur_db_name:$cur_db_table" 122 | ${backup_progdump_path}sqlite $cur_db ".dump $cur_db_table" >> $backup_path/$backup_name-$cur_db_name-sqlite 123 | fi 124 | done 125 | done 126 | if [ -f "$backup_path/$backup_name-$cur_db_name-sqlite" ]; then 127 | gzip -f $backup_path/$backup_name-$cur_db_name-sqlite 128 | fi 129 | fi 130 | else 131 | echo "DB $cur_db not found" 132 | fi 133 | done 134 | exit 135 | 136 | fi 137 | 138 | 139 | #------------------------------------------------------------------------- 140 | # Бэкап всех баз кроме указанных для Postgresql 141 | if [ "_$backup_method" = "_notdb" ]; then 142 | echo "Creating full backup of all SQLite databases except databases $backup_tables_list." 143 | 144 | for cur_db in $backup_db_list; do 145 | cur_db_name=`basename $cur_db` 146 | if [ -f "$cur_db" ]; then 147 | echo "Proccessing $cur_db" 148 | flag=0 149 | for cur_acl in $backup_tables_list; do 150 | if [ "_$cur_acl" = "_$cur_db_name" ]; then 151 | flag=1 152 | fi 153 | done 154 | 155 | if [ $flag -eq 1 ]; then 156 | echo "Skiping $cur_db_name" 157 | else 158 | rm -f $backup_path/$backup_name-$cur_db_name-sqlite 159 | for cur_db_table in `${backup_progdump_path}sqlite $cur_db .tables`; do 160 | flag=0 161 | for cur_acl in $backup_tables_list; do 162 | if [ "_$cur_acl" = "_$cur_db_name:$cur_db_table" ]; then 163 | echo " Skiping $cur_db_name:$cur_db_table" 164 | flag=1 165 | fi 166 | done 167 | 168 | if [ $flag -eq 0 ]; then 169 | ${backup_progdump_path}sqlite $cur_db ".dump $cur_db_table" >> $backup_path/$backup_name-$cur_db_name-sqlite 170 | fi 171 | done 172 | 173 | if [ -f "$backup_path/$backup_name-$cur_db_name-sqlite" ]; then 174 | gzip -f $backup_path/$backup_name-$cur_db_name-sqlite 175 | fi 176 | fi 177 | else 178 | echo "DB $cur_db not found" 179 | fi 180 | done 181 | exit 182 | 183 | fi 184 | 185 | echo "Configuration error. Not valid parameters in backup_method or backup_sqltype." 186 | 187 | 188 | -------------------------------------------------------------------------------- /scripts/sysbackup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Script for store system configuration files and information about installed 3 | # packages. 4 | # Скрипт для сохранения списк всех файлов в системе, списка установленных пакетов 5 | # и файлов конфигурации. 6 | # 7 | # http://www.opennet.ru/dev/fsbackup/ 8 | # Copyright (c) 2001 by Maxim Chirkov. 9 | 10 | #------------------- 11 | # Name of backup, single word. 12 | # Имя бэкапа. 13 | #------------------- 14 | 15 | backup_name="test_host" 16 | 17 | 18 | #------------------- 19 | # Directory to store system backup. 20 | # Корневая директория куда будут помещены данные системного бэкапа. 21 | #------------------- 22 | 23 | sysbackup_path="/usr/local/fsbackup/sys_backup" 24 | 25 | 26 | ############################################################################ 27 | sysname="`uname | tr '[A-Z]' '[a-z]'`" 28 | echo "OS: $sysname" 29 | 30 | # echo "Creating ls-lR..." 31 | # ls -lR / |gzip > $sysbackup_path/${backup_name}-ls-lR.gz 32 | 33 | if [ "_$sysname" = "_linux" ]; then 34 | echo "Creating system config archive..." 35 | rm -f $sysbackup_path/${backup_name}-rpm_conf.tar 36 | for cur_conf in `rpm -q -a -c`; do 37 | tar -rf $sysbackup_path/${backup_name}-rpm_conf.tar $cur_conf 2>/dev/null 38 | done 39 | echo "Creating package list..." 40 | gzip -f $sysbackup_path/${backup_name}-rpm_conf.tar 41 | rpm -q -a > $sysbackup_path/${backup_name}-rpm.list 42 | #dpkg -l > $sysbackup_path/${backup_name}-deb.list 43 | cat /proc/partitions > $sysbackup_path/partitions.txt 44 | cat /proc/mounts > $sysbackup_path/mounts.txt 45 | cat /proc/modules > $sysbackup_path/modules.txt 46 | /sbin/fdisk -l > $sysbackup_path/fdisk.txt 47 | netstat -rn > $sysbackup_path/routes.txt 48 | # Бэкап MBR 49 | #dd if=/dev/sda of=$sysbackup_path/mbr_sda.bin bs=1 count=512 50 | # Списки устройств. 51 | #cat /proc/pci > $sysbackup_path/pci.txt 52 | #cat /proc/bus/usb/devices > $sysbackup_path/usb.txt 53 | #cat /proc/scsi/scsi > $sysbackup_path/scsi.txt 54 | 55 | fi 56 | 57 | if [ "_$sysname" = "_freebsd" ]; then 58 | echo "Creating package list and install.cfg for sysinstall..." 59 | sysctl -a > $sysbackup_path/sysctl.txt 60 | fdisk > $sysbackup_path/fdisk.txt 61 | geom disk list > $sysbackup_path/geom_disk.txt 62 | # Выводим данные о таблицах разделов. 63 | { 64 | disk_list=`sysctl kern.disks| cut -d':' -f2` 65 | for disk in $disk_list; do 66 | echo "DISK $disk ==================" 67 | fdisk $disk 68 | fdisk -s $disk |awk -F':' '{if (int($1) > 0){print int($1)}}'| while read slice; do 69 | echo "SLICE $slice -----------------" 70 | disklabel ${disk}s$slice 71 | done 72 | done 73 | }> $sysbackup_path/disk.txt 74 | 75 | # Сохранение базовой конфигурации 76 | cp -f /etc/rc.conf $sysbackup_path/${backup_name}-rc.conf 77 | . /etc/rc.conf 78 | interface=`echo "$network_interfaces"| awk '{print $1}'`; 79 | eval ifconfig=\$ifconfig_$interface 80 | ipaddr=`echo "$ifconfig"| sed 's/^.*inet \([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*$/\1/'` 81 | netmask=`echo "$ifconfig"| sed 's/^.*netmask \([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*$/\1/'` 82 | domain_name=`cat /etc/resolv.conf| grep -E "search|domain"| awk '{print $2}'|head -n1` 83 | nameserver=`cat /etc/resolv.conf| grep 'nameserver'| awk '{print $2}'|head -n1` 84 | 85 | cat<$sysbackup_path/${backup_name}-install.cfg 86 | # Full example: /usr/src/release/sysinstall/install.cfg 87 | debug=yes 88 | hostname=$hostname 89 | domainname=$domain_name 90 | nameserver=$nameserver 91 | defaultrouter=$defaultrouter 92 | ipaddr=$ipaddr 93 | netmask=$netmask 94 | # ftp=ftp://time.cdrom.com/pub 95 | netDev=$interface 96 | mediaSetFTP 97 | # dists=bin doc manpages info compat21 des src sbase ssys 98 | dists=all 99 | distSetCustom 100 | # File System 101 | ## Current /etc/fstab 102 | `cat /etc/fstab|sed 's/^/## /'` 103 | ## Exmpale 104 | # disk=ad0 105 | # partition=exclusive 106 | # diskPartitionEditor 107 | # bootManager=booteasy 108 | # diskPartitionEditor 109 | # ad0s1-1=ufs 40960 / 110 | # ad0s1-2=swap 40960 none 111 | # ad0s1-3=ufs 0 /usr 1 112 | # diskLabelEditor 113 | # installCommit 114 | ENDL 115 | ls -tr /var/db/pkg| tee $sysbackup_path/${backup_name}-pgk.list | perl -ne 'print "package=${_}packageAdd\n"'>> $sysbackup_path/${backup_name}-install.cfg 116 | fi 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /scripts/sysrestore.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Script for reinstall packages stored by sysbackup.sh 3 | # Скрипт для восстановления пакетов с программами. 4 | # 5 | # http://www.opennet.ru/dev/fsbackup/ 6 | # Copyright (c) 2001 by Maxim Chirkov. 7 | 8 | #------------------- 9 | # Name of backup, single word. 10 | # Имя бэкапа. 11 | #------------------- 12 | 13 | backup_name="test_host" 14 | 15 | 16 | #------------------- 17 | # Directory with installed packets list, stored by sysbackup.sh. 18 | # Директория где расположен сохраненный скриптом sysbackup.sh список пакетов. 19 | #------------------- 20 | 21 | sysbackup_path="/usr/local/fsbackup/sys_backup" 22 | 23 | 24 | #------------------- 25 | # Directory where stored OS packages. 26 | # Директория где располдожены файлы с пакетами программ. 27 | # Для FreeBSD, если переменная не заполнена, пакеты будут установленны с сайта 28 | # производителя. 29 | #------------------- 30 | 31 | packages_path="/usr/local/INST/RPMS" 32 | 33 | 34 | ############################################################################ 35 | sysname="`uname | tr '[A-Z]' '[a-z]'`" 36 | echo "OS: $sysname" 37 | 38 | if [ "_$sysname" = "_linux" ]; then 39 | for cur_pkg in `cat $sysbackup_path/${backup_name}-pgk.list`; do 40 | echo "Installing $cur_pkg from local server..." 41 | rpm -i --nodeps $packages_path/$cur_pkg.*.rpm 42 | done 43 | fi 44 | 45 | if [ "_$sysname" = "_freebsd" ]; then 46 | if [ -z "$packages_path" ]; then 47 | for cur_pkg in `cat $sysbackup_path/${backup_name}-pgk.list |sed 's/^\(.*\)\-[0987654321.]*.*$/\1/'|sort|uniq`; do 48 | echo "Installing $cur_pkg from remote server..." 49 | pkg_add -r $cur_pkg 50 | done 51 | else 52 | export PKG_PATH=$packages_path 53 | for cur_pkg in `cat $sysbackup_path/${backup_name}-pgk.list`; do 54 | echo "Installing $cur_pkg from local path $packages_path..." 55 | if -f $cur_pkg; then 56 | pkg_add $cur_pkg 57 | else 58 | echo "Package $cur_pkg not found, tying to install by mask..." 59 | cur_pkg= `echo $cur_pkg| sed 's/^\(.*\)\-[0987654321.]*.*$/\1/'` 60 | pkg_add ${cur_pkg}-*.tgz 61 | fi 62 | done 63 | fi 64 | fi 65 | 66 | 67 | 68 | 69 | --------------------------------------------------------------------------------