<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2871042105437379351</id><updated>2012-02-23T10:29:36.057+02:00</updated><category term=':dev'/><category term='GDM'/><category term='список пакетов'/><category term='DNS'/><category term='Gitosis'/><category term='автозагрузка'/><category term=':trash'/><category term='FaceBook'/><category term='RSS'/><category term='микрофон'/><category term='no-ip.com'/><category term='Git'/><category term='nginx'/><category term=':it'/><category term='locales'/><category term='dpkg'/><category term='git-daemon'/><category term='su'/><category term='Севастополь'/><category term='песочница'/><category term='urxvt'/><category term='индикатор раскладки'/><category term='адресная строка'/><category term='IPv6'/><category term='SSH'/><category term='MySQL'/><category term='logout'/><category term='культура'/><category term='восстановление пароля'/><category term=':life'/><category term='Xorg'/><category term='Smokin Guns'/><category term='Urban Terror'/><category term='Thunderbird'/><category term='HTTPd'/><category term='Acer'/><category term='Twisted'/><category term='Blogger'/><category term='Fail2ban'/><category term='телефон'/><category term='Gnome'/><category term='луч поноса'/><category term='timezone'/><category term='Firefox'/><category term='Django'/><category term='XFCE'/><category term='shutdown'/><category term='Intel GMA 950'/><category term='GNU Linux'/><category term='JavaScript'/><category term='Intel'/><category term='True Combat: Elite'/><category term='Saturn ST1508'/><category term='Яндекс'/><category term='Python'/><category term='Bolzplatz'/><category term='NTP'/><category term='OpenVZ'/><category term='Apache HTTP Server'/><category term='VirtualBox'/><category term='Mesa 3D'/><category term='OpenSSL'/><category term='FriendFeed'/><category term='feed43.com'/><category term='социальные кнопки'/><category term='update-rc.d'/><category term='Google Picasa'/><category term='Flup'/><category term='Canon'/><category term='IPv4'/><category term='интересности'/><category term='domain'/><category term='aptitude'/><category term='Санкт-Петербург'/><category term='Metacity'/><category term='mkfs'/><category term='звук'/><category term='список ПО'/><category term=':games'/><category term='Americas Army'/><category term='Яндекс.Закладки'/><category term='o3.ua'/><category term='FireTray'/><category term='php'/><category term='FastCGI'/><category term='рабочий стол'/><category term='ViewGit'/><category term='irssi'/><category term='PAM'/><category term='шрифты'/><category term='Canon PIXMA iP1900'/><category term='Java'/><category term='wlstat.pl'/><category term='flash-диск'/><category term='OSCAR'/><category term='MP3-плеер'/><category term='Rhythmbox'/><category term='Nautilus'/><category term='принтер'/><category term='Google Chrome'/><category term='sudo'/><category term='ALSA'/><category term='форматирование'/><category term='hotkeys'/><category term='Saturn'/><category term='vzquota'/><category term='insserv'/><category term='Google Apps'/><category term='fdisk'/><category term='ссылки'/><title type='text'>voan.varlog</title><subtitle type='html'>Бложже мой</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://varlog.voan.ru/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/-/%3Adev'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/search/label/%3Adev'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-3711907626313224441</id><published>2011-11-13T00:51:00.001+02:00</published><updated>2011-11-18T23:16:28.814+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Thunderbird'/><category scheme='http://www.blogger.com/atom/ns#' term='FireTray'/><category scheme='http://www.blogger.com/atom/ns#' term=':it'/><title type='text'>Чиним FireTray для работы с Thunderbird 8</title><content type='html'>Текущая стабильная версия &lt;a href='https://addons.mozilla.org/ru/thunderbird/addon/firetray/'&gt;FireTray (v0.3.3)&lt;/a&gt; не работает с Thunderbird 8.
&lt;br&gt;&lt;br&gt;
Версия из канала разработки (v0.4.0a3) работает с Thunderbird 8, но как-то урезанно.
&lt;br&gt;&lt;br&gt;
Если просто подправить maxVersion в install.rdf, то 0.3.3 не будет работать с Thunderbird 8.
&lt;br&gt;&lt;br&gt;
Решение: скачать обновленную версию &lt;a href='http://code.google.com/p/firetray/issues/detail?id=199#c5'&gt;отсюда (http://code.google.com/p/firetray/issues/detail?id=199#c5)&lt;/a&gt;, ну или собрать из SVN самому.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-3711907626313224441?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/3711907626313224441/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2011/11/firetray-thunderbird-8.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/3711907626313224441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/3711907626313224441'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2011/11/firetray-thunderbird-8.html' title='Чиним FireTray для работы с Thunderbird 8'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-3422250881651119527</id><published>2011-09-16T23:02:00.000+03:00</published><updated>2011-09-16T23:04:09.100+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term=':it'/><category scheme='http://www.blogger.com/atom/ns#' term='irssi'/><category scheme='http://www.blogger.com/atom/ns#' term='wlstat.pl'/><title type='text'>irssi, wlstat.pl - "irssi: warning settings_get(term_type) : not found"</title><content type='html'>После установки скрипта wlstat.pl в irssi начался флуд предупреждениями от скрипта:
&lt;pre&gt;
Irssi: warning settings_get(term_type) : not found
&lt;/pre&gt;

Решение:&lt;br&gt;&lt;br&gt;

Находим строку в wlstat.pl:
&lt;pre&gt;
if (lc Irssi::settings_get_str('term_type') eq 'utf-8') {
&lt;/pre&gt;
в которой меняем &lt;b&gt;term_type&lt;/b&gt; на &lt;b&gt;term_charset&lt;/b&gt;.
&lt;br&gt;&lt;br&gt;
(c) &lt;a href='http://rc.vc/files/irssi/notes/wlstat.txt'&gt;http://rc.vc/files/irssi/notes/wlstat.txt&lt;/a&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-3422250881651119527?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/3422250881651119527/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2011/09/irssi-wlstatpl-irssi-warning.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/3422250881651119527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/3422250881651119527'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2011/09/irssi-wlstatpl-irssi-warning.html' title='irssi, wlstat.pl - &quot;irssi: warning settings_get(term_type) : not found&quot;'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-6737614930670369430</id><published>2011-07-15T01:50:00.000+03:00</published><updated>2011-07-15T01:50:08.870+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Git'/><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term='ViewGit'/><category scheme='http://www.blogger.com/atom/ns#' term='nginx'/><category scheme='http://www.blogger.com/atom/ns#' term=':it'/><category scheme='http://www.blogger.com/atom/ns#' term='SSH'/><category scheme='http://www.blogger.com/atom/ns#' term='git-daemon'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='FastCGI'/><category scheme='http://www.blogger.com/atom/ns#' term='Gitosis'/><title type='text'>Установка и настройка git-сервера (gitosis) + веб-морда viewgit (+ nginx)</title><content type='html'>&lt;center&gt;&lt;b&gt;&lt;h1&gt;Настройка ssh&lt;/h1&gt;&lt;/b&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для работы gitosis необходимо настроить авторизацию по ключам, для этого необходимо изменить несколько параметров в конфиге sshd (на сервере) - /etc/ssh/sshd_config:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;# Авторизация по-паролю - по желанию.
PasswordAuthentication yes

# Если RSA.
RSAAuthentication yes

# Авторизация по ключам.
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

# Если используется AllowUsers, то не забыть добавить туда gitosis-пользователя - gitosis.
AllowUsers user1 user2 gitosis
DenyUsers root www-data
&lt;/pre&gt;&lt;br /&gt;
Теперь необходимо сгенерировать ключи (на клиенте):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;$ ssh-keygen -t rsa -C "mail@example.org" -f username-home
&lt;/pre&gt;&lt;br /&gt;
После чего создаётся два файла (в ~/.ssh/) - username-home, username-home.pub.&lt;br /&gt;
Копируем публичный ключ (содержание username-home.pub) на сервер в файл ~/.ssh/authorized_keys:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
На клиенте надо запустить (если не запущен) и добавить в автозагрузку /usr/bin/ssh-agent.&lt;br /&gt;
Теперь, используя ssh-add, необходимо добавить ключ и парольную фразу к нему:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;$ ssh-add ~/.ssh/username-home
&lt;/pre&gt;&lt;br /&gt;
Не забыть рестартануть sshd (на сервере:):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;$ sudo /etc/init.d/ssh restart
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;b&gt;&lt;h1&gt;Настройка git-сервера&lt;/h1&gt;&lt;/b&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Установка git, gitosis, git-daemon на сервере:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;$ sudo aptitude install git-core gitosis git-daemon-run
&lt;/pre&gt;&lt;br /&gt;
Выполняем инициализацию gitosis-admin репозитория (на сервере):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;# authorized_keys - это файл с публичным ключем, кот-ый в прошлом шаге скопировали на сервер.
$ sudo -H -u gitosis gitosis-init &lt; /home/user_name/.ssh/authorized_keys
&lt;/pre&gt;

Если всё хорошо, то появится надпись, что инициализирован пустой репозиторий gitosis-admin.git:

&lt;pre&gt;Initialized empty Git repository in /srv/gitosis/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /srv/gitosis/repositories/gitosis-admin.git/
&lt;/pre&gt;
Разрешаем выполнение post-update хука:

&lt;pre&gt;$ sudo chmod +x /srv/gitosis/repositories/gitosis-admin.git/hooks/post-update
&lt;/pre&gt;









&lt;center&gt;&lt;b&gt;Настройка gitosis (git-репозитория gitosis-admin)&lt;/b&gt;&lt;/center&gt;


Клонируем конфиг gitosis на нашу локальную машину и перейдем в каталог с репозиторием:

&lt;pre&gt;$ git clone gitosis@git.example.org:gitosis-admin.git
$ cd gitosis-admin
&lt;/pre&gt;
Получили репозиторий, в котором будет лежать дирректория keydir (в ней лежат публичные ключи людей, которые имеют доступ к данному репозиторию. В качестве имени файла используется его имя из открытого ключа. Т.е. что бы добавить человека нужно, просто, добавить его ключ) и файл gitosis.conf (настройка прав доступа для репозиториев, синтаксис и примеры gitosis.conf можно посмотреть здесь: (0) /usr/share/doc/gitosis/; (1) http://eagain.net/gitweb/?p=gitosis.git;a=blob;f=example.conf;hb=master (2) http://nablog.kiev.ua/2010/11/nginx-gitweb-gitosis/).

Содержание gitosis.conf по-умолчанию:

&lt;pre&gt;[gitosis]
[group gitosis-admin]
writable = gitosis-admin
members = логин
&lt;/pre&gt;
После правок он будет выглядеть, например, так:

&lt;pre&gt;[gitosis]
gitweb = no
daemon = no

[group gitosis-admin]
writable = gitosis-admin
members = логин
&lt;/pre&gt;
После правок делаем коммит:

&lt;pre&gt;$ git commit -am "пыщь-пыщь"
&lt;/pre&gt;
Затем записываем изменения:

&lt;pre&gt;$ git push origin master
&lt;/pre&gt;
Всё, изменения применились.











&lt;center&gt;&lt;b&gt;Создаем и настраиваем приватный репозиторий.&lt;/b&gt;&lt;/center&gt;


Клонируем конфиг gitosis на нашу локальную машину и перейдем в каталог с репозиторием:

&lt;pre&gt;$ git clone gitosis@git.example.org:gitosis-admin.git
$ cd gitosis-admin
&lt;/pre&gt;
Пример gitosis.conf с добавленным приватным репозиторием test-priv-repo:

&lt;pre&gt;[gitosis]
gitweb = no
daemon = no

[group gitosis-admin]
writable = gitosis-admin
members = логин

[group test-priv-group]
writable = test-priv-repo
members = логин логин2

[repo test-priv-repo]
description = Тестовый приватный репозиторий
owner = Никнэйм
&lt;/pre&gt;
После правок делаем коммит:

&lt;pre&gt;$ git commit -am "Добавлен репозиторий test-priv-repo"
&lt;/pre&gt;
Затем записываем изменения:

&lt;pre&gt;$ git push origin master
&lt;/pre&gt;
Теперь с данным репозиторием можно работать пользователям, у которых есть доступ, например, клонировать так:

&lt;pre&gt;$ git clone gitosis@git.example.org:test-priv-repo.git
&lt;/pre&gt;









&lt;center&gt;&lt;b&gt;Создаем и настраиваем публичный репозиторий.&lt;/b&gt;&lt;/center&gt;


Клонируем конфиг gitosis на нашу локальную машину и перейдем в каталог с репозиторием:

&lt;pre&gt;$ git clone gitosis@git.example.org:gitosis-admin.git
$ cd gitosis-admin
&lt;/pre&gt;
Пример gitosis.conf с добавленным приватным репозиторием test-pub-repo:

&lt;pre&gt;[gitosis]
gitweb = no
daemon = no

[group gitosis-admin]
writable = gitosis-admin
members = логин

[group test-pub-group]
writable = test-pub-repo
members = логин логин3

[repo test-pub-repo]
daemon = yes
description = Тестовый публичный репозиторий
owner = Никнэйм
&lt;/pre&gt;
После правок делаем коммит:

&lt;pre&gt;$ git commit -am "Добавлен репозиторий test-pub-repo"
&lt;/pre&gt;
Затем записываем изменения:

&lt;pre&gt;$ git push origin master
&lt;/pre&gt;
Теперь, чтобы получить анонимный доступ на чтение к данному репозиторию надо внести изменения в скрипт запуска git-daemon (/etc/sv/git/daemon/run) - изменить путь до репозиториев.

Было:

&lt;pre&gt;#!/bin/sh
exec 2&gt;&amp;1
echo 'git-daemon starting.'
exec chpst -ugitdaemon \
  "$(git --exec-path)"/git-daemon --verbose --base-path=/var/cache /var/cache/git
&lt;/pre&gt;
Стало:

&lt;pre&gt;#!/bin/sh
exec 2&gt;&amp;1
echo 'git-daemon starting.'
exec chpst -ugitdaemon \
  "$(git --exec-path)"/git-daemon --verbose --base-path=/srv/gitosis/repositories /srv/gitosis/repositories
&lt;/pre&gt;
Рестарт git-daemon:

&lt;pre&gt;$ sudo sv restart git-daemon
&lt;/pre&gt;
Теперь с данным репозиторием можно работать пользователям, у которых есть доступ - чтение и запись (ничем не отличается от работы с приватным репозиторием - через ssh), у всех остальных - чтение (через git://), например, клонировать так:

&lt;pre&gt;$ git clone git://git.example.or/test-pub-repo.git
&lt;/pre&gt;












&lt;center&gt;&lt;b&gt;Настройка viewgit (веб-морды для git) + nginx&lt;/b&gt;&lt;/center&gt;


Установим php:

&lt;pre&gt;$ sudo aptitude install php5 php5-cgi php5-common php5-mcrypt php5-suhosin php5-geshi
&lt;/pre&gt;
Настроим php для работы через cgi - установим значение опции (в файле /etc/php5/cgi/php.ini) cgi.fix_pathinfo равное 1:

&lt;pre&gt;cgi.fix_pathinfo=1
&lt;/pre&gt;
Скачаем viewgit:

&lt;pre&gt;$ cd /srv/hosting/git.example.org/public_html/
$ git clone git://repo.or.cz/viewgit.git
$ sudo chown -vR www-data:www-data viewgit
&lt;/pre&gt;

Настроим viewgit:

&lt;pre&gt;cd viewgit/inc
sudo cp config.php localconfig.php
sudo chown www-data:www-data localconfig.php
&lt;/pre&gt;
Пример localconfig.php (более детально можно ознакомиться: (0) viewgit/doc/ (1) viewgit/inc/):

&lt;pre&gt;&lt;?php


/** @file
 * Configuration file for viewgit - localconfig.php
 */


// Список проектов, которые отображать в viewgit.
$conf['projects'] = array(
 'test-pub-repo' =&gt; array('repo' =&gt; '/srv/gitosis/repositories/test-pub-repo.git/'),
);


// $conf['projects'] can also be built up programmatically
// for example the following can be used to translate gitolite's
// projects.list (intended for gitweb) for viewgit
/*
$projects_list_file = "/srv/gitosis/gitosis/projects.list";
$repo_home = "/srv/gitosis/repositories";
foreach (file($projects_list_file) as $proj) {
 $proj = trim($proj);
 $conf['projects'][$proj] = array('repo'  =&gt; "$repo_home/$proj");
}
*/


// Where git is. Default is to search from PATH, but you can use an absolute
// path as well.
$conf['git'] = 'git';


// If set, contains an array of globs/wildcards where to include projects.
// Use this if you have a lot of projects under a directory.
//$conf['projects_glob'] = array('/path/to/*/.git', '/var/git/*.git');


// If set, contains an array of projects to exclude.
// Use this if you have set $conf['projects_glob'] and you
// want to exclude just some projects.
//$conf['projects_exclude'] = array('project1', 'project2');


// Name and prefix for tar/gz &amp; zip archives generated. Default is to use the
// project name and version. Can be overridden in project config.
$conf['archive_prefix'] = '{PROJECT}-{DESCRIBE}';


$conf['datetime'] = '%Y-%m-%d %H:%M';


// More complete format for commit page
$conf['datetime_full'] = '%Y-%m-%d %H:%M:%S';


// Maximum length of commit message's first line to show 
$conf['commit_message_maxlen'] = 50;


// Maximum number of shortlog entries to show on the summary page
$conf['summary_shortlog'] = 15;


// Maximum number of tags to show on the summary page
$conf['summary_tags'] = 10;


// Whether to show remote labels on shortlog
$conf['shortlog_remote_labels'] = false;


// Allow checking out projects via "git clone"
$conf['allow_checkout'] = true;


// If set, this function is used to obfuscate e-mail addresses of authors/committers
// The 'obfuscate_mail' function simply replaces @ with ' at ' and . with ' dot '
//$conf['mail_filter'] = 'obfuscate_mail';
//$conf['mail_filter'] = create_function('$mail', 'return str_rot13(strtoupper($mail));');


// Whether to use GeSHi for source highlighting
$conf['geshi'] = true;

// Path to geshi.php
$conf['geshi_path'] = '/usr/share/php-geshi/geshi.php'; // Path on Debian

// Use line numbers in geshi?
// Setting this to "false" disables line numbers
// Using a value of 0 will enable "NORMAL" geshi line numbers
// Using values of 1 or more will enable "FANCY" geshi line numbers
$conf['geshi_line_numbers'] = 5;


// RSS time to live (how often clients should update the feed), in minutes.
$conf['rss_ttl'] = 10;

// RSS: Maximum number of items in feed
$conf['rss_max_items'] = 30;

// RSS item format. Allowed formatting:
// {AUTHOR}, {AUTHOR_MAIL}, {SHORTLOG}, {LOG}, {COMMITTER}, {COMMITTER_MAIL}, {DIFFSTAT}
$conf['rss_item_title'] = '{SHORTLOG} ({AUTHOR})';
$conf['rss_item_description'] = '&amp;lt;pre&amp;gt;{LOG}&amp;lt;/pre&amp;gt;&amp;lt;b&amp;gt;{AUTHOR}&amp;lt;/b&amp;gt; &amp;amp;lt;{AUTHOR_MAIL}&amp;amp;gt;&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;{DIFFSTAT}&amp;lt;/pre&amp;gt;';


$conf['debug'] = false;
$conf['debug_command_trace'] = false;


// Includes a small link to the ViewGit homepage on each page
$conf['ad'] = false;


// If auth_lib is set, inc/auth_&lt;auth_lib&gt;.php must exist and include a function
// named auth_check(). The function should check any required global variables
// (such as $_REQUEST, $_SERVER['PHP_AUTH_USER']) and die() if access is denied.

// For a simple username/password authorisation you can use auth_simple, see
// inc/auth_simple.php for more info. The array is username =&gt; md5 hash.
//$conf['auth_lib'] = 'simple';
//$conf['auth_simple_users'] = array('test' =&gt; 'd7b58f27f98f47bacd60fa87efe822ba');

// Uncomment the following lines to authenticate using some drupal site's
// config
//$conf['auth_lib'] = 'drupal_user';
//$conf['drupal_site_config'] = '/var/www/sites/default/settings.php';


// Which stylesheet to use
$conf['style'] = 'default';

if (!@include_once('localconfig.php')) {
 header("Content-type: text/plain");
 echo "ViewGit has not been configured yet, please read doc/README for installation instructions:\n\n";
 require_once('doc/README');
 die();
}
&lt;/pre&gt;
Настройка связки nginx + php (через fastcgi):

Создаем /etc/init.d/php-fastcgi:

&lt;pre&gt;#! /bin/sh
### BEGIN INIT INFO
# Provides: php-fastcgi
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start and stop php-cgi in external FASTCGI mode
# Description: Start and stop php-cgi in external FASTCGI mode
### END INIT INFO

# Author: Kurt Zankl &lt;kz@xon.uni.cc&gt;

# Do NOT "set -e"

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="php-cgi in external FASTCGI mode"
NAME=php-fastcgi
DAEMON=/usr/bin/php-cgi
PIDFILE=/var/run/$NAME.pid
scriptNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] &amp;&amp; . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (&gt;= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# If the daemon is not enabled, give the user a warning and then exit,
# unless we are stopping the daemon
if [ "$START" != "yes" -a "$1" != "stop" ]; then
log_warning_msg "To enable $NAME, edit /etc/default/$NAME and set START=yes"
exit 0
fi

# Process configuration
export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS
DAEMON_ARGS="-q -b $FCGI_HOST:$FCGI_PORT"

do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test &gt; /dev/null || return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --background --make-pidfile --chuid $EXEC_AS_USER --startas $DAEMON -- $DAEMON_ARGS || return 2
}

do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE &gt; /dev/null # --name $DAEMON
RETVAL="$?"
[ "$RETVAL" = 2 ] &amp;&amp; return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] &amp;&amp; return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}

case "$1" in
start)
[ "$VERBOSE" != no ] &amp;&amp; log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] &amp;&amp; log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] &amp;&amp; log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] &amp;&amp; log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] &amp;&amp; log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] &amp;&amp; log_end_msg 1 ;;
esac
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $scriptNAME {start|stop|restart|force-reload}" &gt;&amp;2
exit 3
;;
esac
&lt;/pre&gt;
Делаем ему +x и добавляем в автозагрузку

