Sauna Sprint 2010 in Helsinki

written by Domen Kožar, on May 17, 2010 9:43:00 PM.

At last, so called Sauna Sprint 2010 has been announced. First of all, cheers to Nejc and Joni for all the work done.

What is the story behind the Sauna Sprint? At the end of 2009, EESTEC IT team had a sprint at Chairpersons meet in Skopje (we had a great time, big thanks to organizers!). We created from scratch the new eestec.net portal (fully open-sourced and documented).

So, the idea came to make a sauna sprint, hosted by Joni in Helsinki, that would eventually make Plone itself a tiny bit better world by our small team. Some of our experienced Plone developers will be introducing newcomers to Plone CMS. More details about the whole week can be found at plone.org.

Leaning to the darker side of the story, I'm still a student and returning airplane ticket for Ljubljana <-> Helsinki is about 400$ 300$ at the moment. As I currently don't see an option to collect the money in given time, I have opened chipin account for anyone willing to give me a hand. Nevertheless, I have been contributing to Plone in the past.

Eduroam in Slovenia for Linux wicd client

written by Domen Kožar, on Apr 14, 2010 10:59:00 AM.

After year and a half on Faculty of Electrical Engineering, I have managed to get working Eduroam WPA enterprise encryption on wicd networking client for GNU Linux (pretty good alternative to NetworkManager, but with Unix philosophy in mind). Here is wicd encryption template for wpa_supplicant:
name = eap-ttls (Eduroam sl)
version = 1
require anon_identity *Anonymous_Identity ca_cert *Path_to_CA_Cert identity *Identity password *Password
----
eapol_version=1
ap_scan=1
ctrl_interface=/var/run/wpa_supplicant
network={
    ssid="$_ESSID"
    scan_ssid=$_SCAN
    proto=WPA WPA2
    key_mgmt=WPA-EAP
    group=CCMP TKIP
    eap=TTLS
    mixed_cell=1
    peerkey=1
    phase2="auth=PAP"
    ca_cert="$_CA_CERT"
    anonymous_identity="$_ANON_IDENTITY"
    identity="$_IDENTITY"
    password="$_PASSWORD"
}
Cacert is actually not needed, but if I understand correctly it provides encryption for data traffic. Here is full procedure how to get eduroam working with wicd:
  • Install wicd for your favourite Linux distribution
  • $ emerge -av wicd
  • Copy template to wicd
  • $ cp eap-ttls > /etc/wicd/encrpytion/templates
  • Make template active
  • $ echo "eap-ttls" >> /etc/wicd/encryption/tempalates/active
  • Start wicd
  • $ sudo /etc/init.d/wicd start
  • $ wicd-client
  • When configuring eduroam, select eap-ttls template and provide username, password, path to cacert.der and anonymous identity
PS: thanks to @brodul for low level debugging of wpa_supplicant.

Redmine and mercurial-server

written by Domen Kožar, on Mar 11, 2010 5:19:00 PM.

I managed to put together Redmine as issuetracker/wiki/younameit and mercurial-server which manages multi-user access to mercurial repository through ssh.

Redmine installation: redmine:redmine /var/lib/redmine/
Mercurial-server installation: hg:hg /home/hg/
I have put redmine into group hg.

The issue

When you add repository lets say /home/hg/vim/ to redmine, it does not recognise it. Not until you ofcourse make repository read/writeable for hg group (chmod 760). Now comes punchline; $HOME directory must be executable in order for Redmine to read repository info. In my case, I had to do "chmod 710 /home/hg/" in order to redmine to work.

Note that if you change write permissions to home user in linux, pubic keys ssh authentication will not work anymore for security reasons.

Slovenian Gentoo community mirror introduction

written by Domen Kožar, on Feb 2, 2010 12:35:00 AM.

I'm very happy first stage of my Gentoo mirror project is done.

More information about server, how to use it with Gentoo and statitics can be read here

Server is an old box of my girlfriend (thanks!). The box used to have issues with rebooting during ubuntu gnome session, I hope it was graphic's card fault (no graphic desktop is running now).

Consider this beta testing period, spread the world of Slovenian Gentoo mirror! Link is 50/50mbit FTTH. Current location of server is temporary, until I find free provider to sponzor full 100mbit link. Leave any questions at domen[AT]dev.si

Rsync mirror
HTTP source mirror
Statistics

pickle and cStringIO

written by Domen Kožar, on Jan 19, 2010 4:15:18 PM.

More of a note to myself:

You just cannot (I guess because of lacking proper pickling C API support) pickle cStringIO.StringIO instances. Use StringIO.StringIO instead.

Small update to wbus.fubar.si

written by Domen Kožar, on Jan 15, 2010 4:15:00 AM.

As most of you already know, I have small wap site running to check when LPP bus is coming to a bus station in Ljubljana. Today I added name of direction for each bus. Happy puncual days! link

upcoming project: spaces

written by Domen Kožar, on Jan 3, 2010 12:00:00 AM.

I have been thinking about my development issue for a while. Working on many projects and quick switching is a pain. I could not find a solution that even thouches this subject, so I started my own development project management called spaces.

Here is the basic configuration file (in YAML) that already works:
--- !project
name: gspaces

