<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <title type="text">Recent posts on www.fxp0.org.ua</title>
  <id>http://www.fxp0.org.ua/rss/weblog/</id>
  <updated>2010-06-22T17:40:07Z</updated>
  <link href="http://www.fxp0.org.ua/" />
  
  <generator>Werkzeug</generator>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Fxp0orguaFeed" /><feedburner:info uri="fxp0orguafeed" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry xml:base="http://www.fxp0.org.ua/rss/weblog/">
    <title type="text">Installing Grub on FreeBSD with 3Ware raid</title>
    <id>http://www.fxp0.org.ua/2010/jun/22/installing-grub-freebsd-3ware-raid/</id>
    <updated>2010-06-22T17:40:07Z</updated>
    <published>2010-06-22T17:40:07Z</published>
    <link href="http://feedproxy.google.com/~r/Fxp0orguaFeed/~3/EsqBE4dvUsM/" />
    <author>
      <name>Denis Kuzmichyov</name>
    </author>
    <content type="html">&lt;p&gt;
While trying to install Grub on some old freebsd (6.2-RELEASE) I encountered following problem:
&lt;/p&gt;

&lt;pre&gt;
[root@host /usr/ports/sysutils/grub]# grub-install hd0
Probing devices to guess BIOS drives. This may take a long time.
/dev/twed0s1a does not have any corresponding BIOS drive.
&lt;/pre&gt;

&lt;p&gt;
Anyway, grub still can be installed there using following commands:
&lt;/p&gt;

&lt;pre&gt;
grub&amp;gt; device (hd0) /dev/twed0

grub&amp;gt; root (hd0,a)
 Filesystem type is ufs2, partition type 0xa5

grub&amp;gt; setup --stage2=/boot/grub/stage2 (hd0) 
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/ufs2_stage1_5" exists... yes
 Running "embed /boot/grub/ufs2_stage1_5 (hd0)"...  16 sectors are embedded.
succeeded
 Running "install --stage2=/boot/grub/stage2 /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,0,a)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.

grub&amp;gt;
&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/Fxp0orguaFeed/~4/EsqBE4dvUsM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.fxp0.org.ua/2010/jun/22/installing-grub-freebsd-3ware-raid/</feedburner:origLink></entry>
  <entry xml:base="http://www.fxp0.org.ua/rss/weblog/">
    <title type="text">Installing packages in Debian/Ubuntu automatically</title>
    <id>http://www.fxp0.org.ua/2009/jul/31/installing-packages-debianubuntu-automatically/</id>
    <updated>2009-07-31T15:17:32Z</updated>
    <published>2009-07-31T15:17:32Z</published>
    <link href="http://feedproxy.google.com/~r/Fxp0orguaFeed/~3/9oAtc4i3EjY/" />
    <author>
      <name>Denis Kuzmichyov</name>
    </author>
    <content type="html">&lt;p&gt;
I use CFengine for automation of different taks like copying config files from one place
to nodes, reloading services after this, etc. And recently i configured it to check and install
packages for different boxes depending on their role. For example, if box acts as web node,
following packages need to be installed: &lt;i&gt;apache2, apache2-mpm-prefork, libapache2-mod-php5&lt;/i&gt;, etc
&lt;/p&gt;

&lt;p&gt;
So i added into &lt;b&gt;control:&lt;/b&gt; section following lines:
&lt;/p&gt;

&lt;pre&gt;
    debian|ubuntu::
        DefaultPkgMgr = ( dpkg )
        DPKGInstallCommand = ( "/usr/bin/apt-get -y install %s" )
        DPKGRemoveCommand = ( "/usr/bin/apt-get -y purge %s" )
    gentoo::
        DefaultPkgMgr = ( portage )
        PortageInstallCommand = ( "/usr/bin/emerge --nocolor %s" )
    centos::
        DefaultPkgMgr = ( rpm )
        DPKGInstallCommand = ( "/usr/bin/yum -y install %s" )
&lt;/pre&gt;

&lt;p&gt;
Not sure about gentoo/centos though.
And after that, listed required packages in &lt;b&gt;packages:&lt;/b&gt; section:
&lt;/p&gt;

&lt;pre&gt;
    nodes.(debian|ubuntu)::
        apache2 action=install
        apache2-mpm-prefork action=install
        libapache2-mod-geoip action=install
        libapache2-mod-php5 action=install
        php5 action=install
        php5-curl action=install
        ...
&lt;/pre&gt;

&lt;p&gt;
Now cfengine should install packages if box is either ubuntu or debian and class &lt;i&gt;nodes&lt;/i&gt;
is defined. But there's one little problem: if you copy config file for some of those packages, or
for some reason it resides on the box, apt-get/dpkg will ask you what to do with old/new config
(use old or install new version).
And '-y' option won't help in this situation.
&lt;/p&gt;

&lt;p&gt;
I noticed that packages use &lt;b&gt;ucf&lt;/b&gt; - Update Configuration File. And this tool respects following
variables:&lt;br /&gt;
&lt;b&gt;UCF_FORCE_CONFFNEW&lt;/b&gt; - if set, forces the new file to  always overwrite   the   installed   destination file&lt;br /&gt;
&lt;b&gt;UCF_FORCE_CONFFOLD&lt;/b&gt; - if  set  silently  retains  the  installed   file&lt;br /&gt;

