<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>futterblog</title><link href="https://baccenfutter.crew.c-base.org/futterblog/" rel="alternate"></link><link href="https://baccenfutter.crew.c-base.org/futterblog/feeds/all.atom.xml" rel="self"></link><id>https://baccenfutter.crew.c-base.org/futterblog/</id><updated>2014-02-16T22:16:57+01:00</updated><entry><title>VimWiki - Das Wiki-Plugin für Vim</title><link href="https://baccenfutter.crew.c-base.org/futterblog/vimwiki-das-wiki-plugin-fur-vim.html" rel="alternate"></link><updated>2014-02-16T22:16:57+01:00</updated><author><name>baccenfutter</name></author><id>tag:https://baccenfutter.crew.c-base.org/futterblog,2014-02-16:vimwiki-das-wiki-plugin-fur-vim.html</id><summary type="html">&lt;p&gt;Ich habe vor ein paar Tagen ein neues Vim-Plugin gefunden, dass ich
mittlerweile so sexy finde, dass ich es euch nicht vorenthalten möchte.
Das Plugin heisst VimWiki und kann
&lt;a href="http://www.vim.org/scripts/script.php?script_id=2226"&gt;hier&lt;/a&gt;
heruntergeladen werden. Wahlweise kann man das Plugin auch direkt aus
dem &lt;a href="https://github.com/vimwiki/vimwiki"&gt;Github Repository&lt;/a&gt; heraus
installieren.&lt;/p&gt;
&lt;p&gt;Das Plugin verwaltet verlinkte Textdateien innerhalb eines Ordners und
bietet dafür allerhand nützlicher Key-Bindings. Daneben bietet es
Unterstützung für Checklisten, mehrere Wikis in verschiedenen Ordnern,
sowie einen HTML Renderer mit einer mitfelieferten style.css zum
individualisieren.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Das Plugin herunterladen und nach &lt;em&gt;/tmp/&lt;/em&gt; auspacken&lt;/li&gt;
&lt;li&gt;Die Datei vimwiki-?-?.vba mit Vim öffnen&lt;/li&gt;
&lt;li&gt;Sourcen mit: :so %&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Bedienung&lt;/h2&gt;
&lt;p&gt;Es gibt eine umfangreiche &lt;a href="https://github.com/vimwiki/vimwiki/blob/master/doc/vimwiki.txt"&gt;Dokumentation auf
Github&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zum öffnen der Index-Seite in Vim einfach &lt;code&gt;\ww&lt;/code&gt; tippen.&lt;/li&gt;
&lt;li&gt;Einen neuen Link erstellt man durch drücken von &lt;code&gt;Return&lt;/code&gt; auf einem
  beliebigen Wort.&lt;/li&gt;
&lt;li&gt;Einen neuen Artikel erstellt man durch drücken von &lt;code&gt;Return&lt;/code&gt; auf einem
  Link.&lt;/li&gt;
