Friday, October 24, 2008

мучения с торрентами: free disk space

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

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

#!/bin/bash
output=`date +"%F %R"`

# тут лежат торренты
cd /home/nx/torrents

total=0

# проходимся по всем запущенным торрентам и считаем сколько мб они в итоге займут, когда докачаются
for m in `ls .`; do
if [ -d $m ]; then
cd $m
if [ -f $m ]; then
m_filesize=`ctorrent -x $m | perl -lne 'if ($_ =~ /^Total\: (\d*) MB$/){ print $1; }'`
let total+=$m_filesize
fi
cd ..
fi
done

# свободное место на диске. я беру вывод команды df и вырезаю из него строчку, относящуюся к точке монтирования /home
disk_free_space=`df -mx tmpfs | perl -lne 'if ($_ =~ /^[^\s]+\s+\d+\s+\d+\s+(\d+)\s+\d+%\s+\/home$/){ print "$1"; }'`

# всего скачано я считаю как размер директории с торрентами. в ней не должно быть левых файлов
total_downloaded=`du -sm . | perl -lne 'if ($_ =~ /^(\d+)/){ print "$1"; }'`

# осталось скачать = общий объем торрентов минус скачанное
let to_download=$total-$total_downloaded

# место которое можно использовать и которое останется, когда все торренты докачаются:
let space_available=$disk_free_space-$to_download

output+=" total active torrents size: $total Mb total downloaded: $total_downloaded Mb free disk space: $disk_free_space Mb"
output+=" to download: $to_download Mb disk space available for new downloads: $space_available Mb"

echo $output;

# вывод организован так неказисто т.к. мне так удобнее логировать и читать логи

а скриптик из предыдущего поста не работает, кстати, там надо извращенскую конструкцию проверки запущенности процесса закачки торрента
if [ `top -bcn1 | grep -F $m | grep -c ctorrent` == "0" ] ;then
заменить на
if [ `ps -fC ctorrent | grep -cF $m` == "0" ] ;then
причем не работает оно только при запуске по крону, а так работает на ура)

Monday, October 20, 2008

4 миллиарда рублей

не могу не процитировать, очень уж класно подмечено Аленой С++
Интересные слухи бродят среди программистов. Все уже, наверное, слышали про 4 миллиарда рублей, которые были начислены по ошибке некоему оперативнику. Который их вернул. Однако, прочитав внимательно заметки об этом удивительном происшествии, вы наверняка найдете упоминания о том, что до начисления у него на счету был "почти ноль". А четыре миллиарда - это примерно 232. Ну дальше рассказывать не надо, я думаю :-).

p.s. первый коммент к записи рулит:
0 программистов ругал сердитый шeф,
Потом уволил одного, и стало их FF.

автоматизация закачки торрентов ночью + ограничение скорости вечером. ctorrent + ctcs

все находится на стадии тестирования, может и не заработать=)
где-то далеко, у моей сестры стоит ноутбук. он подключен на ночной безлимитный инет от мтис на скорости 32Кб/с. где-то далеко на трекере торрентс.ру лежат десятки, а то и сотни гигабайт файлов, которые мне интересны. поэтому каждый будний день вечером в 19:10 компьютер сестры начинает качать торренты и прекращает это в 7:50 (по будним дням). таким образом начав качать в пятницу вечером остановится он только в понедельник утром.

/etc/crontab :
# m h dom mon dow  user  command

# вечером в 19:10 с понедельника по пятницу запускаем 
# (скрипт запустит закачку через клиент ctorrent)
10 19 * * 1-5      nx    /home/nx/torrents/torrents_start.sh

# а утром в 7:50 убиваем все процессы ctorrent
50 7  * * 1-5      nx    killall -u nx -9 ctorrent

но таким образом мы урадем весь инет, не оставив скорости всей семье, а в инете сидят все. поэтому дополнительно к ctorrent будем успользовать ctcs -- ctorrent control server и через него регулировать скорость. с 7 вечера до полуночи сумарная скорость скачки по торрентам не будет превышать 15Кб/с, а с полуночи до 8 утра -- не ограничена.


/etc/crontab (продолжение) :
# m h dom mon dow  user  command