So, i changed definition of &lt;b&gt;DPKGInstallCommand&lt;/b&gt;:
&lt;/p&gt;

&lt;pre&gt;
DPKGInstallCommand = ( "/usr/bin/env UCF_FORCE_CONFFOLD=1 /usr/bin/apt-get -y install %s" )
&lt;/pre&gt;

&lt;p&gt;
And it worked. But as i found later, not all packages seem use &lt;b&gt;ucf&lt;/b&gt; for handling config files.
So the final version of &lt;b&gt;DPKGInstallCommand&lt;/b&gt; looks like this:
&lt;/p&gt;

&lt;pre&gt;
DPKGInstallCommand = ( "/usr/bin/env UCF_FORCE_CONFFOLD=1 /usr/bin/apt-get -y -o 'Dpkg::Options::=' '--force-confold' install %s" )
&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/Fxp0orguaFeed/~4/9oAtc4i3EjY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.fxp0.org.ua/2009/jul/31/installing-packages-debianubuntu-automatically/</feedburner:origLink></entry>
  <entry xml:base="http://www.fxp0.org.ua/rss/weblog/">
    <title type="text">Embedding images into html</title>
    <id>http://www.fxp0.org.ua/2009/apr/14/embedding-images-html/</id>
    <updated>2009-04-14T19:27:31Z</updated>
    <published>2009-04-14T19:27:31Z</published>
    <link href="http://feedproxy.google.com/~r/Fxp0orguaFeed/~3/ooBJo_1nWVU/" />
    <author>
      <name>Denis Kuzmichyov</name>
    </author>
    <content type="html">&lt;p&gt;
A few days ago I met a small html snippet with an image embedded in it. As it turns out, any
data can be embedded this way:
&lt;/p&gt;

&lt;pre&gt;
&amp;lt;img src="data:image/gif;base64,
R0lGODlhEAAQAPZMAGdnZ3x8fP9yFf9/K/+DMf+EM/+FNf+IOv+KPP+NQv+OQ/+PRf+RSP+TTP+W
UP+XUv+ZVf+aV/+cW/+dXf+fX/+fYP+gYf+gYv+iZf+jZv+kaP+lav+obv+ob/+pcf+qcv+rdP+u
ef+vev+xfYiIiJSUlJmZmaKioqWlpaenp6mpqaysrLGxsbW1tba2tre3t7i4uLq6uv+1hP+9kf++
k8HBwcfHx8vLy8/Pz9bW1t7e3v/o2ebm5ufn5+7u7v/s4P/y6v/z7PHx8fX19fb29vf39//28f/4
9Pj4+Pn5+fv7+/z8/P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
BAAAAAAALAAAAAAQABAAAAeGgBU0MoQcFSAghIQgEiMXQUCRP0dMlZaVjZeamhEam59MEx+gmw4j
lSsupEcYp0wwoERMRgSnOAFCNko5JSclRCYuOw00lbA8AEQqSiguRKofIcZMOiw1NSQ3KiiyGDKf
PKqXHJ6fPpoX0qSX6euXCKPulRMVCwoGAwwRChcGDgUCHGhAEAgAOw==" /&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
And here's how it looks in html:

&lt;img src="data:image/gif;base64,
R0lGODlhEAAQAPZMAGdnZ3x8fP9yFf9/K/+DMf+EM/+FNf+IOv+KPP+NQv+OQ/+PRf+RSP+TTP+W
UP+XUv+ZVf+aV/+cW/+dXf+fX/+fYP+gYf+gYv+iZf+jZv+kaP+lav+obv+ob/+pcf+qcv+rdP+u
ef+vev+xfYiIiJSUlJmZmaKioqWlpaenp6mpqaysrLGxsbW1tba2tre3t7i4uLq6uv+1hP+9kf++
k8HBwcfHx8vLy8/Pz9bW1t7e3v/o2ebm5ufn5+7u7v/s4P/y6v/z7PHx8fX19fb29vf39//28f/4
9Pj4+Pn5+fv7+/z8/P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
BAAAAAAALAAAAAAQABAAAAeGgBU0MoQcFSAghIQgEiMXQUCRP0dMlZaVjZeamhEam59MEx+gmw4j
lSsupEcYp0wwoERMRgSnOAFCNko5JSclRCYuOw00lbA8AEQqSiguRKofIcZMOiw1NSQ3KiiyGDKf
PKqXHJ6fPpoX0qSX6euXCKPulRMVCwoGAwwRChcGDgUCHGhAEAgAOw==" alt="Embedded Image" /&gt;

&lt;/p&gt;

&lt;p&gt;
Besides images, any other data can be embedded this way. The general schema is:
&lt;/p&gt;

&lt;pre&gt;

data:[&amp;lt;mediatype&amp;gt;][;base64],&amp;lt;data&amp;gt;

&lt;/pre&gt;

