пятница, 14 сентября 2012 г.

Как автоматически выкачать файлы со страницы с открытым доступом / How to fetch directly linked files from a webpage

(dear english-speaking friends, please use google translate)

Допустим мы хотим скачать свободный контент со страницы автоматически, а не нажимать вручную. Есть страница на которой указаны прямые ссылки. Однако именно нажимать нам на каждый неудобно. Это решение позволит взять все ссылки и аккуратно их скачать, контроллируя что скачаны будут именно они и то, что расход ресурсов будет минимальным.

Когда я указываю "аккуратно", я имею ввиду пониженная скорость, один поток, хорошая пауза между скачиваниями. В конечном итоге, так как мы будем себя вежливо вести, для владельца это даже лучше, чем ручное выкачивание, так как никогда на не придется чтото скачивать дважды по ошибке.

Если же вы будете вести себя неприлично - будьте уверены, что владелец быстро вас вычислит и отправит в бессрочный бан. Поэтому лучше не злоупотреблять.

Первым делом надо открыть искомую страницу и сохранить ее содержимое обычным броузером. К примеру как: page_source.txt

Теперь нужно вызвать "grep" по ссылкам. Чтобы оставить только релевантные линии.Вот примерный фрагмент:
   <td><a href="/xxxxxxx/my_file.txt" onClick="rl(this, 'DM', 'list-http');return false;">http</a>

Самый надежный способ выудить строку - ключ "list-http".
Также заметьте, ссылки не абсолютные, а относительные. Значить к каждой строчке нужно будет еще добавить полный адрес.

Теперь правьте конструкцию снизу и вызвайте ее, чтобы получился список адресов:
grep "list-http" page_source.txt | sort | uniq | grep -o '<a .*href=.*>' | sed -e 's/<a/\n<a/g' | sed -e 's/<a .*href=['"'"'"]//' -e 's/["'"'"'].*$//' -e '/^$/ d' | sed -e 's#^#http://ваш урл который надо спереди приписать.net#'  > download_list.txt

Что это делает:
- вырезает все строки с ключевым словом из исходной страницы (page_code.txt)
- cортирует и унифицирует их
- вырезает оттуда конструкцию <a href>
- извлекает оттуда ссылку
- дополняет спереди до полного адреса
- помещает это в файл download_list.txt (с перезаписью)

Это создаст список файлов годных для скачки. Проверьте это.

Теперь осталось скормить это wget. Почему wget - потому что wget будет качать в один поток, один файл за раз, чтобы не бесить сервер. Самый "культурный" скачиватель.

Следующую строку нужно вызвать из места где распологается download_list.txt, туда и будут помешены скачанные файлы:
wget --user-agent="Mozilla/11.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2010092416 Firefox/11.0.0" --tries=3 -c -i download_list.txt -o download_log.log –limit-rate=500k --wait=5 --waitretry=30m

Что она делает:
  • меняет useragent на более нейтральный
  • ставит количество попыток перекачки на 3. В случае провала и частых попыток перекачать исходный сайт может нас банить (и правильно). Не будем бесить его:
  • для того, чтобы не бесить, опция --waitretry ставит время ожидания при сбое в 30 минут. Это более чем гуманно.
  • пишет лог. За ним можно следить с другой машины.
  • ограничивает скорость 500 КиБ. Это нужно чтобы не перегружать целевой сервер.
  • ставит ожидание между закачками в 10 секунд. Опять, чтобы также не перегружать сервер. 
Если хочется отправить закачку на фон, чтобы можно было прикрыть терминал, можно воспользоватся опцией "-b". Также, тогда можно опусить опцию "-o", лог будет принудительно выводится в "wget.log"

Чем это удобнее, чем графический менеждер скачек?
  • полный контроль над точными ссылками
  • потребляется значительно меньше системных ресурсов
  • очень хорошая контроллируемость
  • значительно более низкий риск сбоя при долговременной работе

понедельник, 10 сентября 2012 г.

xfprint4 не отображается принтер / xfprint4 does not show printer

(dear english-speaking friends, please use google translate)

Перебирая скрипты thunar от Linux Mint, я натолкнулся на команду печати, которая позволяет сразу распечатать любой текстовый файл прямо из thunar.
xfprint4 имя_файла

Он не был установлен, но после установки, диалог красовался следующим образом:
 
Как видно, принтеры вообще не отображаются. Как это исправить?

Во первых, должен присутствовать пакет a2ps.
Во вторых, нужно открыть терминал и выполнить xfprint-settings, и в появившимся диалоге выбрать нужную систему. В моем случае, это CUPS. После этого, принтеры будут отображаться.

Вещи, стоящие упоминания
Стоит заметить, что xfprint4 использует a2ps, который НЕ поддерживает UTF-8. Это фатально в современных системах, которые сплошь и полностью работают на UTF-8.
Как вариант, можно заменить a2ps через u2ps (пакет gnome-u2ps в debian-образных) используя simlinkи, но этот метод мной еще проверен не был.

понедельник, 3 сентября 2012 г.

Развертывание NFS шары на небольшой безопасной сетке / Simple NFS filesharing

NFS встроен в любой nix, включая Linux и представляет куда более эффективную сеть, чем виндовская SMB/Samba. По моим замерам в сети 100Mbit на кабеле RJ45 Cat 6, NFS развивал скорость передачи 12МБит/c, когда как Samba только 8(нативный виндовский SMB вообще проваливался с 5Mбит/c). Поэтому, если в сети присуствие корявых окон не предвидится, можно и нужно смело пользоваться NFS. Пока статья не рассматиривает аутентификацию и разграничение доступа, поэтому применяйте данную сеть в хорошо огороженном рутером месте, или вообще вне интернета.

