Web-gui для wget (light)

в 7:25, , рубрики: GUI, wget

Ранее здесь находилось описание возможных ситуаций, когда данное решение могло бы вам понадобиться, но давайте его опустим. Возможность удобного создания удаленных закачек, которые выполняются привычным wget-ом (можно спокойно увидеть их список при помощи ps), с отображением прогресса — идея не новая. И даже есть некоторые решения, но не актуальные, так как более 5 лет никем не поддерживаются.

Для торрентов всё просто и тривиально — ставим Transmission или любой аналогичный клиент с веб-мордой. Но для ссылок на простые файлы/страницы нужно что то своё. Вот короткий список задач, которые меня подтолкнули к написанию оного:

  • Смотрю фильм онлайн при помощи планшета, но появляются дела и надо бы его сохранить, чтоб досмотреть позже;
  • На удаленный сервер надо скачать файл, и приходится запускать терминал каждый раз;
  • Надо бы скачать образ свежего linuxmint, но на домашний NAS, а не ноутбук, работая за которым пришла эта идея;
  • Во время серфинга часто возникает задача сохранить файл и расшарить его.

Если вам стало интересно — добро пожаловать под кат:

Web gui для wget (light)

Системные требования

Веб-интерфейс построен на 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). При отсутствии задач в центре страницы располагается поле для добавления адреса закачки, если задачи имеются — это поле смещается вверх страницы, и ниже располагаются задачи.

Все запросы — асинхронные (без перезагрузки страницы). Дизайн страницы — адаптивный:

Web gui для wget (light)

Изменение состояния отображается также в заголовке вкладки (окна):
Web gui для wget (light)

В нижней части страницы располагается javascript-закладка («Download this»), переместив которую в панель закладок браузера можно одним кликом добавлять новые задачи (при клике будет добавлена активная вкладка; если открыта вкладка с видеофайлом и будет нажата эта «закладка» на панели закладок — будет добавлена задача на скачивание этого видеофайла):

Web gui для wget (light)

Весь javascript код документа расположен в файле core.js. В верхней его части располагаются основные настройки:

  • «updateStatusInterval = 5 * 1000» — интервал обновления данных на открытой вкладке (будьте аккуратны с этим параметром на слабых серверах);
  • «DebugMode = false» — режим отладки, выводится отладочная информация в console.log;
  • «prc = 'rpc.php'» — путь до скрипта серверной части.

Описывать функциональные моменты смысла особого не вижу, но скажу — функции разделены на логические группы, скрипт не минифицирован, комментарии имеют место быть.

При нажатии на F5 происходит принудительное обновление задач, страница перезагружается только по нажатию на кнопку обновления в браузере.

Установка

  • Скачать или склонировать крайнюю версию репозитория;
  • Распаковать в директорию, доступную «извне»;
  • Изменить путь define('download_path', BASEPATH.'/downloads'); в «rpc.php»;
  • Открыть в браузере, проверить работоспособность. В случае возникновения ошибок — задайте вопрос.

История изменений

По мере изменений буду обновлять этот пост

  • 0.0.3 — Релиз на гитхабе

Чего стоит ждать:

  • Добавление авторизации и доступа по ключу;
  • Логирование;
  • Автоматическая (или полуавтоматическая) очистка отработанных лог-файлов;
  • Расширение для браузера;
  • Детальные настройки для задач, такие как путь для загрузки и имя сохраняемого файла;
  • Удаление не докачанных задач;
  • ...
Лицензия MIT

Copyright © 2014 Samoylov Nikolay

Данная лицензия разрешает лицам, получившим копию данного программного обеспечения и сопутствующей документации (в дальнейшем именуемыми «Программное Обеспечение»), безвозмездно использовать Программное Обеспечение без ограничений, включая неограниченное право на использование, копирование, изменение, добавление, публикацию, распространение, сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам, которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:

Указанное выше уведомление об авторском праве и данные условия должны быть включены во все копии или значимые части данного Программного Обеспечения.

ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.

Ссылка на проект: https://github.com/tarampampam/wget-gui-light

Автор: cmepthuk

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js