&lt;p&gt;
If &lt;em&gt;;base64&lt;/em&gt; is omited, data octets should be represented using ascii encoding or using %xx
hex notation.
Details can be found in &lt;a href="http://www.faqs.org/rfcs/rfc2397.html" rel="nofollow"&gt;rfc2397&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Fxp0orguaFeed/~4/ooBJo_1nWVU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.fxp0.org.ua/2009/apr/14/embedding-images-html/</feedburner:origLink></entry>
  <entry xml:base="http://www.fxp0.org.ua/rss/weblog/">
    <title type="text">psi crashes on appearance options</title>
    <id>http://www.fxp0.org.ua/2008/may/14/psi-crashes-appearance-options/</id>
    <updated>2008-05-14T16:55:36Z</updated>
    <published>2008-05-14T16:55:36Z</published>
    <link href="http://feedproxy.google.com/~r/Fxp0orguaFeed/~3/uMHuFR4Lq84/" />
    <author>
      <name>Denis Kuzmichyov</name>
    </author>
    <content type="html">&lt;p&gt;
I noticed that my jabber client crashes (segmentation fault) whenever i try to close last chat tab
or try to open Appearance tab in Options. Version of psi is 0.11-3.
&lt;/p&gt;
&lt;p&gt;
 Seems like it has to do with new Qt version. There's a &lt;a href="https://bugs.launchpad.net/ubuntu/+source/psi/+bug/229614"&gt;bug&lt;/a&gt; reported already.
But it's not fixed yet. Fortunely, there's a fixed version available in Debian/unstable: &lt;a href="http://packages.debian.org/sid/i386/psi/download"&gt;0.11-8&lt;/a&gt;.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Fxp0orguaFeed/~4/uMHuFR4Lq84" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.fxp0.org.ua/2008/may/14/psi-crashes-appearance-options/</feedburner:origLink></entry>
  <entry xml:base="http://www.fxp0.org.ua/rss/weblog/">
    <title type="text">Running powerdns via keepalived</title>
    <id>http://www.fxp0.org.ua/2008/apr/16/running-powerdns-keepalived/</id>
    <updated>2008-04-16T10:46:06Z</updated>
    <published>2008-04-16T10:46:06Z</published>
    <link href="http://feedproxy.google.com/~r/Fxp0orguaFeed/~3/wj07JuwBfUQ/" />
    <author>
      <name>Denis Kuzmichyov</name>
    </author>
    <content type="html">&lt;p&gt;
If you run e.g. two dns servers and one goes down, some applications start to work slower.
This happens because they pick one dns server in order to resolve some address, and if this server
is down, you'll have to wait untill timeout. Then they try the other(s).
&lt;/p&gt;

&lt;p&gt;
All this may lead to a number of unpleasunt situations, like:
&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;High load on servers&lt;/li&gt;
 &lt;li&gt;High number of connections to the server&lt;/li&gt;
 &lt;li&gt;Insufficient resources b/c of former and so on..&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
To prevent such situations when 1 of dns servers goes down,
we decided to run DNS service under &lt;strong&gt;keepalived&lt;/strong&gt;.
So that if one dns server goes down, keepalived on the other server
brings ip of the gone dns server up. Dns servers are setup on IPVS directors
(where keepalived servers running on). Typical keepalived config for dns
may look like this: 
&lt;/p&gt;

&lt;pre&gt;
[...]
vrrp_instance DNS1 {
    state MASTER
    virtual_router_id 1
    interface eth0
    priority 150
    authentication {
        auth_type PASS
        auth_pass s3cr3t
    }
    virtual_ipaddress {
        10.1.1.1
    }
    smtp_alert
}

vrrp_instance DNS2 {
    state BACKUP
    virtual_router_id 2
    interface eth0
    priority 100
    authentication {
        auth_type PASS
        auth_pass s3cr3t
    }
    virtual_ipaddress {
       10.1.1.2
    }
    smtp_alert
}
[...]
&lt;/pre&gt;

&lt;p&gt;
And vise versa on the other director.
&lt;/p&gt;

&lt;p&gt;
We use &lt;strong&gt;powerdns&lt;/strong&gt; in our setup. Unfortunely it cannot
bind to ``all`` ip's on box. Actually it can, but there's no guarantee the you'll
get the answer from ip you was quering. Because of this you have to bind to
concrete ip's. This is not a problem at all unless you need to bind to different
ip's automaticly if the other server goes down. In the begining i was trying to use
some scripts to change pdns' config with &lt;b&gt;notify_master&lt;/b&gt;/&lt;b&gt;notify_backup&lt;/b&gt;.
But recently i found a much more simple solution. All you need to do is to specify &lt;b&gt;all&lt;/b&gt;
ip's in every pdn's config on every dns server. And just to let pdn bind to ip's the box doesnt own,
simply do:
&lt;/p&gt;

&lt;pre&gt;

# sysctl -w net.ipv4.ip_nonlocal_bind=1

&lt;/pre&gt;

&lt;p&gt;
This lets pdns to bind to all ip's and if the other server goes down, the one that alive will
serve all queries to all ip's.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Fxp0orguaFeed/~4/wj07JuwBfUQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.fxp0.org.ua/2008/apr/16/running-powerdns-keepalived/</feedburner:origLink></entry>
  <entry xml:base="http://www.fxp0.org.ua/rss/weblog/">
    <title type="text">Heimdal Kerberos with LDAP backend: opening database: ldap_sasl_bind_s: Can't contact LDAP server</title>
    <id>http://www.fxp0.org.ua/2008/jan/16/heimdal-kerberos-ldap-backend-cant-contact-server/</id>
    <updated>2008-01-16T11:35:15Z</updated>
    <published>2008-01-16T11:35:15Z</published>
    <link href="http://feedproxy.google.com/~r/Fxp0orguaFeed/~3/Bx3-Z2YQJno/" />
    <author>
      <name>Denis Kuzmichyov</name>
    </author>
    <content type="html">&lt;p&gt;
