<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Just another tech blog ... &#187; Howtos</title>
	<atom:link href="http://hexor2k.wordpress.com/category/computer/howtos/feed/" rel="self" type="application/rss+xml" />
	<link>http://hexor2k.wordpress.com</link>
	<description>... about (mobile) Linux and Java</description>
	<lastBuildDate>Thu, 31 Dec 2009 11:15:03 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='hexor2k.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/3350773e6f25e0db7b7f27bdf342b466?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Just another tech blog ... &#187; Howtos</title>
		<link>http://hexor2k.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://hexor2k.wordpress.com/osd.xml" title="Just another tech blog &#8230;" />
		<item>
		<title>NSLU2-Howto: Automount für externe HDD</title>
		<link>http://hexor2k.wordpress.com/2009/12/16/nslu-howto-automount-skript-fur-externe-festplatte/</link>
		<comments>http://hexor2k.wordpress.com/2009/12/16/nslu-howto-automount-skript-fur-externe-festplatte/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 11:30:28 +0000</pubDate>
		<dc:creator>hexor2k</dc:creator>
				<category><![CDATA[Howtos]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[NAS]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[NSLU2]]></category>
		<category><![CDATA[UDEV]]></category>

		<guid isPermaLink="false">http://hexor2k.wordpress.com/?p=503</guid>
		<description><![CDATA[Hallo liebe Leser,
ich habe mich noch ein bisschen mit UDEV beschäftigt, um das Automounting meiner externen Festplatte an der SLUG zu realisieren. Hintergrund ist folgender:

Die Festplatte ist nicht immer an der SLUG angeschlossen (Strom sparen und Platte vor Verschleiß schützen).
Die SLUG soll später mal dauerhaft als VPN- und Jabber-Server laufen.
Beim Anschluss der Festplatte soll diese [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=hexor2k.wordpress.com&blog=4544707&post=503&subd=hexor2k&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Hallo liebe Leser,</p>
<p>ich habe mich noch ein bisschen mit UDEV beschäftigt, um das Automounting meiner externen Festplatte an der SLUG zu realisieren. Hintergrund ist folgender:</p>
<ul>
<li><span id="more-503"></span>Die Festplatte ist nicht immer an der SLUG angeschlossen (Strom sparen und Platte vor Verschleiß schützen).</li>
<li>Die SLUG soll später mal dauerhaft als VPN- und Jabber-Server laufen.</li>
<li>Beim Anschluss der Festplatte soll diese gemounted und der Samba-Dämon gestartet werden.</li>
<li>Bei einmaligem Tastendruck soll die Festplatte je nach Mount-Status unmounted oder neu gemounted werden. Gleiches gilt für den Samba-Dämon.</li>
<li>Zweimaliger Tastendruck fährt die SLUG herunter.</li>
<li>NFS wird nicht realisiert, da es zu einem sehr langem Bootvorgang führt und danach trotzdem nicht richtig funktioniert, falls die Festplatte schon beim Start angeschlossen ist.</li>
</ul>
<p>Also, zum Start braucht man erst einmal mehrere Bash-Skripte und Anpassungen in der inittab und in den UDEV Regeln:</p>
<h3>Mount-Skript:</h3>
<p>Hier wird versucht, die externe Festplatte zu mounten und bei Erfolg den Samba-Dämon zu starten. Zusätzlich wird noch das LED für Disk 2 zuerst blinkend und am Ende auf an geschaltet. Die Datei habe ich unter dem Namen &#8222;/usr/bin/mybookMountAndStartServices&#8220; abgelegt. Sie soll bei jedem einzelnen Tastendruck ausgeführt werden, wenn die externe Festplatte nicht gemounted ist.</p>
<pre class="brush: bash;">

#!/bin/sh
LOGFILE=&quot;/var/log/exthddmount.log&quot;
THIS=&quot;mybookMountAndStartServices&quot;
MOUNTDIR=&quot;/mnt/MyBook&quot;

# set led 2 to flashing state
leds disk-2 flash

# try to mount
echo &quot;$THIS Try to mount MyBook&quot; &gt;&gt; $LOGFILE
mount $MOUNTDIR

# check mount status
if [ $? == 0 ]
then   echo &quot;$THIS MyBook was mounted. Try to start services.&quot; &gt;&gt; $LOGFILE
else    cat /etc/mtab | grep $MOUNTDIR &gt; /dev/null
if [ $? == 0 ]
then  echo &quot;$THIS MyBook is already mounted. Try to start services&quot; &gt;&gt; $LOGFILE
else   echo &quot;$THIS MyBook is not connected or an error occured on mount&quot; &gt;&gt; $LOGFILE
exit 1
fi
fi

# start samba service
sh /etc/init.d/samba start

# set led 2 to on
leds disk-2 on

leds beep -r 1
</pre>
<h3>Umount-Skript:</h3>
<p>Das gleiche Skript, nur anders herum. Services werden gestoppt, die Festplatte wird unmounted. Gespeichert wird die File unter &#8222;/usr/bin/mybookUmountAndStopServices&#8220;.</p>
<pre class="brush: bash;">

#!/bin/sh
LOGFILE=&quot;/var/log/exthddmount.log&quot;
THIS=&quot;mybookUmountAndStopServices&quot;
MOUNTDIR=&quot;/mnt/MyBook&quot;

# stop samba service
sh /etc/init.d/samba stop
echo &quot;$THIS Stopped all services&quot; &gt;&gt; $LOGFILE

# umount MyBook
echo &quot;$THIS Umounting MyBook...&quot; &gt;&gt; $LOGFILE
umount $MOUNTDIR
echo &quot;$THIS Umounted MyBook. No you can disconnect it&quot; &gt;&gt; $LOGFILE

# set led 2 to flashing state
leds disk-2 off
leds beep -r 2
</pre>
<h3>Ausführung bei Tastendruck &#8211; Inittab:</h3>
<p>&#8222;Das ist natürlich schön und gut, aber wie und wann werden die Skripte ausgeführt?&#8220; wird sich jetzt mancher denken. Über die Datei &#8222;/etc/inittab&#8220; festgelegt werden, was bei der Tastenkombination STRG+ALT+ENTF passiert. Bei der SLUG entspricht dies einem einmaligem Tastendruck. In der Inittab muss die Zeile für den Tastendruck, die ungefähr wie folgende aussieht</p>
<p><code>ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now</code></p>
<p>durch folgenden Code ersetzt werden:</p>
<p><code>ca:12345:ctrlaltdel:/usr/bin/buttonPressControl &amp;</code></p>
<p>Das Skript, welches hier aufgerufen wird, beschreibe ich im nächsten Abschnitt. Das &#8222;&amp;&#8220; am Ende der Zeile ist sehr wichtig.</p>
<h3>Tastendruck-Kontrolle:</h3>
<p>Die Skripte zum Mount bzw. Umount habe ich schon beschrieben, aber woher weiß die SLUG, welches beim Tastendruck ausgeführt werden soll? Und wie kann man einen zweimaligen Tastendruck erkennen? Ich habe deswegen ein weiteres Skript entworfen, welches sich darum kümmert und das bei jedem Tastendruck aufgerufen wird. Die Erkennung des zweimaligem Tastendrucks ist vielleicht nicht ganz sauber gelöst, aber mir ist auf Anhieb nichts besseres eingefallen.</p>
<pre class="brush: bash;">

#!/bin/sh

LOGFILE=&quot;/var/log/exthddmount.log&quot;
EXT_HDD_DEV=&quot;/dev/mybook&quot;
PIDFILE=&quot;/tmp/exthddmount.pid&quot;
THIS=&quot;buttonPressControl&quot;

touch $LOGFILE

if [ -e $PIDFILE ]
then
 rm $PIDFILE
 echo &quot;$THIS Pressed a second time within 2 seconds. Shutdown system&quot; &gt;&gt; $LOGFILE
 leds beep -f 800 -r 3 -l80 -d 40
 /sbin/shutdown -t1 -a -h now
else
 # create pid file
 touch $PIDFILE
 sleep 2

 if [ -e $PIDFILE ]
 then
 # beep to indicate start
 leds beep -f 700 -r 2 -l 80 -d 40

 # check if mounted
 cat /etc/mtab | grep /mnt/MyBook &gt; /dev/null
 if [ $? == 0 ]
 then
 # already mounted, now umount and stop services
 sh /usr/bin/mybookUmountAndStopServices
 else
 # not mounted, check if connected
 if [ -e $EXT_HDD_DEV ]
 then
 # connected, but not mounted. Mount now
 sh /usr/bin/mybookMountAndStartServices
 else
 # not connected, do nothing
 echo &quot;$THIS No MyBook connected. Do nothing.&quot; &gt;&gt; $LOGFILE
 fi
 fi
 rm $PIDFILE
 fi
fi
</pre>
<h3>UDEV-Regel:</h3>
<p>Was fehlt noch? Genau, eine UDEV-Regel, die das Mount-Skript auch bei Systemstart und beim Anschließen der Festplatte ausführt. Damit diese Regel zum Ende erst geprüft wird, habe ich sie &#8222;z70-exthddmount.rules&#8220; genannt und in &#8222;/etc/udev/rules.d&#8220; abgelegt.</p>
<p><code>BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="57442D574341554630363532373631", SYMLINK="mybook", RUN+="/usr/bin/mybookMountAndStartServices"</code></p>
<p>Dieser Code muss in einer Zeile stehen! Die eindeutige Seriennummer der externen Festplatte erhält man mit dem Programm lsusb:</p>
<pre class="brush: bash;">

SLUG:#lsusb -v | egrep &quot;(iProduct | iSerial)&quot;

iProduct                2 OHCI Host Controller
 iSerial                 1 0000:00:01.0
 iProduct                2 OHCI Host Controller
 iSerial                 1 0000:00:01.1
 iProduct                2 U3 Cruzer Micro
 iSerial                 3 08759111AD8169DA
 iProduct                2 EHCI Host Controller
 iSerial                 1 0000:00:01.2
 iProduct                2 My Book
 iSerial                 3 57442D574341554630363532373631
</pre>
<p>Die unteren beiden Zeilen stehen für meine externe Festplatte. Wer kein MyBook besitzt, muss natürlich nach der Bezeichnung seiner Festplatte suchen.</p>
<h3>Fazit:</h3>
<p>So das sind alle notwendigen Skripte, um das Automounting zu realisieren. Wenn alle Skripte vorhanden und angepasst sind, sollte die SLUG neu gestartet werden, um die Inittab und die UDEV-Regeln neu zu initialisieren. Wie schon angesprochen funktioniert das Mounten beim Start leider nur mit dem Samba-Dämon reibungslos. Bei NFS hängen sich die Startskripte leider auf, wenn beim Systemstart das Mount-Skript mittels UDEV aufgerufen wird. Wahrscheinlich ist der Zeitpunkt zu früh für NFS. Aber wenn jemand  eine Lösung dafür findet, passe ich das gerne noch an.</p>
<p>Der eingebettete Sourcecode wurde mit dem neuen Sourcecode-Plugin für WordPress erstellt. <a href="http://en.support.wordpress.com/code/posting-source-code/">Hier</a> ist noch eine kleine Anleitung dazu.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/hexor2k.wordpress.com/503/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hexor2k.wordpress.com/503/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/hexor2k.wordpress.com/503/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/hexor2k.wordpress.com/503/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/hexor2k.wordpress.com/503/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/hexor2k.wordpress.com/503/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/hexor2k.wordpress.com/503/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/hexor2k.wordpress.com/503/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/hexor2k.wordpress.com/503/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/hexor2k.wordpress.com/503/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=hexor2k.wordpress.com&blog=4544707&post=503&subd=hexor2k&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://hexor2k.wordpress.com/2009/12/16/nslu-howto-automount-skript-fur-externe-festplatte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da83901c46990b57efdd2759b9ec859f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">hexor2k</media:title>
		</media:content>
	</item>
		<item>
		<title>Surround Sound auf Nvidia Nforce 4</title>
		<link>http://hexor2k.wordpress.com/2009/07/15/surround-sound-auf-nvidia-nforce-4/</link>
		<comments>http://hexor2k.wordpress.com/2009/07/15/surround-sound-auf-nvidia-nforce-4/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 18:53:02 +0000</pubDate>
		<dc:creator>hexor2k</dc:creator>
				<category><![CDATA[Howtos]]></category>
		<category><![CDATA[ALSA]]></category>
		<category><![CDATA[Kubuntu]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nforce]]></category>
		<category><![CDATA[Nvidia]]></category>
		<category><![CDATA[Surround Sound]]></category>

		<guid isPermaLink="false">http://hexor2k.wordpress.com/?p=445</guid>
		<description><![CDATA[Dies ist eine Sache, die mich durch jede Linux-Installation gequält hat   Wenn mal alles richtig läuft, komme ich auf so Ideen wie z.B. 5.1-Sound. Nur leider erweist sich die Kombination von ALSA und einer internen Nforce 4 Soundkarte als etwas bockig. Seit einigen Jahren schleppe ich deshalb meine Sound-Config durch jede Neuinstallation (Gentoo, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=hexor2k.wordpress.com&blog=4544707&post=445&subd=hexor2k&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Dies ist eine Sache, die mich durch jede Linux-Installation gequält hat <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Wenn mal alles richtig läuft, komme ich auf so Ideen wie z.B. 5.1-Sound. Nur leider erweist sich die Kombination von ALSA und einer internen Nforce 4 Soundkarte als etwas bockig. Seit einigen Jahren schleppe ich deshalb meine Sound-Config durch jede Neuinstallation (Gentoo, Debian, Kubuntu). Nachdem es jetzt unter meinem frischen Kubuntu 09.04 läuft, gibts hier mal die Config.</p>
<p><span id="more-445"></span></p>
<p>Diesmal habe ich die Config global für alle Nutzer unter<em> /etc/asound.conf</em> gelegt. Es funktioniert aber genau so, wenn man sie für den vorgesehenen Nutzer in <em>~/.asoundrc</em> ablegt. Hier nun die Config:</p>
<pre>#-------------------------------                                                                                                                                                    
#  Main hardware control                                                                                                                                                            
#-------------------------------                                                                                                                                                    

pcm.nforce {                                                                                                                                                                        
   type hw                                                                                                                                                                         
   card 0                                                                                                                                                                          
   device 0                                                                                                                                                                        
   channels 6                                                                                                                                                                      
   rate 48000                                                                                                                                                                      
   format "S16_LE"                                                                                                                                                                 
}                                                                                                                                                                                   

pcm.softmixer {                                                                                                                                                                     
   type dmix                                                                                                                                                                       
   ipc_key 1024                                                                                                                                                                    
   ipc_key_add_uid false                                                                                                                                                           
   ipc_perm 0660                                                                                                                                                                   
   slave {                                                                                                                                                                         
     pcm nforce                                                                                                                                                                  
     format "S16_LE"                                                                                                                                                             
     channels 6                                                                                                                                                                  
     rate 48000                                                                                                                                                                  
     period_time 0                                                                                                                                                               
     period_size 1024                                                                                                                                                            
     buffer_size 5120                                                                                                                                                            
   }                                                                                                                                                                               
   bindings {                                                                                                                                                                      
     0 0                                                                                                                                                                         
     1 1                                                                                                                                                                         
     2 4                                                                                                                                                                         
     3 5                                                                                                                                                                         
     4 2                                                                                                                                                                         
     5 3                                                                                                                                                                         
   }                                                                                                                                                                               
}                                                                                                                                                                                   

#-------------------------------
#  Recording                    
#-------------------------------

pcm.recording {
   type        dsnoop
   ipc_key     2589  
   slave {           
     pcm     "hw:0,0"
     format  "S16_LE"
   }                   
}                       

#-------------------------------
#  Upmix                        
#-------------------------------
# upmix stereo to 5.1           
pcm.upmix {                     
   type        route           
   slave.pcm   "softmixer"     
   slave.channels    6         
   ttable {                    
     0.0    1                
     0.2    0.75             
     0.4    0.5              
     1.1    1                
     1.3    0.75             
     1.4    0.5              
   }                           
}                               

pcm.upmix40 {
   type        route
   slave.pcm   "softmixer"
   slave.channels    6    
   ttable {               
     0.0    1           
     1.1    1           
     2.2    1           
     3.3    1           
     0.4    0.5         
     1.4    0.5         
   }                      
}                          

pcm.upmix41 {
   type        route
   slave.pcm   "softmixer"
   slave.channels    6    
   ttable {               
     0.0    1           
     1.1    1           
     2.2    1           
     3.3    1           
     0.4    0.5         
     1.4    0.5         
     4.5    1           
   }                      
}                          

pcm.upmix50 {
   type        route
   slave.pcm   "softmixer"
   slave.channels    6    
   ttable {               
     0.0    1           
     1.1    1           
     2.2    1           
     3.3    1           
     4.4    1           
   }                      
}                          

#-------------------------------
#  Downmix                      
#-------------------------------

pcm.downmix71 {
   type        route
   slave.pcm    "softmixer"
   slave.channels    6     
   ttable {                
     0.0    0.67         
     1.1    0.67         
     2.2    0.67         
     3.3    0.67
     4.4    1
     5.5    1
     6.0    0.33
     6.2    0.33
     7.1    0.33
     7.3    0.33
   }
}

#-------------------------------
#  Overwrite existing devices
#-------------------------------

pcm.!default {
   type           asym
   playback.pcm   "plug:upmix"
   capture.pcm    "plug:recording"
}

ctl.!default {
   type hw
   card 0
}

pcm.!front {
   type        plug
   slave.pcm   "upmix"
}

pcm.!surround40 {
   type         plug
   slave.pcm    "upmix40"
}

pcm.!surround41 {
   type         plug
   slave.pcm    "upmix41"
}

pcm.!surround50 {
   type         plug
   slave.pcm    "upmix50"
}

pcm.!surround51 {
   type        plug
   slave.pcm    "softmixer"
}

pcm.!surround71 {
   type         plug
   slave.pcm    "downmix71"
}

pcm.dsp0 {
   type         plug
  slave.pcm    "softmixer"
}</pre>
<p>Wichtig ist, dass die Kanäle auch richtig eingesteckt werden. Ansonsten müssen die vertauschten Kanäle im PCM <em>softmix</em> geändert werden. Bis jetzt gab es bei mir keine Blockaden bei Sound-Ausgabe von unterschiedlichen Programmen. Aber wer weiß schon, wo Skype wieder überall reinpfuscht.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/hexor2k.wordpress.com/445/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hexor2k.wordpress.com/445/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/hexor2k.wordpress.com/445/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/hexor2k.wordpress.com/445/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/hexor2k.wordpress.com/445/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/hexor2k.wordpress.com/445/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/hexor2k.wordpress.com/445/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/hexor2k.wordpress.com/445/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/hexor2k.wordpress.com/445/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/hexor2k.wordpress.com/445/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=hexor2k.wordpress.com&blog=4544707&post=445&subd=hexor2k&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://hexor2k.wordpress.com/2009/07/15/surround-sound-auf-nvidia-nforce-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da83901c46990b57efdd2759b9ec859f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">hexor2k</media:title>
		</media:content>
	</item>
		<item>
		<title>Howto: Fetchmail, Postfix, Procmail, Dovecot auf der SLUG</title>
		<link>http://hexor2k.wordpress.com/2009/02/25/howto-fetchmail-postfix-procmail-dovecot-auf-der-slug/</link>
		<comments>http://hexor2k.wordpress.com/2009/02/25/howto-fetchmail-postfix-procmail-dovecot-auf-der-slug/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 20:30:37 +0000</pubDate>
		<dc:creator>hexor2k</dc:creator>
				<category><![CDATA[Howtos]]></category>
		<category><![CDATA[Dovecot]]></category>
		<category><![CDATA[Fetchmail]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NSLU2]]></category>
		<category><![CDATA[Postfix]]></category>
		<category><![CDATA[Procmail]]></category>

		<guid isPermaLink="false">http://hexor2k.wordpress.com/?p=398</guid>
		<description><![CDATA[Vor einigen Wochen hat mich es mal wieder extrem angekotzt, dass bei meinen verschiedenen Mailkonten Probleme auftraten. Web.de lässt sich nur alle 15 Minuten abfragen, AOL bringt KMail ständig zum Absturz, usw. Außerdem wäre eine automatische Verteilung und Filterung schön, da im Moment alles quer durcheinander auf meinen Konten eingeht. Die Filtermöglichkeiten von KMail gefallen [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=hexor2k.wordpress.com&blog=4544707&post=398&subd=hexor2k&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Vor einigen Wochen hat mich es mal wieder extrem angekotzt, dass bei meinen verschiedenen Mailkonten Probleme auftraten. Web.de lässt sich nur alle 15 Minuten abfragen, AOL bringt KMail ständig zum Absturz, usw. Außerdem wäre eine automatische Verteilung und Filterung schön, da im Moment alles quer durcheinander auf meinen Konten eingeht. Die Filtermöglichkeiten von KMail gefallen mir nicht wirklich&#8230;</p>
<p style="text-align:justify;"><strong>Als Lösung habe ich auserkoren, meine SLUG als Mailserver einzurichten, um alle Mails dort zu sammeln und im Netzwerk bereit zu stellen. Versand über die SLUG sollte auch möglich sein.<br />
</strong></p>
<p style="text-align:justify;">Der erste Schritt war nun, sich in die Mailserver-Konfiguration unter Linux einzulesen. Hier habe ich schnell gemerkt, dass dies bei weitem nicht trivial ist (für nen Nicht-Admin <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). Zu verstehen, wie die verschiedene Programme eines Mailservers funktionieren hat einige Zeitgedauert, die Einrichtung noch länger. Ich fange also mal ganz von vorn an:</p>
<p style="text-align:justify;"><span id="more-398"></span></p>
<p style="text-align:justify;">
<h3 style="text-align:justify;">Mail Retrieval Agent: Fetchmail</h3>
<p style="text-align:justify;">Dieses Program sorgt dafür, dass Emails von einem entferntem Server abgeholt werden können. Diese gibt es an das lokale Linux-Mailsystem oder den <em>Mail Delivery Agent</em> weiter. Mehr tut es nicht. Als Programm habe ich <em>Fetchmail</em> gewählt, da es in vielen Howtos sehr gut beschrieben wird. Für <em>Fetchmail</em> muss man eine Config-Datei namens <em>.fetchmailrc</em> im Home-Verzeichnis anlegen. Meine Config sieht folgendermaßen aus:</p>
<p><code><br />
# ~/.fetchmailrc<br />
set postmaster&lt;username&gt;<br />
set bouncemail </code></p>
<p># Spam account, dont let messages on the server, fetch old and new messages, use SSL<br />
poll pop3.web.de<br />
protocol POP3<br />
port 995<br />
user &#8222;XXXXXXX@web.de&#8220; there       #  username on mailserver<br />
with password &#8222;XXXXXXX&#8220;                        # password on mailserver<br />
is XXXXXXX here                               #  local user name<br />
fetchall<br />
ssl<br />
nokeep<br />
mda &#8216;procmail -fv&#8217;                                                       # execute procmail<br />
mda &#8222;/usr/bin/procmail -d %s&#8220;            # execute procmail</p>
<p># regular account, leave messages on server,  fetch only new messages<br />
poll pop.aim.com<br />
protocol POP3<br />
user &#8222;XXXXXXX&#8220; there<br />
with password &#8222;XXXXXXX&#8220;<br />
is XXXXXXX here<br />
keep<br />
nofetchall<br />
mda &#8216;procmail -fv&#8217;<br />
mda &#8222;/usr/bin/procmail -d %s&#8220;</p>
<p># regular account, leave messages on server, fetch only new messages, use SSL<br />
poll pop3.t-online.de<br />
protocol POP3<br />
port 995<br />
user &#8222;XXXXXXX&#8220; there<br />
with password &#8222;XXXXXXX&#8220;<br />
is XXXXXXX here<br />
keep<br />
ssl<br />
nofetchall<br />
mda &#8216;procmail -fv&#8217;<br />
mda &#8222;/usr/bin/procmail -d %s&#8220;</p>
<p style="text-align:justify;">Hier werden von beispielsweise drei Konten Mails abgeholt und an <em>Procmail</em> weitergegeben (siehe nächstes Kapitel). Ein Konto ist mein Spamkonto für Foren, Shopping und Mailing-Lists. Es kann deshalb sehr schnell voll laufen, weshalb hier alle Mails beim Abholen vom Server gelöscht werden. Die beiden anderen Konten lassen zwecks Redundanz die Mails auf dem Server. Die Kommentare geben an, was das Kommando tut bzw. was in XXXXXXX stehen soll.</p>
<h3 style="text-align:justify;">Mail Delivery Agent: Procmail (optional)</h3>
<p style="text-align:justify;">Dieser Schritt ist optional. Mittels <em>Procmail</em> können Mails gefiltert und an IMAP-Ordner verteilt werden. Auch Spamfiltering mittels Spamassassin ist möglich, dies möchte ich meiner SLUG aber nicht antun. Für mich reicht es hingegen, einkommende Mails in verschiedene IMAP-Ordner zu filtern, was mit einfachen regulären Ausdrücken geht. Im Homeverzeichnis muss dazu eine Datei mit Namen <em>.procmailrc</em> angelegt werden. Meine sieht folgendermaßen aus:</p>
<p><code><br />
# ~/.procmailrc<br />
PATH="/usr/bin:/usr/local/bin"<br />
MAILDIR="$HOME/mails"<br />
DEFAULT="$HOME/mails/&lt;username&gt;"<br />
LOGFILE="$HOME/mails/procmail.log"<br />
SHELL="/bin/sh"<br />
VERBOSE="on" </code></p>
<p>#########################################################<br />
##### Filter Mailing Lists like BlueCove, OpenMoko<br />
:0:<br />
* ^To:.*bluecove-users@googlegroups\.com<br />
.MailingLists.BlueCove/</p>
<p>:0:<br />
* ^From:.*skarzhevskyy@gmail\.com<br />
.MailingLists.BlueCove/</p>
<p>:0:<br />
* ^Subject:.*\[BlueCove-users\]<br />
.MailingLists.BlueCove/</p>
<p>:0:<br />
* ^CC:.+@lists\.openmoko\.org<br />
.MailingLists.OpenMoko/</p>
<p>:0:<br />
* ^To:.+@lists\.openmoko\.org<br />
.MailingLists.OpenMoko/</p>
<p>##########################################################<br />
##### Filter Online-Shopping like eBay, Amazon: use From field<br />
:0:<br />
* ^From:.*[Aa]mazon.*<br />
* ^From:.*eBay.*<br />
.Filter.Shopping/</p>
<p>###########################################################<br />
##### Filter by Accout: use the To field</p>
<p>:0:<br />
* ^To:.*XXXXXXXXXXXXXXX\.de<br />
.Kontos.T-Online/</p>
<p>:0:<br />
* ^To:.*XXXXXXXXXXXXXXX\.de<br />
.Kontos.Webde/</p>
<p>:0:<br />
* ^To:.*XXXXXXXXXXXXXXX<br />
.Kontos.AOL/</p>
<p>#############################################################<br />
######### Filter all others to INBOX<br />
:0:<br />
./</p>
<p style="text-align:justify;">Hier werden eingehende Mails erst nach Absendern, Mailinglisten, Shops, etc gefiltert und danach je nach Empfänger auf die verschiedenen Ordner auf dem IMAP-Server. Die Punkte und Slashes sind hier sehr wichtig!!! Trennzeichen für IMAP-Ordnerstrukturen ist der Punkt. An jedem IMAP-Ordnereintrag muss unbeding der Slash angehängt werden. XXXXXXX steht hier wieder für den jeweiligen Empfänger.</p>
<p style="text-align:justify;">
<h3 style="text-align:justify;">IMAP-Server: Dovecot</h3>
<p style="text-align:justify;">Um es gleich vorweg zu sagen, <em>Dovecot</em> steht nicht für die Exkremente irgendwelcher Zugvögel, sondern für <em>Taubenschlag</em>. Dovecot ist ein performanter und schlanker IMAP-Server und deshalb sehr geeignet für die SLUG. Dovecot lässt sich sehr einfach mit dem Befehl <code>aptitude install dovecot-common dovecot-imapd</code> installieren. Danach muss evtl. noch die Konfigurationsdatei <code>/etc/dovecot/dovecot.conf</code> angepasst werden. Meine enthält folgendes.</p>
<p style="text-align:justify;"><code><br />
# /etc/dovecot/dovecot.conf<br />
protocols = imap                                   # only IMAP<br />
disable_plaintext_auth = no                   # insecure<br />
ssl_disable = yes                                 # insecure<br />
mail_location = maildir:%h/mails            # mail is at mails-dir in home folder<br />
mail_privileged_group = mail<br />
protocol imap {<br />
}<br />
auth default {                                        # authentication on local users<br />
mechanisms = plain<br />
passdb shadow {<br />
}<br />
userdb passwd {<br />
}<br />
user = root<br />
}<br />
</code><br />
Die vorliegende simple Config stellt Dovecot so ein, dass es nur über IMAP erreichbar ist. Die unsicheren Einstellungen für Plaintext Authentication und SSL sind für mein lokales Netzwerk ausreichend, keinesfalls, wenn der Server im Internet sichtbar sein soll. Für Nutzernamen und Passwörter werden die der lokalen User verwendet.</p>
<h3>Mail Transfer Agents (nicht notwendig):</h3>
<p style="text-align:justify;">Während der Einrichtung des Mailservers bin ich des Öfteren auf <em>Mail Transfer Agents</em> gestoßen. Diese Programme haben den Zweck, vom <em>Mail Retrieval Agent</em> Mails zu erhalten und an die lokalen Unix-Mailkonten zu verteilen. Zusätzlich übernehmen sie den Mailversand über SMTP entweder an lokale Nutzer oder an andere SMTP-Server. <strong>Für meine Konfiguration sind diese jedoch nicht notwendig</strong>, da Mails automatisch von Procmail verteilt werden und der Versand weiterhin vom Email-Client aus läuft. Grundsätzlich würde der Versand über den lokalen MTA auch funktionieren. Diese würde dann die gesendeten Emails an einen SMTP-Server weiterleiten, falls der Empfänger nicht lokal existiert. Leider blockt jeder Spam-Filter Mails, deren Absender-Adresse nicht mit der Server-Adresse übereinstimmt.</p>
<h3>Cron:</h3>
<p style="text-align:justify;">Der <em>Cron-Demon</em> ist ein Linux-Programm zur zeitgesteuerten Ausführung von Programmen. Um die Systemlast auf der SLUG gering zu halten, verwende ich den <em>Cron-Demon</em> um in regelmäßigen Abständen <em>Fetchmail</em> auszuführen. Dazu muss eine Crontab erstellt werden, eine Tabelle der auszuführenden Tasks. Die Crontab wird für einen einzelnen Nutzer mittels <code>crontab -e</code> erstellt. Meine sieht folgendermaßen aus:<br />
<code><br />
# crontab, created by "crontab -e" command<br />
# m h  dom mon dow   command<br />
00      *       *       *       *       /usr/bin/getmails --force &amp;&gt; /dev/null<br />
@reboot /usr/bin/getmails --force &amp;&gt; /dev/null</code></p>
<p style="text-align:justify;">Die erste Zeile lässt jede Stunde das von mir geschriebene Skript <em>getmails</em> laufen (siehe nächstes Kapitel). Die zweite Zeile tut das gleich, jedoch sofort beim Start des Demons. Alle Mails werden nach /dev/null weiter geleitet <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Ne, natürlich nicht, sondern nur die Standard- und Fehler-Ausgabe. Fehlt die Ausgabeumleitung, so erhält man bei jedem Lauf des Skripts eine Email mit der Ausgabe.</p>
<h3>Getmails:</h3>
<p>Das von mir geschriebene Bash-Skript /usr/bin/getmails erweitert die Funktionalität von Fetchmail noch ein bisschen. Es erfüllt folgende Aufgaben:</p>
<ul>
<li>Emails werden nur abgerufen, wenn auch der Nutzer am IMAP-Server angemeldet ist. Gut für häufige Checks, ohne die Festplatte aufzuwecken. Sie läuft nur an, wenn auch wirklich neue Mails geholt werden.</li>
<li>Optische Signale mittels Disk-2-LED: Blinken, wenn Skript läuft, langsames Blinken, wenn Mails gefunden, sonst LED aus.</li>
<li>Akustische Signale: Beep, wenn Mails gefunden.</li>
<li>&#8211;force Option zum Check, auch wenn der Nutzer nicht angemeldet ist</li>
<li>Ausgaben sollen geloggt werden</li>
</ul>
<p>Das Skript sieht so aus:<br />
<code><br />
#!/bin/bash<br />
# usage string<br />
USAGE="Usage: getmails.sh [--force]<br />
This script is wrapper for fetchmail. It executes fetchmail only if the executing user is logged on at the IMAP server (dovecot).<br />
If --force parameter is given, check is performed even if user is not connected." </code></p>
<p># default led values<br />
RUNNING=flash<br />
MAILFOUND=slow<br />
NOMAILFOUND=off</p>
<p># set LED<br />
sudo leds disk-2 &#8222;$RUNNING&#8220;</p>
<p># set default variables<br />
PARAMS=$#<br />
USERNAME=$(whoami)<br />
FORCE=&#8220;false&#8220;<br />
LOGFILE=&#8220;/home/$USERNAME/mails/lastlog.log&#8220;</p>
<p># check &#8211;force parameter<br />
if [ -z "$1" ]<br />
then<br />
FORCE=&#8220;false&#8220;<br />
else<br />
if [ "$1" == "--force" ]<br />
then<br />
FORCE=&#8220;true&#8220;<br />
else<br />
echo $USAGE<br />
exit 1<br />
fi<br />
fi</p>
<p># Check if user is connected to Dovecot<br />
LOGON=$(ps &#8211;user &#8222;$USERNAME&#8220; | grep &#8222;imap&#8220;)</p>
<p># Debug output<br />
echo &#8222;Username: $USERNAME&#8220;<br />
echo &#8222;Force: $FORCE&#8220;<br />
echo &#8222;Logon: $LOGON&#8220;</p>
<p>if [ "$FORCE" == "true" ]<br />
then<br />
echo &#8222;Force email check for user $USERNAME&#8220;<br />
fetchmail &amp;&gt; &#8222;$LOGFILE&#8220;<br />
STATUS=$?<br />
else<br />
if [ -z "$LOGON" ]<br />
then<br />
echo &#8222;No user logged in, do nothing.&#8220;<br />
else<br />
echo &#8222;User logged in, checking emails.&#8220;<br />
fetchmail &amp;&gt; &#8222;$LOGFILE&#8220;<br />
STATUS=$?<br />
fi<br />
fi</p>
<p>echo &#8222;Status: $STATUS&#8220;</p>
<p>if [ "$STATUS" == "0" ]<br />
then<br />
sudo leds beep -f 500 -n<br />
sudo leds disk-2 &#8222;$MAILFOUND&#8220;<br />
else<br />
sudo leds disk-2 &#8222;$NOMAILFOUND&#8220;<br />
fi</p>
<p>Das Skript sollte nach Erstellung als nur vom Root editierbar gesetzt werden, um Manipulation zu vermeiden.</p>
<h3>Fazit:</h3>
<p>Meine jetzige Konfiguration funktioniert nach einigen Wochen Einarbeitung schon sehr gut. Das Skript wird jede Stunde ausgeführt, voher hatte ich einen viertelstündigen Check, was aber die externe Festplatte sehr oft aufgeweckt hat. Jetzt wird sie nur 1x pro Stunde aufgeweckt und ich erhalte gleichzeitig eine sofortige Rückmeldung von der SLUG, so dass ich dann die Mails mit meinem Mailprogramm anschauen kann.</p>
<p>Als nächstes werde ich mir noch den Webmailer <em>Squirrelmail</em> zu gemüte führen, um Mails auch ohne Mailprogramm lesen zu können. Auch VPN wäre nicht schlecht, um auch von entfernten Rechnern (Arbeit, Handy, etc.) darauf zuzugreifen.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/hexor2k.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hexor2k.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/hexor2k.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/hexor2k.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/hexor2k.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/hexor2k.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/hexor2k.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/hexor2k.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/hexor2k.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/hexor2k.wordpress.com/398/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=hexor2k.wordpress.com&blog=4544707&post=398&subd=hexor2k&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://hexor2k.wordpress.com/2009/02/25/howto-fetchmail-postfix-procmail-dovecot-auf-der-slug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da83901c46990b57efdd2759b9ec859f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">hexor2k</media:title>
		</media:content>
	</item>
		<item>
		<title>Declarative Services in Fragment Bundles</title>
		<link>http://hexor2k.wordpress.com/2008/09/30/declarative-services-in-fragment-bundles/</link>
		<comments>http://hexor2k.wordpress.com/2008/09/30/declarative-services-in-fragment-bundles/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 17:52:46 +0000</pubDate>
		<dc:creator>hexor2k</dc:creator>
				<category><![CDATA[Howtos]]></category>
		<category><![CDATA[Declarative Services]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Equinox]]></category>
		<category><![CDATA[Fragment Bundle]]></category>
		<category><![CDATA[Howto]]></category>

		<guid isPermaLink="false">http://hexor2k.wordpress.com/?p=196</guid>
		<description><![CDATA[Hier noch eine kleine Info-Sammlung über Declarative Services (DS) in Fragment Bundles (FB). Alle folgenden Infos beziehen sich auf Eclipse Equinox.


Grundsätzlich gilt: es funktioniert. Allerdings unterliegen DS in FB einigen Besonderheiten:

XML-Files: Die Service-Komponenten-Beschreibungen können beliebig im Host- oder Fragment-Bundle abgelegt werden. Sie können beliebige Klassen aus beiden Bundles reservieren, da ja beide zur Laufzeit zu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=hexor2k.wordpress.com&blog=4544707&post=196&subd=hexor2k&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Hier noch eine kleine Info-Sammlung über Declarative Services (DS) in Fragment Bundles (FB). Alle folgenden Infos beziehen sich auf Eclipse Equinox.</p>
<p style="text-align:justify;">
<p style="text-align:justify;"><span id="more-196"></span></p>
<p style="text-align:justify;">Grundsätzlich gilt: es funktioniert. Allerdings unterliegen DS in FB einigen Besonderheiten:</p>
<ul style="text-align:justify;">
<li><strong>XML-Files: </strong>Die Service-Komponenten-Beschreibungen können beliebig im Host- oder Fragment-Bundle abgelegt werden. Sie können beliebige Klassen aus beiden Bundles reservieren, da ja beide zur Laufzeit zu einem Bundle verschmolzen werden und sich den Classpath teilen.</li>
<li><strong>Manifest-Files: </strong>Jetzt die schlechte Nachricht, das Element <code>Service-Component<br />
</code> darf nur in der Manifest-File des Host-Bundles eingetragen sein, im Manifest des Fragments wird es ignoriert. Es können jedoch mehrere <code>Service-Component</code>-Elemente im Host-Manifest &#8222;auf Vorrat&#8220; eingetragen werden, wenn man sich dann an den Fehlermeldungen im Log nicht stört.</li>
<li><strong>Konflikte</strong>: Was passiert, wenn man mehrere gleichnamige XML-Files in Host- und Fragmenten liegen, diese aber unterschiedliche Service-Komponenten deklarieren?? Es steht wahrscheinlich in keiner Spezifkation, was dann geschieht, bei Eclipse Equinox passiert folgendes: Es werden zwei eigenständige Service-Komponenten erstellt und gestartet. Es findet keine Überschreibung oder Überlagerung statt. Man kann sich das so vorstellen, als lägen beide in unterschiedlichen Files im gleichen Bundle. Falls es vorkommt, dass die Service-Komponenten einen identischen Namen haben (too much copy-paste <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ),  so kollidieren sie so wie im Normalfall.</li>
</ul>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/hexor2k.wordpress.com/196/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hexor2k.wordpress.com/196/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/hexor2k.wordpress.com/196/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/hexor2k.wordpress.com/196/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/hexor2k.wordpress.com/196/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/hexor2k.wordpress.com/196/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/hexor2k.wordpress.com/196/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/hexor2k.wordpress.com/196/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/hexor2k.wordpress.com/196/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/hexor2k.wordpress.com/196/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=hexor2k.wordpress.com&blog=4544707&post=196&subd=hexor2k&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://hexor2k.wordpress.com/2008/09/30/declarative-services-in-fragment-bundles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da83901c46990b57efdd2759b9ec859f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">hexor2k</media:title>
		</media:content>
	</item>
		<item>
		<title>Howto debug ANT Tasks</title>
		<link>http://hexor2k.wordpress.com/2008/09/03/howto-debug-ant-tasks/</link>
		<comments>http://hexor2k.wordpress.com/2008/09/03/howto-debug-ant-tasks/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 10:39:07 +0000</pubDate>
		<dc:creator>hexor2k</dc:creator>
				<category><![CDATA[Howtos]]></category>
		<category><![CDATA[ANT]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://hexor2k.wordpress.com/?p=174</guid>
		<description><![CDATA[Jeder, der schon einmal selbst einen ANT Task geschrieben hat, kennt das Problem:
Man kann zwar ANT Scripts debuggen (innerhalb von Eclipse), in einen Task kann man aber nicht springen. Falls der Task wegen Fehlern abbricht, sieht man meist nur eine lapidare Fehlermeldung. Eine Hilfe wäre es zwar, Debugmeldungen via sysout auszugeben, schön ist das jedoch [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=hexor2k.wordpress.com&blog=4544707&post=174&subd=hexor2k&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Jeder, der schon einmal selbst einen ANT Task geschrieben hat, kennt das Problem:</p>
<p style="text-align:justify;">Man kann zwar ANT Scripts debuggen (innerhalb von Eclipse), in einen Task kann man aber nicht springen. Falls der Task wegen Fehlern abbricht, sieht man meist nur eine lapidare Fehlermeldung. Eine Hilfe wäre es zwar, Debugmeldungen via sysout auszugeben, schön ist das jedoch nicht.</p>
<p style="text-align:justify;">Abhilfe schafft hier der <strong>Java Remote Debugger</strong>: Da ANT selbst eine Java-Anwendung ist, kann man diese im Debug-Modus starten. Zusätzlich meldet man diese Anwendung noch an einem Netzwerksocket als Remote Application an. Danach kann man von außen mittels einer eigenen Debugging-Instanz auf die Anwendung zugreifen und auf alle ihrer Breakpoints reagieren. Das folgende Beispiel bezieht sich auf die Eclipse IDE, mit anderen IDEs sollte es aber auch funktionieren.<br />
<span id="more-174"></span><br />
So, nun das ganze mal als Code:</p>
<pre style="text-align:justify;"><code>
echo off
set ECLIPSE_HOME=""
set WORKSPACE=""
set PROJECT=""

%ECLIPSE_HOME%\eclipsec.exe -nosplash -data %WORKSPACE%
  -application org.eclipse.ant.core.antRunner
  -buildfile %WORKSPACE%\%PROJECT%\build.xml
  -vmargs -Xdebug -Xnoagent -Djava.compiler=NONE
  -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
echo on</code></pre>
<p style="text-align:justify;">ANT wird via Batch-File als Eclipse-Headless-Application gestartet und bekommt zusätzlich die Parameter für Remote Debugging angegeben (<code>-Xrunjdwp:</code>&#8230;). Dann erstellt man in Eclipse eine neue DebugConfiguration und wählt als Typ Remote Java Application. Weitere Parameter müssen nicht verändert werden. Nach dem Start der Batchfile erscheint eine Console mit den Ausgaben der ANT-Anwendung. Wenn nun die DebugConfiguration gestartet wird, hängt diese sich an den Remote Task an. Hat man nun in einem selbst geschriebenen ANT Task einen Breakpoint, so stoppt die Anwendung genau an diesem Punkt und wechselt in die Debug-Perspektive.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/hexor2k.wordpress.com/174/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/hexor2k.wordpress.com/174/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/hexor2k.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hexor2k.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/hexor2k.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/hexor2k.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/hexor2k.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/hexor2k.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/hexor2k.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/hexor2k.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/hexor2k.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/hexor2k.wordpress.com/174/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=hexor2k.wordpress.com&blog=4544707&post=174&subd=hexor2k&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://hexor2k.wordpress.com/2008/09/03/howto-debug-ant-tasks/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da83901c46990b57efdd2759b9ec859f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">hexor2k</media:title>
		</media:content>
	</item>
		<item>
		<title>Howto OSGI Declarative Services</title>
		<link>http://hexor2k.wordpress.com/2008/08/27/osgi-declarative-services/</link>
		<comments>http://hexor2k.wordpress.com/2008/08/27/osgi-declarative-services/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 19:29:57 +0000</pubDate>
		<dc:creator>hexor2k</dc:creator>
				<category><![CDATA[Howtos]]></category>
		<category><![CDATA[Declarative Services]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Equinox]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[OSGi]]></category>

		<guid isPermaLink="false">http://hexor2k.wordpress.com/?p=140</guid>
		<description><![CDATA[Nachdem ich auf der Arbeit ständig damit hantiere, gibts jetzt ne kleine Anleitung bzw. Checkliste für Declarative Services (DS)  unter OSGI. Was sind DS? Ganz einfach: Normalerweise müsste man per Hand codieren, welche Services ein OSGI-Bundle anbietet und welche es verwendet. Dadurch entstehen einige Probleme, vor allem muss man sich selbst darum kümmern, was [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=hexor2k.wordpress.com&blog=4544707&post=140&subd=hexor2k&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Nachdem ich auf der Arbeit ständig damit hantiere, gibts jetzt ne kleine Anleitung bzw. Checkliste für <em>Declarative Services (DS) </em> unter <em>OSGI</em>. Was sind DS? Ganz einfach: Normalerweise müsste man per Hand codieren, welche Services ein OSGI-Bundle anbietet und welche es verwendet. Dadurch entstehen einige Probleme, vor allem muss man sich selbst darum kümmern, was passieren soll, wenn ein Service mal nicht zur Verfügung steht oder sich im Betrieb verabschiedet. Außerdem ist es für einen Außenstehenden oft schwer einzusehen, welche Services das Bundle verwendet bzw. anbietet. Die Ressourcenbelegung ist auch ein Punkt, da die Services sich sofort bei Bundle-Start registrieren und nicht erst, wenn sie benötigt werden. Hier kommen die Declarativen Services ins Spiel. Mit ihnen kann man Services per XML-Datei konfigurieren.</p>
<p style="text-align:justify;">
<p style="text-align:justify;"><span id="more-140"></span></p>
<p>Die folgende Checkliste wurde unter der Verwendung von Eclipse Equinox erstellt.</p>
<h3>Checkliste: Was wird für Declarative Services benötigt?</h3>
<ul>
<li>Die Implementierung der Deklarative Services erfolgt durch das Bundle <strong>org.eclipse.equinox.ds</strong>. Dieses Bundle muss immer mit geladen werden, bevor die DS verwendet werden können.</li>
<li>Zusätzlich wird die Klasse <strong>ComponentContext</strong> aus dem Bundle <strong>org.osgi.service.component</strong> benötigt.</li>
<li>Die eigentliche Implementierung des DS erfolgt als sog. <strong>Service Component, </strong>also einer Klasse, welche den Service (besser gesagt: das Service Interface) implementiert. Im Gegensatz zu einem Activator wird diese nicht abgeleitet oder implementiert eine Interface. Sie muss trotzdem folgende zwei Funktionen enthalten, damit die ServiceComponent funktioniert. Diese Funktionieren ähnlich wie die <em>start </em>und<em> stop </em>Methoden des Bundle-Activators.
<ul>
<li><strong>protected void activate(Component context){&#8230;}</strong></li>
<li><strong>protected void deactivate(Component context){&#8230;}<br />
</strong></li>
</ul>
</li>
<li>Eine <strong>Konfigurationsdatei</strong> in XML: Diese Datei wird üblicherweise in einem Verzeichnis namens <strong>OSGI-INF</strong> abgelegt, der Dateiname ist beliebig. Die XML-Datei selbst folgt dem <a href="http://www.osgi.org/xmlns/scr/v1.0.0/scr.xsd">hier</a> zu findenden Schema. Wichtig ist hier, dass alle Inhalte der XML-Datei, also Tags, Attribute aber Paket- und Klassennamen <strong>richtig </strong>geschrieben sind, ansonsten kann die Service Component nicht aktiviert werden.</li>
</ul>
<ul>
<li>Änderung im Manifest-File des Bundles: Füge eine neue Zeile hinzu, der Inhalt ist <strong>Service-Component: OSGI-INF/service.xml</strong> (wenn die XML-Datei service.xml heißt)</li>
</ul>
<h3>Beispiel:</h3>
<p style="text-align:justify;">Hierzu ein kleines Beispiel: Eine ServiceComponent soll erstellt werden, die einen Service mit dem Interface <strong>MyServiceInterface</strong> bereitstellt. Sie soll außerdem eine Liste von Services des Interface <strong>OtherService</strong> beinhalten. Dazu bindet sie diesen Service (der auch über eine Service Component realisiert werden muss) mit der <strong>cardinality=&#8220;1..n&#8220;</strong>, so dass mindestens ein <strong>OtherService</strong> vorhanden sein muss, um die Service Component zu aktivieren. Die einzige Funktion in <strong>MyServiceInterface</strong> gibt die Anzahl der angebundenen <strong>OtherService</strong> zurück.</p>
<h4>Service Interface:</h4>
<pre><code>package org.example.ds
import ...
public interface MyServiceInterface {
    int getCount();
}</code></pre>
<h4>Implementierungs-Klasse:</h4>
<pre><code>package org.example.ds.internal
import ...
public class MyServiceImplementation implements MyServiceInterface {

    private ComponentContext context;
    private List&lt;OtherService&gt; servicelist = new Vector&lt;OtherService&gt;(0);

    protected void activate(ComponentContext context){
        this.context = context;
    }

    protected void deactivate(ComponentContext context){
        this.context = null;
    }

    protected void bindOtherService(OtherService otherservice){
        this.servicelist.add(otherservice)
    }

    protected void unbindOtherService(OtherService otherservice){
</code><code>        this.servicelist.remove(otherservice)</code>
<code>    }

    </code><code>public int getCount(){
        return this.servicelist.size();
</code><code>    }
}
</code></pre>
<h4>Die XML-Datei im OSGI-INF Ordner:</h4>
<pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;component name="myServiceComponent"&gt;
    &lt;implementation class="org.example.ds.MyServiceImplementation"/&gt;
    &lt;service&gt;
        &lt;provide interface="org.example.ds.MyServiceInterface"/&gt;
    &lt;/service&gt;
    &lt;reference
        name="otherservice"
        interface="org.example.ds.OtherService"
        bind="bindOtherService"
        unbind="unbindOtherService"
        cardinality="1..n"
        policy="static"
    /&gt;
&lt;/component&gt;
</code></pre>
<h3>Fehlersuche:</h3>
<ul>
<li>Das Bundle startet, aber die Service Component nicht. Dies kann viele Ursachen haben:
<ul>
<li>Schreibfehler in der Manifest- oder XML-File. Am besten nochmal nachschauen, ob alle Paket- und Klassennamen stimmen.</li>
<li>Eine geforderte Referenz ist nicht verfügbar. Untersuche alle Referenzen, ob deren Service Components vollständig gestartet wurden.</li>
<li>Eintrag in der <strong>Manifest-File</strong> fehlt oder ist ungültig. Mein absoluter Lieblings-Fehler <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li>Funktionen wie <strong>activate/deactivate</strong> bzw. <strong>bind/unbind</strong> fehlen oder sind ungültig.</li>
</ul>
</li>
<li><strong>NullPointerException</strong> oder andere krude Exceptions werden geworfen: Dies kann auftreten, wenn Klassenmember in der <strong>activate</strong>-Funtion belegt werden. Diese wird nämlich erst dann aufgerufen, wenn alle Referenzen erfüllt sind, also erst nach den <strong>bind</strong>-Funktionen. Wenn in <strong>bind</strong> schon auf das Member zugegriffen wird, ist es dann noch <strong>null</strong> und die NullPointerException wird geworfen.</li>
<li>Hilfe, ich sehe nicht ob sich irgendwas tut!!!
<ul>
<li>Der Status einer Service Component kann leider nicht einfach über den <strong>status</strong>-Befehl abgefragt werden, da Service Components ein relativ neues Konzept sind.</li>
<li>Eine Service Component meldet ihre Services sofort an der Service Registry an, der Befehl <strong>services</strong> gibt also keinerlei Aufschluss über den Status ser Service Component.</li>
<li>Am besten kann der Lebenszyklus über den Log-Service verfolgt werden, den Equinox mitliefert. Er kann über das Bundle <strong>org.eclipse.equinox.log</strong> angebunden werden</li>
</ul>
</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/hexor2k.wordpress.com/140/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/hexor2k.wordpress.com/140/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/hexor2k.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hexor2k.wordpress.com/140/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/hexor2k.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/hexor2k.wordpress.com/140/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/hexor2k.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/hexor2k.wordpress.com/140/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/hexor2k.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/hexor2k.wordpress.com/140/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/hexor2k.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/hexor2k.wordpress.com/140/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=hexor2k.wordpress.com&blog=4544707&post=140&subd=hexor2k&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://hexor2k.wordpress.com/2008/08/27/osgi-declarative-services/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/da83901c46990b57efdd2759b9ec859f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">hexor2k</media:title>
		</media:content>
	</item>
	</channel>
</rss>