&lt;li&gt;Einen Artikel zurück kommt man mit der &lt;code&gt;Backspace&lt;/code&gt; Taste.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ein kurzer Blick lohnt sich!&lt;/p&gt;</summary><category term="linux"></category><category term="vim"></category><category term="dokumentation"></category></entry><entry><title>Wie ich am lokalen Datenverkehr teilhabe</title><link href="https://baccenfutter.crew.c-base.org/futterblog/wie-ich-am-lokalen-datenverkehr-teilhabe.html" rel="alternate"></link><updated>2013-12-28T04:39:09+01:00</updated><author><name>baccenfutter</name></author><id>tag:https://baccenfutter.crew.c-base.org/futterblog,2013-12-28:wie-ich-am-lokalen-datenverkehr-teilhabe.html</id><summary type="html">&lt;p&gt;Weil mir der Network-Manager vor langer Zeit einmal zu viel auf den Sack
gegangen ist, bin ich auf WICD umgestiegen. Der machte mir dann aber aus
verschiedenen Gründen auch nicht all zu lange Spaß. Etwa zu dieser Zeit
flog mit dann zufällig ein kleines Shell-Script von 'grenouille' in die
Hände, mit dem er seine diversen Netze direkt aus der Shell verwaltete.&lt;/p&gt;
&lt;p&gt;Ich habe ein paar encfs Zeilen in das Script gehackt und es viele Jahre
lang absolut zufrieden benutzt und gelegentlich ausgebaut. By popular
demand ist es dann irgendwann in ein &lt;a href="https://github.com/baccenfutter/netconf/"&gt;Git-Repo&lt;/a&gt; gewandert und
veröffentlicht worden. Plötzlich benutzen Member das Script, die ich
kaum bis garnicht kenne, und das finde ich super.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Das grobe Ganze&lt;/h2&gt;
&lt;p&gt;Am Laptop will man häufig das WLAN wechseln. Das soll schnell und
komfortabel von statten gehen. Schnell und komfortabel heisst bei mir
'wpa_supplicant'. Alles Geläufige, was es da so drum herum gibt ist
meiner persönlichen Ansicht nach... nicht ganz so überzeugend.&lt;/p&gt;
&lt;p&gt;Der große Nachteil bei wpa_supplicant ist, dass für verschlüsselte WLANs
eine Konfigurationsdatei mit dem Klartextpasswort fuer das jeweilige
WLAN im Dateisystem hinterlegt werden muss. Die Dateien gehören zwar
root, allerdings ist das kein großes Hindernis, wenn das Notebook mal
geklaut werden sollte. Ich persönlich bin kein großer Freund davon ganze
Partitionen oder gar die ganze HDD zu verschlüsseln - das schafft nur
Komplexität an Stellen wo man keine haben will. Der Benefit sind
zahlreiche verschlüsselte open-source Binaries und Libs, während das
Betriebssystem unnötig ackern muss und ich am Ende nicht mehr booten
kann, weil "Nein? Doch! Oh!".&lt;/p&gt;
&lt;p&gt;Darum benutze ich seit Jahren &lt;a href="http://www.arg0.net/encfs"&gt;encfs&lt;/a&gt;, um einzelne Verzeichnisse zu
verschlüsseln, wo es Sinn ergibt - unter Anderem, um meine ganzen
wpa_supplicant Konfigurationsdateien zu verschlüsseln. Um meine ganzen
encfs Verzeichnisse besser verwalten zu können, habe ich einen kleinen
Wrapper namens &lt;a href="https://github.com/baccenfutter/enconfig/"&gt;enconfig&lt;/a&gt; drum herum gehackt.&lt;/p&gt;
&lt;p&gt;Und weil ich so verdammt faul bin, habe ich einen &lt;a href="https://gist.github.com/baccenfutter/848179fd8750a1541e6d"&gt;Bash-Alias&lt;/a&gt; fuer alle
meine Netze, die die beiden Wrapper wrappen. :P&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Einrichtung&lt;/h2&gt;
&lt;p&gt;Hier versuche ich mal eine kleine Anleitung zusammen zu stellen, um mein
Setup nach zu bauen. Feedback und Verbesserungsvorschläge gerne per
Mail.&lt;/p&gt;
&lt;h3&gt;enconfig&lt;/h3&gt;
&lt;p&gt;Zuerst installieren wir encfs, wpa_supplicant und enconfig. Wir brauchen
den wpa_supplicant zwar noch nicht wirklich fuer enconfig, aber wir
installieren ihn einfach gleich mal mit.&lt;/p&gt;
&lt;p&gt;Als root:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;aptitude install encfs wpa_supplicant
git clone git@github.com/baccenfutter/enconfig.git
ln -s &lt;span class="nv"&gt;$PWD&lt;/span&gt;/enconfig/enconfig /usr/local/bin/
ln -s /usr/local/bin/enconfig /usr/local/bin/encup
ln -s /usr/local/bin/enconfig /usr/local/bin/encdown
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/etc/wpa_wupplicant/.wpa /etc/wpa_supplicant/wpa&amp;quot;&lt;/span&gt; &amp;gt; ~/.privatedirs
encup 1
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dann erstellen wir eine erste wpa_supplicant.cfg:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;ssid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;access-point-ssid&amp;quot;&lt;/span&gt;  &lt;span class="c"&gt;# hier die SSID des AP eintragen&lt;/span&gt;
encup 1
cat &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF &amp;gt; /etc/wpa_supplicant/wpa/foo.conf&lt;/span&gt;
&lt;span class="s"&gt;network={&lt;/span&gt;
&lt;span class="s"&gt;    ssdid=$ssid&lt;/span&gt;
&lt;span class="s"&gt;    key_mgmt=NONE&lt;/span&gt;
&lt;span class="s"&gt;}&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
encdown 1
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Fertig.&lt;/p&gt;
&lt;h3&gt;Net-Conf&lt;/h3&gt;
&lt;p&gt;Kommen wir zur Installation von Net-Conf.&lt;/p&gt;
&lt;p&gt;Als root:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;aptitude install python-ipaddr pip
pip install net-conf
ln -s /usr/lib/python2.7/site-packages/netconf/netconf.sh /usr/local/bin/netconf
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dann erstellen wir eine kleine Public-AP config:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;netconf     &lt;span class="c"&gt;# einmal durchlaufen lassen, damit das&lt;/span&gt;
            &lt;span class="c"&gt;# Konfigurationsverzeichnis erstellt wird&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/.config/net_conf
cp static-wifi-example foo.py
&lt;span class="nb"&gt;cd&lt;/span&gt; -
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;... und probieren sie auch gleich mal aus:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;netconf foo
&lt;/pre&gt;&lt;/div&gt;


