
Web-gui для wget (light)
Ранее здесь находилось описание возможных ситуаций, когда данное решение могло бы вам понадобиться, но давайте его опустим. Возможность удобного создания удаленных закачек, которые выполняются привычным wget-ом (можно спокойно увидеть их список при помощи ps), с отображением прогресса — идея не новая. И даже есть некоторые решения, но не актуальные, так как более 5 лет никем не поддерживаются.
Для торрентов всё просто и тривиально — ставим Transmission или любой аналогичный клиент с веб-мордой. Но для ссылок на простые файлы/страницы нужно что то своё. Вот короткий список задач, которые меня подтолкнули к написанию оного:
Если вам стало интересно — добро пожаловать под кат:

Веб-интерфейс построен на Javascript + css3 с клиентской стороны, и php (выбран как наиболее популярный) с серверной. Для полноценной работы потребуется:
Как уже было сказано выше — в роли серверной части выступает скрипт, написанный на php. Он выполняет следующие задачи:
Для своей работы ему требуются ps, wget и kill соответственно. Для получения значения состояния закачки (на сколько процентов завершена) используется следующий алгоритм:
Путь для временных лог-файлов устанавливается в строке "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 запросы. Разницы между ними нет. Так же отвечает на параметры, переданные в командной строке. Например:
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
}
]
}
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. В верхней его части располагаются основные настройки:
Описывать функциональные моменты смысла особого не вижу, но скажу — функции разделены на логические группы, скрипт не минифицирован, комментарии имеют место быть.
При нажатии на F5 происходит принудительное обновление задач, страница перезагружается только по нажатию на кнопку обновления в браузере.
По мере изменений буду обновлять этот пост
Ссылка на проект: https://github.com/tarampampam/wget-gui-light
Для торрентов всё просто и тривиально — ставим 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";
- Читаем крайнюю строку этого файла, получая регуляркой из него искомое значение.
Путь для временных лог-файлов устанавливается в строке "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 запросы. Разницы между ними нет. Так же отвечает на параметры, переданные в командной строке. Например:
php ./rpc.php get_list
или php ./rpc.php add_task http://goo.gl/5Qi0Xs
.Пример 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»;
- Открыть в браузере, проверить работоспособность. В случае возникновения ошибок — задайте вопрос.
История изменений
По мере изменений буду обновлять этот пост
- Стало лень обновлять, вот ссылка на актуальный changelog
- 0.0.9 — Добавлена возможность задания имени сохраняемого файла, путем добавления к URL в GUI строки вида "-> filename.ext" (полный вид запроса при этом будет «htttp://somehost.io/oldfilename.zip -> newfilename.zip»), добавлена дополнительная проверка входных данных
- 0.0.8 — Добавлена проверка директории для временных файлов, добавлена возможность добавления нескольких задач в GUI, мелкие доработки (в основном в визуальной части)
- 0.0.7 — В функцию тестирования добавлена проверка на существование и разрешение на запись в download_path (http://goo.gl/I8gYoK)
- 0.0.6 — Вызов ps aux изменен на ps -ewwo pid,args для ускорения парсинга (issue #8)
- 0.0.5 — Обновления безопасности, исправлено ошибочное сообщение об ошибке при добавлении задачи, функции возвращают не просто результат true|false — а плюс описание, добавлена поддержка работы с параметрами запуска из консоли (терминала), добавлена функция тестирования сервера (в gui — вместо url передать слово «test»), другие мелкие исправления
- 0.0.4 — Добавлено автоматическое удаление лог-файлов wget-а, мелкие исправления
- 0.0.3 — Релиз на гитхабе
Чего стоит ждать:
- Добавление авторизации и доступа по ключу;
- Логирование (реализовано);
- Автоматическая (или полуавтоматическая) очистка отработанных лог-файлов (реализовано частично);
- Расширение для браузера (реализовано);
- Детальные настройки для задач, такие как путь для загрузки и имя сохраняемого файла (реализовано частично);
- Удаление не докачанных задач;
- ...
Лицензия MIT
Copyright © 2014 Paramtamtam
Данная лицензия разрешает лицам, получившим копию данного программного обеспечения и сопутствующей документации (в дальнейшем именуемыми «Программное Обеспечение»), безвозмездно использовать Программное Обеспечение без ограничений, включая неограниченное право на использование, копирование, изменение, добавление, публикацию, распространение, сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам, которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:
Указанное выше уведомление об авторском праве и данные условия должны быть включены во все копии или значимые части данного Программного Обеспечения.
ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
Данная лицензия разрешает лицам, получившим копию данного программного обеспечения и сопутствующей документации (в дальнейшем именуемыми «Программное Обеспечение»), безвозмездно использовать Программное Обеспечение без ограничений, включая неограниченное право на использование, копирование, изменение, добавление, публикацию, распространение, сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам, которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:
Указанное выше уведомление об авторском праве и данные условия должны быть включены во все копии или значимые части данного Программного Обеспечения.
ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
Ссылка на проект: https://github.com/tarampampam/wget-gui-light
Comments 50
Only users with full accounts can post comments. Log in, please.