Setting up Heimdal Kerberos with LDAP backend i faced a weird problem.
In &lt;strong&gt;kadmin&lt;/strong&gt; i got following errors:
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;opening database: ldap_sasl_bind_s: Can't contact LDAP server&lt;/li&gt;
&lt;li&gt;kadm5_get_principals: Wrong database version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;strong&gt;Slapd&lt;/strong&gt; was running and KDC had all permissions though.
Despite such attempts, there were no activity in slapd logs.
&lt;/p&gt;

&lt;p&gt;
The problem was simple: whereas slapd creates its socket as &lt;i&gt;/var/run/slapd/ldapi&lt;/i&gt;,
Kerberos(/libldap?) tries to open it as &lt;i&gt;/var/run/ldapi&lt;/i&gt;.
So &lt;i&gt;ln -s /var/run/slapd/ldapi /var/run/ldapi&lt;/i&gt; has solved the problem.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Fxp0orguaFeed/~4/Bx3-Z2YQJno" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.fxp0.org.ua/2008/jan/16/heimdal-kerberos-ldap-backend-cant-contact-server/</feedburner:origLink></entry>
  <entry xml:base="http://www.fxp0.org.ua/rss/weblog/">
    <title type="text">Firefox crash in Ubuntu Gutsy Gibbon</title>
    <id>http://www.fxp0.org.ua/2007/dec/10/firefox-crash-ubuntu-gutsy-gibbon/</id>
    <updated>2007-12-10T13:05:51Z</updated>
    <published>2007-12-10T13:05:51Z</published>
    <link href="http://feedproxy.google.com/~r/Fxp0orguaFeed/~3/6DPLUAmcBCA/" />
    <author>
      <name>Denis Kuzmichyov</name>
    </author>
    <content type="html">&lt;p&gt;
Several days ago i updated my Ubuntu &amp;laquo;Gusty Gibon&amp;raquo; installation. And after
that Firefox keeps crashing randomly, saying &lt;b&gt;``Floating point exception``&lt;/b&gt; in console.
&lt;/p&gt;

&lt;p&gt;
The reason of this issue seems changes in libcairo2 made by security update. Latest version of this library is &lt;i&gt;libcairo2_1.4.10-1ubuntu4.1&lt;/i&gt;. Downgrading it to &lt;i&gt;libcairo2_1.4.10-1ubuntu4&lt;/i&gt; fixes the problem.
&lt;/p&gt;

&lt;p&gt;
The &lt;a rel="nofollow" href="https://bugs.launchpad.net/ubuntu/+source/libcairo/+bug/173861"&gt;bug is reported already&lt;/a&gt; and I hope libcairo2 will be fixed soon. But untill that moment &lt;b&gt;sudo apt-get install libcairo2=1.4.10-1ubuntu4&lt;/b&gt; can help.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;UPD:&lt;/b&gt; Issue is fixed in 1.4.10-1ubuntu4.2:
&lt;/p&gt;

&lt;pre&gt;
libcairo (1.4.10-1ubuntu4.2) gutsy-security; urgency=low