&lt;pre&gt;$ sudo chmod +x /etc/init.d/php-fastcgi
$ sudo insserv php-fastcgi
&lt;/pre&gt;
Создаем /etc/default/php-fastcgi:

&lt;pre&gt;#
# Settings for php-cgi in external FASTCGI Mode
#

# Should php-fastcgi run automatically on startup? (default: no)
START=yes

# Which user runs PHP? (default: www-data)
EXEC_AS_USER=www-data

# Host and TCP port for FASTCGI-Listener (default: localhost:9000)
FCGI_HOST=localhost
FCGI_PORT=9999

# Environment variables, which are processed by PHP
PHP_FCGI_CHILDREN=1
PHP_FCGI_MAX_REQUESTS=1000
&lt;/pre&gt;
Настраиваем nginx (пример виртуального хоста):

&lt;pre&gt;### file /etc/nginx/sites-available/git.example.org
### Host git.example.org

server {
    listen       80;               ## for IPv4.
    listen       [::];             ## for IPv6.

    server_name  git.example.org;

    ## Разрешаем коннект только к своему сайту.
    if ($host !~ ^(git.example.org)$) {
        rewrite ^ http://www.fbi.gov$request_uri? permanent;
    }

    charset  utf-8;

    access_log    /srv/hosting/git.example.org/logs/access.log;
    error_log     /srv/hosting/git.example.org/logs/error.log;

    root /srv/hosting/git.example.org/public_html;

    location / {
        index index.php index.html;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9999;
        fastcgi_index index.php;
        fastcgi_param script_FILENAME /srv/hosting/git.example.org/public_html$fastcgi_script_name;
        include fastcgi_params;
    }
}  # end server (git.example.org).
&lt;/pre&gt;
Затем не забыть сделать симлинк этого файла в sites-enabled и рестатрануть nginx, после чего можно наблюдать веб-морду к гит по адресу http://git.example.org/viewgit/







