Как стать автором
Обновить

Web-gui для wget (light)

PHP
Ранее здесь находилось описание возможных ситуаций, когда данное решение могло бы вам понадобиться, но давайте его опустим. Возможность удобного создания удаленных закачек, которые выполняются привычным 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";
  • Читаем крайнюю строку этого файла, получая регуляркой из него искомое значение.

Путь для временных лог-файлов устанавливается в строке "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
Теги:linuixwgetguiphpjavascriptвелосипедостроение
Хабы: PHP
Всего голосов 66: ↑49 и ↓17 +32
Просмотры28.2K

Похожие публикации

PHP разработчик / PHP Developer
от 100 000 до 250 000 ₽GainnetМожно удаленно
PHP-программист (удаленно)
от 200 000 ₽Акушерство.руМожно удаленно
Стажер-программист PHP
от 40 000 до 60 000 ₽DeneroСанкт-Петербург
PHP-программист
от 100 000 ₽РыбачОКСанкт-ПетербургМожно удаленно
PHP разработчик
от 60 000 до 150 000 ₽EmsoftМоскваМожно удаленно

Лучшие публикации за сутки