[Из песочницы] Знакомьтесь — HTTraqt

Здравствуйте, уважаемые хабровчане. В данном топике я расскажу о замечательном linux-аналоге большинству знакомого Teleport Pro — HTTraqt. Путь к данному продукту был довольно длинным. После перехода на Linux (использую исключительно debian с самого начала — тогда это был еще lenny stable) мне ужасно не хватало программы для скачивания сайтов, так как тогда не всегда под рукой был интернет, а останавливаться не хотелось и приходилось выкачивать огромное количество статей, что было весьма неудобно, поэтому выкачивал сайты для их работы в оффлайн режиме. Пока пользовался Windows, устраивал вполне Teleport Pro. Даже на первых порах я продолжал его использовать, запуская его под wine. Будучи новичком, я не знал о httrack, wget и прочих менеджерах, которые могут тоже самое, что и выше упомянутый продукт. Вскоре я начал пользоваться wget для скачивания сайтов, и в принципе меня он устраивает. Конечно, не всегда хватает (чего таить — во многих случаях он не справлялся, то ли я неправильно параметры использовал), потом попробовал пошаманить с httrack, удалось больше, но, изучая его, наткнулся на Qt-интерфейс к нему — HTTraqt. Прежде чем тестировать его, перечислю его возможности и особенности: Так как это является надстройкой над httrack, то, естественно, выше его возможностей он не прыгнет, а просто предоставляет GUI-интерфейс для их определения, дабы избавить пользователя от возни с командной строкой. Начинающим пользователям будет полезно. Следует отметить, что HTTraqt это клон небезызвестного WinHTTrack, но мне он показался глючным, к тому же работал слишком долго, поэтому я его очень быстро забросил и более новые версии не смотрел. Направлен исключительно на Linux-системы (на официальной странице доступы rpm и deb пакеты). Поддержка прерывания скачивания отдельных файлов из активного списка. От релиза к релизу интерфейс становится лучше, функционал активно дорабатывается и добавляется новый (я его начал использовать еще с версии 0.0.7, а сейчас уже доступна 1.1.9). Огромное количество локализаций, в том числе и русская. Хотя как по мне вполне достаточно английского, хотя меня подержут далеко не все. Создание копии сайта посредством индксирования и скачивания всех страниц сайта, картинок, документов и файлов, расположенных непосредственно на самом сайте (внешние ссылки не индксирует). Исходный код программы распространяется на условиях лицензии GNU GPLv3. Гибкая система настроек каждого проекта, а с недавних пор появилась возможность сброса настроек на глобальные. Далее опишу процесс сборки из исходников, так как в репозиториях ее до сих пор нет. Я уже долгое время создаю пакеты из исходников по методу, описанному в этом посте. Для этого я создал bash-сценарий (дабы автоматизировать этот процесс — на крутого мейнтейнера я не претендую, поэтому данное решение вполне мне подходит). Предыстория создания скрипта недолгая: долгое время я пользовался утилитой checkinstall для сборки пакетов, но многое в этом меня начало раздражать, а конкретно — неудобство внесения изменений в сам процесс установки, а конкретно — скриптов postinstall, preinstall, postrm. Поэтому начал пользоваться методом дебианизации пакетов, наподобие того, как это делают мейнтейнеры. Но использовал я очень мало из всех предоставленных возможностей данного метода ввиду отсутсвия в этом необходимости. Вот сам скрипт:#! /bin/bash

failed=$(tput hpa $(tput cols))$(tput cub 6)$(tput setf 4) cancell=$(tput hpa $(tput cols))$(tput cub 10)$(tput setf 4) toend=$(tput hpa $(tput cols))$(tput cub)$(tput setf 2) reset=$(tput sgr0)

# install dependencies if [ ! -z »$1» ]; then echo «Executing command sudo apt-get install» sudo apt-get install $@ echo echo «Installing dependencies $@ ${toend}[OK]${reset}» fi

