Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Instruktor
Зарегистрирован: 29.02.2008 Сообщения: 89
|
Добавлено: 2008-03-14 13:21 pm Заголовок сообщения: скрипт генерации ed2k и DC++ ссылок |
|
|
скрипт генерации ed2k и DC++ ссылок
задача:
- сгенерить хеш-суммы, составить ссылки и заполнить соответствующие поля для всех файлов, зарегистрированных в видеокаталоге;
- выполнять генерация для новых файлов регулярно по расписению (cron);
условия:
- FreeBSD 6.2;
- файлы раcположены локально или подмонтированы по ftp|smb|nfs;
- в mysql имена файлов храняться в кодировке cp1251, имена самих файлов в koi8-r;
средства:
- штатные системные утилиты FreeBSD 6.2;
- tthsum, утилита генерит TTH-хеш для ссылок DC++ (/usr/ports/security/tthsum);
- ed2k_hash, утилита генерит ed2k-ссылку (/usr/ports/net-p2p/edonkey-tool-hash);
- iconv, утилита конвертит кодировку строки (/usr/ports/converters/iconv);
- mysql, консольный клиент;
скрипт:
Код: |
#!/bin/sh
# корректируем PATH
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/bin:/root/sbin; export PATH
my="mysql -N -h127.0.0.1 -uvideo -p154121 video" # обращение к mysql
lock="/var/run/p2p_hash_count.lock" # флаг блокировки
log="/var/log/p2p_hash_count.log" # лог
my_chs="cp1251" # кодировка имён файлов в mysql
sys_chs="koi8-r" # системная кодировка имён
#--------------------------------------------
test -f $lock && exit # проверяем не запущен ли уже процесс
touch $lock # ставим флаг блокировки
#--------------------------------------------
# выполнять пока есть пустые поля dc++ или ed2k
while [ `echo "select count(ID) from files where dcppLink='' or ed2kLink=''" | $my` -gt 0 ]
do
row=`echo "select ID,Size,Path from files where dcppLink='' or ed2kLink='' limit 1" | $my` # получаем объект
f_id=`echo $row | awk '{print $1}'` # ID
f_size=`echo $row | awk '{print $2}'` # объём в байтах
f_path=`echo $row | awk '{print $3}' | iconv -f $my_chs -t $sys_chs` # путь
f_name=`basename $f_path | tr " " "_" | tr -d "'" | iconv -f $sys_chs -t $my_chs` # имя файла
dat=`date "+%Y-%m-%d_%H:%M:%S"`
if test -f "$f_path" # проверяем есть ли доступ к файлу, если нет то всё бросаем
then
else
echo "$dat file not found: id=$f_id path=$f_path" >> $log
rm -f $lock
exit
fi
# DC++ Генерим ссылку (если нет), забиваем в базу и пишем лог.
if [ `echo "select count(ID) from files where ID=$f_id and dcppLink=''" | $my` != "0" ]
then
dcpp="magnet:?xt=urn:tree:tiger:`nice -n 5 tthsum "$f_path" | awk '{print $1}'`&xl=${f_size}&dn=${f_name}"
echo "update files set dcppLink='$dcpp' where ID=$f_id" | $my 2>&1 >> $log
echo "$dat dc++ link created: id=$f_id link=$dcpp" | iconv -f $my_chs -t $sys_chs >> $log
fi
# ed2k Генерим ссылку (если нет), забиваем в базу и пишем лог.
if [ `echo "select count(ID) from files where ID=$f_id and ed2kLink=''" | $my` != "0" ]
then
ed2k=`nice -n 5 edonkey-tool-hash "$f_path" | tr " " "_" | tr -d "'" | iconv -f $sys_chs -t $my_chs`
echo "update files set ed2kLink='$ed2k' where ID=$f_id" | $my 2>&1 >> $log
echo "$dat ed2k link created: id=$f_id link=$ed2k" | iconv -f $my_chs -t $sys_chs >> $log
fi
done
#--------------------------------------------
rm -f $lock # снимаем блокировку
exit
|
замечания:
- когда файлы лежат не локально а подмонтированы по сети время обработки значительно увеличивается;
- если вы обновили файл то p2p-ссылки каталогом удаляются, скрипт будет генерить новые;
- если скрипт натыкается на ошибку доступа к файлу (неверно имя, умер диск, оборвалась сеть и т.п.) то процесс останавливается.
Обработать такую ситуацию уже не просто, нужно вмешательство.
- возможны косяки с именами файлов (кодировки, спец-символы);
- не дружит с пробелами в пути к файлу.
Последний раз редактировалось: Instruktor (2008-03-17 18:41 pm), всего редактировалось 4 раз(а) |
|
Вернуться к началу |
|
iVale
Зарегистрирован: 11.03.2008 Сообщения: 33
|
Добавлено: 2008-03-14 15:40 pm Заголовок сообщения: |
|
|
Респек, то что нужно!
Только не совсем понятно как работает:
- Добавляется dc++ ссылка в БД самого скрипта видеокаталога?
- Как в админке добавлять ссылку, что бы её увидели юзеры?
- Как выглядит на практике? |
|
Вернуться к началу |
|
Instruktor
Зарегистрирован: 29.02.2008 Сообщения: 89
|
Добавлено: 2008-03-14 15:57 pm Заголовок сообщения: |
|
|
iVale писал(а): |
- Добавляется dc++ ссылка в БД самого скрипта видеокаталога?
|
Ссылки добавляются непосредственно в базу данных видеокаталога.
Как только ссылка добавилась - она отображается на страничке фильма.
iVale писал(а): |
- Как в админке добавлять ссылку, что бы её увидели юзеры?
|
В админке в редакторе в разделе "файлы" фильмов есть соответствующие два поля "Ссылка ed2k" и "Ссылка DC++". Здесь можно поставить ссылки вручную и они будут отображены на странице фильма.
iVale писал(а): |
- Как выглядит на практике?
|
Всё как обычно, модераторы добавляют фильмы, про p2p-ссылки ничего не нают
В час ночи запускается скрипт и начинает генерить ссылки для новых файлов пока не сгенерит для каждого. В идеале - процесс полностью автономный, но изредка необходимо проверять не запнулся ли процесс на какой-нибудь ошибке, типа неправильного пути к файлу. |
|
Вернуться к началу |
|
iVale
Зарегистрирован: 11.03.2008 Сообщения: 33
|
Добавлено: 2008-03-14 16:08 pm Заголовок сообщения: |
|
|
Instruktor писал(а): | В админке в редакторе в разделе "файлы" фильмов есть соответствующие два поля "Ссылка ed2k" и "Ссылка DC++". Здесь можно поставить ссылки вручную и они будут отображены на странице фильма. |
Тоесть в изначальной поставке видео скрипта уже есть поля dc++ и ed2k, и вводить их можно вручную? (спрашиваю потому, т.к. только оплачиваю продукт), но Ваш скрипт позволяет автоматически пропарсить туда ссылки?
Тоесть фильмы днём добавляются модерами (без дц++ ссылок), ночью скрипт запускается и парсит ссылки в БД, которые потом уже сами появляются на странице фильма? |
|
Вернуться к началу |
|
Angel
Зарегистрирован: 29.02.2008 Сообщения: 79
|
Добавлено: 2008-03-14 17:27 pm Заголовок сообщения: |
|
|
iVale писал(а): |
Тоесть в изначальной поставке видео скрипта уже есть поля dc++ и ed2k, и вводить их можно вручную? (спрашиваю потому, т.к. только оплачиваю продукт), но Ваш скрипт позволяет автоматически пропарсить туда ссылки?
Тоесть фильмы днём добавляются модерами (без дц++ ссылок), ночью скрипт запускается и парсит ссылки в БД, которые потом уже сами появляются на странице фильма? |
Совершенно верно |
|
Вернуться к началу |
|
iVale
Зарегистрирован: 11.03.2008 Сообщения: 33
|
Добавлено: 2008-03-17 17:55 pm Заголовок сообщения: |
|
|
Пробую на linux slackware, установил
http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz
http://freshmeat.net/redir/tthsum/53976/url_tgz/tthsum-1.1.0.tar.gz
Код: | #!/bin/sh
# корректируем PATH
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/bin:/root/sbin; export PATH
my="mysql -N -h127.0.0.1 -uюзнр -pпароль база" # обращение к mysql
lock="/var/run/p2p_hash_count.lock" # флаг блокировки
log="/var/log/p2p_hash_count.log" # лог
my_chs="cp1251" # кодировка имён файлов в mysql
sys_chs="koi8-r" # системная кодировка имён
#--------------------------------------------
test -f $lock && exit # проверяем не запущен ли уже процесс
touch $lock # ставим флаг блокировки
#--------------------------------------------
# выполнять пока есть пустые поля dc++ или ed2k
while [ `echo "select count(ID) from files where dcppLink='' or ed2kLink=''" | $my` -gt 0 ]
do
row=`echo "select ID,Size,Path from files where dcppLink='' or ed2kLink='' limit 1" | $my` # получаем объект
f_id=`echo $row | awk '{print $1}'` # ID
f_size=`echo $row | awk '{print $2}'` # объём в байтах
f_path=`echo $row | awk '{print $3}' | iconv -f $my_chs -t $sys_chs` # путь
f_name=`basename $f_path | tr " " "_" | tr -d "'" | iconv -f $sys_chs -t $my_chs` # имя файла
dat=`date "+%Y-%m-%d_%H:%M:%S"`
if test -f "$f_path" # проверяем есть ли доступ к файлу, если нет то всё бросаем
then
else
echo "$dat file not found: id=$f_id path=$f_path" >> $log
rm -f $lock
exit
fi
# DC++ Генерим ссылку (если нет), забиваем в базу и пишем лог.
if [ `echo "select count(ID) from files where ID=$f_id and dcppLink=''" | $my` != "0" ]
then
dcpp="magnet:?xt=urn:tree:tiger:`nice -n 5 tthsum "$f_path" | awk '{print $1}'`&xl=${f_size}&dn=${f_name}"
echo "update files set dcppLink='$dcpp' where ID=$f_id" | $my 2>&1 >> $log
echo "$dat dc++ link created: id=$f_id link=$dcpp" | iconv -f $my_chs -t $sys_chs >> $log
fi
#
done
rm -f $lock
exit |
Как вы видите убрал вконце про ed2k, правильно ли идёт обращение к mysql? я про слитное -uюзер, -pпароль?
Файл p2p_hash_count.lock создаётся с весом 0.
В базе пусто. |
|
Вернуться к началу |
|
Instruktor
Зарегистрирован: 29.02.2008 Сообщения: 89
|
Добавлено: 2008-03-17 18:07 pm Заголовок сообщения: |
|
|
iVale писал(а): | Пробую на linux slackware, установил
Как вы видите убрал вконце про ed2k, правильно ли идёт обращение к mysql? я про слитное -uюзер, -pпароль?
|
Слитно это нормально. Так должно быть.
для отладки нужно смотреть какой формируется запрос к базе
строку:
echo "update files set dcppLink='$dcpp' where ID=$f_id" | $my 2>&1 >> $log
заменить на:
echo "update files set dcppLink='$dcpp' where ID=$f_id"
Скрипт запустить в консоли и смотреть на ошибки и формируемые sgl-запросы.
Поскольку система другая - без отладки никак.
iVale писал(а): | Файл p2p_hash_count.lock создаётся с весом 0. |
Размер не важен, важно наличие файла.
Если файл есть - заблокировано, если файла нет, можно запускаться. |
|
Вернуться к началу |
|
iVale
Зарегистрирован: 11.03.2008 Сообщения: 33
|
Добавлено: 2008-03-17 18:18 pm Заголовок сообщения: |
|
|
Запускается без ошибок, как посмотреть текущие запросы к базе?
Замечу что лог не пишется вообще.
Код: | mysql -N -h127.0.0.1 -uюзер -pпароль [b]база[/b] |
Последнее я правильно понял - база указывается? |
|
Вернуться к началу |
|
Instruktor
Зарегистрирован: 29.02.2008 Сообщения: 89
|
Добавлено: 2008-03-17 18:31 pm Заголовок сообщения: |
|
|
iVale писал(а): | Запускается без ошибок, как посмотреть текущие запросы к базе?
Замечу что лог не пишется вообще.
Код: | mysql -N -h127.0.0.1 -uюзер -pпароль [b]база[/b] |
Последнее я правильно понял - база указывается? |
да, последнее это база.
Убедитьсь, что перед стартом скрипта удалён лок-файл. Пока есть лок скрипт выполняться не будет.
или можно закомментировать test -f $lock && exit |
|
Вернуться к началу |
|
iVale
Зарегистрирован: 11.03.2008 Сообщения: 33
|
Добавлено: 2008-03-17 18:50 pm Заголовок сообщения: |
|
|
Удалил лок файл, запускаю заново:
Код: | sudo sh getdclinks1.sh
getdclinks1.sh: line 27: syntax error near unexpected token `else'
getdclinks1.sh: line 27: ` else' |
Привожу опять скрипт:
Код: | #!/bin/sh
# корректируем PATH
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/bin:/root/sbin; export PATH
my="mysql -N -h127.0.0.1 -ulmss -pjtdMNmRPUepUwACE lmss1" # обращение к mysql
lock="/var/run/p2p_hash_count.lock" # флаг блокировки
log="/var/log/p2p_hash_count.log" # лог
my_chs="cp1251" # кодировка имён файлов в mysql
sys_chs="koi8-r" # системная кодировка имён
#--------------------------------------------
test -f $lock && exit # проверяем не запущен ли уже процесс
touch $lock # ставим флаг блокировки
#--------------------------------------------
# выполнять пока есть пустые поля dc++ или ed2k
while [ `echo "select count(ID) from files where dcppLink='' or ed2kLink=''" | $my` -gt 0 ]
do
row=`echo "select ID,Size,Path from files where dcppLink='' or ed2kLink='' limit 1" | $my` # получаем объект
f_id=`echo $row | awk '{print $1}'` # ID
f_size=`echo $row | awk '{print $2}'` # объём в байтах
f_path=`echo $row | awk '{print $3}' | iconv -f $my_chs -t $sys_chs` # путь
f_name=`basename $f_path | tr " " "_" | tr -d "'" | iconv -f $sys_chs -t $my_chs` # имя файла
dat=`date "+%Y-%m-%d_%H:%M:%S"`
if test -f "$f_path" # проверяем есть ли доступ к файлу, если нет то всё бросаем
then
else
echo "$dat file not found: id=$f_id path=$f_path" >> $log
rm -f $lock
exit
fi
# DC++ Генерим ссылку (если нет), забиваем в базу и пишем лог.
if [ `echo "select count(ID) from files where ID=$f_id and dcppLink=''" | $my` != "0" ]
then
dcpp="magnet:?xt=urn:tree:tiger:`nice -n 5 tthsum "$f_path" | awk '{print $1}'`&xl=${f_size}&dn=${f_name}"
echo "update files set dcppLink='$dcpp' where ID=$f_id"
echo "$dat dc++ link created: id=$f_id link=$dcpp" | iconv -f $my_chs -t $sys_chs >> $log
fi
done
rm -f $lock
exit |
|
|
Вернуться к началу |
|
Instruktor
Зарегистрирован: 29.02.2008 Сообщения: 89
|
Добавлено: 2008-03-17 20:45 pm Заголовок сообщения: |
|
|
[quote="iVale "]Удалил лок файл, запускаю заново:
Код: | sudo sh getdclinks1.sh
getdclinks1.sh: line 27: syntax error near unexpected token `else'
getdclinks1.sh: line 27: ` else' |
В линуксе if then else обрабатывается иначе. Здесь после then нужно поместить любую команду.
найти:
Код: | if test -f "$f_path"
then
else
echo "$dat file not found: id=$f_id path=$f_path" >> $log
rm -f $lock
exit
fi |
сделать так:
Код: | if test -f "$f_path"
then
pwd
else
echo "$dat file not found: id=$f_id path=$f_path" >> $log
rm -f $lock
exit
fi |
|
|
Вернуться к началу |
|
iVale
Зарегистрирован: 11.03.2008 Сообщения: 33
|
Добавлено: 2008-03-17 20:50 pm Заголовок сообщения: |
|
|
Спасибо за отзыв. Сделал как вы сказали:
Код: | sudo sh getdclinks1.sh
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)
getdclinks1.sh: line 17: [: -gt: unary operator expected |
|
|
Вернуться к началу |
|
Marcus
Зарегистрирован: 29.02.2008 Сообщения: 15
|
Добавлено: 2008-03-18 10:27 am Заголовок сообщения: |
|
|
iVale ,
У меня на Linux CentOS 5 заработало только после некоторых манипуляций (в частности тех, которые тут уже приводили) ...
Вот что получилось
Код: |
#!/bin/sh
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
my="mysql -N -h<ip_mysql> -u<user> -p<password> database_name" # обращение к mysql
lock="/var/run/p2p_hash_count.lock" # флаг блокировки
log="/var/log/p2p_hash_count.log" # лог
my_chs="utf8" # кодировка имён файлов в mysql
sys_chs="utf-8" # системная кодировка имён
#--------------------------------------------
test -f $lock && exit # проверяем не запущен ли уже процесс
touch $lock # ставим флаг блокировки
#--------------------------------------------
# выполнять пока есть пустые поля dc++ или ed2k
while [ `echo "select count(ID) from files where dcppLink=''" | $my` -gt 0 ]
do
row=`echo "select ID,Size from files where dcppLink='' limit 1" | $my` # получаем объект
f_id=`echo $row | awk '{print $1}'` # ID
f_size=`echo $row | awk '{print $2}'` # объём в байтах
f_path=`echo "set names $my_chs; select Path from files where ID=$f_id" | $my` # путь
f_name=`echo "set names $my_chs; select Name from files where ID=$f_id" | $my` # имя файла
dat=`date "+%Y-%m-%d_%H:%M:%S"`
if test -f "$f_path" # проверяем есть ли доступ к файлу, если нет то всё бросаем
then
pwd
else
echo "$dat file not found: id=$f_id path=$f_path" | iconv -f $my_chs -t $sys_chs >> $log
rm -f $lock
exit
fi
# DC++ Генерим ссылку (если нет), забиваем в базу и пишем лог.
if [ `echo "select count(ID) from files where ID=$f_id and dcppLink=''" | $my` != "0" ]
then
dcpp=`nice -n 5 tthsum "$f_path" | awk '{print $1}'`
echo "set names $my_chs; update files set dcppLink='magnet:?xt=urn:tree:tiger:$dcpp&xl=${f_size}&dn=${f_name}' where
ID=$f_id" | $my 2>&1 >> $log
echo "$dat dc++ link created: id=$f_id name=$f_name link=$dcpp" | iconv -f $my_chs -t $sys_chs >> $log
fi
done
|
И работает на УРА! Респект Instruktor !
Кстати, если заметили, то замена
Код: |
f_path=`echo $row | awk '{print $3}' | iconv -f $my_chs -t $sys_chs` # путь
f_name=`basename $f_path | tr " " "_" | tr -d "'" | iconv -f $sys_chs -t $my_chs` # имя файла
|
на
Код: |
f_path=`echo "set names $my_chs; select Path from files where ID=$f_id" | $my` # путь
f_name=`echo "set names $my_chs; select Name from files where ID=$f_id" | $my` # имя файла
|
позволяет индексировать файлы с пробелами в названии/пути. |
|
Вернуться к началу |
|
iVale
Зарегистрирован: 11.03.2008 Сообщения: 33
|
Добавлено: 2008-03-18 14:21 pm Заголовок сообщения: |
|
|
У меня по прежнему ошибка
НО, заменяю
Код: | while [ `echo "select count(ID) from files where dcppLink=''" | $my` -gt 0 ] |
на
Код: | while [ `echo "select count(ID) from files where dcppLink=''" | $my -gt 0` ] |
ошибка Код: |
sudo sh getdclinks1.sh
getdclinks1.sh: line 17: [: too many arguments |
|
|
Вернуться к началу |
|
Instruktor
Зарегистрирован: 29.02.2008 Сообщения: 89
|
Добавлено: 2008-03-18 14:34 pm Заголовок сообщения: |
|
|
очевидно, нет коннекта к базе
уберите из строки коннекта -h127.0.0.1
пусть через сокет конектится
если не поможет то нужно разбираться с юзером и его правами на базу данных |
|
Вернуться к началу |
|
|