--- !chromium-browser
urls:
    - http://docs.python.org/dev/library/logging.html
    - http://docs.python.org/dev/library/subprocess.html
    - http://docs.python.org/dev/library/optparse.html
    - http://en.wikipedia.org/wiki/YAML#Basic_components_of_YAML
    - http://docs.repoze.org/configuration/index.html

--- !gvim
mode: tabbed
open:
    - gspaces/__init__.py
    - setup.py
    - gspaces.yml

--- !screen
windows:
    - title: gspaces 
      cmd: python manage.py runserver
Obviously, it prepares your workspace and opens some stuff for you. I also plan to add "shutdown" support. I will release it under BSD licence and hope somebody else will find it useful.

Fragmenting one big nginx config

written by Domen Kožar, on Nov 15, 2009 3:51:00 PM.

Getting lost in all glory of big nginx.conf is not that uncommon. I could not stand it anymore, so I wrote this little clever script with support of pyparsing module for Python:
from pyparsing import *

nginx_conf_expr = OneOrMore(Suppress(SkipTo('server' + White())) + originalTextFor(Word('server ') + nestedExpr('{', '}'))).parseWithTabs()
server_name_expr = (Suppress(SkipTo('server_name' + White()) + Word('server_name') + White()) +  CharsNotIn(' ;')).parseWithTabs()

nginx_conf = open('nginx.conf').read()
new_nginx_conf = str(nginx_conf)

for server in nginx_conf_expr.parseString(nginx_conf):
    try:
        name = server_name_expr.parseString(server)[0]
        f = open('nginxsite_%s.conf' % name, 'w+')
        f.write(str(server))
        f.close()

	# update nginx config
	new_nginx_conf = new_nginx_conf.replace(str(server), '')
    except:
        print 'Entry failed:\n', server

open('new_nginx.conf', 'w').write(new_nginx_conf)
Warning! Do not use that on production data before making a backup copy! Script has been tested on ~1500 long nginx config, and is not bulletproof

This script basically extracts all server {} entries and writes them to separate files named "nginxsite_sitename.conf" (all in current working directory). It also produces new_nginx.conf that does not include extracted entries. All you need to do is to add include directive to new_nginx.conf like this:

  # path is relative to this global nginx.conf
  include sites/*.conf;
Note that I haven't made it very customizable (it should be with little python knowledge).

Example:
temp $ ls
migrate_nginx_config.py
nginx.conf

temp $ python migrate_nginx_config.py
migrate_nginx_config.py
nginx.conf
new_nginx.conf
nginxsite_www.fubar.si.conf
nginxsite www.tvnext.si.conf
...

Public release of BurnerOnFire

written by Domen Kožar, on Oct 3, 2009 9:59:00 AM.

I'm proud to release first public version of BurnerOnFire.

BurnerOnFire is written in Python, providing simple GUI(GTK+) and CLI interface to burning .iso images simultaneously to multiple CD/DVD burners.

Documentation and install instructions are located at kiberpipa.org.

Features:
  • write iso image to multiple CD/DVD burners
  • count number of successfully burned discs
  • option to limit number of discs to be burned
  • detects write speeds and intersect results
  • eject/close tray burner
  • TODO: write multiple iso images from a folder

Writing post-installation-script to create shortcut on Windows desktop

written by Domen Kožar, on Sep 27, 2009 3:53:00 PM.

I'm building an GUI program that will be used on Windows platform. I already accepted the fact that I will need three installers (Python, GTK stuff, and one for my package).

Now, I want my installer to place shiny little shortcut on my desktop. Here is the command to generate Window installer:
python setup.py egg_info -RDb "" bdist_wininst --install-script postinstall.py
egg_info -RDb will clear and developemnt tags from release name, so the output will be package-0.1 instead of package-0.1dev
bdist_wininst will invoke Windows Installer builder
--install-script postinstall.py commands that postinstall.py script mentioned in setup.py file will be used for post installation.

Here is the setup.py slice. Note that this script must lie in root of our package:
...
setup(name='package',
      ...
      scripts=['postinstall.py'],
      ...
      )
And finally, the postinstall.py:
#! python
# -*- coding: utf-8 -*-

import os
import sys
import shutil
import my_package

DESKTOP_FOLDER = get_special_folder_path("CSIDL_DESKTOPDIRECTORY")
NAME = 'program.lnk'

if sys.argv[1] == '-install':
    create_shortcut(
        os.path.join(sys.prefix, 'pythonw.exe'), # program
        'Description of the shortcut', # description
        NAME, # filename
        mypackage.__file__, # parameters
        '', # workdir
        os.path.join(os.path.dirname(my_package.__file__), 'favicon.ico'), # iconpath
    )
    # move shortcut from current directory to DESKTOP_FOLDER
    shutil.move(os.path.join(os.getcwd(), NAME),
                os.path.join(DESKTOP_FOLDER, NAME))
    # tell windows installer that we created another 
    # file which should be deleted on uninstallation
    file_created(os.path.join(DESKTOP_FOLDER, NAME))

if sys.argv[1] == '-remove':
    pass
    # This will be run on uninstallation. Nothing to do.
[1] Note that I'm using some custom builtin functions, you can read more about here.
[2] I'm invoking pythonw.exe instead of python.exe because I don't want console to be visible (we are using GUI, remember).
[3] In __init__.py of the my_package, use the casual __name__ == '__main__' trick.