* Fix debian/patches/91_malloc-overflow-fixes.dpatch to avoid
    divide-by-zero; patch from upstream fixes (LP: #173861):
[...]
&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/Fxp0orguaFeed/~4/6DPLUAmcBCA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.fxp0.org.ua/2007/dec/10/firefox-crash-ubuntu-gutsy-gibbon/</feedburner:origLink></entry>
  <entry xml:base="http://www.fxp0.org.ua/rss/weblog/">
    <title type="text">Comments app in Django</title>
    <id>http://www.fxp0.org.ua/2007/dec/7/comments-app-django/</id>
    <updated>2007-12-07T08:32:30Z</updated>
    <published>2007-12-07T08:32:30Z</published>
    <link href="http://feedproxy.google.com/~r/Fxp0orguaFeed/~3/ukpMo6sIFPQ/" />
    <author>
      <name>Denis Kuzmichyov</name>
    </author>
    <content type="html">&lt;p&gt;
  I wonder how &lt;i&gt;``is_public``&lt;/i&gt; supposed to be used in FreeComments? Neither  &lt;b&gt;get_comment_count&lt;/b&gt; nor &lt;b&gt; get_comment_list&lt;/b&gt; seems aware of it.
&lt;/p&gt;

&lt;p&gt;
 Recently i set up &lt;a href="http://code.google.com/p/django-comment-utils/"&gt;comment_utils app&lt;/a&gt;, which can use akismet module and some other ways to decide if comment shouldn't be public. Akismet check works very good, and spam comments get &lt;i&gt;``is_public``&lt;/i&gt; flag set to &lt;i&gt;false&lt;/i&gt;. However, comments template tags &lt;b&gt;get_comment_count&lt;/b&gt; and &lt;b&gt; get_comment_list&lt;/b&gt; don't use it. And display/count comments no matter if they're public or not.
&lt;/p&gt;

&lt;p&gt;
As of now, i do the following:
&lt;/p&gt;

&lt;pre&gt;
{% get_free_comment_list for blog.entry object.id as comment_list %}
    {% for comment in comment_list %}
        {%if comment.is_public %}
        [...]
        {% endif %}
    {% endfor %}
&lt;/pre&gt;

&lt;p&gt;
 &lt;b&gt;get_free_comment_count&lt;/b&gt; still returns the number of all comments though.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Fxp0orguaFeed/~4/ukpMo6sIFPQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.fxp0.org.ua/2007/dec/7/comments-app-django/</feedburner:origLink></entry>
  <entry xml:base="http://www.fxp0.org.ua/rss/weblog/">
    <title type="text">Some things have broken in django/flup</title>
    <id>http://www.fxp0.org.ua/2007/dec/1/broken-django-flup-autoescape/</id>
    <updated>2007-12-01T18:24:49Z</updated>
    <published>2007-12-01T18:24:49Z</published>
    <link href="http://feedproxy.google.com/~r/Fxp0orguaFeed/~3/UL6Ifu2WqtA/" />
    <author>
      <name>Denis Kuzmichyov</name>
    </author>
    <content type="html">&lt;p&gt;
 After &lt;a rel="nofollow" href="http://code.djangoproject.com/changeset/6671"&gt;adding&lt;/a&gt;
&lt;a href="http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#Auto-escapingintemplates"&gt;autoescape &lt;/a&gt;stuff to Django svn, at least several things have broken it seems.
&lt;/p&gt;

&lt;p&gt;
Firstly i noticed the problem with ``flat pages``. Instead of seeing my static data, i got ``Unhadled exeption`` in reply. In logs i found following:
&lt;/p&gt;

&lt;pre&gt;
2007-12-01 17:39:13: (mod_fastcgi.c.2588) FastCGI-stderr: Traceback (most recent call last):
  File "/usr/lib/python2.5/site-packages/flup/server/fcgi_base.py", line 558, in run
    protocolStatus, appStatus = self.server.handler(self)
  File "/usr/lib/python2.5/site-packages/flup/server/fcgi_base.py", line 1120, in handler
    write(data)
  File "/usr/lib/python2.5/site-packages/flup/server/fcgi_base.py", line 1062, in write
    assert type(data) is str, 'write() argument must be string'
AssertionError: write() argument must be string
&lt;/pre&gt;

&lt;p&gt;
As seen above, error reported by Flup, which is used by Django to run as fastcgi server.
Type of data passed to line 1062 is &lt;b&gt;django.utils.safestring.SafeString&lt;/b&gt; now and AssertionError is raised.
&lt;/p&gt;

&lt;p&gt;
There's a &lt;a rel="nofollow" href="http://code.djangoproject.com/ticket/6063"&gt;ticket&lt;/a&gt; already created because of this issue, and even &lt;a rel="nofollow" href="http://trac.saddi.com/flup/ticket/28"&gt;reported&lt;/a&gt; to flup's author. But there's no solution to the problem as of now.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Fxp0orguaFeed/~4/UL6Ifu2WqtA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.fxp0.org.ua/2007/dec/1/broken-django-flup-autoescape/</feedburner:origLink></entry>
  <entry xml:base="http://www.fxp0.org.ua/rss/weblog/">
    <title type="text">PostgreSQL table partitioning and flow-export</title>
    <id>http://www.fxp0.org.ua/2007/sep/27/postgresql-table-partitioning-and-flow-export/</id>
    <updated>2007-09-27T13:47:10Z</updated>
    <published>2007-09-27T13:47:10Z</published>
    <link href="http://feedproxy.google.com/~r/Fxp0orguaFeed/~3/8581vXKKwuA/" />
    <author>
      <name>Denis Kuzmichyov</name>
    </author>
    <content type="html">&lt;p&gt;
To export data aggregated by &lt;strong&gt;flow-capture&lt;/strong&gt; to Postgresql, similar table structure
must be created:
&lt;/p&gt;

&lt;p&gt;&lt;textarea name="code" class="sql:nogutter" rows="15" cols="100"&gt;
CREATE TABLE flowdata (
    unix_secs   bigint NOT NULL,
    doctets     bigint NOT NULL,
    srcaddr     inet NOT NULL,
    dstaddr     inet NOT NULL,
    srcport     integer NOT NULL,
    dstport     integer NOT NULL,
    prot        integer NOT NULL
);
&lt;/textarea&gt;&lt;/p&gt;
&lt;p&gt;
After this, &lt;strong&gt;flow-capture&lt;/strong&gt; must be launched as following:
&lt;/p&gt;

&lt;pre&gt;
#file: /etc/flow-tools/flow-capture.conf
-w /var/flowdata -n 95  -N 3 -R /usr/local/bin/flowdata-export.sh 0/0/555
&lt;/pre&gt;

&lt;p&gt;
This means that it will run &lt;i&gt;/usr/local/bin/flowdata-export.sh&lt;/i&gt; script every time it rotates its log file. With the first argument as the flow file name after rotating. Here's is the simple script:
&lt;/p&gt;

&lt;pre&gt;
#!/bin/sh

LOGS=/var/flowdata
DB=dbuser:dbpass:dbhost:dbport:dbname:dbtable

if [ $# -lt 1 ]; then
    echo "USE: $0 &amp;lt;filename&amp;gt;"
    exit
fi

flow-export -f 5 -m UNIX_SECS,DOCTETS,SRCADDR,DSTADDR,SRCPORT,DSTPORT,PROT -u $DB &amp;lt; $LOGS/$1
&lt;/pre&gt;

&lt;p&gt;
There can be a lot of data in db, and it could be wise to split it into smaller chunks. This can be done using postgresql table partitioning. Here's how we can improve our database/table setup:
&lt;/p&gt;

&lt;p&gt;&lt;textarea name="code" class="sql:nogutter" rows="15" cols="100"&gt;
CREATE TABLE flowdata (
    unix_secs   bigint NOT NULL,
    doctets     bigint NOT NULL,
    srcaddr     inet NOT NULL,
    dstaddr     inet NOT NULL,
    srcport     integer NOT NULL,
    dstport     integer NOT NULL,
    prot        integer NOT NULL
);&lt;/p&gt;
&lt;p&gt;CREATE TABLE flowdata_01 (
    CHECK ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 1 )
) INHERITS (flowdata);&lt;/p&gt;
&lt;p&gt;CREATE TABLE flowdata_02 (
    CHECK ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 2 )
) INHERITS (flowdata);&lt;/p&gt;
&lt;p&gt;CREATE TABLE flowdata_03 (
    CHECK ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 3 )
) INHERITS (flowdata);&lt;/p&gt;
&lt;p&gt;CREATE TABLE flowdata_04 (
    CHECK ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 4 )
) INHERITS (flowdata);&lt;/p&gt;
&lt;p&gt;CREATE TABLE flowdata_05 (
    CHECK ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 5 )
) INHERITS (flowdata);&lt;/p&gt;
&lt;p&gt;CREATE TABLE flowdata_06 (
    CHECK ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 6 )
) INHERITS (flowdata);&lt;/p&gt;
&lt;p&gt;CREATE TABLE flowdata_07 (
    CHECK ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 7 )
) INHERITS (flowdata);&lt;/p&gt;
&lt;p&gt;CREATE TABLE flowdata_08 (
    CHECK ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 8 )
) INHERITS (flowdata);&lt;/p&gt;
&lt;p&gt;CREATE TABLE flowdata_09 (
    CHECK ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 9 )
) INHERITS (flowdata);&lt;/p&gt;
&lt;p&gt;CREATE TABLE flowdata_10 (
    CHECK ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 10 )
) INHERITS (flowdata);&lt;/p&gt;
&lt;p&gt;CREATE TABLE flowdata_11 (
    CHECK ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 11 )
) INHERITS (flowdata);&lt;/p&gt;
&lt;p&gt;CREATE TABLE flowdata_12 (
    CHECK ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 12 )
) INHERITS (flowdata);&lt;/p&gt;
&lt;p&gt;CREATE INDEX flowdata_01_unix_secs ON flowdata_01 ( unix_secs );
CREATE INDEX flowdata_01_srcaddr ON flowdata_01 ( srcaddr );
CREATE INDEX flowdata_01_dstaddr ON flowdata_01 ( dstaddr );
CREATE INDEX flowdata_01_srcport ON flowdata_01 ( srcport );
CREATE INDEX flowdata_01_dstport ON flowdata_01 ( dstport );
CREATE INDEX flowdata_01_prot ON flowdata_01 ( prot );&lt;/p&gt;
&lt;p&gt;CREATE INDEX flowdata_02_unix_secs ON flowdata_02 ( unix_secs );
CREATE INDEX flowdata_02_srcaddr ON flowdata_02 ( srcaddr );
CREATE INDEX flowdata_02_dstaddr ON flowdata_02 ( dstaddr );
CREATE INDEX flowdata_02_srcport ON flowdata_02 ( srcport );
CREATE INDEX flowdata_02_dstport ON flowdata_02 ( dstport );
CREATE INDEX flowdata_02_prot ON flowdata_02 ( prot );&lt;/p&gt;
&lt;p&gt;CREATE INDEX flowdata_03_unix_secs ON flowdata_03 ( unix_secs );
CREATE INDEX flowdata_03_srcaddr ON flowdata_03 ( srcaddr );
CREATE INDEX flowdata_03_dstaddr ON flowdata_03 ( dstaddr );
CREATE INDEX flowdata_03_srcport ON flowdata_03 ( srcport );
CREATE INDEX flowdata_03_dstport ON flowdata_03 ( dstport );
CREATE INDEX flowdata_03_prot ON flowdata_03 ( prot );&lt;/p&gt;
&lt;p&gt;CREATE INDEX flowdata_04_unix_secs ON flowdata_04 ( unix_secs );
CREATE INDEX flowdata_04_srcaddr ON flowdata_04 ( srcaddr );
CREATE INDEX flowdata_04_dstaddr ON flowdata_04 ( dstaddr );
CREATE INDEX flowdata_04_srcport ON flowdata_04 ( srcport );
CREATE INDEX flowdata_04_dstport ON flowdata_04 ( dstport );
CREATE INDEX flowdata_04_prot ON flowdata_04 ( prot );&lt;/p&gt;
&lt;p&gt;CREATE INDEX flowdata_05_unix_secs ON flowdata_05 ( unix_secs );
CREATE INDEX flowdata_05_srcaddr ON flowdata_05 ( srcaddr );
CREATE INDEX flowdata_05_dstaddr ON flowdata_05 ( dstaddr );
CREATE INDEX flowdata_05_srcport ON flowdata_05 ( srcport );
CREATE INDEX flowdata_05_dstport ON flowdata_05 ( dstport );
CREATE INDEX flowdata_05_prot ON flowdata_05 ( prot );&lt;/p&gt;
&lt;p&gt;CREATE INDEX flowdata_06_unix_secs ON flowdata_06 ( unix_secs );
CREATE INDEX flowdata_06_srcaddr ON flowdata_06 ( srcaddr );
CREATE INDEX flowdata_06_dstaddr ON flowdata_06 ( dstaddr );
CREATE INDEX flowdata_06_srcport ON flowdata_06 ( srcport );
CREATE INDEX flowdata_06_dstport ON flowdata_06 ( dstport );
CREATE INDEX flowdata_06_prot ON flowdata_06 ( prot );&lt;/p&gt;
&lt;p&gt;CREATE INDEX flowdata_07_unix_secs ON flowdata_07 ( unix_secs );
CREATE INDEX flowdata_07_srcaddr ON flowdata_07 ( srcaddr );
CREATE INDEX flowdata_07_dstaddr ON flowdata_07 ( dstaddr );
CREATE INDEX flowdata_07_srcport ON flowdata_07 ( srcport );
CREATE INDEX flowdata_07_dstport ON flowdata_07 ( dstport );
CREATE INDEX flowdata_07_prot ON flowdata_07 ( prot );&lt;/p&gt;
&lt;p&gt;CREATE INDEX flowdata_08_unix_secs ON flowdata_08 ( unix_secs );
CREATE INDEX flowdata_08_srcaddr ON flowdata_08 ( srcaddr );
CREATE INDEX flowdata_08_dstaddr ON flowdata_08 ( dstaddr );
CREATE INDEX flowdata_08_srcport ON flowdata_08 ( srcport );
CREATE INDEX flowdata_08_dstport ON flowdata_08 ( dstport );
CREATE INDEX flowdata_08_prot ON flowdata_08 ( prot );&lt;/p&gt;
&lt;p&gt;CREATE INDEX flowdata_09_unix_secs ON flowdata_09 ( unix_secs );
CREATE INDEX flowdata_09_srcaddr ON flowdata_09 ( srcaddr );
CREATE INDEX flowdata_09_dstaddr ON flowdata_09 ( dstaddr );
CREATE INDEX flowdata_09_srcport ON flowdata_09 ( srcport );
CREATE INDEX flowdata_09_dstport ON flowdata_09 ( dstport );
CREATE INDEX flowdata_09_prot ON flowdata_09 ( prot );&lt;/p&gt;
&lt;p&gt;CREATE INDEX flowdata_10_unix_secs ON flowdata_10 ( unix_secs );
CREATE INDEX flowdata_10_srcaddr ON flowdata_10 ( srcaddr );
CREATE INDEX flowdata_10_dstaddr ON flowdata_10 ( dstaddr );
CREATE INDEX flowdata_10_srcport ON flowdata_10 ( srcport );
CREATE INDEX flowdata_10_dstport ON flowdata_10 ( dstport );
CREATE INDEX flowdata_10_prot ON flowdata_10 ( prot );&lt;/p&gt;
&lt;p&gt;CREATE INDEX flowdata_11_unix_secs ON flowdata_11 ( unix_secs );
CREATE INDEX flowdata_11_srcaddr ON flowdata_11 ( srcaddr );
CREATE INDEX flowdata_11_dstaddr ON flowdata_11 ( dstaddr );
CREATE INDEX flowdata_11_srcport ON flowdata_11 ( srcport );
CREATE INDEX flowdata_11_dstport ON flowdata_11 ( dstport );
CREATE INDEX flowdata_11_prot ON flowdata_11 ( prot );&lt;/p&gt;
&lt;p&gt;CREATE INDEX flowdata_12_unix_secs ON flowdata_12 ( unix_secs );
CREATE INDEX flowdata_12_srcaddr ON flowdata_12 ( srcaddr );
CREATE INDEX flowdata_12_dstaddr ON flowdata_12 ( dstaddr );
CREATE INDEX flowdata_12_srcport ON flowdata_12 ( srcport );
CREATE INDEX flowdata_12_dstport ON flowdata_12 ( dstport );
CREATE INDEX flowdata_12_prot ON flowdata_12 ( prot );&lt;/p&gt;
&lt;p&gt;CREATE OR REPLACE RULE flowdata_insert_01 AS
ON INSERT TO flowdata WHERE
    ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 1 )
