Category Archive: Скрипты

Бэкапирование

В прежние времена я часто занимался автоматизацией бэкапирования, т.е. создания резервной копии баз данных, файлов и т.д.. Сейчас таких задач у меня не возникает, но все же решил написать о том, как писать такие скрипты.
Перечислим базовые шаги алгоритма скрипта:

  1. Выбрать директорию, где храняться резервные копии
  2. Снять резервную копию базы данных
  3. Сжать файлы с помощью архиватора и присвоить удобное наименование архиву
  4. Добавить скрипт в планировщик и установить время и периодичность запуска

Рассмотрим версии скрипта для Windows и для Linux.

Генерация Java-классов Web-сервиса по WSDL

Допустим, у вас есть WSDL и вы хотите написать либо сам веб-сервис, либо клиента для сервиса. Для этого по WSDL нужно сгенерировать Java-классы с помощью утилиты wsimport, входящую в состав JDK.
Стоит отметить, что сгенерированный код может использовать и на сервере, и на клиенте.
Создайте новую папку и положите в нее вашу WSDL и всё, что к ней относится (это может быть другие WSDL или XSD). Увидеть все, что импортирует ваша основная WSDL можно в теге import. Например:

<xsd:import namespace="http://www.kesh.kz/blog/v1" 
schemaLocation="http://123.45.678.90:8080/kesh/example.xsd"/>

В данном примере следует заменить интернет адрес XSD на локальный:

<xsd:import namespace="http://www.kesh.kz/blog/v1" 
schemaLocation="example.xsd"/>

Разумеется, файл example.xsd должен лежать c WSDL в одной директории.
Теперь напишем скрипт для генерирования классов. Рассмотрим сперва Windows-версию скрипта, а потом Linux-версию.

Скрипт для Windows
Создайте файл w-gen.bat в любом текстовом редакторе и скопируйте в него следующий код:

cls
set GEN_DIR=kz
rmdir %GEN_DIR% /s/q
"%JAVA_HOME%/bin/wsimport" -keep -Xnocompile -p kz.kesh.blog.v1 myBlog.wsdl
pause

cls — очистка консоли
GEN_DIR — директория пакета верхнего уровня
rmdir — полное удаление директории
wsimport — утилита для генерации Java-классов из WSDL
keep — сохраняет сгенерированные файлы
Xnocompile — не компилирует сгенерированные Java-файлы
kz.kesh.blog.v1 — имя пакета, в котором будет сгенерированые классы
myBlog.wsdl — наша WSDL
pause — пауза, чтобы консольное окно сразу не закрылось

Данный скрипт генерирует *.java файлы, но вы можете немного переработать скрипт и генерировать скопилированные файлы *.class. Так же вы можете доработать упаковку файлов и WSDL в jar. Например:

"%JAVA_HOME%/bin/jar" cf keskBlog.jar kz

jar — стандартная утилита из JDK для создания jar-файлов
cf — создает новый архив с указанным именем
keskBlog.jar — имя вашего jar-файла
kz — директория, которая упаковывается в jar, она соответствует названию верхнего пакета

Скрипт для Linux
Создайте файл w-gen.sh:

#!/bin/bash
GEN_DIR="kz"
rm -r $GEN_DIR
wsimport -keep -Xnocompile -p kz.kesh.blog.v1 myBlog.wsdl

Не забудьте дать скрипту права на выполенение:

chmod +x w-gen.sh

#!/bin/bash — обязательная строчка для bash-скриптов
GEN_DIR — директория пакета верхнего уровня
rm — рекурсивное удаление директории
wsimport — утилита для генерации Java-классов из WSDL
keep — сохраняет сгенерированные файлы
Xnocompile — не компилирует сгенерированные Java-файлы
kz.kesh.blog.v1 — имя пакета, в котором будет сгенерированы классы
myBlog.wsdl — наша WSDL

Создание резервной копии директорий (WinRAR)

Иногда возникает необходимость в создании полной резервной копии какой-нибудь директории.
Можно, конечно, каждый раз вручную архивировать папку, присваивая название архиву и проставляя номер или дату резервной копии. Но это быстро надоедает. Предлагаю написать скрипт(bat), который будет автоматизировать эту работу.

Допустим, есть директория D:\Projects\ProjectX, для которой нужно сделать резервную копию, заархивировав WinRAR’ом. Название архива будет содержать, кроме названия, еще и дату создания. Для этого нужно выполнить следующие шаги:

  1. Создадим любым текстовым редактором файл с названием projectx.bat.
    Желательно создать специальную директорию для хранения подобных скриптов (Например, D:\Scripts\backups)

  2. Вставьте следующий код в файл
    cls
    set rar="C:\Program Files\WinRAR\Rar.exe"
    set source_dir="D:\Projects\ProjectX"
    set backup_dir="D:\Backup\ProjectX\projectx_"
    %rar% a -r -ep1 -agYYYY-MM-DD[HHMM] %backup_dir% %source_dir%

    cls — необязательная команда, которая очищает консоль

  3. Переменная rar хранит полный путь к утилите rar.exe
    Переменная source_dir хранит полный путь к директории, для которой создается резервная копия
    Переменная backup_dir содержит путь до директории, где хранятся резерный копии(D:\Backup\), поддиректории (ProjectX) и префикса названия файла архива (projectx_)
    Теперь рассмотрим параметры архивирования, которые мы передаем утилите rar.exe:
    a — команда, указывающая на добавление файлов в архив
    -ep1 — опция, которая позволяет исключить базовый путь из имен файлов, но сохраняет внутреннюю иерархию директории
    -agYYYY-MM-DD[HHMM] — генерирует название файла на основе текущей даты и времени
    Последние два параметра передаваемые утилите — это путь до архива (backup_dir) и архивируемая директория (source_dir).

Теперь рассмотрим все в картинках:
Директория для архивирования:
pic1

Запускаемый скрипт:
pic2

Директория с резервными копиями:
pic3

Содержимое архива:
pic4

Содержимое директории:
pic5

Почему лучше использовать абсолютные пути в скрипте?
Во-первых, это позволит хранить скрипты в одном месте, а резервные копии в другом.
Во-вторых, можно запускать скрипты из любого места, не заботясь о текущей директории.

Созданный нами скрипт можно запускать по мере необходимости или запускать планировщиком по расписанию. Если всё же решили использовать в скрипте относительные пути, то при создании задания в планировщике не забудьте указать рабочую директорию скрипта.