&lt;hr /&gt;(C)
0. &lt;a href="http://www.openbsd.ru/docs/ssh.html"&gt;http://www.openbsd.ru/docs/ssh.html&lt;/a&gt;
1. &lt;a href="http://help.github.com/linux-set-up-git/"&gt;http://help.github.com/linux-set-up-git/&lt;/a&gt;
2. /usr/share/doc/gitosis/README.Debian
3. &lt;a href="http://catap.ru/blog/2009/02/12/git-make-a-hosting/"&gt;http://catap.ru/blog/2009/02/12/git-make-a-hosting/&lt;/a&gt;
4. &lt;a href="http://nablog.kiev.ua/2010/11/nginx-gitweb-gitosis/"&gt;http://nablog.kiev.ua/2010/11/nginx-gitweb-gitosis/&lt;/a&gt;
5. &lt;a href="http://blog.eveel.ru/2009/06/set-up-nginx-gitweb-gitosis-on-fedora.html"&gt;http://blog.eveel.ru/2009/06/set-up-nginx-gitweb-gitosis-on-fedora.html&lt;/a&gt;
6. &lt;a href="https://help.ubuntu.com/community/Git"&gt;https://help.ubuntu.com/community/Git&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-6737614930670369430?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/6737614930670369430/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2011/07/git-gitosis-viewgit-nginx.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/6737614930670369430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/6737614930670369430'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2011/07/git-gitosis-viewgit-nginx.html' title='Установка и настройка git-сервера (gitosis) + веб-морда viewgit (+ nginx)'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-7078962329638474225</id><published>2011-03-29T12:10:00.000+03:00</published><updated>2011-03-29T12:10:44.533+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: копирование содержимого изменяемых объектов (список, словарь)</title><content type='html'>Копирование содержимого через срезы &lt;b&gt;[:]&lt;/b&gt; (для &lt;i&gt;списков&lt;/i&gt;), метода &lt;b&gt;.copy()&lt;/b&gt; (для &lt;i&gt;словарей&lt;/i&gt;), &lt;b&gt;copy.copy(объект)&lt;/b&gt; создаёт неполную копию. Если в списке (словаре) есть другой изменяемый объект, то создастся не копия, а ссылка на тот же участок памяти.&lt;br /&gt;
Если нужна полная копия, то нужно использовать &lt;b&gt;copy.deepcopy(объект)&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;&gt;&gt;&gt; import copy
&gt;&gt;&gt; &lt;b&gt;lst1&lt;/b&gt; = [1, [2, 3], 4]
&gt;&gt;&gt; &lt;b&gt;lst2&lt;/b&gt; = lst1[:]
&gt;&gt;&gt; &lt;i&gt;lst3&lt;/i&gt; = copy.deepcopy(lst1)
&gt;&gt;&gt;
&gt;&gt;&gt; id(lst1), id(lst2), id(lst3)
(3077665228L, 3077665004L, 3077650700L)
&gt;&gt;&gt;
&gt;&gt;&gt; id(&lt;b&gt;lst1[1]&lt;/b&gt;), id(&lt;b&gt;lst2[1]&lt;/b&gt;), id(&lt;i&gt;lst3[1]&lt;/i&gt;)
(&lt;b&gt;3077650668L&lt;/b&gt;, &lt;b&gt;3077650668L&lt;/b&gt;, &lt;i&gt;3077665548L&lt;/i&gt;)
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-7078962329638474225?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/7078962329638474225/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2011/03/python.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/7078962329638474225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/7078962329638474225'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2011/03/python.html' title='Python: копирование содержимого изменяемых объектов (список, словарь)'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-7950477838268751845</id><published>2011-03-16T22:16:00.000+02:00</published><updated>2011-03-16T22:16:05.016+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='nginx'/><category scheme='http://www.blogger.com/atom/ns#' term='Flup'/><category scheme='http://www.blogger.com/atom/ns#' term=':it'/><category scheme='http://www.blogger.com/atom/ns#' term='FastCGI'/><title type='text'>Настройка связки django + fastcgi (flup) + nginx</title><content type='html'>Содержание:&lt;br /&gt;
&lt;li&gt;Настройка Django;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Настройка проекта;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Настройка пользователя для сайта;&lt;li&gt;&lt;br /&gt;
&lt;li&gt;Настройка Nginx для работы с Django через FastCGI;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Настройка FastCGI;&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;big&gt;&lt;b&gt;Настройка Django&lt;/b&gt;&lt;/big&gt;&lt;/center&gt;&lt;hr/&gt;Описывается здесь: &lt;a href='http://varlog.voan.ru/2011/03/django.html'&gt;http://varlog.voan.ru/2011/03/django.html&lt;/a&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;big&gt;&lt;b&gt;Настройка проекта&lt;/b&gt;&lt;/big&gt;&lt;/center&gt;&lt;hr/&gt;Создаём папку для сайтов.&lt;br /&gt;
&lt;pre&gt;$ cd ~/env/sites/
&lt;/pre&gt;&lt;br /&gt;
Создаем папку для нужного сайта.&lt;br /&gt;
&lt;pre&gt;$ mkdir voan.ru
$ cd voan.ru
&lt;/pre&gt;&lt;br /&gt;
Папка для логов.&lt;br /&gt;
&lt;pre&gt;$ mkdir logs
&lt;/pre&gt;&lt;br /&gt;
Создаём пустой django-проект.&lt;br /&gt;
&lt;pre&gt;$ django-admin.py startproject web_site
$ cd web_site
&lt;/pre&gt;&lt;br /&gt;
Директория для статики.&lt;br /&gt;
&lt;pre&gt;$ mkdir static
&lt;/pre&gt;&lt;br /&gt;
Корректируем путь к модулю настроек url (settings.py).&lt;br /&gt;
&lt;pre&gt;$ perl -pi -e "s/web_site.urls/urls/g" settings.py
&lt;/pre&gt;&lt;br /&gt;
Укзываем путь к статике для админики.&lt;br /&gt;
&lt;pre&gt;$ perl -pi -e "s/ADMIN_MEDIA_PREFIX = '\/media\/'/ADMIN_MEDIA_PREFIX = '\/media_admin\/'/g" settings.py
&lt;/pre&gt;&lt;br /&gt;
Для корректной работы factcgi необходимо обнулить FORCE_SCRIPT_NAME.&lt;br /&gt;
&lt;pre&gt;$ echo "FORCE_SCRIPT_NAME = ''" | tee -a settings.py
&lt;/pre&gt;&lt;br /&gt;
Теперь можно попробовать запустить девелоперский сервер:&lt;br /&gt;
&lt;pre&gt;$ /usr/bin/python2.6 manage.py runserver ИП.Адрес.Сервера:Порт
&lt;/pre&gt;&lt;br /&gt;
&lt;center&gt;&lt;big&gt;&lt;b&gt;Настройка пользователя для сайта&lt;/b&gt;&lt;/big&gt;&lt;/center&gt;&lt;hr/&gt;Небходимо установить Flup:&lt;br /&gt;
&lt;pre&gt;$ sudo aptitude install python-flup
&lt;/pre&gt;&lt;br /&gt;
Для того, чтобы изолировать код проекта от остальной системы, необходимо добавить в систему пользователя, от имени которого будет исполняться код проекта:&lt;br /&gt;
&lt;pre&gt;$ sudo addgroup --quiet --system django
$ sudo adduser --quiet --system --ingroup django --no-create-home --no-create-home django
&lt;/pre&gt;&lt;br /&gt;
Необходимо, чтобы доступ к исходному коду имел только владелец, но при этом надо обеспечить взаимодействие с web-сервером через сокет, а так же дать доступ к статическим файлам пользователю веб сервера:&lt;br /&gt;
&lt;pre&gt;$ sudo chown django:www-data -R ~/env/sites/voan.ru
&lt;/pre&gt;&lt;br /&gt;
Установка прав доступа на проект - чтение/запись есть только у владельца. http-серверу (www-data) позволяем только читать.&lt;br /&gt;
&lt;pre&gt;$ sudo chmod u=rwx,g=rx,o= -R ~/env/sites/voan.ru
&lt;/pre&gt;&lt;br /&gt;
Доступ к исходному django-коду должен быть только у владельца&lt;br /&gt;
&lt;pre&gt;$ sudo chmod u=rwx,g=,o= -R ~/env/sites/voan.ru/web_site
&lt;/pre&gt;&lt;br /&gt;
В данной директории будт находиться не только логи веб-сервера, но и сокет (если будут использоваться unix-сокеты).&lt;br /&gt;
Поэтому необходимо обеспечить (для unix-сокетов):&lt;br /&gt;
* автоматическое создание сокета с группой http-сервера&lt;br /&gt;
* возможность записи в сокет от имени пользователя http-сервера&lt;br /&gt;
Для этого необходимо сделать:&lt;br /&gt;
* выставить бит sgid, чтобы файлы создавались с тойже группой, что и у директории logs&lt;br /&gt;
* выставить доступ на запись для пользователя http-сервера&lt;br /&gt;
&lt;pre&gt;$ sudo chmod u=rwx,g=rwxs,o= -R ~/env/sites/voan.ru/logs
&lt;/pre&gt;&lt;br /&gt;
&lt;center&gt;&lt;big&gt;&lt;b&gt;Настройка Nginx для работы с Django через FastCGI&lt;/b&gt;&lt;/big&gt;&lt;/center&gt;&lt;hr/&gt;Файл с настройками FastCGI &lt;i&gt;/etc/nginx/conf.d/fastcgi.conf&lt;/i&gt;:&lt;br /&gt;
&lt;pre&gt;fastcgi_param    PATH_INFO             $fastcgi_script_name;