DO INSTEAD
    INSERT INTO flowdata_01 VALUES ( NEW.unix_secs,
                                     NEW.doctets,
                                     NEW.srcaddr, 
                                     NEW.dstaddr,
                                     NEW.srcport,
                                     NEW.dstport,
                                                                         NEW.prot );&lt;/p&gt;
&lt;p&gt;CREATE OR REPLACE RULE flowdata_insert_02 AS
ON INSERT TO flowdata WHERE
    ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 2 )
DO INSTEAD
    INSERT INTO flowdata_02 VALUES ( NEW.unix_secs,
                                     NEW.doctets,
                                     NEW.srcaddr, 
                                     NEW.dstaddr,
                                     NEW.srcport,
                                     NEW.dstport,
                                                                         NEW.prot );&lt;/p&gt;
&lt;p&gt;CREATE OR REPLACE RULE flowdata_insert_03 AS
ON INSERT TO flowdata WHERE
    ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 3 )
DO INSTEAD
    INSERT INTO flowdata_03 VALUES ( NEW.unix_secs,
                                     NEW.doctets,
                                     NEW.srcaddr, 
                                     NEW.dstaddr,
                                     NEW.srcport,
                                     NEW.dstport,
                                                                         NEW.prot );&lt;/p&gt;
&lt;p&gt;CREATE OR REPLACE RULE flowdata_insert_04 AS
ON INSERT TO flowdata WHERE
    ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 4 )