Настройка NFS сервера (шары)

Установить rpcbind, nfs-common и nfs-server.
Не нужно биндовать интерфейс loopback при настройке rpcbind. В старых руководствах встречается portmap, он был заменен rpcbind.

Для открытия доступа нужно править файл /etc/exports, имеющего такой синтаксис:  
[путь] [* или имя клиента или IP адрес/маска](rw/ro,async)
В этом файле, подобно /etc/fstab, указываются все расшареные точки на текущей машине.Маску можно и опустить, тогда будет задан единственный адрес.

После правки exports, нужно вызвать sudo exportfs -a
Пример конфига:
/mnt/data 192.168.10.0/24(rw,async)
будет расшарена папка /mnt/data, доступ получит подсеть 192.168.10.хх с правами чтения/записи. Здесь 24 - маска 255.255.255.0 - первые 24 бита (из 32) будут выставленны в 1, фильтруя доступ.

Настройка клиента

Установить rpcbind, nfs-common.
Затем нужно создать пустую папку, куда будет подсоединена шара
mkdir -p "~/Шара".
В отличии от SMB, NFS полностью использует UNIX подход (с монтированием) и гармонично вливается в среду. Никаких просмотров NFS не нужно и не предвидится.

Затем нужно определится как мы будем подсоединятся - в ручную или автоматически через fstab. Подсоединение через fstab имеет все преймущества и недостатки подсоединения любого другого раздела - если шара не планируется быть постоянно доступной, лучше это делать вручную, то есть или руками, или сделать готовый скрипт.

Подсоединение напрямик

Синтакс подсоединения напрямик:
sudo mount [IP или DNS алиас сервера]:[путь на сервере] [путь на клиенте] [опция,опция..] [-o nfs опции]
Опции:
-w разрешить запись
-r только чтение
-s подсоединить все-равно (игнорировать проверки)
NFS опции:
Эти опции используются клиентом при подсоединении - или на стадии команды mount (через -o) или в fstab. Полный список можно почитать по man nfs. Приведены наиболее значимые.
defaults - задает параметры по умолчанию. Следом за ним, можно их менять.
nfsvers=х - явно задать требуемую версию NFS протокола.
bg / fg - задать тип подсоединения. fg - foreground - прямой, команда mount заберет управление и будет подсоединять, в случае провала вывалится с ошибкой. bg - background - фоновой, команда mount сразу завершится, но будет продолжать пытаться создать соединение на фоне.
retry=х - количество попыток (сверху), перед сдаванием. Очень полезно при монтировании во время пуска, если сервер не доступен. По умолчанию - три.
port=х, proto=tcp/udp - задать порт и протокол.По умолчанию порт 2049. Если задан 0 - осуществляется опрос демона rpcbind на целевом сервере на счет порта.
timeo=x - задать интервал повтора запроса в х десятках секунд. По умолчанию 60, для протокола UDP - 1.1 c увеличением задержки в случае провала. Есть смысл менять только для сетей с долгим откликом.
retrans=х - количество попыток передачи, перед тем, как сервер сдастся. По умолчанию 3.
rsize=х, wsize=х - количество байт, кратное 1024, переданное за раз при запросах для записи и чтения соответсвенно.
Пример:
sudo mount сервер.домен.com:/mnt/data ~/Шара -w 
sudo mount 192.168.1.1:/mnt/data ~/Шара -w 

Графический скрипт, позволяющий подключать шару.
Этот примитивный скрипт позволит подключать сервер просто щелкнув и введя пароль (это требует mount).
Возможно попозже, я создам софт, который позволит легко обращаться с шарами. Сейчас это не в планах, и мне неизвестно ни одно готовое решение (потому что NFS прост?).
  • нужно заменить IP и папку на сервере, на собственную
  • если используется kde, нужно заменить gksudo на kdesu
  • шара подсоединена с стороны клиента к ~/SHARE
  • нужно поместить его в /usr/local/bin и дать ему +x
  • советую сделать к нему ярлык
  • скрипт использует gksudo и sudo таким образом, потому что стандартный вызов gksudo выдает диалог без возможности сохранить пароль на период времени. 
  • следующие после gksudo вызовы sudo будут автоматически приняты, если пароль был введен корректно.

Вот этот скрипт:
#!/bin/bash
#### This is rather primitive script to access NFS share
#### Substitute IP and folder of the server with your own (192; /home/server).
#### Share will be located at ~/SHARE on client side.
#### And finally, it uses GKSUDO. Install it, or replace with what you use.

mkdir -p ~/SHARE
gksudo -p -S -m "Введите пароль для подсоединения диска" | sudo -S -s -- mount 192.168.1.1:/home/files ~/SHARE -w -o defaults,fg,rsize=4096,wsize=4096
sudo /etc/init.d/rpcbind restart
sudo /etc/init.d/nfs-common restart

 

Подсоединение через /etc/fstab 

[IP или DNS алиас сервера]:[путь на сервере] [путь на клиенте] nfs [nfs опция1, nfs опция2..]

Пример из /etc/fstab:
server.filetrash.com:/mnt/data_files /files nfs rsize=8192,wsize=8192,timeo=10

Завершающие действия

После подсоединения вручную рекоммендуется перезапустить демонов nfs-kernel-server и rpcbind
sudo /etc/init.d/rpcbind restart 
sudo /etc/init.d/nfs-kernel-server restart

Более серьезный разбор доступен здесь.