fastcgi_param    REQUEST_METHOD        $request_method;
fastcgi_param    QUERY_STRING          $query_string;
fastcgi_param    CONTENT_TYPE          $content_type;
fastcgi_param    CONTENT_LENGTH        $content_length;

fastcgi_param    SCRIPT_NAME           $fastcgi_script_name;
fastcgi_param    REQUEST_URI           $request_uri;
fastcgi_param    DOCUMENT_URI          $document_uri;
fastcgi_param    DOCUMENT_ROOT         $document_root;
fastcgi_param    SERVER_PROTOCOL       $server_protocol;

fastcgi_param    GATEWAY_INTERFACE     CGI/1.1;

fastcgi_param    SERVER_SOFTWARE      nginx;

fastcgi_param    REMOTE_ADDR          $remote_addr;
fastcgi_param    REMOTE_PORT          $remote_port;

fastcgi_param    SERVER_ADDR          $server_addr;
fastcgi_param    SERVER_PORT          $server_port;
fastcgi_param    SERVER_NAME          $server_name;

fastcgi_param    SCRIPT_FILENAME      $document_root$fastcgi_script_name;

fastcgi_pass_header         Authorization;
fastcgi_intercept_errors    off;

## PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param    REDIRECT_STATUS      200;
&lt;/pre&gt;&lt;br /&gt;
Файл настроек нужного виртуального хоста &lt;i&gt;/etc/nginx/sites-available/example.org&lt;/i&gt; должен иметь следующие настройки:&lt;br /&gt;
&lt;pre&gt;server {
  ...

  # Кусок настройки nginx, связанный с FastCGI:
  location / {
    fastcgi_pass  127.0.0.1:8989;

    include       /etc/nginx/conf.d/fastcgi.conf;

    fastcgi_param              PATH_INFO        $fastcgi_script_name;
    fastcgi_pass_header        Authorization;
  }

  # Кусок настройки nginx, связанный со статическим содержимым проекта:
  location /static/ {
    alias /home/django/env/sites/voan.ru/web_site/static/;
    expires 30d;
  }

  # Кусок настройки nginx, связанный с статическим содержимым админки:
  location /media_admin/ {
    alias /usr/lib/python2.6/dist-packages/django/contrib/admin/media/;
    expires 30d;
  }

  ...
}
&lt;/pre&gt;&lt;br /&gt;
&lt;center&gt;&lt;big&gt;&lt;b&gt;Настройка FastCGI&lt;/b&gt;&lt;/big&gt;&lt;/center&gt;&lt;hr/&gt;FastCGI-сервер запускать так:&lt;br /&gt;
&lt;pre&gt;$ sudo -u django /usr/bin/python2.6 /home/django/env/sites/voan.ru/web_site/manage.py runfcgi method=prefork maxchildren=10 maxspare=5 minspare=2 maxrequests=100 host=127.0.0.1 port=8989 pidfile=/home/django/env/sites/voan.ru/logs/django-server.pid umask=007
&lt;/pre&gt;Если используется port &amp; host, а не socket, то umask не надо использовать.&lt;br /&gt;
umask=007 выставляется для того, чтобы право на работу с сокетом имели только владелец и группа сокета.&lt;br /&gt;
&lt;br /&gt;
Остановить FastCGI-сервер:&lt;br /&gt;
&lt;pre&gt;$ sudo -u django kill `cat /home/django/env/sites/voan.ru/logs/django-server.pid`
&lt;/pre&gt;(!) Обратить внимание, что кавычки такие (` ака нажатие на ё).&lt;br /&gt;
&lt;br /&gt;
&lt;hr/&gt;(C) &lt;a href='http://debianworld.ru/articles/ustanovka-i-nastrojka-django-nginx-cherez-fastcgi-flup-v-debian-ubuntu/'&gt;http://debianworld.ru/articles/ustanovka-i-nastrojka-django-nginx-cherez-fastcgi-flup-v-debian-ubuntu/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-7950477838268751845?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/7950477838268751845/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2011/03/django-fastcgi-flup-nginx.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/7950477838268751845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/7950477838268751845'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2011/03/django-fastcgi-flup-nginx.html' title='Настройка связки django + fastcgi (flup) + nginx'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-4519772503481802120</id><published>2011-03-16T17:34:00.003+02:00</published><updated>2011-03-16T17:43:36.459+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term=':it'/><title type='text'>Развёртывание Django</title><content type='html'>Содержание:&lt;br /&gt;
&lt;li&gt;1-й способ. Глобальная установка;&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;big&gt;&lt;b&gt;1-й способ&lt;/b&gt;&lt;/big&gt;&lt;/center&gt;&lt;hr/&gt;Глобальная установка.&lt;br /&gt;
&lt;pre&gt;# cd /opt
# wget http://media.djangoproject.com/releases/1.2/Django-1.2.5.tar.gz
# tar xzf Django-1.2.5.tar.gz
# python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
  /usr/lib/python2.6/dist-packages
# ln -s /opt/Django-1.2.5/django /usr/lib/python2.6/dist-packages/django
# ln -s /opt/Django-1.2.5/django/bin/django-admin.py /usr/local/bin/
# python -c "import django; print django.VERSION"
  (1, 2, 5, 'final', 0)
&lt;/pre&gt;(C) &lt;a href='http://debianworld.ru/articles/ustanovka-i-nastrojka-django-nginx-cherez-fastcgi-flup-v-debian-ubuntu/'&gt;http://debianworld.ru/articles/ustanovka-i-nastrojka-django-nginx-cherez-fastcgi-flup-v-debian-ubuntu/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-4519772503481802120?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/4519772503481802120/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2011/03/django.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/4519772503481802120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/4519772503481802120'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2011/03/django.html' title='Развёртывание Django'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-5971354242761905400</id><published>2011-02-01T13:25:00.002+02:00</published><updated>2011-02-05T17:27:59.252+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term=':it'/><category scheme='http://www.blogger.com/atom/ns#' term='SSH'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Оповещение на e-mail обо всех успешных SSH-подключениях</title><content type='html'>&lt;b&gt;last update: 2011 02 05&lt;/b&gt;&lt;br /&gt;
Обновил скрип и данный пост.&lt;br /&gt;
&lt;br /&gt;
Сам скрипт (sln.py):&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre class="brush: python"&gt;#!/usr/bin/python
# coding: utf-8
# sln.py - уведомление по email о каждом успешном ssh-логине.
#
# Использование:
#   В /etc/ssh/sshrc (если нет, то создать) вписать следующую строку:
#   /path/to/sln.py --text="$(date +%d.%m.%Y\ %H:%M:%S)|$USER|$SSH_CONNECTION|$SSH_TTY"
# ----------------------------------------


# Настройки.
smtp_host = "smtp.gmail.com"
smtp_port = "587"

mail_login = "no_reply@example.org"
mail_pass = "superpuperporol"
mail_to = "admin@example.org"

mail_subj = "New SSH login on srv"
# ----------------------------------------


from sys import argv
from getopt import getopt

import smtplib
import email.utils
from email.mime.text import MIMEText


def send_mail(text):
    
    msg = MIMEText(text, "plain", "utf-8")
    
    msg["To"] = email.utils.formataddr((mail_to, mail_to))
    msg["From"] = email.utils.formataddr((mail_login, mail_login))
    msg["Subject"] = mail_subj
    
    server = smtplib.SMTP(smtp_host + ":" + smtp_port)
    server.ehlo()
    server.starttls()
    server.ehlo()
    server.login(mail_login, mail_pass)
    server.sendmail(mail_login, mail_to, msg.as_string())
    server.quit()


opts, args = getopt(argv[1:], "x", ["text="])
ssh_info = opts[0][1].split("|")
ssh_info2 = ssh_info[2].split(" ")

text = """%s (IP: %s):\n\nДата: %s\nЗалогинившийся пользователь: %s\nIP подключившегося: %s\nSSH TTY: %s""" % (mail_subj, ssh_info2[-2], ssh_info[0], ssh_info[1], ssh_info2[0], ssh_info[-1])
send_mail(text=text)
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Использование:&lt;/b&gt;&lt;br /&gt;
В файл &lt;i&gt;/etc/ssh/sshrc&lt;/i&gt; (если нет, то создать) добавить:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;/path/to/sln.py --text="$(date +%d.%m.%Y\ %H:%M:%S)|$USER|$SSH_CONNECTION|$SSH_TTY"
&lt;/pre&gt;Не забыть указать правильный путь sln.py, далее надо дать права на исполнение скрипту (главное не догадайтесь дать 777 права [как догадался один чувак это посоветовать на одном из форумов], который, кстати, не указал, что скрипт взял отсюда. Ну и хуй с ним).&lt;br /&gt;
&lt;br /&gt;
Если мучают параноидальные мысли (вычитано всё с того же форума) о "&lt;big&gt;это же текстовый файл, кто угодно может просмотреть его содержимое&lt;/big&gt;", то можно сделать скомпилированную версию скрипта (после того как внесены правки в скрипт - логин, пароль, etc):&lt;br /&gt;
&lt;pre class="brush: bash"&gt;/usr/bin/python -m compileall sln.py
&lt;/pre&gt;После чего будет создан sln.&lt;b&gt;pyc&lt;/b&gt; и можно удалить sln.&lt;b&gt;py&lt;/b&gt; (главное не стоит забывать, что данный скомпилированный вариант жестко привязан к версии питона. Не нравится это? Напиши сам на C, где не будет никаких ограничений).&lt;br /&gt;
Далее надо сделать pyc-файл исполняемым,для пущей параноидальности можно изменить .pyc расширение на что-нибудь другое (или вообще его убрать).&lt;br /&gt;
Теперь в sshrc надо не забыть изменить (путь до скомпилированного скрипта).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Результат:&lt;/b&gt;&lt;br /&gt;
Сразу после каждого успешного логина по SSH будет приходить письмо на e-почту вида:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;Тема письма: New SSH login on srv

Текст письма:
New SSH login on srv (IP: IP_сервера):

Дата: 05.02.2011 17:00:41
Залогинившийся пользователь: userName
IP подключившегося: IP_подключившегося
SSH TTY: /dev/pts/0
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-5971354242761905400?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/5971354242761905400/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2011/02/ssh.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/5971354242761905400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/5971354242761905400'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2011/02/ssh.html' title='Оповещение на e-mail обо всех успешных SSH-подключениях'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-8140203845790853980</id><published>2011-01-04T13:21:00.000+02:00</published><updated>2011-01-04T13:21:26.832+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python-скрипт получения uptime в unix-like ОС</title><content type='html'>Сам код:&lt;br /&gt;
&lt;pre class="brush: python"&gt;def uptime():
    proc_uptime = open("/proc/uptime", "r")
    uptime_raw = proc_uptime.read()
    proc_uptime.close()
    
    uptime_raw = uptime_raw.split(" ")
    uptime_raw = float(uptime_raw[0])
    minute = 60
    hour = minute * 60
    day = hour * 24
    
    days = int(uptime_raw / day)
    hours = int((uptime_raw % day) / hour)
    minutes = int((uptime_raw % hour) / minute)
    seconds = int(uptime_raw % minute)
    
    return (days, hours, minutes, seconds)

u = uptime()
print "Uptime: %s days, %s hours, %s minutes, %s seconds." % (u[0],u[1],u[2],u[3])
&lt;/pre&gt;&lt;br /&gt;
Результат:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;Uptime: 0 days, 3 hours, 56 minutes, 43 seconds.
&lt;/pre&gt;&lt;br /&gt;
Исходный код на Си: &lt;a href='http://www.ibm.com/developerworks/ru/library/l-Geany/index.html'&gt;http://www.ibm.com/developerworks/ru/library/l-Geany/index.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-8140203845790853980?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/8140203845790853980/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2011/01/python-uptime-unix-like.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/8140203845790853980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/8140203845790853980'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2011/01/python-uptime-unix-like.html' title='Python-скрипт получения uptime в unix-like ОС'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-769611648614539854</id><published>2010-12-22T12:34:00.000+02:00</published><updated>2010-12-26T17:08:35.942+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Twisted'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='OSCAR'/><title type='text'>Пример простого ICQ/OSCAR-бота на python (twisted)</title><content type='html'>Для работы бота необходим python2 (проверено на 2.5, 2.6), python-twisted-words (проверено на 8.1.0-2, 10.1.0-1).&lt;br /&gt;
&lt;br /&gt;
Что бот умеет:&lt;br /&gt;
* команда !help;&lt;br /&gt;
* команда !about;&lt;br /&gt;
* на любое сообщение, которое бот не знает он отвечает как на команду !help.&lt;br /&gt;
&lt;br /&gt;
Есть 2 файла:&lt;br /&gt;
* settings.py - основные настройки для бота.&lt;br /&gt;
* icqbot.py - реализация бота.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
settings.py:&lt;br /&gt;
&lt;pre class="brush: python"&gt;# coding: utf-8
# settings.py

# Префикс для команд бота, напр.: !.
PREF_C = "!"

# ICQ UIN.
SN = "123456"

# Password.
PASS = "the_Secret_porole"

# Servers, ports.
SERVER1 = "login.icq.com"
PORT1 = 5238

hostport = (SERVER1, PORT1)
icqMode = 1

# away-статус по-умолчанию.
AWAY_MSG = "I am ICQ-bot. More info: !about, !help"
&lt;/pre&gt;&lt;br /&gt;
icqbot.py:&lt;br /&gt;
&lt;pre class="brush: python"&gt;# coding: utf-8
# icqbot.py

from twisted.words.protocols import oscar
from twisted.internet import protocol, reactor

# настройки.
from settings import PREF_C, SN, PASS, hostport, icqMode, AWAY_MSG

# ------------------------------

class Bot(oscar.BOSConnection):
    """ class Bot. """
    
    """ Переопределяем, необходимые для успешного соединения, методы:
        initDone, gotSelfInfo, gotBuddyList, gotAway и инициализируем
        переменную capabilities.
    """
    
    
    capabilities = [oscar.CAP_CHAT]  # ['t\x8f$ b\x87\x11\xd1\x82"DEST\x00\x00']
    
    def initDone(self):
        print "Connection (%s) to server: %s:%s" % (SN, hostport[0], hostport[1])
        
        self.requestSelfInfo().addCallback(self.gotSelfInfo)
        self.requestSSI().addCallback(self.gotBuddyList)
        
        self.setAway(AWAY_MSG)    # away-сообщение.
    
    def gotSelfInfo(self, user):
        print user.__dict__
        self.name = user.name
    
    def gotBuddyList(self, l):
        print l
        self.activateSSI()
        self.setProfile("""ICQBot.py (C) 2010 The Voan""")
        self.setIdleTime(0)
        self.clientReady()
    
    def gotAway(self, away, user):
        if away:
            print "User ", user,": ", away
    
    ### -----------------------------
    
    def receiveMessage(self, user, multiparts, flags):
        """ Принимаем и обрабатываем входящее сообщение (строку). """
        
        print "\n", "-"*10
        print "From: %s" % user.name
        print "Message: %s" % multiparts[0][0]
        
        command = multiparts[0][0].lower()
        
        if command == (PREF_C+"help"):
            msg = self.get_help()    # отправляемое сообщение.
            
            # Отправляем сообщение.
            self.sendMessage(user.name, msg)
        
        elif command == (PREF_C+"about"):
            msg = self.get_about()
            self.sendMessage(user.name, msg)
        
        elif command == "!cool":
            self.sendMessage(user.name, "Yes! The cool bot.. :-)")
        
        else:
            msg = self.get_help()
            self.sendMessage(user.name, msg)
    
    
    def get_help(self):
        return "the !help command."
    
    def get_about(self):
        
        msg = """
        the
                  !about
                  
                  
               command.
        """
        return msg
    
# -------------------

class BotAuth(oscar.OscarAuthenticator):
   BOSClass = Bot

protocol.ClientCreator(reactor, BotAuth, SN, PASS, icq=icqMode).connectTCP(*hostport)
reactor.run()
&lt;/pre&gt;&lt;br /&gt;
П.С. У меня были проблемы с кодировкой отправляемых сообщений.&lt;br /&gt;
Решать мне их не хочется, поэтому я тупо использовал транслит :-)&lt;br /&gt;
&lt;br /&gt;
Впринципе, все достаточно просто:-)&lt;br /&gt;
&lt;br /&gt;
Документация:&lt;br /&gt;
* http://twistedmatrix.com/documents/current/words/examples/oscardemo.py&lt;br /&gt;
* http://twistedmatrix.com/documents/current/words/howto/&lt;br /&gt;
* http://twistedmatrix.com/documents/current/api/twisted.words.protocols.oscar.html&lt;br /&gt;
* http://www.valleybrooksoftware.com/weblog/2010/jan/11/chatbots-python/&lt;br /&gt;
* Google://twisted oscar&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-769611648614539854?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/769611648614539854/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2010/12/icqoscar-python-twisted.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/769611648614539854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/769611648614539854'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2010/12/icqoscar-python-twisted.html' title='Пример простого ICQ/OSCAR-бота на python (twisted)'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-9123679128220970364</id><published>2010-11-02T21:54:00.003+02:00</published><updated>2010-12-26T15:29:34.410+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: прохождение по 2-м (и более) спискам в цикле</title><content type='html'>Можно с помощью функции &lt;i&gt;zip&lt;/i&gt;:&lt;br /&gt;
&lt;pre class="brush: python;"&gt;&gt;&gt;&gt; l1 = [1,2,3]
&gt;&gt;&gt; l2 = [4,5,6]
&gt;&gt;&gt; 
&gt;&gt;&gt; for i,j in zip(l1,l2):
...   print i,j
... 
1 4
2 5
3 6
&gt;&gt;&gt;
&lt;/pre&gt;наверняка, можно и еще как-нибудь?!..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-9123679128220970364?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/9123679128220970364/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2010/11/python-2.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/9123679128220970364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/9123679128220970364'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2010/11/python-2.html' title='Python: прохождение по 2-м (и более) спискам в цикле'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-4123973467681081944</id><published>2010-09-08T15:51:00.004+03:00</published><updated>2010-12-26T17:16:28.785+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Яндекс'/><category scheme='http://www.blogger.com/atom/ns#' term='Яндекс.Закладки'/><title type='text'>Яндекс.Закладки: кнопка "Я.Запомню", модифицируем для открытия в новой вкладке</title><content type='html'>По-умолчанию кнопка &lt;b&gt;Я.Запомню&lt;/b&gt; открывает страницу&amp;nbsp;для добавления закладки в этом же окне, что, однако, не удобно.&lt;br /&gt;
&lt;br /&gt;
Было:&lt;br /&gt;
&lt;pre class="brush: javascript"&gt;javascript:(function(){location.href='http://zakladki.yandex.ru/newlink.xml?url='+encodeURIComponent(location.href)+'&amp;amp;name='+encodeURIComponent(document.title);})();
&lt;/pre&gt;&lt;br /&gt;
Стало:&lt;br /&gt;
&lt;pre class="brush: javascript"&gt;javascript:(function(){window.open('http://zakladki.yandex.ru/newlink.xml?url='+encodeURIComponent(location.href)+'&amp;amp;name='+encodeURIComponent(document.title));})();
&lt;/pre&gt;&lt;br /&gt;
Теперь страница для добавления новой закладки в Я.Закладки будет открываться в новой вкладке.&lt;br /&gt;
Яндекс.Закладки - &lt;a href="http://zakladki.yandex.ru/"&gt;zakladki.yandex.ru&lt;/a&gt;.&lt;br /&gt;
the end.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-4123973467681081944?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/4123973467681081944/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2010/09/blog-post.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/4123973467681081944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/4123973467681081944'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2010/09/blog-post.html' title='Яндекс.Закладки: кнопка &quot;Я.Запомню&quot;, модифицируем для открытия в новой вкладке'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-3311454322856292212</id><published>2010-06-30T15:29:00.006+03:00</published><updated>2010-12-26T15:29:34.412+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term='IPv6'/><category scheme='http://www.blogger.com/atom/ns#' term='IPv4'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: определяем свои IPv4-, IPv6-адреса</title><content type='html'>Скрипт написан с использованием сервиса &lt;a href='http://whatismyipv6.net'&gt;whatismyipv6.net&lt;/a&gt;.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre class="brush: python"&gt;# coding: utf-8
# (C) 2010 The Voan &amp;lt;the@voan.ru&amp;gt;
# WWW: http://code.google.com/p/voan-sp/wiki/whatismyip
# Определяем свои IPv4 и IPv6 адреса с помощью сервиса www.whatismyipv6.net.
# using: python myips.py

import urllib, re

def my_ipv4():
    """Возвращает 'белый' IPv4-адрес (используется ipv4.whatismyipv6.net)."""
    url = "http://ipv4.whatismyipv6.net/"
    tmp = urllib.urlopen(url).read()
    
    my_re = re.compile(r&amp;quot;&amp;lt;h1&amp;gt;(.*?)&amp;lt;/h1&amp;gt;&amp;quot;)
    tmp = re.findall(my_re, tmp)
    
    tmp = tmp[0].split(" ")
    tmp = tmp[-1]
    
    return tmp

def my_ipv6():
    """Возвращает IPv6-адрес (используется ipv6.whatismyipv6.net)."""
    url = "http://ipv6.whatismyipv6.net/"
    tmp = urllib.urlopen(url).read()
    
    my_re = re.compile(r&amp;quot;&amp;lt;h1&amp;gt;(.*?)&amp;lt;/h1&amp;gt;&amp;quot;)
    tmp = re.findall(my_re, tmp)
    
    tmp = tmp[0].split(" ")
    tmp = tmp[-1]
    
    return tmp

print my_ipv4()
print my_ipv6()
&lt;/pre&gt;&lt;br /&gt;
Определение IPv4- и IPv6-адреса вынесено в разные функции =&gt; можно использовать для определения:&lt;br /&gt;
* только IPv4-адреса;&lt;br /&gt;
* только IPv6-адреса;&lt;br /&gt;
* обоих адресов.&lt;br /&gt;
&lt;hr&gt;последняя ревизия скрипта и другие реализации определения своего IP смотреть здесь: &lt;a href='http://code.google.com/p/voan-sp/wiki/whatismyip'&gt;http://code.google.com/p/voan-sp/wiki/whatismyip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-3311454322856292212?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/3311454322856292212/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2010/06/python-ipv4-ipv6.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/3311454322856292212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/3311454322856292212'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2010/06/python-ipv4-ipv6.html' title='Python: определяем свои IPv4-, IPv6-адреса'/><author><name>Andrey Vorobyev</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-Y8CjZcXC0g8/AAAAAAAAAAI/AAAAAAAAA4s/hRqB3YrS-cw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2871042105437379351.post-5650471653253612200</id><published>2009-08-17T22:39:00.017+03:00</published><updated>2010-12-26T14:41:46.181+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':dev'/><category scheme='http://www.blogger.com/atom/ns#' term=':trash'/><category scheme='http://www.blogger.com/atom/ns#' term=':games'/><category scheme='http://www.blogger.com/atom/ns#' term='песочница'/><category scheme='http://www.blogger.com/atom/ns#' term=':it'/><category scheme='http://www.blogger.com/atom/ns#' term=':life'/><title type='text'>Hello, World!</title><content type='html'>Привет, Мир! &lt;br /&gt;
Это тестовое сообщение. &lt;br /&gt;
этот пост спользуется как &amp;laquo;песочница&amp;raquo;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2871042105437379351-5650471653253612200?l=varlog.voan.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://varlog.voan.ru/feeds/5650471653253612200/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://varlog.voan.ru/2009/08/hello-world.html#comment-form' title='Комментарии: 11'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/5650471653253612200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2871042105437379351/posts/default/5650471653253612200'/><link rel='alternate' type='text/html' href='http://varlog.voan.ru/2009/08/hello-world.html' title='Hello, World!'/><author><name>voan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry></feed>