# Change commit function checkCommit (){ if [ -z »$1» ]; then infoGrep=$(echo $1 | grep «dpkg-source --commit») else echo echo echo «Compiling and build was been successfully! Congratulations!!! ${toend}[OK]${reset}» fi if [ -z »$infoGrep» -a -z »$2» ]; then dpkg-source --commit textBuildChecking=$(dpkg-buildpackage -rfakeroot) echo «Fix source ${toend}[OK]${reset}» checkCommit $textBuildChecking «not» else echo echo echo «If don’t create package, Checking error and try again!!!${toend}[END]${reset}»; fi

}

nameArchive=$(ls | grep *tar*); if [ -z »$nameArchive» ]; then nameArchive=$(ls | grep *bz2); fi

if [ -z »$nameArchive» ]; then nameArchive=$(ls | grep *xz); fi

#get file name without archive extension onlyNameAndVersionWithoutTar=${nameArchive%.tar*} onlyNameAndVersionWithoutBz=${onlyNameAndVersionWithoutTar%.bz*} onlyNameAndVersion=${onlyNameAndVersionWithoutBz%.*} # get package name namePackageFirst=${onlyNameAndVersion%[-]*} namePackage=${namePackageFirst%[_]*}

((countSub=${#namePackage} + 1))

# Get package version versionPackageFirst=${onlyNameAndVersionWithoutBz:$countSub:${#onlyNameAndVersion}} versionPackage=${versionPackageFirst%.*}

echo «Name Package with version: $onlyNameAndVersion» echo «Name Package: $namePackage» echo «Version Package: $versionPackage»

echo echo -n «Checking getting data about package (see up). Correctly? [y/n] » read checkInfoPackage

echo case »$checkInfoPackage» in [yY]) echo «Checking information about package ${toend}[OK]${reset}» ;; [nN]) echo «Checking information about package ${failed}[FAIL]${reset}» echo «Rename archive (delete all don’t needed data from name) and try again» exit ;; *) echo «Checking information about package ${toend}[OK]${reset}» ;; esac

# erase old sir if exist sudo rm -r ${namePackage} echo «Remove old data ${toend}[OK]${reset}» #create dir mkdir ${namePackage} mkdir ${namePackage}/${versionPackage} mkdir ${namePackage}/${versionPackage}/${namePackage}-${versionPackage}

echo «Create dir for build package ${toend}[OK]${reset}»

allPath=${namePackage}/${versionPackage}/${namePackage}-${versionPackage}; #get archive extension ((countSub=${#onlyNameAndVersionWithoutBz} + 1))

