Ранее здесь находилось описание возможных ситуаций, когда данное решение могло бы вам понадобиться, но давайте его опустим. Возможность удобного создания удаленных закачек, которые выполняются привычным wget-ом (можно спокойно увидеть их список при помощи ps), с отображением прогресса — идея не новая. И даже есть некоторые решения, но не актуальные, так как более 5 лет никем не поддерживаются.
Для торрентов всё просто и тривиально — ставим Transmission или любой аналогичный клиент с веб-мордой. Но для ссылок на простые файлы/страницы нужно что то своё. Вот короткий список задач, которые меня подтолкнули к написанию оного:
- Смотрю фильм онлайн при помощи планшета, но появляются дела и надо бы его сохранить, чтоб досмотреть позже;
- На удаленный сервер надо скачать файл, и приходится запускать терминал каждый раз;
- Надо бы скачать образ свежего linuxmint, но на домашний NAS, а не ноутбук, работая за которым пришла эта идея;
- Во время серфинга часто возникает задача сохранить файл и расшарить его.
Если вам стало интересно — добро пожаловать под кат:
Системные требования
Веб-интерфейс построен на Javascript + css3 с клиентской стороны, и php (выбран как наиболее популярный) с серверной. Для полноценной работы потребуется:
- *nix (по крайней мере писалось именно под эту платформу, для запуска под другой потребуются рабочие порты wget, ps и kill);
- php5.x (скорее всего работать будет и на php4.x, по к моменту публикации это протестировано не было);
- Браузер с поддержкой Javascript (и очень желательно — с поддержкой css3).
Особенности и настройки серверной части
Как уже было сказано выше — в роли серверной части выступает скрипт, написанный на php. Он выполняет следующие задачи:
- Получение информации о запущенных задачах;
- Отмена запущенных задач;
- Добавление новых задач;
- Возвращение результатов в JSON формате.
Для своей работы ему требуются ps, wget и kill соответственно. Для получения значения состояния закачки (на сколько процентов завершена) используется следующий алгоритм:
- Задачи wget запускаются с флагами "--background" и "--progress=bar:force";
- Вывод лога загрузки производится в файл, установленный в параметре "--output-file=FILE";
- При запросе состояния задач с помощью "ps -ax" получаем путь к файлу, установленный в "--output-file=FILE";
- Читаем крайнюю строку этого файла, получая регуляркой из него искомое значение.
Неприятная особенность — лог файлы после завершения закачки автоматически не удаляются, и делать на данный момент это приходится ручками (добавив в crontab что то похожее на "rm -f /tmp/wget*.log.tmp").
Данную возможность можно отключить (не будут создаваться лог-файлы, но и не будет информации о прогрессе), закомментировав строку "define('tmp_path', '/tmp');";
Путь до директории, в которую будет происходить сохранение всех загружаемых файлов устанавливается в строке "define('download_path', BASEPATH.'/downloads');".
Доступно удобное указание путей до ps, wget и kill. Для этого достаточно убрать комментарий вначале строки и указать свой путь, например: "define('wget', '/usr/bin/wget');".
Возможна установка ограничения на скорость закачки из секции настроек. За это отвечает строка "define('wget_download_limit', '1024');". Если оставить её закомментированной — никакого ограничения не будет.
Для определения в списке задачи запущенной через GUI от любой другой используется определенный флаг, уникальный для GUI. Он установлен в строке "define('wget_secret_flag', '--max-redirect=4321');" и его менять без необходимости не надо. Кстати, если хотите чтоб другие ваши задачи, запущенные из терминала отображались в веб-интерыейсе — достаточно как раз этот параметр к ним и добавить. Но не забывайте, что есть ещё и некоторые другие параметры, не менее обязательные (в зависимости от настроек).
Постарался написать с максимально экономичным отношением к ресурсам и минимальной зависимостью от системы, но большим опытом в php не обладаю, поэтому — буду признателен рекомендациям по оптимизации.
Скрипт отвечает как на POST, так и GET запросы. Разницы между ними нет.
Пример POST-запроса и Json ответа:
Request:
192.168.1.2/wget/rpc.php?action=add_task&url=http://mirror.yandex.ru/linuxmint/stable/17/linuxmint-17-cinnamon-dvd-64bit.iso
Answer:
{
status: 1,
msg: "Task added",
id: 10910
}
Request:
192.168.1.2/wget/rpc.php?action=get_list
Answer:
{
status: 1,
msg: "Active tasks list",
tasks: [
{
url: "mirror.yandex.ru/linuxmint/stable/17/linuxmint-17-cinnamon-dvd-64bit.iso",
progress: 95,
id: 10910
}
]
}
Вывод «ps -ax | grep wget» и «cat /tmp/wget{RND}.log.tmp»:
data:~# ps -ax | grep wget
10910 ? S<s 0:34 wget --progress=bar:force --background --tries=0 --no-cache --user-agent=Mozilla/5.0 (X11; Linux amd64; rv:21.0) Gecko/20100101 Firefox/21.0 --directory-prefix=/DataVolume/shares/Public/Downloads/ --limit-rate=2048k --output-file=/tmp/wget9720.log.tmp --max-redirect=4321 http://mirror.yandex.ru/linuxmint/stable/17/linuxmint-17-cinnamon-dvd-64bit.iso
11378 pts/0 S+ 0:00 grep wget
data:~# cat /tmp/wget9720.log.tmp
--2014-08-24 12:32:04-- http://mirror.yandex.ru/linuxmint/stable/17/linuxmint-17-cinnamon-dvd-64bit.iso
Resolving mirror.yandex.ru... 213.180.204.183, 2a02:6b8::183
Connecting to mirror.yandex.ru|213.180.204.183|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1286799360 (1.2G) [application/octet-stream]
Saving to: `/DataVolume/shares/Public/Downloads/linuxmint-17-cinnamon-dvd-64bit.iso`
95% [==================================> ] 1,225,527,078 1.37M/s eta 35s
data:~#
Особенности и настройки клиентской части
Не используются «новые html5 теги», но используются свойства css3 для оформления прогресc-бара загрузок и адаптива. Дизайн выполнен в минималистичном стиле без изображений (исключением является favicon). При отсутствии задач в центре страницы располагается поле для добавления адреса закачки, если задачи имеются — это поле смещается вверх страницы, и ниже располагаются задачи.
Все запросы — асинхронные (без перезагрузки страницы). Дизайн страницы — адаптивный:
Изменение состояния отображается также в заголовке вкладки (окна):
В нижней части страницы располагается javascript-закладка («Download this»), переместив которую в панель закладок браузера можно одним кликом добавлять новые задачи (при клике будет добавлена активная вкладка; если открыта вкладка с видеофайлом и будет нажата эта «закладка» на панели закладок — будет добавлена задача на скачивание этого видеофайла):
Весь javascript код документа расположен в файле core.js. В верхней его части располагаются основные настройки:
- «updateStatusInterval = 5 * 1000» — интервал обновления данных на открытой вкладке (будьте аккуратны с этим параметром на слабых серверах);
- «DebugMode = false» — режим отладки, выводится отладочная информация в console.log;
- «prc = 'rpc.php'» — путь до скрипта серверной части.
Описывать функциональные моменты смысла особого не вижу, но скажу — функции разделены на логические группы, скрипт не минифицирован, комментарии имеют место быть.
При нажатии на F5 происходит принудительное обновление задач, страница перезагружается только по нажатию на кнопку обновления в браузере.
Установка
- Скачать или склонировать крайнюю версию репозитория;
- Распаковать в директорию, доступную «извне»;
- Изменить путь define('download_path', BASEPATH.'/downloads'); в «rpc.php»;
- Открыть в браузере, проверить работоспособность. В случае возникновения ошибок — задайте вопрос.
История изменений
По мере изменений буду обновлять этот пост
- 0.0.3 — Релиз на гитхабе
Чего стоит ждать:
- Добавление авторизации и доступа по ключу;
- Логирование;
- Автоматическая (или полуавтоматическая) очистка отработанных лог-файлов;
- Расширение для браузера;
- Детальные настройки для задач, такие как путь для загрузки и имя сохраняемого файла;
- Удаление не докачанных задач;
- ...
Данная лицензия разрешает лицам, получившим копию данного программного обеспечения и сопутствующей документации (в дальнейшем именуемыми «Программное Обеспечение»), безвозмездно использовать Программное Обеспечение без ограничений, включая неограниченное право на использование, копирование, изменение, добавление, публикацию, распространение, сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам, которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:
Указанное выше уведомление об авторском праве и данные условия должны быть включены во все копии или значимые части данного Программного Обеспечения.
ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
Ссылка на проект: https://github.com/tarampampam/wget-gui-light
Автор: cmepthuk