ForeverYoung's blog » gentoo/atom/gentoo/?lang=ru2011-05-31T06:49:59ZAnton NovosyolovLinux, программирование и понемногу о разномblohgQR-коды/post/qr-code-local/?lang=ru2011-05-31T06:49:59Z2011-05-31T06:49:59ZAnton Novosyolovanton.novosyolov@gmail.com<!-- tags: gentoo,Nokia N900,QR -->
<!-- date: 1306824599 -->
<p>Продолжение <a class="reference external" href="/post/qr-code/?lang=ru">поста</a>, версия без использования Google Chart API.</p>
<!-- tags: gentoo,Nokia N900,QR -->
<!-- date: 1306824599 -->
<p>Продолжение <a class="reference external" href="/post/qr-code/?lang=ru">поста</a>, версия без использования Google Chart API.</p>
<!-- read_more -->
<p><em>qrcode</em> - для создания QR-кода - компьютерная версия:</p>
<pre class="brush: bash">
#!/bin/bash
qrencode -o /tmp/qr.png
feh /tmp/qr.png
rm /tmp/qr.png
</pre>
<p><em>qrcode</em> - для создания QR-кода - версия для N900:</p>
<pre class="brush: bash">
#!/bin/bash
qrencode -o /tmp/qr.png
phone-control --browse file:///tmp/qr.png
</pre>
<p>Различия минимальны - в вызове просмотрщика изображений.</p>
<p>На компьютере ставим media-gfx/qrencode и feh (либо переделываем под другой просмотрщик), на N900 - qrencode и phone-control (оба из extras-devel).</p>
<p>Использование:</p>
<pre class="brush: plain">
$ qrcode < file
$ qrcode
text
text2
Ctrl-D
</pre>
<p>На N900 сделал виджет <a class="reference external" href="http://wiki.maemo.org/Desktop_Command_Execution_Widget_scripts">DCEW</a> для вызова.</p>
<p>Команда:</p>
<pre class="brush: bash">
sh -c "osso-xterm -e /home/user/.bin/qrcode &" | echo ""
</pre>
<p>Чтение кода - все как было.</p>
<p><strong>UPD</strong>: <em>qrcode-clip</em> - читает из буфера обмена:</p>
<pre class="brush: bash">
#!/bin/bash
clip=`xclip -o -selection clipboard`
if [ "$clip" != "" ]; then
echo "$clip" | qrencode -o /tmp/qr.png
phone-control --browse file:///tmp/qr.png
fi
</pre>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js"></script>
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css"/>
<script type="text/javascript">SyntaxHighlighter.defaults.toolbar=false; SyntaxHighlighter.all();</script>О blohg/post/about-blohg/?lang=ru2011-05-27T10:24:15Z2011-05-27T10:24:15ZAnton Novosyolovanton.novosyolov@gmail.com<!-- date: 1306491855 -->
<!-- tags: python,reStructuredText,mercurial,gentoo,lighttpd,blohg -->
<p><a class="reference external" href="http://blohg.org">Blohg</a> - это блоговый движок, написанный на Python.</p>
<!-- date: 1306491855 -->
<!-- tags: python,reStructuredText,mercurial,gentoo,lighttpd,blohg -->
<p><a class="reference external" href="http://blohg.org">Blohg</a> - это блоговый движок, написанный на Python.</p>
<!-- read_more -->
<p>В основе - <a class="reference external" href="http://flask.pocoo.org">Flask</a>, <a class="reference external" href="http://jinja.pocoo.org/2/">Jinja2</a>, <a class="reference external" href="http://pypi.python.org/pypi/docutils">docutils</a>, <a class="reference external" href="http://mercurial.selenic.com">Mercurial</a>.
Система комментариев внешная, от <a class="reference external" href="http://disqus.com">disqus</a>.</p>
<p>Преимущества для меня:</p>
<ul class="simple">
<li><a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> - больше возможностей, чем например у <a class="reference external" href="http://ru.wikipedia.org/wiki/Markdown">Markdown</a>.</li>
<li><a class="reference external" href="http://mercurial.selenic.com">Mercurial</a> - удобство публикования постов - <em>edit</em>, hg commit, hg push (но, <em>на текущий момент</em>, нет возможности публиковать из браузера, думаю реализовать это).</li>
</ul>
<div class="section" id="id2">
<h3>Установка</h3>
<p>Как установить, расписывать не люблю, но в gentoo это делается легко (<a class="reference external" href="http://rafaelmartins.eng.br">Rafael G. Martins</a> - автор blohg - один из разработчиков gentoo) (<em>пока смотрел его сайт, увидел много вкусностей, внедрю и опишу</em>):</p>
<pre class="brush: bash">
$ emerge blohg
</pre>
</div>
<div class="section" id="id3">
<h3>Использование</h3>
<p>Создание репозитория:</p>
<pre class="brush: bash">
$ blohg initrepo --repo-path my_blohg
</pre>
<p>Настраиваем параметры в <em>config.yaml</em>, настраиваем шаблоны (в директории <em>templates</em>).</p>
<p>Пишем посты (в директории <em>content/post</em>), создаем аттачи (в директории <em>content/attachments</em>).</p>
<p>Коммитим изменения.</p>
</div>
<div class="section" id="id4">
<h3>Развертывание</h3>
<p>Клонируем репозиторий на удаленный сервер:</p>
<pre class="brush: bash">
$ hg clone my_blohg ssh://user@yourdomain.tld/path/to/my_blohg/
</pre>
<p>В качестве веб-сервера решил использовать <a class="reference external" href="http://www.lighttpd.net">lighttpd</a>.</p>
<p>Конфиг mod_fastcgi:</p>
<pre class="brush: plain">
fastcgi.debug = 0
fastcgi.server = ("/" =>
(
"blohg" => (
"socket" => "/tmp/blohg-fcgi.sock",
"bin-path" => "/var/www/blohg.fcgi",
"check-local" => "disable",
"fix-root-scriptname" => "enable"
)
)
)
alias.url = (
"/static/" => "/var/www/blog/static"
)
url.rewrite-once = (
"^(/static.*)$" => "$1",
"^(/favicon.ico.*)$" => "/static$1",
)
</pre>
<p>Содержимое <em>/var/www/blohg.fcgi</em> (нужен модуль <a class="reference external" href="http://pypi.python.org/pypi/flup">flup</a>):</p>
<pre class="brush: python">
#!/usr/bin/python
from flup.server.fcgi import WSGIServer
from blohg import create_app
if __name__ == '__main__':
application = create_app('/path/to/my_blohg')
WSGIServer(application).run()
</pre>
</div>
<div class="section" id="id5">
<h3>Доработки</h3>
<div class="class strikeout container">
<p>В <a class="reference external" href="/post/my-server/?lang=ru">посте про мой сервер</a> мне захотелось сделать зачеркнутый текст,
но reStructuredText к сожалению такое не поддерживает.
Пришлось править docutils, <a class="reference external" href="http://blog.f-y.name/attachments/docutils-0.7-strikeout.patch">патч</a>.
Думаю попробовать перенести эту функциональность в blohg.</p>
<p><strong>UPD</strong>: Сделано, <a class="reference external" href="http://hg.f-y.name/blohg/changeset/c82ba2f18ad9">changeset</a>.</p>
</div>
<p><strong>UPD2</strong>: Сделано правильно. <a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/directives.html#custom-interpreted-text-roles">Существует</a> стандартный путь определить новую роль, которая только добавляет класс к тэгу <span>:</p>
<pre class="brush: plain">
.. role:: strikeout
:class: strikeout
</pre>
<p>Или можно обернуть нужный текст в контейнер с указанным классом:</p>
<pre class="brush: plain">
.. container::
:class: strikeout
</pre>
<p>Я форкнул blohg на <a class="reference external" href="http://bitbucket.org">http://bitbucket.org</a>, для внесения своих изменений: <a class="reference external" href="http://hg.f-y.name/blohg">форк</a>. Точнее форкнул не проект самого Рафаэля, а пользователя Ry4an, так как Рафаэль хостит репозиторий у себя.</p>
<p>В планах прикрутить у себя <a class="reference external" href="http://hg.rafaelmartins.eng.br/rst-resume/">rst-resume</a>.</p>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js"></script>
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css"/>
<script type="text/javascript">SyntaxHighlighter.defaults.toolbar=false; SyntaxHighlighter.all();</script></div>
QR-коды/post/qr-code/?lang=ru2011-04-11T11:06:00Z2011-04-11T11:06:00ZAnton Novosyolovanton.novosyolov@gmail.com<!-- date: 1302519960 -->
<!-- tags: gentoo,Nokia N900,QR -->
<!-- aliases: 301:/2011/04/qr.html/ -->
<p>Написал пару скриптов для передачи мелкой текстовой информации с ноутбука в телефон (Nokia N900) и обратно.</p>
<!-- date: 1302519960 -->
<!-- tags: gentoo,Nokia N900,QR -->
<!-- aliases: 301:/2011/04/qr.html/ -->
<p>Написал пару скриптов для передачи мелкой текстовой информации с ноутбука в телефон (Nokia N900) и обратно.</p>
<!-- read_more -->
<p><em>qrcode</em> - для создания QR-кода (средствами Google Chart API):</p>
<pre class="brush: python">
#!/usr/bin/python
import sys
import webbrowser
import urllib
if len(sys.argv) == 1:
s = sys.stdin.read()
else:
s = sys.argv[1]
webbrowser.open("http://chart.apis.google.com/chart?chs=300x300&cht=qr&chl=%s" % (urllib.quote(s, safe="")))
</pre>
<p>Этот скрипт располагаем на телефоне и на ноутбуке.</p>
<p>Использование:</p>
<pre class="brush: plain">
$ qrcode < file
$ qrcode text
$ qrcode
text
text2
Ctrl-D
</pre>
<p>Чтение кода - на телефоне mBarCode.</p>
<p>На ноутбуке <em>qrread</em>:</p>
<pre class="brush: bash">
#!/bin/bash
trap 'xclip /tmp/qr -selection clipboard' 2
zbarcam --raw -q | tee /tmp/qr
# --nodisplay
</pre>
<p>Нужна программа zbar, для gentoo находится в оверлее bircoph.</p>
<p>Если не нужно окно с изображением с камеры, нужно добавить закомментированный параметр.</p>
<p>Как только распознанный текст появляется в консоли, нужно нажать Ctrl-C, и он попадет в буфер обмена.
Таким способом легко передался например текст qrcode с телефона на ноутбук.</p>
<p>В проекте генерация QR-кода без использования Google (оффлайн). <strong>UPD</strong>: <a class="reference external" href="/post/qr-code-local/?lang=ru">Сделал</a></p>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js"></script>
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css"/>
<script type="text/javascript">SyntaxHighlighter.defaults.toolbar=false; SyntaxHighlighter.all();</script>Пинг по расписанию для мониторинга состояния сети/post/ping-monitoring/?lang=ru2007-10-22T07:20:00Z2007-10-22T07:20:00ZAnton Novosyolovanton.novosyolov@gmail.com<!-- tags: gentoo,мониторинг,php,bash -->
<!-- date: 1193037600 -->
<!-- aliases: 301:/2007/10/blog-post_22.html/ -->
<p>В нашей локалке в последнее время появились потери до шлюза, когда в сети много людей. Для мониторинга написал скрипт, который пингует шлюз по расписанию, и выводит на сайт результаты.</p>
<!-- tags: gentoo,мониторинг,php,bash -->
<!-- date: 1193037600 -->
<!-- aliases: 301:/2007/10/blog-post_22.html/ -->
<p>В нашей локалке в последнее время появились потери до шлюза, когда в сети много людей. Для мониторинга написал скрипт, который пингует шлюз по расписанию, и выводит на сайт результаты.</p>
<!-- read_more -->
<p>Сам скрипт пинга:</p>
<pre class="brush: bash">
#!/bin/bash
fn=`date +%F.%H:%M:%S`
dir=/var/www/localhost/htdocs/ping-stat
ping -i 0.3 -c 500 10.13.0.17 > $dir/$fn.txt
tail -n 3 < $dir/$fn.txt > $dir/$fn.stat.txt
</pre>
<p>Запись в crontab:</p>
<pre class="brush: plain">
0,30 * * * * root /path/to/script
</pre>
<p>Скрипт для показа результатов на сайте: <em>/var/www/localhost/cgi-bin</em>:</p>
<pre class="brush: bash">
#!/bin/sh
echo "Content-type: text/html; charset=cp1251"
echo
echo "<html><body>"
echo "<a href='http://$HTTP_HOST/ping-stat-graph/packetlost.php'>График</a><br>"
echo "<a href='http://$HTTP_HOST/ping-stat-graph/packetlost.php?t'>График таймингов</a><br>"
echo "<form action='http://$HTTP_HOST/ping-stat-graph/packetlost.php'>"
echo "Показать последние записи, шт. <input name='s'><input type='submit' value='Показать'><br>"
echo "Показать последние записи, тайминги, шт. <input name='s'><input type='submit' value='Показать'><input type='hidden' name='t'></form>"
echo "<table>"
for i in $( find /var/www/localhost/htdocs/ping-stat/ -type f -not -name "*.stat.txt" -printf "%f\n" | sort )
do
base=`expr match "$i" '\([^.]*\.[^.]*\)'`
echo "<tr><td><a href='/ping-stat/$i'>$base</a><br></td>"
if [ -e "/var/www/localhost/htdocs/ping-stat/$base.stat.txt" ]
then
echo "<td><a href='/ping-stat/$base.stat.txt'>Кратко</a></td><tr>"
else
echo "<td>Кратко</td><tr>"
fi
done
echo "</table>"
echo "</body></html>"
</pre>
<p>Скрипт для графика <em>/var/www/localhost/htdocs/ping-stat-graph/packetlost.php</em> (автор скрипта мой друг mvf):</p>
<pre class="brush: php">
<?php
$dir = "/var/www/localhost/htdocs/ping-stat/";
$filename_date_format = "%Y-%m-%d.%H:%M:%s.";
$filename_format = "^[[:punct:][:digit:]]{14,30}\.stat\.txt$"; // формат имени файла - для ерега
$file_content_format ="([[:digit:]]+) packets transmitted, ([[:digit:]]+) received, [[:digit:]]+% packet loss, time [[:digit:]]+ms[[:space:]]*rtt min/avg/max/mdev = ([[:digit:]\.]+)/([[:digit:]\.]+)/([[:digit:]\.]+)/([[:digit:]\.]+) ms";
/////////////////////////////////////////////////////////////////
// Returns a date from a string based on a given format
// кривая штуковина скопированная их хелпов и немного переделанная,
// но в принципе худо-бедно может прочитать дату из заданного формата
function parseDate( $date, $format )
{
// Builds up date pattern from the given $format, keeping delimiters in place.
if( !preg_match_all( "/%([YmdHMs])([^%])*/", $format, $formatTokens, PREG_SET_ORDER ) ) {
return false;
}
$datePattern = "";
foreach( $formatTokens as $formatToken )
{
$delimiter = preg_quote( $formatToken[2], "/" );
if($formatToken[1] == 'Y') {
$datePattern .= '(.{1,4})'.$delimiter;
} else {
$datePattern .= '(.{1,2})'.$delimiter;
}
}
if( !preg_match( "/".$datePattern."/", $date, $dateTokens) ) return false;
$dateSegments = array();
for($i = 0; $i < count($formatTokens); $i++) {
$dateSegments[$formatTokens[$i][1]] = $dateTokens[$i+1];
}
return mktime ( $dateSegments["H"], $dateSegments["M"], $dateSegments["s"], $dateSegments["m"], $dateSegments["d"], $dateSegments["Y"]);
}
/////////////////////////////////////////////////////////////////
// для usort
function cmp_by_date($a, $b)
{
if ($a['time'] == $b['time']) { return 0; }
return ($a['time'] < $b['time']) ? -1 : 1;
}
////////////////////////////////////////////////////////////////
//// начало
////////////////////////////////////////////////////////////////
$filenames = scandir($dir);
$data = array();
foreach ($filenames as $filename)
{
$full_name = $dir.$filename;
if (!is_dir($full_name) && $filename != "." && $filename != ".." && ereg($filename_format, $filename))
{
$ftime = parseDate($filename, $filename_date_format);
ereg($file_content_format,file_get_contents($full_name),$res);
$data_piece['time'] = $ftime;
$data_piece['time_text'] = date("H:i",$ftime);
if ($res[1]!=0) $data_piece['lost'] = (1 - $res[2]/$res[1])*100; else $data_piece['lost'] = 100;
$data_piece['transmitted'] = $res[1]+0;
$data_piece['received'] = $res[2]+0;
$data_piece['min'] = $res[3]+0.0;
$data_piece['avg'] = $res[4]+0.0;
$data_piece['max'] = $res[5]+0.0;
$data_piece['mdev'] = $res[6]+0.0;
$data[] = $data_piece;
} // if (!is_dir ...
} // foreach ($filenames
usort($data, "cmp_by_date");
// по идее тут бы лучше разбить скрипт на два...
// один которые собирает и сохраняет данные, второй - показывает сохраенные данные.
if (isset($_GET['s'])) // если указан размер
{
$size = count($data);
$disired_size = 0 + $_GET['s'];
$croppoint = $size - $disired_size;
if ($croppoint < 0) $croppoint = 0;
$data = array_slice($data, $croppoint);
}
require('chart.php');
$time_min = array();
$time_max = array();
$time_avg = array();
$x_axis = array();
$lost = array();
foreach ($data as $data_piece)
{
$time_min[] = $data_piece['min'];
$time_max[] = $data_piece['max'];
$time_avg[] = $data_piece['avg'];
$x_axis[] = $data_piece['time_text'];
$lost[] = $data_piece['lost'];
}
//plot (array $c1, array $c2 = false, color $color = "black",
// string $style = "lines", color $gradient_color = "black",
// int $parameter = 0)
if (isset($_GET['t']))
{
$chart = new chart(2000, 500);
$chart->set_title("Ping timing (10.13.0.17 from 10.13.200.111)");
$chart->set_x_ticks ($x_axis,"text");
$chart->set_labels ("time", "ping, ms");
$chart->set_margins ($left = 50, $right = 10, $top = 20, $bottom = 43);
$chart->plot($time_max, false, "black");
$chart->add_legend("Max");
$chart->plot($time_avg, false, "red", "gradient");
$chart->add_legend("Avg", "red");
$chart->plot($time_min, false, "blue", "gradient");
$chart->add_legend("Min", "blue");
$chart->stroke();
} else
{
$chart = new chart(2000, 500);
$chart->set_title("Packet lost (10.13.0.17 from 10.13.200.111)");
$chart->set_x_ticks ($x_axis,"text");
$chart->set_labels ("time", "lost, %");
$chart->set_margins ($left = 50, $right = 10, $top = 20, $bottom = 43);
$chart->plot($lost, false, "black");
$chart->stroke();
}
?>
</pre>
<p>Для отрисовки используется библиотека <a class="reference external" href="http://quimby.gnus.org/circus/chart/chart-manual.php">chart</a>.</p>
<p>Результат можно посмотреть <a class="reference external" href="http://fyfd.homeip.net/cgi-bin/ping-stat"><span class="strikeout">здесь</span></a> (не работает за давностью лет и ненужностью).</p>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js"></script>
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css"/>
<script type="text/javascript">SyntaxHighlighter.defaults.toolbar=false; SyntaxHighlighter.all();</script>Скрипт для скачки структуры ftp-сервера/post/ftp-scrap/?lang=ru2007-10-19T18:13:00Z2007-10-19T18:13:00ZAnton Novosyolovanton.novosyolov@gmail.com<!-- date: 1192817580 -->
<!-- tags: gentoo,bash,ftp -->
<!-- aliases: 301:/2007/10/ftp_19.html/ -->
<p>Решил написать такой, чтобы рассмотреть, что есть на некоторых наших богатых ftp-серверах, без подключения..</p>
<!-- date: 1192817580 -->
<!-- tags: gentoo,bash,ftp -->
<!-- aliases: 301:/2007/10/ftp_19.html/ -->
<p>Решил написать такой, чтобы рассмотреть, что есть на некоторых наших богатых ftp-серверах, без подключения..</p>
<!-- read_more -->
<p>Долго извращался с bash'ем, пока не дошел до переменной IFS :)</p>
<p>В общем вот скрипт:</p>
<p><em>get_listing</em>:</p>
<pre class="brush: bash">
#!/bin/bash
if [ "$1" == "" ]
then
echo "Usage: `basename $0` server"
exit
fi
server=$1
base=$PWD
IFS=$'\n'
function get_listing()
{
local prev_dir=$PWD
local url=
if [ "$1" != "" ]
then
url=$1
echo "Creating dir: $2"
mkdir "$2"
cd "$2"
fi
echo "Retreiving file list $url"
curl ftp://$server$url/ 2 > /dev/null > listing
lst=`cat listing | grep "^d" | grep -v "\.$" | xargs -I'{}' $base/get_fname "{}"`
for f in $lst
do
get_listing "${url}/$f" "$f"
done
cd $prev_dir
}
get_listing
</pre>
<p><em>get_fname</em>:</p>
<pre class="brush: bash">
#!/bin/bash
echo `expr match "$1" '\\S*\\s*\\S*\\s*\\S*\\s*\\S*\\s*\\S*\\s*\\S*\\s*\\S*\\s*\\S*\\s*\(.*\)'`
</pre>
<p>Как засунуть <em>get_fname</em> в сам скрипт, так и не понял...
Пробовал $() внутри ``, и наоборот, и по всякому..</p>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js"></script>
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css"/>
<script type="text/javascript">SyntaxHighlighter.defaults.toolbar=false; SyntaxHighlighter.all();</script>Мой сервер/post/my-server/?lang=ru2007-10-11T21:45:00Z2007-10-11T21:45:00ZAnton Novosyolovanton.novosyolov@gmail.com<!-- date: 1192139100 -->
<!-- tags: gentoo -->
<!-- aliases: 301:/2007/10/blog-post_5658.html/ -->
<p>Этот бот и разные другие интересные вещи крутятся у меня на домашнем сервере.
Необходимость в нем возникла, когда дома появилось больше одного компьютера.</p>
<!-- date: 1192139100 -->
<!-- tags: gentoo -->
<!-- aliases: 301:/2007/10/blog-post_5658.html/ -->
<p>Этот бот и разные другие интересные вещи крутятся у меня на домашнем сервере.
Необходимость в нем возникла, когда дома появилось больше одного компьютера.</p>
<!-- read_more -->
<p>Сначала купил беспроводный маршрутизатор (D-Link DI-624). Но, к сожалению, как потом оказалось, что пользоваться им в нашей сети (Корбина-Ярославль) не слишком удобно: невозможно сидеть одновременно и в локальной сети и в Интернете (выход в него происходит через VPN, если выходить через маршрутизатор - невозможно быть в обоих сетях одновременно, так как он не поддерживает статическую маршрутизацию :( ; если подключаться к VPN с компов за ним - провайдер не дает).</p>
<p>Поэтому я решил купить старенький комп, установить на него Linux, поставить 3 сетевые карты и сделать из него роутер.</p>
<p>Изначально сервером стал Pentium II, 400 MHz, 80 Gb, 128 Mb. Потом появилась возможность сменить его на P4-2000, 512 Mb (что самое хорошее - линукс перенесся вместе в винчестером без каких либо проблем :) ).</p>
<p>Даже хорошо, что маршрутизатор оказался таким слабым - появился сервер, можно теперь над ним много чего с ним делать :)</p>
<p>В итоге на нем стоит:</p>
<ol class="arabic simple">
<li>Роутер - iptables, NAT</li>
<li>Web-сервер</li>
<li>ftp-сервер</li>
<li>jabber-сервер</li>
<li>mail-сервер (пока что не работает, так как и не нужен то особо, но хочу всё таки довести до ума)</li>
<li>IRC-бот (пришлось отключить, так как теперь внутрисетевой сервер не пускает больше 2 (или 1) с IP.. хотя сейчас что то сменилось, надо опять попробовать)</li>
<li>icq-bot</li>
<li>World of Warcraft-сервер (стоял еще на P2, жрет сволочь мегов 400 памяти только в путь :) )</li>
<li>Ну, MySQL естественно</li>
</ol>
<p>Так же планируется:</p>
<ol class="arabic simple">
<li>Видео-вещание по сети (на сервере стоит TV-тюнер), с помощью VLC, или чего-то аналогичного</li>
<li>Что-то типа адаптера IP-телефонии (не знаю пока как это сделать вообще)</li>
<li>Управление "умным" домом.. (протокол X10, но это еще надо оборудование купить/спаять..., в общем это еще в будущем.. :) )</li>
<li>Подключу скоро безлимитный интернет, настрою web-интерфейс для качалки (mldonkey)</li>
</ol>
<p>Адрес сервера кстати <span class="strikeout">http://fyfd.homeip.net/</span> <a class="reference external" href="http://server.f-y.name">http://server.f-y.name</a></p>
icq-бот на основе micq/post/icq-bot/?lang=ru2007-10-11T08:02:00Z2007-10-11T08:02:00ZAnton Novosyolovanton.novosyolov@gmail.com<!-- date: 1192089720 -->
<!-- tags: gentoo,linux,icq,bot,perl -->
<!-- aliases: 301:/2007/10/icq-micq_10.html/ -->
<p>Решил вот сделать icq бота, в основном для проверки по асе пингов до серверов/коммутаторов в домашней сети.. Нуу, точнее это давно уже было, где то в середине июля :) только вот дошли руки написать что нибудь в дневник..</p>
<!-- date: 1192089720 -->
<!-- tags: gentoo,linux,icq,bot,perl -->
<!-- aliases: 301:/2007/10/icq-micq_10.html/ -->
<p>Решил вот сделать icq бота, в основном для проверки по асе пингов до серверов/коммутаторов в домашней сети.. Нуу, точнее это давно уже было, где то в середине июля :) только вот дошли руки написать что нибудь в дневник..</p>
<!-- read_more -->
<p>У micq есть такая мощная штука, как "scripting". В настройке по-умолчанию после запуска создается именованный пайп ~/.micq/scripting. Если в него писать, это расценивается как ввод в консоли micq. Таким образом, одна сторона взаимодействия у нас есть. Для получения команд, будем читать логи пользователей из каталога history.</p>
<p>Скрипт я написал на perl, использовал модуль File::Tail</p>
<p>Формат файла логов примерно такой:</p>
<pre class="brush: plain">
# 20070629123241/ [icq8:xxxxxxxx]!icqbot@foreveryoung.yar <- xxxxxxxxx[icq8:xxxxxxxxx+10000000 online] +1
</pre>
<p>+1 - означает сколько далее строчек самого сообщения</p>
<p>В общем, не знаю, что еще расписать :), просто приведу пример моего скрипта-пинговалки:</p>
<pre class="brush: perl">
#!/usr/bin/perl
$_ = 1;
exit if( $#ARGV < 2 )
name = "/home/icqbot/.micq/history/${ARGV[0]}.log"
file = File::Tail->new( name=>$name, maxinterval=>1, interval=>1, reset_tail=>0 );
open LOG, ">>${ARGV[0]}_bot.log";
$skip = 0;
$cmd = 0;
while( defined( $_ = $file->read ) )
{
if( $skip > 0 )
{
$skip--;
next;
}
# далее отправленное ботом, его просто пропускаем
if( $_ =~ /# \d+\/ \[[^]]+\]\S+ -> [^[]*\[[^]]+\] [+](\d+)/ )
{
$skip = $1;
$cmd = 0;
next;
}
# дальше возможно команда
if( $_ =~ /# \d+\/ \[[^]]+\]\S+ <- [^[]*\[[^]]+\] [+](\d+)/ )
{
$cmd = 1;
next;
}
if( !$cmd )
{
next;
}
if( $_ =~ /^ping (.+)$/ )
{
print LOG "Pinging $1\n";
$ping = `ping -c 10 $1 2>&1`;
open OUT, ">.micq/scripting";
print OUT "/msg ${ARGV[0]}\n";
print OUT $ping;
print OUT ".\n";
close OUT;
next;
}
}
</pre>
<p>Скрипт я запускаю так: <tt class="docutils literal">script &</tt></p>
<p>micq запущен под <a class="reference external" href="http://en.wikipedia.org/wiki/GNU_Screen">screen</a>.</p>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js"></script>
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css"/>
<script type="text/javascript">SyntaxHighlighter.defaults.toolbar=false; SyntaxHighlighter.all();</script>