extensionArch=${nameArchive:$countSub:${#nameArchive}}

rm -r tmp mkdir tmp if [ »$extensionArch» == «tar.gz» ]; then $(tar xzf $nameArchive -C tmp/); elif [ »$extensionArch» == «tar.bz2» ]; then $(tar xjvf $nameArchive -C tmp/); elif [ »$extensionArch» == «bz2» ]; then cd tmp/ mv …/${nameArchive} ./ $(bunzip2 $nameArchive); cd … elif [ »$extensionArch» == «tar.xz» -o »$extensionArch» == «xz» ]; then echo $nameArchive tar xJvf $nameArchive -C tmp/ else echo «Unrecognized archive type. Unpacking not impossible. Abort!${failed}[FAIL]${reset}» exit fi

echo echo echo «Unpacking archive ${toend}[OK]${reset}»

# get directory with source file after unpacking catMake=$(ls tmp | grep ake)/

if [ -z »$catMake» ]; then catmake=$(ls tmp | grep ${namePackage}); fi

if [ -z »$catMake» ]; then echo «Can’t found source file. Abrted!!! ${failed}[FAIL]${reset}» exit else catMake=» fi

#move source mv --force tmp/${catMake}* ${allPath}/ echo «Move source files to build directory ${toend}[OK]${reset}»;

#remove temporary dir sudo rm -r tmp

echo «Remove temporary dir ${toend}[OK]${reset}» cd ${allPath}

# Prepare source to create deb-package dh_make --createorig

echo echo echo «Create origin source data for debian ${toend}[OK]${reset}»

# Change info about package echo echo echo «Do you want editing data to build debian directory (y/n)» read checkReplaceDataNewPackage case »$checkReplaceDataNewPackage» in [yY]) nano debian/rules nano debian/changelog nano debian/README.debian nano debian/README.source nano debian/postinst.ex nano debian/postrm.ex nano debian/preinst.ex echo «Replacing exiting information about package ${toend}[OK]${reset}» ;; [nN]) echo «Replacing exiting information about package ${cancell}[CANCELLED]${reset}» ;; *) nano debian/rules nano debian/changelog nano debian/README.debian nano debian/README.source nano debian/postinst.ex nano debian/postrm.ex nano debian/preinst.ex echo «Replacing exiting information about package ${toend}[OK]${reset}» ;; esac

# Build package a=$(dpkg-buildpackage -rfakeroot)

# Check commit checkCommit $a Что он делает думаю в общих чертах всем понятно. Объясню просто ход своей мысли. Для того, чтобы воспользоваться скриптом, необходимо создать каталог, в который необходимо перенести архив с исходниками. Так уж сложилось, что я работал лишь с исходниками в формате tar.gz, tar.xz, xz, bz2. На других типах архивов работать не будет. Первым делом при вызове скрипта ему возможно передать параметр — список пакетов, которые необходимо установить для корректной сборки, заявленной разработчиками. В inroduction обычно об этом идет речь, так что тут проблем не должно возникнуть. Покажу работу скрипта на примере сборки рассматриваемого продукта. Его зависимости упираются в собственно сам httrack, заголовочные файлы к нему и в qt4. Поэтому в данном случае его вызываю так: sh .sh libhttrack2 libhttrack-dev httrack qt4-dev-tools. Набираю так потому, что скрипт лежит в /usr/bin, поэтому доступен везде. Иначе его нужно запускать только из директории с исходниками. Возможности передачи пути в качестве параметра я не предусматривал. Далее все просто. После установки всех зависимостей происходит парсинг имени архива исходников и извлечения из названия будущего пакета и его версии. Потом создаются необходимые каталоги для сборки, распаковка и перемещение исходников в нужный каталог, создание оригинального архива для репозитория и собственно сборка пакетов. Также перед сборкой высветится вопрос о том, будете ли вы редактировать файлы в каталоге debian (который генерирует dh_make), а именно control, rules, changelog, README.debian, README.source, postinst.ex, postrm.ex, preinst.ex. После окончания (если не произошло ошибок во время выполнения dpkg-buildpackage -rfakeroot), создадутся все необходимые файлы для дальнейшей манипуляции с пакетом (я к примеру у себя создал локальный репозиторий и кидаю это все туда — мне так удобнее). Теперь настало время познакомиться поближе с возможности только что собранной утилиты. Интерфейс весьма простой и функциональный, но несмотря на это достаточно мощный. Внений вид httraqt Каждый проект может сдержать зеркало сразу нескольких сайтов, что очень удобно для тех, кто любит порядок на винчестере и всю имеющую информацию группирует. Также имеется возможность импорта списка сайтов из обычного текстового документа. При этом каждая новая ссылка должна располагаться на новой строке. Настройки у каждого проекта также свои, но с недавних пор появилась возможность определять глобальные настройки (по умолчанию). Также следует отметить гибкую систему фильтров, которая позволяет задавать типы файлов которые будут или не будут качаться. Максимальная глубина скачивания (с внешних и внутренних ссылок)(что немного неудобно) задается select-списком, т. е. задать ее вручную из gui нет. Также есть возможность указания максимального размера закачиваемых данных, максимально допустимой скорости закачки, максимального числа одновременного соединения, максимального число соединений, максимального числа ссылок, прокси, задания соответствий mime-типов. В общем я в принципе возможностями HTTraqt вполне доволен, советую и Вам испробовать ее на деле. Пример оформления скрипта (а конкретно статусов выполнения взято отсюда, также помог вот этот пост, за что авторам — ОГРОМНОЕ СПАСИБО!).

© Habrahabr.ru