# вечером, перез запуском торрентов, убиваем, если он вдруг запущен
8 19  * * 1-5      nx    killall -u nx -9 ctcs
# а потом запускаем с ограничением скорости -d  -u 
9 19  * * 1-5      nx    ctcs -d 15 -u 15

# почти сразу после полуночи убиваем и запускаем без ограничения по скорости 
# (100 кб/с недостижима). это действие уже ежедневное.
10 0  * * *        nx    killall -u nx -9 ctcs
11 0  * * *        nx    ctcs -d 100 -u 100

# плюс по выходным в 11 утра сново включается ограничение скорости
10 11  * * 6-7     nx    killall -u nx -9 ctcs
11 11  * * 6-7     nx    ctcs -d 15 -u 15

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


/home/nx/torrents/torrents_start.sh :
#!/bin/bash

base_url="http://tmp4.osiacat.ru/torrents"

# удаляем старый список .torrent файлов, которые следует скачать с сервера, если он есть
if [ -a "index.php" ] ; then rm index.php; fi
# и получаем новый с сервера
wget -q $base_url/index.php
# выдача проста как валенок:
# код index.php: 

# в папке /home/nx/torrents соблюдается структура:
# для каждого торрента своя папка, название совпадает с названием .torrent файла
# сам .torrent файл лежит в папке.

# если список с сервера скачался, пробегаемся по нему 
# создаем нужные директории и скачиваем с сервера .torrent файлы
if [ -f index.php ] ; then
    for m in `cat index.php`; do
        if [ ! -d $m  ]; then
            mkdir $m;
            cd $m;
            wget -q $base_url"/"$m
            cd ..
        fi
    done
fi


# независимо от того скачивали ли мы новые .torrent запускаем все что есть в папке,
# проверяя, не запущен ли уже этот торрент

# для каждого из списка всех файлов в директории (/home/nx/torrents)
for m in `ls .`; do
    # если это директория
    if [ -d $m ]; then
        cd $m
        # если в ней есть файл с таким же именем
        if [ -f $m ]; then
            # если количество запущенных процессов, в команде запуска которых 
            # присутствует имя нашего файла равно нулю (торрент не запущен)
            if [ `top -bcn1 | grep -F $m | grep -c ctorrent` == "0" ] ;then
                # запускаем ctorrent указав чтобы он запускался как демон
                # и использовал ctcs запущенный на localhost:2780
                ctorrent -d -S localhost:2780 $m
            fi
        fi
        cd ..
    fi
done

решить скачать торрент я могу в любое время суток, например в 2:30 ночи=) хочется чтобы закачка началась не вечером следующего дня, а, насколько это возможно, быстрее. раз в час я буду выполнять скрипт запуска торрентов. заодно он оживит умершие торренты.

/etc/crontab (продолжение) :
# m h dom mon dow  user  command

# 20:30 -- 23:30 ежедневно
30 20-23 * * *          nx    /home/nx/torrents/torrents_start.sh

# 0:30 -- 6:30 ежедневно
30 0-6 * * *            nx    /home/nx/torrents/torrents_start.sh

# 7:30 -- 19:30 по выходным
30 7-19 * * 6-7         nx    /home/nx/torrents/torrents_start.sh

# таким образом покрывается все время доступности интернета


p.s. сам знаю, тут можно кучу вещей оптимизировать, писал на ходу.
нет проверки на зацикливание процессов (бывает ctorrent или ctcs взбесится и будет кушать 100% процессора пока его не убъешь)
+ в ближайшее время думаю дополнить контролем свободного места на диске и автоматическим спихиванием скачанных торрентов на другой компьютер, когда тот включен.

ссылки: Enhanced CTorrent, CTCS

Wednesday, October 8, 2008

foobar2000

может я мало гуглил, может просто ленился все пробовать, но amarok с ape+cue я так и не подружил. попробовал foobar2000 и он мне нравится! работает он под wine без проблем, разве что, возможно, я не все функции испытывал.
в качестве редактора пробую notepad++ т.к. мне все остальные чем-то не нравятся. хотя, признаться честно, мне вообще весь софт который я видел хоть в чем-нибудь да не нравится)

Sunday, October 5, 2008