DO INSTEAD
    INSERT INTO flowdata_04 VALUES ( NEW.unix_secs,
                                     NEW.doctets,
                                     NEW.srcaddr, 
                                     NEW.dstaddr,
                                     NEW.srcport,
                                     NEW.dstport,
                                                                         NEW.prot );&lt;/p&gt;
&lt;p&gt;CREATE OR REPLACE RULE flowdata_insert_05 AS
ON INSERT TO flowdata WHERE
    ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 5 )
DO INSTEAD
    INSERT INTO flowdata_05 VALUES ( NEW.unix_secs,
                                     NEW.doctets,
                                     NEW.srcaddr, 
                                     NEW.dstaddr,
                                     NEW.srcport,
                                     NEW.dstport,
                                                                         NEW.prot );&lt;/p&gt;
&lt;p&gt;CREATE OR REPLACE RULE flowdata_insert_06 AS
ON INSERT TO flowdata WHERE
    ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 6 )
DO INSTEAD
    INSERT INTO flowdata_06 VALUES ( NEW.unix_secs,
                                     NEW.doctets,
                                     NEW.srcaddr, 
                                     NEW.dstaddr,
                                     NEW.srcport,
                                     NEW.dstport,
                                                                         NEW.prot );&lt;/p&gt;
&lt;p&gt;CREATE OR REPLACE RULE flowdata_insert_07 AS
ON INSERT TO flowdata WHERE
    ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 7 )