&lt;hr /&gt;
&lt;h2&gt;Runde Ecken&lt;/h2&gt;
&lt;p&gt;Jetzt einfach beliebig viel wpa_supplicant.cfgs nach
/etc/wpa_supplicant/wpa/ legen und dann einen Bash-Alias für die
Wichtigsten einrichten:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;net_mywifi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;encup 1 &amp;amp;&amp;amp; netconf foo &amp;amp;&amp;amp; encdown 1&amp;#39;&lt;/span&gt;
net_mywifi
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Die meisten Orte, an denen ich mein Laptop aufklappe sind Orte, an denen
ich mich häufiger aufhalten (e.g. zu Hause, auf der c-base, etc). Ich
klappe mein Notebook auf und tippe 'net_cbase' und schwupps bin ich
online.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;# net_cbase &lt;/span&gt;
&lt;span class="n"&gt;Mounting&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wpa_supplicant&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wpa&lt;/span&gt;
&lt;span class="n"&gt;EncFS&lt;/span&gt; &lt;span class="n"&gt;Password&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;

&lt;span class="n"&gt;utils&lt;/span&gt;      &lt;span class="n"&gt;killing&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="n"&gt;daemons&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;utils&lt;/span&gt;      &lt;span class="n"&gt;resetting&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="n"&gt;interfaces&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;iface&lt;/span&gt;      &lt;span class="n"&gt;ifup&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wlan0&lt;/span&gt;
&lt;span class="n"&gt;supplicant&lt;/span&gt; &lt;span class="n"&gt;connecting&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wpa_supplicant&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wpa&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;crew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;
&lt;span class="n"&gt;iface&lt;/span&gt;      &lt;span class="n"&gt;ifup&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wlan0&lt;/span&gt;
&lt;span class="n"&gt;address&lt;/span&gt;    &lt;span class="n"&gt;configuring&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wlan0&lt;/span&gt;
&lt;span class="n"&gt;gateway&lt;/span&gt;    &lt;span class="n"&gt;routing&lt;/span&gt; &lt;span class="n"&gt;via&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;10.0.1.254&lt;/span&gt;
&lt;span class="n"&gt;iface&lt;/span&gt;      &lt;span class="n"&gt;ifup&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wlan0&lt;/span&gt;
&lt;span class="n"&gt;address&lt;/span&gt;    &lt;span class="n"&gt;configuring&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a02&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f28&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wlan0&lt;/span&gt;
&lt;span class="n"&gt;gateway&lt;/span&gt;    &lt;span class="n"&gt;routing&lt;/span&gt; &lt;span class="n"&gt;via&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a02&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f28&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;resolver&lt;/span&gt;   &lt;span class="n"&gt;resolving&lt;/span&gt; &lt;span class="n"&gt;via&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;10.0.1.254&lt;/span&gt;
&lt;span class="n"&gt;Unmounting&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wpa_supplicant&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wpa&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="linux"></category><category term="gentoo"></category><category term="encryption"></category><category term="wifi"></category><category term="python"></category></entry><entry><title>Apple MagicMouse unter Gentoo/Linux</title><link href="https://baccenfutter.crew.c-base.org/futterblog/apple-magicmouse-unter-gentoolinux.html" rel="alternate"></link><updated>2013-06-27T20:48:23+02:00</updated><author><name>baccenfutter</name></author><id>tag:https://baccenfutter.crew.c-base.org/futterblog,2013-06-27:apple-magicmouse-unter-gentoolinux.html</id><summary type="html">&lt;p&gt;Ich bewege mich eher in der Linux Welt und bin alles Andere als ein Apple
Fanboy. Eine kleine Schw&amp;auml;che muss ich allerdings zugeben... die Apple
MagicMouse.&lt;/p&gt;
&lt;p&gt;Schon als ich sie das erste Mal benutzt habe, habe ich mir gesagt: "Also die,
die wuerde ich kaufen." Das habe ich dann auch gestern getan. Wie gesagt, bewege
ich mich allerdings eher in der Linux Welt.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Mein Setup&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Lenovo T420&lt;/li&gt;
&lt;li&gt;Gentoo (~amd64)&lt;/li&gt;
&lt;li&gt;gentoo-sources-3.11.1&lt;/li&gt;
&lt;li&gt;Xserver&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gentoo.de/doc/de/fluxbox-config.xml"&gt;Fluxbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gentoo.de/doc/de/bluetooth-guide.xml"&gt;Bluetooth&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Howto&lt;/h2&gt;
&lt;p&gt;Mittlerweile hat der Linux Kernel einen nativen Treiber fuer die Apple
MagicMouse. Input-devices (vor allem, via BlueTooth) kompiliere ich mir in aller
Regel als Kernelmodul, damit nicht mein ganzes System die Hufe hebt, wenn das
Device mal spinnt.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;Symbol&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;HID_MAGICMOUSE&lt;/span&gt; &lt;span class="o"&gt;[=&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tristate&lt;/span&gt;
&lt;span class="n"&gt;Prompt&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Apple&lt;/span&gt; &lt;span class="n"&gt;Magic&lt;/span&gt; &lt;span class="n"&gt;Mouse&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Trackpad&lt;/span&gt; &lt;span class="n"&gt;multi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;touch&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt;
&lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Device&lt;/span&gt; &lt;span class="n"&gt;Drivers&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;HID&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;HID&lt;/span&gt; &lt;span class="n"&gt;bus&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HID&lt;/span&gt; &lt;span class="o"&gt;[=&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;     &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Special&lt;/span&gt; &lt;span class="n"&gt;HID&lt;/span&gt; &lt;span class="n"&gt;drivers&lt;/span&gt;
&lt;span class="n"&gt;Defined&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="sr"&gt;/hid/&lt;/span&gt;&lt;span class="n"&gt;Kconfig&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;402&lt;/span&gt;
&lt;span class="n"&gt;Depends&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;INPUT&lt;/span&gt; &lt;span class="o"&gt;[=&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;HID&lt;/span&gt; &lt;span class="o"&gt;[=&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Mit dieser Konfiguration fuer die Maus baue ich meinen Kernel dann neu und rolle
ihn aus.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;make&lt;/span&gt;
&lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt;
&lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;modules_install&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Anschlie&amp;szlig;end lade ich das Kernelmodul nach.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;modprobe&lt;/span&gt; &lt;span class="n"&gt;hid_magicmouse&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Unter Fluxbox kann ich BlueMan als Bluetooth-Manager sehr empfehlen. Warum? Er
funktioniert einfach out-of-the-box.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;emerge&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;av&lt;/span&gt; &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;wireless&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;blueman&lt;/span&gt;
&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;blueman-applet &amp;amp;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fluxbox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Fertig. Nie wieder Bluetooth Gefrickel!&lt;/p&gt;
&lt;p&gt;Den Blueman-Manager &amp;ouml;ffnet man durch Klick auf das Icon im Tray. Dann
einfach auf "Suche" klicken und die Maus einschalten. Jetzt kann die Maus
hinzugefuegt. Die PIN lautet "0000". Zuletzt empfielt es sich das Device auf
"trusted" zu stellen, damit beim Einschalten automatisch eine Verbindung
hergestellt wird.&lt;/p&gt;</summary><category term="linux"></category><category term="gentoo"></category></entry><entry><title>Out of Inodes - Dateien in Verzeichnissen zählen</title><link href="https://baccenfutter.crew.c-base.org/futterblog/out-of-inodes-dateien-in-verzeichnissen-zahlen.html" rel="alternate"></link><updated>2013-06-27T20:48:23+02:00</updated><author><name>baccenfutter</name></author><id>tag:https://baccenfutter.crew.c-base.org/futterblog,2013-06-27:out-of-inodes-dateien-in-verzeichnissen-zahlen.html</id><summary type="html">&lt;p&gt;Wenn die Inodes mal wieder volllaufen sollten, bin ich vorbereitet. &amp;gt;:]&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/env python2&lt;/span&gt;
&lt;span class="c"&gt;# -*- coding:utf8 -*-&lt;/span&gt;
&lt;span class="n"&gt;__author__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;baccenfutter&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;__licence__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Academic Free 3.0&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;__date__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;2013-06-27&amp;#39;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Basedir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/tmp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Representation of a base directory&lt;/span&gt;

&lt;span class="sd"&gt;        :param base:    str -- absolute path of base directory&lt;/span&gt;
&lt;span class="sd"&gt;        &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hiddenfiles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__repr__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;repr(self) -&amp;gt; &amp;lt;Basedir|base=%s|layers=%i&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;lt;Basedir|&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__get_dirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Helper for obtaining a subdirectory list&lt;/span&gt;

&lt;span class="sd"&gt;        :param base: str    -- absolute path of directory to traverse&lt;/span&gt;
&lt;span class="sd"&gt;        :returns: Generator&lt;/span&gt;
&lt;span class="sd"&gt;        &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hiddenfiles&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__get_files&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Helper for obtaining a file list&lt;/span&gt;

&lt;span class="sd"&gt;        :param base: str    -- absolute path of directory to traverse&lt;/span&gt;
&lt;span class="sd"&gt;        :return: Generator&lt;/span&gt;
&lt;span class="sd"&gt;        &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hiddenfiles&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__traverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_recursion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="sd"&gt;        :param base:            str -- absolute path of base directory&lt;/span&gt;
&lt;span class="sd"&gt;        :param max_recursion:   int -- max recursion level&lt;/span&gt;
&lt;span class="sd"&gt;        :param current:         int -- current recursion level&lt;/span&gt;
&lt;span class="sd"&gt;        &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;max_recursion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__get_dirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__traverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;max_recursion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;max_recursion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__get_files&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dirs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;traverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Traverse this basedir&lt;/span&gt;

&lt;span class="sd"&gt;        :param depth: int   -- maximum number of recursion, e.g. level of depth&lt;/span&gt;
&lt;span class="sd"&gt;        :return: list&lt;/span&gt;
&lt;span class="sd"&gt;        &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__traverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_recursion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;basename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;basename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;/tmp/test&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;depth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;depth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;basedir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Basedir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;basedir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;traverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%8i&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="linux"></category><category term="python"></category></entry><entry><title>IPv6 Support für OpenVZ Gäste auf Debian-basis</title><link href="https://baccenfutter.crew.c-base.org/futterblog/ipv6-support-fur-openvz-gaste-auf-debian-basis.html" rel="alternate"></link><updated>2013-06-09T20:50:49+02:00</updated><author><name>baccenfutter</name></author><id>tag:https://baccenfutter.crew.c-base.org/futterblog,2013-06-09:ipv6-support-fur-openvz-gaste-auf-debian-basis.html</id><summary type="html">&lt;p&gt;Ich habe eine Weile gek&amp;auml;mpft, um den IPv6 Support f&amp;uuml;r meine OpenVZ
G&amp;auml;ste auf einem Debian Lenny zum Laufen zu kriegen. Im Wesentlichen, ist es
auch garkeine Raketenwissenschaft, wenn man erstmal wei&amp;szlig;, wo denn genau
das Problem liegt.&lt;/p&gt;
&lt;p&gt;Meine gesammelten Erkenntnisse m&amp;ouml;chte ich euch nicht vorenthalten.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Ausgangsszenario&lt;/h2&gt;
&lt;p&gt;Zugrunde liegendes Betriebssystem ist ein Debian Lenny (funktioniert vermutlich
auch mit sp&amp;auml;teren Releases), auf dem bereits grunds&amp;auml;tzlicher IPv6
Support eingerichtet ist.&lt;/p&gt;
&lt;p&gt;Am Einfachsten &amp;uuml;berpr&amp;uuml;ft man dies mit dem Kommando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# ip -0 a&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In der Ausgabe sollten IPv6 Link-Local Adressen zu sehen sein, die mit dem Block
fe80 beginnen, bspw. &lt;em&gt;fe80::2a0:86ef:ff2d:93a4/64&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Selbstverst&amp;auml;ndlich muss IPv6 Support auf dem Internet-Uplink anliegen und
geroutet werden, unabh&amp;auml;ngig davon, ob es sich um nativen Support oder einen
Tunnel handelt.&lt;/p&gt;
&lt;p&gt;Desweiteren gehen wir in diesem Fallbeispiel davon aus, dass es auf dem Host ein
physikalisches Interface &lt;em&gt;eth0&lt;/em&gt;, sowie ein virtuelles Interface &lt;em&gt;venet0&lt;/em&gt; gibt,
und ansonsten keine weiteren Interfaces vorhanden sind.&lt;/p&gt;
&lt;p&gt;Der Prefix, von dem hier ausgegangen wird, lautet:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2a02:bace:bace::/48&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unser Default-Gateway ins Internet ist ein DSL-Router irgendwo im LAN. Wir
folgen der Konvention und konfigurieren hier die erste Host-IP des Prefixes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2a02:bace:bace::1/64&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Konfiguration des Hosts&lt;/h2&gt;
&lt;p&gt;Wenn der IPv6 Support im Betriebssystem fertig eingerichtet ist, beginnen wir
mit der Konfiguration von OpenVZ.&lt;/p&gt;
&lt;p&gt;Hierf&amp;uuml;r editiert man die Datei
&lt;em&gt;/etc/vz/vz.conf&lt;/em&gt; und f&amp;uuml;gt folgende Zeilen hinzu:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;IPV6="yes"&lt;br /&gt;
   IP6TABLES="ip6_tables ip6table_filter ip6table_mangle ip6t_REJECT"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Anschlie&amp;szlig;end muss der Daemon durchgestartet werden.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# /etc/init.d/vz restart&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Auf dem Host wird irgendeine zuf&amp;auml;llige Host-IP aus unserem Prefix
konfiguriert und eine Default-Route eingerichtet.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# ip a a 2a02:bace:bace::bace/64 dev eth0&lt;/span&gt;
&lt;span class="c"&gt;# ip r a default via 2a02:bace:bace::1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Damit diese IP auch nach jedem Neustart zur Verf&amp;uuml;gung steht, muss sie in
die Datei &lt;em&gt;/etc/network/interfaces&lt;/em&gt; eingetragen werden.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;iface eth0 inet6 static  
    address 2a02:bace:bace::bace  
    netmask 64  
    gateway 2a02:bace:bace::1
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ein kurzer Test, ob das Internet via IPv6 erreichbar ist und weiter geht`s.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# ping6 -c3 google.de&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Damit der Host IPv6 Packete seiner G&amp;auml;ste forwarded, m&amp;uuml;ssen einige
Sysctl Parameter gesetzt werden. Diese werden am Besten direkt ans Ende der
Datei &lt;em&gt;/etc/sysctl.conf&lt;/em&gt; geschrieben...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;net.ipv4.conf.eth0.proxy_arp=1&lt;br /&gt;
  net.ipv6.conf.default.forwarding = 1&lt;br /&gt;
  net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
  net.ipv6.conf.default.proxy_ndp = 1&lt;br /&gt;
  net.ipv6.conf.all.proxy_ndp = 1  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;... und dann geladen...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# sysctl -p /etc/sysctl.conf&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;hr /&gt;
&lt;h2&gt;Konfiguraiton der G&amp;auml;ste&lt;/h2&gt;
&lt;p&gt;IPv6 Adresen werden genau so konfiguriert, wie IPv4 Adressen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# vzctl set $VEID --ipadd 2a02:bace:bace::2 --save&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Host und Gast sollten sich nun erreichen k&amp;ouml;nnen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#host# ping6 -c3 2a02:bace:bace::2&lt;/span&gt;
&lt;span class="c"&gt;#gast# ping6 -c3 2a02:bace:bace::bace&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;hr /&gt;
&lt;h2&gt;Pitfall&lt;/h2&gt;
&lt;p&gt;Wenn die G&amp;auml;ste nicht in der Lage sind das Internet zu erreichen, liegt es
daran, dass die ARP-Requests, die vom Router stammen, vom Host nicht an seine
G&amp;auml;ste weitergeleitet werden. Somit wei&amp;szlig; der Router nicht wohin er die
Antwortpackete leiten soll. Vom Gast aus stellt sich die Situation so dar, als
ob es keine Route vom Host ins Internet g&amp;auml;be, was aber nicht den Tatsachen
entspricht. Die Route ist da, aber die Rueckroute nicht.&lt;/p&gt;
&lt;p&gt;Damit der Host ARP-Requests, die f&amp;uuml;r seine G&amp;auml;ste bestimmt sind,
durchreicht, muss er als Neighbor-Proxy f&amp;uuml;r alle seine G&amp;auml;ste
konfiguriert werden.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# ip -6 n add proxy 2a02:bace:bace::2 dev eth0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Hierbei ist die IPv6-Adresse die des Gastes und das Device das physische
Interface des Hosts.&lt;/p&gt;
&lt;p&gt;Um auch diese Konfiguration persistent gegen Neustarts zu kriegen, habe ich ein
kleines if-up Script geschrieben, das sich stumpf alle IPv6-Adressen aller
G&amp;auml;ste holt und als Proxy konfiguriert.&lt;/p&gt;
&lt;p&gt;Hierzu legt man die Datei &lt;em&gt;/etc/network/if-up.d/ipv6vzneighproxy&lt;/em&gt; an und
schreibt folgende Zeilen hinein.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${1:-2a02}&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;ext_iface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${2:-eth0}&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;guests&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$(grep -r &amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$prefix&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; /etc/vz/conf/*.conf | sed &amp;#39;s/.*\(2a02\)/\1/&amp;#39; | tr &amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="err"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;ip in &lt;span class="nv"&gt;$guests&lt;/span&gt;; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="k"&gt;    &lt;/span&gt;ip -6 n add proxy &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; dev &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ext_iface&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Done.&lt;/p&gt;</summary><category term="operations"></category><category term="ip"></category><category term="ipv6"></category><category term="vz"></category><category term="openvz"></category><category term="bash"></category></entry><entry><title>NIPAP - The Neat IP Address Planer</title><link href="https://baccenfutter.crew.c-base.org/futterblog/nipap-the-neat-ip-address-planer.html" rel="alternate"></link><updated>2013-06-09T00:09:54+02:00</updated><author><name>baccenfutter</name></author><id>tag:https://baccenfutter.crew.c-base.org/futterblog,2013-06-09:nipap-the-neat-ip-address-planer.html</id><summary type="html">&lt;p&gt;Schonmal mehr als nur ein einziges /24 IPv4 Netz verwaltet?&lt;/p&gt;
&lt;p&gt;Admins mit gr&amp;ouml;&amp;szlig;eren oder gar mehreren Prefixen kennen den Aufwand und
die organisatorischen Probleme, die die Verwaltung solcher Adressr&amp;auml;ume mit
sich bringt. Gro&amp;szlig;e Adressr&amp;auml;ume werden meist in Subnetze zerteilt und
den verschiedensten Aufgabenbereichen zugewiesen. Um nicht alle IPs in einem
gro&amp;szlig;en Adressraum durcheinander zu w&amp;uuml;rfeln, werden kleinere
Adressr&amp;auml;ume reserviert, aus denen sp&amp;auml;ter bei Bedarf IPs
vergeben werden. Durch die Reservierungen sollen aber keine allzu gro&amp;szlig;en
ungenutzten L&amp;ouml;cher im Adressraum entstehen.&lt;/p&gt;
&lt;p&gt;Tools f&amp;uuml;r die Verwaltung von Layer-3 Netzen, gibt es unz&amp;auml;hlige.&lt;br /&gt;
Neulich bin ich auf eins gesto&amp;szlig;en, dass ich sehr gerne weiterempfehlen
m&amp;ouml;chte - &lt;a href="http://spritelink.github.io/NIPAP/"&gt;NIPAP&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;NIPAP steht f&amp;uuml;r 'Neat IP Address Planer' und das Tool wird seinem Namen
gerecht. In seinem Kern handelt es sich um &lt;a href="http://code.google.com/p/ipaddr-py/"&gt;ipaddr-py&lt;/a&gt;, dass mit einer
praktischen Google Suchmaske versehen ist, doch nach genauerem Hinsehen entdeckt
man einige richtig ausgekl&amp;uuml;gelte Features, die einem die Arbeit echt
erleichtern.&lt;/p&gt;
&lt;p&gt;Neben einem Web-Frontend, wird ein CLI mitgeliefert, was sich leicht in Scripte
einbetten l&amp;auml;sst. Zum Einpflegen von Daten, werden die Meisten wohl das
Web-Frontend benutzen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Alt Text" src="https://baccenfutter.crew.c-base.org/futterblog/images/nipap_prefix_list.png" /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Ausprobieren&lt;/h2&gt;
&lt;p&gt;Auf Derivaten von Debian l&amp;auml;sst sich NIPAP ohne Probleme kurz und schmerzlos
anschauen. Einfach das APT-Repo hinzufuegen und installieren:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;deb http://spritelink.github.io/NIPAP/repos/apt stable main extra&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nipap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;
&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;
&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;nipapd&lt;/span&gt; &lt;span class="n"&gt;nipap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt; &lt;span class="n"&gt;nipap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt; &lt;span class="n"&gt;nipap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cli&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pynipap&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Die RPM Benutzer m&amp;uuml;ssen sich ihre Packete mithilfe des mitgelieferten
Makefiles selbst bauen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;
&lt;span class="n"&gt;virtualenv&lt;/span&gt; &lt;span class="n"&gt;nipap&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="n"&gt;nipap&lt;/span&gt;
&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;
&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;docutils&lt;/span&gt; &lt;span class="n"&gt;pypi2rpm&lt;/span&gt; 
&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;clone&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//github.com/SpriteLink/NIPAP.git&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="n"&gt;NIPAP&lt;/span&gt;
&lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;buildrpm&lt;/span&gt;
&lt;span class="n"&gt;rpm&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ivh&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rpm&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;NIPAP richtet w&amp;auml;rend der Installation die ben&amp;ouml;tigte Postgres Datenbank
ein und legt seine Config nach /etc/nipap/.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Objekt-Typen&lt;/h2&gt;
&lt;p&gt;NIPAP kennt die folgenden Objekt-Typen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;VRF&lt;/p&gt;
&lt;p&gt;Steht f&amp;uuml;r &lt;a href="http://de.wikipedia.org/wiki/VRF-Instanz"&gt;Virtual Routing and Forwarding&lt;/a&gt;. Es ist das Root-Object
aller Reservations. Die Meisten von euch werden hier eure AS eintragen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reservations&lt;/p&gt;
&lt;p&gt;Reservations sind zusammenh&amp;auml;ngende Adressr&amp;auml;ume, die keinen
bestimmten Verwendungszweck haben, wohl aber existieren. Sie dienen als
Container-Objekte fuer Assignments oder andere Reservations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Assignment&lt;/p&gt;
&lt;p&gt;Assignments liegen immer in Reservations. Ein Assignment ist ein
zusammenh&amp;auml;ngender Adressraum, der f&amp;uuml;r einen bestimmten
Verwendungszweck vorgesehen ist. Es besteht aus einem Prefix und einem
Verwendungszweck.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Alt Text" src="https://baccenfutter.crew.c-base.org/futterblog/images/nipap_assignment_edit.png" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hosts&lt;/p&gt;
&lt;p&gt;Ein Host liegt immer in einem Assignment; er hat einen Node-Namen und eine
IP-Adresse.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pools&lt;/p&gt;
&lt;p&gt;Ein Pool ist ein weiteres Container-Objekt. Allerdings k&amp;ouml;nnen in Pools
auch nichtzusammenh&amp;auml;ngende Adressr&amp;auml;ume zusammengefasst werden.
Wenn beispielsweise fuer alle Kunden-IPs die Prefixe 192.168.1.0/24 und
192.168.42.0/24 zur Verf&amp;uuml;gung stehen, so k&amp;ouml;nnen diese im Pool
'Kunden' zusammengefasst werden.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Neue Objekte lassen sich mit wenigen Klicks und einem benutzerfreundlichen
AJAX-Frontend hinzuf&amp;uuml;gen. Die Bedienung ist sehr intuitiv, die Lernkurve
progressiv (vorausgesetzt, man bringt das entsprechende Hintergrundwissen mit).
Im Handumdrehen sind die existierenden Assignments und Hosts eingepflegt und der
Admin muss sich nie wieder Gedanken um die Verwaltung seiner Adressr&amp;auml;ume
machen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Alt Text" src="https://baccenfutter.crew.c-base.org/futterblog/images/nipap_add_prefix.png" /&gt;&lt;/p&gt;</summary><category term="operations"></category><category term="admin"></category><category term="ip"></category><category term="ipv6"></category></entry><entry><title>Bash: Alle Childs beim Erreichen eines Timeouts toeten</title><link href="https://baccenfutter.crew.c-base.org/futterblog/bash-alle-childs-beim-erreichen-eines-timeouts-toeten.html" rel="alternate"></link><updated>2013-05-18T21:57:05+02:00</updated><author><name>baccenfutter</name></author><id>tag:https://baccenfutter.crew.c-base.org/futterblog,2013-05-18:bash-alle-childs-beim-erreichen-eines-timeouts-toeten.html</id><summary type="html">&lt;p&gt;Hin und wieder kann es vorkommen, das ein Bash-Script eine oder mehrere
Subshells &amp;ouml;ffnet, um diverse Jobs im Hintergrund zu erledigen. Dabei kann
es aber in vielen F&amp;auml;llen vorkommen, dass eine der Subshells in einen
Blocking-State verf&amp;auml;llt und h&amp;auml;ngen bleibt. Das ist vor allem dann
verh&amp;auml;ngnisvoll, wenn das Script automatisiert von beispielsweise CRON
ausgef&amp;uuml;hrt wird.&lt;/p&gt;
&lt;p&gt;In solchen Szenarien empfiehlt es sich eine Routine zu implementieren, die beim
Erreichen eines definierten Timeouts alle Subshells t&amp;ouml;tet.&lt;/p&gt;
&lt;p&gt;F&amp;uuml;r diesen Fall bietet sich das Linux-Signal SIGALRM an. Wenn das
Haupt-Script ein SIGALRM erh&amp;auml;lt, soll es alle seine Childs t&amp;ouml;ten und
sich mit ungleich Null beenden. So muss zus&amp;auml;tzlich zu den Workern einfach
nur eine weitere Subshell mit GNU/sleep + GNU/kill installiert werden, die
nach Ablauf des Timeouts das Signal an den Hauptprozess sendet.&lt;/p&gt;
&lt;p&gt;Hier ein Code-Schnipsel, der die L&amp;ouml;sung erkl&amp;auml;rt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nv"&gt;alarmtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3
&lt;span class="nv"&gt;childs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3
&lt;span class="nv"&gt;parentpid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;
&lt;span class="nv"&gt;childpids&lt;/span&gt;&lt;span class="o"&gt;=()&lt;/span&gt;

exit_timeout&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Alarm signal received : killing all children&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;child in &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;childpids&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="k"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;kill&lt;/span&gt; -STOP &lt;span class="nv"&gt;$childpid&lt;/span&gt; &amp;amp;&amp;gt;/dev/null
    &lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="k"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;trap &lt;/span&gt;exit_timeout SIGALRM

&lt;span class="k"&gt;for &lt;/span&gt;i in &lt;span class="k"&gt;$(&lt;/span&gt;seq &lt;span class="nv"&gt;$childs&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="k"&gt;    &lt;/span&gt;sleep 4 &amp;amp;  &lt;span class="c"&gt;# very long task that may timeout&lt;/span&gt;
    childpids+&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="nv"&gt;$!&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="o"&gt;(&lt;/span&gt;sleep &lt;span class="nv"&gt;$alarmtime&lt;/span&gt;; &lt;span class="nb"&gt;kill&lt;/span&gt; -ALRM &lt;span class="nv"&gt;$parentpid&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &amp;amp;
&lt;span class="nv"&gt;alarmpid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$!&lt;/span&gt;

&lt;span class="nb"&gt;wait&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;childpids&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Alarm never reached, children exited cleanly.&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;kill&lt;/span&gt; &lt;span class="nv"&gt;$alarmpid&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ich freue mich, wenn es jemandem hilft. =)&lt;/p&gt;</summary><category term="hacks"></category></entry></feed>