среда, 28 января 2015 г.

Автоматическое скачивание файлов (скрипт на bash для файлового сервера)

"Сервер" (старенький компьютер с Debian) установлен, настроен и подключен к сети.
 Эту машинку планировалось использовать как файловый сервер, с доступом к файлам по сети по протоколу smb.
На сервере установлена торентокачалка Transmission, она запускается как демон при загрузке системы, а для управления используется Web interface. Очень удобно. Управлять загрузками, раздачами, добавлениями, удалениями можно при помощи любого веб-браузера.
 Для того чтобы иметь возможность скачивания файлов из интернета на сервер по обычным протоколам http, ftp и при этом автоматизировать процесс, на сервере каждые 15 минут, по cron запускается маленький скрипт. Скрипт проверяет определённый файл на наличие в нём ссылок на скачивание. И если в файле присутствует ссылка(ки), начинается загрузка указанного в ней файла.
Как это работает...

 Одно из условий для удобной работы, наличие прав на запись в какую-либо директорию на файловом сервере.

 Для того, чтобы иметь возможность указать скрипту ссылку, по которой вы хотите скачать файл, необходимо вставить эту ссылку (или несколько ссылок) в текстовый файл находящийся в доступной вам директории на файловом сервере. Необходимо открыть этот файл на любом вашем компьютере или смартфоне, вставить туда ссылку и закрыть файл при этом сохранив изменения. Через некоторое время (у меня каждые 15 минут часа), запустится скрипт и начнётся скачивание указанного в ссылке файла.
Сам файл-задание (файл в котором вы будете указывать ссылки), для удобства, можно разместить в той же директории, в которой загруженные файлы будут доступны для дальнейшего использования по сети.
Я так и сделал, разместил файл-задание в папке с загружаемыми файлами.

 Подробнее о скрипте

 #!/bin/bash - То с чего начинается каждый bash скрипт

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

dldir="/media/user/Downloads/" - Главная директория для загрузок.
tmpdir="/media/user/Downloads/.wgettmp/" - Директория для хранения временных файлов.
dlfile="/media/user/Downloads/dlinks.txt" - Текстовый файл в который необходимо помещать ссылки на скачивание.

Для уникальности имени временного файла (который будет формироваться каждый раз при обработке скрипта, при условии что файл-задание содержит ссылки) создаётся временной тэг который будет отображать День, Час, Минуту и Секунду, в названии временного файла.

timestamp=`date +%d%H%M%S`- Делаем временной тэг, который будет использоваться для уникальности временного файла.
tmpfile="/media/user/Downloads/.wgettmp/dlinks.${timestamp}" - Путь по которому содержится временный файл и формрирование его уникального имени.

Все переменные объявлены, далее следует проверка файла-задания на доступность, примитивная проверка на содержание "ссылки" и загрузка файла по ссылке(ам) из файла-задания. Если вы не создавали, или удалили файл-задание, то скрипт создаст его автоматически.

if [ -w $dfile ]; then - Проверка файла на доступность.
    if [ $(stat -c %s $dfile) -gt 5 ]; then - Если файл существует и доступен для записи, то проверяется размер самого файла, не пуст ли он.
        cp $dlfile $tmpfile -  Если файл не пуст то содержимое копируется во временный файл с которым и будет работать программа загрузчик.
        cp /dev/null $dlfile -  Файл-задание отчищается для дальнейшего использования.
        wget -P $dldir -c -t0 -i $tmpfile -nv -a $tmpdir/log - Запускается программа Wget которая попытается загрузить файл на который указывает ссылка во временном файле. Загрузчик запускается с минимальным (параметр -nv) логированием, сам лог находится во временной директории.
        echo "************" >> $tmpdir/log - Для удобства чтения логов добавляем разделитель который отделяет события.
        rm $tmpfile - По окончании загрузки, удаляем временный файл.
    else
        exit 0 - В том случае если файл задание оказался пуст, просто прерываем выполнение скрипта и выходим (до следующего запуска скрипта).
    fi
else
    touch $dlfile - Создаём файл-задание, если он не существует.
fi


Ниже привожу сам скрипт (раскрашен в цвета дефолтного gedit):
#!/bin/bash
dldir="/media/user/Downloads/"

tmpdir="/media/user/Downloads/.wgettmp/"
dlfile="/media/user/Downloads/dlinks.txt"
timestamp=`date +%d%H%M%S`
tmpfile="/media/user/Downloads/.wgettmp/dlinks.${timestamp}"
if [ -w $dfile ]; then
    if [ $(stat -c %s $dfile) -gt 5 ]; then
        cp $dlfile $tmpfile
        cp /dev/null $dlfile
        wget -P $dldir -c -t0 -i $tmpfile -nv -a $tmpdir/log
        echo "************" >> $tmpdir/log
        rm $tmpfile
    else
        exit 0
    fi
else
    touch $dlfile
fi

Можно просто скопировать содержимое этого скрипта в файл и сохранить его с разрешением .sh ( у меня он называется dload.sh). Также необходимо сделать файл запускаемым.
Отредактировать переменные в которых указываются пути по которым находятся директории (если их ещё нет, то необходимо создать) и файлы в соответствии с вашей конфигурацией.
Сам файл со скриптом может быть размещён в любом месте. Но удобнее в рабочей директории пользователя. И уже оттуда он будет запускаться по расписанию (по cron).

Комментариев нет:

Отправить комментарий