DO INSTEAD
    INSERT INTO flowdata_07 VALUES ( NEW.unix_secs,
                                     NEW.doctets,
                                     NEW.srcaddr, 
                                     NEW.dstaddr,
                                     NEW.srcport,
                                     NEW.dstport,
                                                                         NEW.prot );&lt;/p&gt;
&lt;p&gt;CREATE OR REPLACE RULE flowdata_insert_08 AS
ON INSERT TO flowdata WHERE
    ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 8 )
DO INSTEAD
    INSERT INTO flowdata_08 VALUES ( NEW.unix_secs,
                                     NEW.doctets,
                                     NEW.srcaddr, 
                                     NEW.dstaddr,
                                     NEW.srcport,
                                     NEW.dstport,
                                                                         NEW.prot );&lt;/p&gt;
&lt;p&gt;CREATE OR REPLACE RULE flowdata_insert_09 AS
ON INSERT TO flowdata WHERE
    ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 9 )
DO INSTEAD
    INSERT INTO flowdata_09 VALUES ( NEW.unix_secs,
                                     NEW.doctets,
                                     NEW.srcaddr, 
                                     NEW.dstaddr,
                                     NEW.srcport,
                                     NEW.dstport,
                                                                         NEW.prot );&lt;/p&gt;
&lt;p&gt;CREATE OR REPLACE RULE flowdata_insert_10 AS
ON INSERT TO flowdata WHERE
    ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 10 )
DO INSTEAD
    INSERT INTO flowdata_10 VALUES ( NEW.unix_secs,
                                     NEW.doctets,
                                     NEW.srcaddr, 
                                     NEW.dstaddr,
                                     NEW.srcport,
                                     NEW.dstport,
                                                                         NEW.prot );&lt;/p&gt;
&lt;p&gt;CREATE OR REPLACE RULE flowdata_insert_11 AS
ON INSERT TO flowdata WHERE
    ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 11 )
DO INSTEAD
    INSERT INTO flowdata_11 VALUES ( NEW.unix_secs,
                                     NEW.doctets,
                                     NEW.srcaddr, 
                                     NEW.dstaddr,
                                     NEW.srcport,
                                     NEW.dstport,
                                                                         NEW.prot );&lt;/p&gt;
&lt;p&gt;CREATE OR REPLACE RULE flowdata_insert_12 AS
ON INSERT TO flowdata WHERE
    ( EXTRACT(MONTH FROM to_timestamp(unix_secs) ) = 12 )
DO INSTEAD
    INSERT INTO flowdata_12 VALUES ( NEW.unix_secs,
                                     NEW.doctets,
                                     NEW.srcaddr, 
                                     NEW.dstaddr,
                                     NEW.srcport,
                                     NEW.dstport,
                                                                         NEW.prot );&lt;/p&gt;
&lt;/textarea&gt;

&lt;p&gt;
After this, there will be a dedicated table for every month. Data can be insterted into &lt;i&gt;flowdata&lt;/i&gt; table as before (as well as selected), though in fact it will reside in its corresponding table. Such structure is good for keeping logs for the last year. All we need to do
is to flush current month table every first day of the month. Thus we'll always have data for the last 12 monthes.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Fxp0orguaFeed/~4/8581vXKKwuA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.fxp0.org.ua/2007/sep/27/postgresql-table-partitioning-and-flow-export/</feedburner:origLink></entry>
</feed>

