tag:blogger.com,1999:blog-62018066274345714672024-03-05T11:01:13.926+00:00My YaST2 developmentMichal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.comBlogger21125tag:blogger.com,1999:blog-6201806627434571467.post-77387087275070753152010-06-30T13:42:00.004+01:002010-06-30T15:46:24.384+01:00WebYaST: Switch from XML into JSON (day two)Hi!<br />Today I compared JSON vs XML communication in WebYaST.<div>And the result is ... there's no big difference for us.<br />Calling groups index page without profiling takes almost same time with XML or JSON:<br /><br />JSON<br />5.59, 5.7, 5.59, 5.82, 6.01 (average 5.742)<br /><br />XML<br />5.99, 5.98, 5.88, 6.17, 5.96 (average 5.996)</div><div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz8G_3EgfxKmCI4fltSRMoobVBcfG875xpf_ECw3V_c5DQS0jOrW9fN3So2y1n5WSNi9NHtfffDTnpDQH6vUrh37-SnKDzOwKre9JWoEOF8JwaslP1DTKuiH1uhSveF1sOkAW42LF1bgU/s1600/profiling1.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz8G_3EgfxKmCI4fltSRMoobVBcfG875xpf_ECw3V_c5DQS0jOrW9fN3So2y1n5WSNi9NHtfffDTnpDQH6vUrh37-SnKDzOwKre9JWoEOF8JwaslP1DTKuiH1uhSveF1sOkAW42LF1bgU/s400/profiling1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5488573079550268178" /></a><br /></div><div>Comparing processor cycles - JSON is winner, but the difference is not so visible, because there are much bigger time consumers than XML/JSON parsing.</div><div>Maybe (as jreidinger suggested) caching on client side could improve the performance ...</div>Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com0tag:blogger.com,1999:blog-6201806627434571467.post-5497235931617550192010-06-29T14:04:00.009+01:002010-06-29T15:30:43.982+01:00WebYaST: Switch from XML into JSON (day one)<div style="text-align: left;">This week I'll continue on project that started on recent WebYaST Workshop:<a href="http://en.opensuse.org/Appliances/Events/Workshop_Nuremberg_2010/Projects/WebYaST_Performance">WebYaST_Performance</a></div><br />Result from previous tests was that bundled reXML parser is slowest from all ;-)<br />Now I'd like to continue with comparison XML and JSON performance. For this purpose I created webclient json branch in our git repository.<br /><br /><br />To install profiling extension you'll need to add repository <a href="http://download.opensuse.org/repositories/devel:/languages:/ruby:/extensions/openSUSE_11.2">http://download.opensuse.org/repositories/devel:/languages:/ruby:/extensions/openSUSE_11.2</a><br />and install package <b>rubygem-ruby-prof</b>. Also to see results from profiling you'll need <b>kcachegrind</b> package.<br /><div><br />I started some tests with Firefox firebug extension (5 measurements from each and then calculate average). First one without any modification, then with profiling enabled.<br /><br /><table style="width: 250px;"><tbody><tr><th>xml (rexml), no benchmarking</th><th>xml (rexml), ruby-prof enabled</th></tr><tr><td>5.53</td><td>6.3</td></tr><tr><td>6.53</td><td>5.71</td></tr><tr><td>6.15</td><td>5.79</td></tr><tr><td>6.55</td><td>5.78</td></tr><tr><td>6.15</td><td>5.99</td></tr><tr><td><b>6.182</b></td><td><b>5.914</b></td></tr></tbody></table><br /></div><div><br /></div><br /><br /><br /><br /><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4w_jCgo9XGM-7A7dbUPc1LaaMQwiOuVaqabKm8mwUy-rkJkRYTvBhrYtPDIF41tfGgyGwKS5nWTIfhVOhY0m66uKajj_oE4wgXkD9wFvot3XmFFFGEG52sNkAkmNADHamaQkTsmU-R7c/s400/profiling.png" style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 344px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5488198560318659922" /><br />On this picture you can see (selected line is xml parsing process) with luck we can speed up <b>1/5</b> times (about 1 sec in my case). There's almost no difference between creating json and xml output: Calling http://localhost:4984/groups.xml takes average time <b>655</b>ms, http://localhost:4984/groups.json takes average time <b>621.4</b>ms.<div>In rest-service there are some problems - json output is not valid, jreidinger is working on it.</div><div>I'll continue tomorrow.</div>Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com5tag:blogger.com,1999:blog-6201806627434571467.post-1000470959550931082009-05-26T10:04:00.005+01:002009-06-01T13:49:29.932+01:00Automatic installation via PXEThis post is more howto than regular blog. I tried to setup PXE based automatic installation server.<br />There are some docu pages:<br />http://en.opensuse.org/SuSE_install_with_PXE_boot<br />http://en.opensuse.org/SDB:Network_Installation_of_SuSE_Linux_via_PXE_Boot<br />but they're both old and step-by-step doesn't work.<br /><br /><br />First of all, download openSUSE11.1.iso and create installation source:<br /><span style="font-weight: bold;">wget http://download.opensuse.org/distribution/11.1/iso/openSUSE-11.1-DVD-i586.iso<br />mkdir /srv/www/htdocs/11.1<br />mount -o loop,uid=wwwrun openSUSE-11.1-DVD-i586.iso /srv/www/htdocs/11.1</span><br /><br /><span style="font-weight: bold;"></span><br />Install apache web server:<br /><span style="font-weight: bold;">zypper in apache2</span><br /><br />Configure apache to use symlinks:<br />in /etc/apache2/default-server.conf, in section <Directory "/srv/www/htdocs"><br />change "Options None" to "Options FollowSymLinks"<br />restart apache:<br /><span style="font-weight: bold;">rcapache2 restart</span><br /><br /><span style="font-weight: bold;">Note:</span> <span style="font-style: italic;">my PXE server mas 172.168.1.1 IP address. PXE client will have 172.168.1.2 IP address and 08:00:27:B9:42:52 MAC address</span><br /><br />Install DHCP server<br />zypper in <span style="font-weight: bold;">dhcp-server</span><br /><br />Configure DHCP server, to offer PXE, dhcpd.conf:<br />option domain-name-servers 172.168.1.1;<br />option routers 172.168.1.1;<br />default-lease-time 14400;<br />ddns-update-style none;<br />subnet 172.168.1.0 netmask 255.255.255.0 {<br /> range 172.168.1.2 172.168.1.30;<br /> default-lease-time 14400;<br /> max-lease-time 172800;<br />}<br />group { # id="pxe-client"<br /> next-server 172.168.1.1;<br /> filename "pxelinux.0";<br /> host PXEclient { hardware ethernet 08:00:27:B9:42:52; }<br />}<br /><br /><span style="font-weight: bold;">rcdhcpd restart</span><br /><br /><br />Install yast2-tftp-server and configure tftp service:<br /><span style="font-weight: bold;">yast2 tftp</span> (confirm to create /tftpboot)<br /><br />Install syslinux and copy into /tftpboot:<br /><span style="font-weight: bold;">zypper in syslinux</span><br /><span style="font-weight: bold;">cp /usr/share/syslinux/pxelinux.0 /tftpboot/</span><br /><span style="font-weight: bold;">rcxinetd restart</span><br /><br />Copy and configure isolinux:<br /><span style="font-weight: bold;">mkdir /tftpboot/pxelinux.cfg</span><br /><span style="font-weight: bold;">cp iso/boot/i386/loader/isolinux.cfg /tftpboot/pxelinux.cfg/default</span><br /><br />Copy kernel and initrd<br /><span style="font-weight: bold;">cp iso/boot/i386/loader/linux</span><br /><span style="font-weight: bold;">cp iso/boot/i386/loader/initrd</span><br /><br />Edit config file to boot this as default:<br />/tftpboot/pxelinux.cfg/default:<br />default linux<br />label linux<br />append initrd=initrd splash=silent showopts install=http://172.168.1.1/11.1 insecure=1<br /><br />implicit 1<br />display message<br />prompt 1<br />timeout 40<br /><br />Configure your client (in BIOS setup) to "Boot from LAN", "PXE", "network boot" or something similar (depends on BIOS version).<br />Now we can start installation. On the last dialog, check "create reference profile" checkbox and click OK. When this will be done, copy profile from /root/autoyast.xml on your PXE server as /srv/www/htdocs/AY.xml.<br /><br />Now you can update your /tftpboot/pxelinux.cfg/default (add <span style="font-weight: bold;">autoyast</span> option):<br />append initrd=initrd splash=silent showopts install=http://172.168.1.1/11.1 insecure=1 autoyast=http://172.168.1.1/AY.xml<br /><br /><br /><br />Ok, the result is what we wanted:<br />When you reboot <span style="font-style: italic;">client</span> machine, it will be be automatically reinstalled to default installation (from autoyast profile). If you comment <span style="font-weight: bold;">filename</span> option (and restart dhcp server), client machine will only boot into installed system.<br /><br /><br />I hope it's clean to understand/reproduce and I hope it will help to somebody.<br />If not, I'm looking for your feedback ;-)Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com1tag:blogger.com,1999:blog-6201806627434571467.post-34971487391780133392009-04-07T19:38:00.005+01:002009-04-07T20:05:48.567+01:00UML diagram of yui objectsRecently I found UML modeling tool - Umbrello. Well, it's not very stable, but there is autosave function ;-)<br />So I created Class diagram for my small widget_library:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJiEoCn-aRdrTS9ZpJqkhgDDRxdIW_Ie4w4lXZ34kztU6ukJx-1n1s3b1e15r37re1gs9ymjSwBLfkC2oI_ieTKBMUykbTCKvosyt3e16e692BQYAyt7J5usJdaNSGq9clzmsw16L1Tk8/s1600-h/uml.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 298px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJiEoCn-aRdrTS9ZpJqkhgDDRxdIW_Ie4w4lXZ34kztU6ukJx-1n1s3b1e15r37re1gs9ymjSwBLfkC2oI_ieTKBMUykbTCKvosyt3e16e692BQYAyt7J5usJdaNSGq9clzmsw16L1Tk8/s320/uml.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5322021318671271570" /></a><br /><br />Some objects are missing (work in progress), anyway it's important to visualise objects from begining. It's could be too late when library becomes too complex and relations complicated ...Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com0tag:blogger.com,1999:blog-6201806627434571467.post-16940247493434540952009-03-13T20:35:00.009+00:002009-03-14T22:19:17.620+00:00OOP YaST GUI: event handlingOOP in YaST GUI: Event handling<br />------------------------------<br /><br />Hello, here I am again ...<br /><br />I played with idea of event handling, but if possible better way than we do in ycp now.<br />Also using inheritance: when you define some behavior, you can inherit class and override handling method or just use objects and handling will be done automatically (using composition).<br />So the basic idea is that event loop is done automatically and it executes handle function of object that is responsible for such event or which is listening.<br /><br />Event loop is implemented in parent object (root object in hierarchy - CDialog). Because of this, all inherited objects (MainDialog, PopupDialog) will have this functionality automatically.<br /><br /><pre><br />class CDialog:<br /> def __init__(self):<br /> self.factory = yui.YUI.widgetFactory()<br /><br /> def listen(self, newList):<br /> self.listeners = newList<br /> etype=-1<br /> while etype!=5:<br /> event = self.dialog.waitForEvent()<br /> etype = event.eventType()<br /> for item in self.listeners:<br /> if (item.getInstance()==event.widget()): item.handle(event)<br /><br />class CButton:<br /> def __init__(self, factory, parent, label):<br /> self.button = factory.createPushButton( parent, label )<br /> def getInstance(self):<br /> return self.button<br /><br />...<br />self.pbAdd = CButton(self.f, hbox2, "&Add")<br />self.pbEdit = CButton(self.f, hbox2, "&Edit")<br />self.pbDel = CButton(self.f, hbox2, "&Delete")<br />...<br />d.listen([self.pbAdd, self.pbEdit, self.pbDel])<br />...<br /><br /></pre><br /><br /><br />When you want to handle something (button click for example), you need to:<br />- define function that will executed<br />- connect function to the object<br />- start event loop with list of "listeners" (objects with connected functions)<br /><br />There are 3 kinds of functons:<br />1 - function without any connection to object<br /><pre><br />self.pbAdd.handle = self.handleAdd<br /></pre><br />2 - function with connection just to object<br /><pre><br />self.pbAdd.handle = new.instancemethod(mujhandler, self.pbAdd, self.pbAdd.__class__)<br /></pre><br />3 - function with visibility outside of the object (example: function can see whole dialog)<br /><pre><br />self.pbAdd.handle = new.instancemethod(self.handleAdd.im_func, self.pbAdd, self.pbAdd.__class__)<br /></pre><br /><br />Code is submitted into <a href="http://svn.opensuse.org/svn/yast/branches/tmp/mzugec/python-yui/">subversion</a><br /><br />How to test this code:<br />- svn checkout http://svn.opensuse.org/svn/yast/branches/tmp/mzugec/python-yui/<br />- make sure you have installed packages: python-yui, yast2-libyui, yast2-qt, yast2-ncurses <br />- run "./main.py" to see Qt version, "unset DISPLAY;./main.py" for ncurses version (unfortunately,in ncurses only way how to terminate application is to kill it, TODO)Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com0tag:blogger.com,1999:blog-6201806627434571467.post-26380730330806772462009-02-17T13:16:00.013+00:002009-03-12T14:19:14.410+00:00Object Oriented UI for YaSTHello!<br /><br />After my last blog I worked on YaST (what a surprise) and didn't have any time to post anything until now.<br />Meanwhile I read some chapters from the "Thinking in Java" book. There are some chapters about OOP in general and it brings me to idea, how it would be great in YaST. As a side effect it also means get away from ycp ;-). Thanks to <a href="http://kkaempf.blogspot.com/2008/05/declaring-ui-independence-earlier-this.html">UI independence</a> I can use Python with the YaST UI.<br /><br />Here's some code example:<br /><br />widget_library.py:<br /><pre><br />#!/usr/bin/python<br /># -*- coding: utf-8 -*-<br />import yui<br /><br />class MainDialog:<br /> def __init__(self):<br /> self.factory = yui.YUI.widgetFactory()<br /> self.dialog = self.factory.createMainDialog()<br /> def __del__(self):<br /> self.dialog.destroy()<br /><br />class Popup:<br /> def __init__(self):<br /> self.factory = yui.YUI.widgetFactory()<br /> self.dialog = self.factory.createPopupDialog()<br /> def __del__(self):<br /> self.dialog.destroy()<br /><br /><br />class TableDialog:<br /> def __init__(self, d):<br /> self.f = d.factory<br /> vbox1 =self.f.createVBox( d.dialog )<br /> self.f.createVStretch(vbox1)<br /> hbox1 =self.f.createHBox( vbox1 )<br /> self.f.createHStretch(hbox1)<br /> self.f.createHSpacing(hbox1,1)<br /> vbox2 =self.f.createVBox( hbox1 )<br /><br /> self.Table( vbox2 )<br /><br /> vspace =self.f.createVSpacing(vbox1,2)<br /> self.f.createHSpacing(hbox1,1)<br /> self.f.createHStretch(hbox1)<br /> self.f.createVStretch(vbox1)<br /><br /> etype=-1<br /> while etype!=5:<br /> event = d.dialog.waitForEvent()<br /> etype = event.eventType()<br /> self.HandleEvent( event )<br /> print etype<br /><br /> def Table(self,parent):<br /> vbox3 =self.f.createVBox( parent )<br /> self.customWidget(vbox3)<br /> theader = yui.YTableHeader()<br /> theader.addColumn("Targets")<br /> self.table =self.f.createTable( vbox3, theader )<br /> hbox2 =self.f.createHBox( vbox3 )<br /> self.pbAdd =self.f.createPushButton( hbox2, "&Add" )<br /> self.pbEdit =self.f.createPushButton( hbox2, "&Edit" )<br /> self.pbDel =self.f.createPushButton( hbox2, "&Delete")<br /> self.enableDisableButtons()<br /><br /> def customWidget(self,parent):<br /> pass<br /><br /> def HandleEvent(self,event):<br /> if (event.widget()==self.pbAdd):<br /> self.handleAdd(event)<br /> elif (event.widget()==self.pbEdit):<br /> self.handleEdit(event)<br /> elif (event.widget()==self.pbDel):<br /> self.handleDel(event)<br /> self.enableDisableButtons()<br /><br /> def enableDisableButtons(self):<br /> self.pbEdit.setEnabled(self.table.itemsCount()>0)<br /> self.pbDel.setEnabled(self.table.itemsCount()>0)<br /></pre><br /><br />main.py:<br /><pre><br />#!/usr/bin/python<br /># -*- coding: utf-8 -*-<br />import yui<br />from widget_library import *<br /><br />class TargetDialog(TableDialog):<br /> def __init__(self,d):<br /> TableDialog.__init__(self,d)<br /><br /> def customWidget(self,parent):<br /> hbox =self.f.createHBox( parent )<br /> self.f.createInputField(hbox, "Target")<br /> self.f.createInputField(hbox, "Identifier")<br /><br /> def handleAdd(self, event):<br /> print "add target item"<br /> def handleEdit(self,event):<br /> print "edit target item ..."<br /> def handleDel(self,event):<br /> print "delete target item ..."<br /><br />class MyTable(TableDialog):<br /> def __init__(self,d):<br /> TableDialog.__init__(self,d)<br /><br /> def handleAdd(self,event):<br /> print "adding ..."<br /> TargetDialog(Popup())<br /><br /> def handleEdit(self,event):<br /> print "edit item ..."<br /> def handleDel(self,event):<br /> print "delete item ..."<br /><br />if __name__== "__main__":<br /> td = TargetDialog(MainDialog())<br /></pre><br /><br /><br />I know that code is not nice and not very useful, but here's some nice OOP examples:<br />inheritance, composition, etc ...<br /><br />Easily put into constructor, what kind of dialog I want:<br />TableDialog(MainDialog()) or TargetDialog(Popup())<br /><br />Inherit some class and override methods you want (see MyTable.handle*())<br />This is much better than generate file from template (as we do now).<br /><br />I like this way and I'll keep working on it during my ITO.<br /><br />Bye,<br />MichalMichal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com1tag:blogger.com,1999:blog-6201806627434571467.post-66836951613520200392008-08-11T13:17:00.006+01:002008-08-11T13:45:30.718+01:00New YaST2 printer configuration moduleToday I submitted new version of yast2-printer (2.17.2). This version contains big (major) changes. It uses Johannes Meixner's code from Build service, based on some <a href=http://en.opensuse.org/YaST/Development/Printer_Enhancement#Release_Candidate_2>ideas</a> to improve current status. <br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUozfoevRrxzASYPRMkSUXD9VmwcPzABFbetRQT8mP8-ZiYYlKOY0LH_AuBxmDplsdoayWbpEI4RZpqDYbsDnB6dJ9qEWKFyzPz3G50s6oD4yw3JLkuGJufwG5dacyXiSXQq5Xmv9XVaE/s1600-h/yast2-printer.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUozfoevRrxzASYPRMkSUXD9VmwcPzABFbetRQT8mP8-ZiYYlKOY0LH_AuBxmDplsdoayWbpEI4RZpqDYbsDnB6dJ9qEWKFyzPz3G50s6oD4yw3JLkuGJufwG5dacyXiSXQq5Xmv9XVaE/s320/yast2-printer.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5233236802446946050" /></a><br /><br />Please anybody interested in improving current status of printing configuration - test it and give me (any) feedback.<br /><br />Thank you,<br />MichalMichal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com5tag:blogger.com,1999:blog-6201806627434571467.post-28840363533563322912008-08-07T08:53:00.004+01:002008-08-07T09:57:29.299+01:00Installation via wireless networkI fixed some issues in yast2-network-2.17.16 and did some tests and the result is : <b>it works fine!</b><br /><br />1 - Boot into any already installed linux, download <b>kernel & initrd</b>, create /boot/grub/menu.lst entry - some documentation <a href="http://en.opensuse.org/Network_Install">here</a>, also possible to use miniISO<br /><br />2 - Into bootloader pass <b>install=$custom_or_public_NETWORK_repository</b> option<br /><br />3 - Unplug your wired card<br /><br />4 - With this setup will Linuxrc try to use your wireless network card to connect network repository. There are some dialogs to specify ESSID, WEP/WPA and sharedkey<br /><br />5 - In case of connection succeed, do installation as usual (via wireless ;-))<br /><br />6 - Before first reboot this network setup will be saved as persistent (into /etc/sysconfig/network/ifcfg-wlan0)<br /><br />7 - During next boot (2nd stage of installation) wireless network is automatically up and you can finish installationMichal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com0tag:blogger.com,1999:blog-6201806627434571467.post-60108207729393380802008-08-04T12:27:00.014+01:002008-08-04T13:41:08.584+01:00YaST network and TunnelsFrom version yast2-network-2.17.14 YaST has support for creating tunnels. This is good for virtual networking, VPN and virtualization.<br />But theory you can read on many places (including wikipedia), so here is practical example of configuration:<br /><br />My previous "usual" configuration<br /><pre><br />urchin:/home/mzugec/svn/trunk/network # ip a<br />1: lo: <loopback,up,lower_up> mtu 16436 qdisc noqueue<br /> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br /> inet 127.0.0.1/8 brd 127.255.255.255 scope host lo<br /> inet 127.0.0.2/8 brd 127.255.255.255 scope host secondary lo<br />2: eth0: <broadcast,multicast,promisc,up,lower_up> mtu 1500 qdisc pfifo_fast qlen 1000<br /> link/ether 00:11:d8:39:4e:d0 brd ff:ff:ff:ff:ff:ff<br /> inet 10.20.1.28/21 brd 10.20.7.255 scope global eth0<br />3: eth1: <broadcast,multicast> mtu 1500 qdisc pfifo_fast qlen 1000<br /> link/ether 00:11:d8:39:5c:e4 brd ff:ff:ff:ff:ff:ff<br /></pre><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim6DbHtPN1g3GFS8IUvwi2j4xjQPntbeUDnQMn3HFWP6Q0E3FXz1nsyGd3S2VoqMEhnubok8-KfqUM2H0fA7N82GVwfTsm5NcUTnpIM9HjO-CyxXjrNO7PkapyDP-mkjHTQzKX3FDikFM/s1600-h/yast2-000.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim6DbHtPN1g3GFS8IUvwi2j4xjQPntbeUDnQMn3HFWP6Q0E3FXz1nsyGd3S2VoqMEhnubok8-KfqUM2H0fA7N82GVwfTsm5NcUTnpIM9HjO-CyxXjrNO7PkapyDP-mkjHTQzKX3FDikFM/s320/yast2-000.png" alt="" id="BLOGGER_PHOTO_ID_5230628207380265810" border="0" /></a><br /><br />In YaST, remove configuration from eth0 (because this configuration belongs to bridge - see later)<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhI3aBNDoVUu1jL3XhVJ1V4dq3pPbKX5TNtzB2CsghgX2F0LMEbPMkLw5EarUOD7ToYND9Sfbr40wyTB1FRtwFtpKyrMrADOyp3l9eeGePOgn9sDkeH1Y22IiABU70opES-BUjplqu2Bg/s1600-h/yast2-001.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhI3aBNDoVUu1jL3XhVJ1V4dq3pPbKX5TNtzB2CsghgX2F0LMEbPMkLw5EarUOD7ToYND9Sfbr40wyTB1FRtwFtpKyrMrADOyp3l9eeGePOgn9sDkeH1Y22IiABU70opES-BUjplqu2Bg/s320/yast2-001.png" alt="" id="BLOGGER_PHOTO_ID_5230628300096796738" border="0" /></a><br /><br />Create new TAP device, click Next<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6ty38DZbhYdU_XgC8asjt_lCki5yd8EvvaHPRRE5hnBfMKQuo6CSxurN0mz3IswVWw4Xam_ug7Xf6UY8KD_53TWA-OrQlddGMe_2Nvv0KV6uigYCEM2ubzPqAa97g4gD71yxW4unK3s4/s1600-h/yast2-002.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6ty38DZbhYdU_XgC8asjt_lCki5yd8EvvaHPRRE5hnBfMKQuo6CSxurN0mz3IswVWw4Xam_ug7Xf6UY8KD_53TWA-OrQlddGMe_2Nvv0KV6uigYCEM2ubzPqAa97g4gD71yxW4unK3s4/s320/yast2-002.png" alt="" id="BLOGGER_PHOTO_ID_5230628525249708242" border="0" /></a><br /><br />Leave default "Persistent Tunnel" and set owner and/or group to access this device from user account<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihHc0IukI2on4Oqjq3aoq8PcyMWTIYLfysk2JCr4qJLpV8CwBbJmEC67U3nGc8r9-MBqNPJNwqcertQ4qcnQkuUaZYVd9YEcHrw9CYYxUaY1V9oamgXK9UymmussjHZqLa-NwpgZzTC2U/s1600-h/yast2-003.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihHc0IukI2on4Oqjq3aoq8PcyMWTIYLfysk2JCr4qJLpV8CwBbJmEC67U3nGc8r9-MBqNPJNwqcertQ4qcnQkuUaZYVd9YEcHrw9CYYxUaY1V9oamgXK9UymmussjHZqLa-NwpgZzTC2U/s320/yast2-003.png" alt="" id="BLOGGER_PHOTO_ID_5230628529936239906" border="0" /></a><br /><br /><br />Configuration overview<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWFGKiTqAAaIX7jKQuzMb6ERsLnMXtwpCgx9C1Jvo1UxdcXsrgrKjVONAuJcuJ3-dDJXcGvRrukh9bjMMHJeqSf-3CCXiIDZVPv-t1Cb2B4aVz2pzFTRE8UslEJvEhKCv88ON53cRRcFE/s1600-h/yast2-004.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWFGKiTqAAaIX7jKQuzMb6ERsLnMXtwpCgx9C1Jvo1UxdcXsrgrKjVONAuJcuJ3-dDJXcGvRrukh9bjMMHJeqSf-3CCXiIDZVPv-t1Cb2B4aVz2pzFTRE8UslEJvEhKCv88ON53cRRcFE/s320/yast2-004.png" alt="" id="BLOGGER_PHOTO_ID_5230628533328294738" border="0" /></a><br /><br />Create new network interface type bridge<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqX5LaDeSHunjCcKmNsVgSJrKn66qeOEaHVpc4XJrZj2sDChF51E5CiCscRGF9LJwsflcyquYxLyojQ4-kCHWVIXp0RZZFRGdFIfnPrOQd0kUfoYPDVy5Se2H_uICj5UFHb4s7qzvSkRU/s1600-h/yast2-005.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqX5LaDeSHunjCcKmNsVgSJrKn66qeOEaHVpc4XJrZj2sDChF51E5CiCscRGF9LJwsflcyquYxLyojQ4-kCHWVIXp0RZZFRGdFIfnPrOQd0kUfoYPDVy5Se2H_uICj5UFHb4s7qzvSkRU/s320/yast2-005.png" alt="" id="BLOGGER_PHOTO_ID_5230628535066848610" border="0" /></a><br /><br />Put eth0 and tap0 into bridge and configure bridge with DHCP (as eth0 before)<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLoOgGuASL-yE8Ely3nKvlc6p0ZNFXYosvr2GwmIMe8kVYiRFszVVd6VlJ1V_s69flYgCcL5IX7E-NSQHmuo3oaP6SXisDuaBD3VRQ6W3ZwN47RxYEJYs60q7AAC5DjNXkw05gxrA8ZNI/s1600-h/yast2-006.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLoOgGuASL-yE8Ely3nKvlc6p0ZNFXYosvr2GwmIMe8kVYiRFszVVd6VlJ1V_s69flYgCcL5IX7E-NSQHmuo3oaP6SXisDuaBD3VRQ6W3ZwN47RxYEJYs60q7AAC5DjNXkw05gxrA8ZNI/s320/yast2-006.png" alt="" id="BLOGGER_PHOTO_ID_5230628545289593842" border="0" /></a><br /><br />Configuration overview<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9UVieLsqlwigBcfw86QdN1XAE2q5DIsJ7jhqLjx8DBkHWV7A8MbcQKjMKemcbwKBRzL_2CbF89DOhiD4l0l9NWNkyWYuuk6wW71WiQiKgXjkzW6XWllvrwv64yhOCXehETacLotm5bbA/s1600-h/yast2-007.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9UVieLsqlwigBcfw86QdN1XAE2q5DIsJ7jhqLjx8DBkHWV7A8MbcQKjMKemcbwKBRzL_2CbF89DOhiD4l0l9NWNkyWYuuk6wW71WiQiKgXjkzW6XWllvrwv64yhOCXehETacLotm5bbA/s320/yast2-007.png" alt="" id="BLOGGER_PHOTO_ID_5230628609940936482" border="0" /></a><br /><br /><pre><br />urchin:/home/mzugec/svn/trunk/network/src # ip a<br />1: lo: <loopback,up,lower_up> mtu 16436 qdisc noqueue<br /> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br /> inet 127.0.0.1/8 brd 127.255.255.255 scope host lo<br /> inet 127.0.0.2/8 brd 127.255.255.255 scope host secondary lo<br />2: eth0: <broadcast,multicast,promisc,up,lower_up> mtu 1500 qdisc pfifo_fast qlen 1000<br /> link/ether 00:11:d8:39:4e:d0 brd ff:ff:ff:ff:ff:ff<br />3: eth1: <broadcast,multicast> mtu 1500 qdisc pfifo_fast qlen 1000<br /> link/ether 00:11:d8:39:5c:e4 brd ff:ff:ff:ff:ff:ff<br />24: tap0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc pfifo_fast qlen 500<br /> link/ether 00:ff:1c:00:23:8b brd ff:ff:ff:ff:ff:ff<br />25: br0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc noqueue<br /> link/ether 00:11:d8:39:4e:d0 brd ff:ff:ff:ff:ff:ff<br /> inet 10.20.1.28/21 brd 10.20.7.255 scope global br0<br /><br />urchin:/home/mzugec/svn/trunk/network/src # brctl show<br />bridge name bridge id STP enabled interfaces<br />br0 8000.0011d8394ed0 no eth0<br /> tap0<br /></pre><br /><br />Using TAP device with VirtualBox.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1VONhonFApj8hZ0WZqitRhRj9Ucyv95bjkbDJeAedNr-t1XS5xC6T4WfQTixzR2KtJ2m_tBFzBQS6yoceyR2n31tAfVoc_X4nvxBzJQgfgi_ip7Y46e1JdWPAw02YD7Mp4Nug7oKZtUI/s1600-h/vbox"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1VONhonFApj8hZ0WZqitRhRj9Ucyv95bjkbDJeAedNr-t1XS5xC6T4WfQTixzR2KtJ2m_tBFzBQS6yoceyR2n31tAfVoc_X4nvxBzJQgfgi_ip7Y46e1JdWPAw02YD7Mp4Nug7oKZtUI/s320/vbox" alt="" id="BLOGGER_PHOTO_ID_5230628708814364290" border="0" /></a><br />Virtualized machine through tunnel connected into bridge is accessible from outside network!Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com5tag:blogger.com,1999:blog-6201806627434571467.post-46437194085719111962008-07-21T10:36:00.003+01:002008-07-23T14:11:52.946+01:00AutoYaST, network device namesEverybody probably knows YaST. You should use it, at least for installation. And what about AutoYaST? <a href="http://www.suse.com/%7Eug/autoyast_doc/index.html">AutoYaST</a> is a great tool for automatic installation and configuration. I did some work regarding automatic installation & network setup during installation. Documented <a href="http://en.opensuse.org/YaST/installation-network#Device_names_in_AutoYaST">here</a><br />I did 4 tests:<br /><br />1 - When installation starts, udev will create configuration file for persistent naming (based on MAC address). At the end of 1st stage (before first reboot) YaST will copy this file into installed system, so after reboot all network devices will have same device names.<br /><br />2 - Same as 1, but during AutoYaST installation. That means when no rule in AutoYaST profile about this file, keep it, not replace by empty file.<br /><br />3 - Use AutoYaST profile. When there is defined some rule about this file, use it and replace the original one. This example from networking section creates corresponded udev rule to keep eth0 name for interface with 08:00:27:07:a2:2d MAC address (and replaces udev rule file from 1):<br /><br />part of AY.xml<br /><pre><br /><networking><br />...<br /> <net-udev type=list><br /> <rule><br /> <rule>ATTR{address}</rule><br /> <value>08:00:27:07:a2:2d</value><br /> <name>eth0</name><br /> </rule><br /> </net-udev><br />...<br /></networking><br /></pre><br /><br />/etc/udev/rules.d/70-persistent-net.rules file as a result:<br /><pre><br /># Generated by autoyast<br /># program run by the persistent-net-generator.rules rules file.<br />#<br /># You can modify it, as long as you keep each rule on a single line.<br />SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:07:a2:2d", NAME="eth0"<br /></pre><br /><br />4 - Migration from SLES10-style syntax. When you use your old profile (from <=SLES10x), it's something like:<br /><pre><br /><networking><br />...<br /> <interfaces config:type=list><br /> <interface><br /> <bootproto>dhcp</bootproto><br /> <device>eth-id-08:00:27:07:a2:2d</device><br /> <name>79c970 [PCnet32 LANCE]</name><br /> <startmode>auto</startmode><br /> <usercontrol>no</usercontrol><br /> </interface><br /> </interfaces><br />...<br /></networking><br /></pre><br /><br />YaST will convert device name eth-id-08:00:27:07:a2:2d into rule for udev:<br /><pre><br /># Generated by autoyast<br /># program run by the persistent-net-generator.rules rules file.<br />#<br /># You can modify it, as long as you keep each rule on a single line.<br />SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:07:a2:2d", NAME="eth0"<br /></pre><br /><br />and rename configuration name into eth0<br /><br />And that's all for now ...<br />... have a lot of fun<br />Bye,<br />MichalMichal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com1tag:blogger.com,1999:blog-6201806627434571467.post-48742490275980016452008-07-09T09:15:00.003+01:002008-07-09T09:35:41.689+01:00Network DocumentationI started to <a href=http://en.opensuse.org/YaST/installation-network>document</a> some exceptions or special cases of network during installation. But this is I already know (I don't know what users don't know or wants to know ;-)) so if anybody wants to some parts be more detailed or something is missing there, your feedback is welcome.Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com2tag:blogger.com,1999:blog-6201806627434571467.post-46550788435468321532008-07-03T12:34:00.010+01:002008-07-03T14:06:06.907+01:00IPv6 - network, applications, ...As I already <a href=http://mzugec.blogspot.com/2008/06/ipv6-prefixlen.html>wrote</a>, there is support in YaST network module to configure IPv6 addresses (one or more), possibly mixed with IPv4:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjttuvKhaYNfqr9DeiAIZ3eAzvcsebvuvDLraqshTlQU7N3jVR6cSTFWGi3qJDgXwB8YrTf3Mthh6zj2gPw0KSLs2W2fwPuCuEr8cI5YIKN5qzFM8evzG-i6VX_exMUvs8ZTzj2VH85jSM/s1600-h/ipv6_1.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjttuvKhaYNfqr9DeiAIZ3eAzvcsebvuvDLraqshTlQU7N3jVR6cSTFWGi3qJDgXwB8YrTf3Mthh6zj2gPw0KSLs2W2fwPuCuEr8cI5YIKN5qzFM8evzG-i6VX_exMUvs8ZTzj2VH85jSM/s320/ipv6_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5218765100991534882" /></a><br /><br /><br /><br />But what is really new - support to configure apache2 server for IPv6 environment:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTnbu-nK3bJA9LHzXiTB5OyGGSbDnxmBFfP0ZdHuizoP5-cLdyoesZHzZBR6wFUm5CiLlX3czSrxm6ft1tuolsnoUyTIASRfCLrTFpsWxgkfU08VqiWBdfEZ6E6o3JzgfXG7fTBxgXSmI/s1600-h/ipv6_2.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTnbu-nK3bJA9LHzXiTB5OyGGSbDnxmBFfP0ZdHuizoP5-cLdyoesZHzZBR6wFUm5CiLlX3czSrxm6ft1tuolsnoUyTIASRfCLrTFpsWxgkfU08VqiWBdfEZ6E6o3JzgfXG7fTBxgXSmI/s320/ipv6_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5218766209182043890" /></a><br />Setup on which addresses apache listen<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd7-ijLz0tQ0IMJCALZ8igiDM_3rSfRJ6ZRDngowMNr6bTtP5b1qfrtv-SBjT4p7vVwck1wvgtk-c5M8zqRJ6W0wvwFwiZnKDl8VWy6sSnd_ZYX65_CY3-7GlfEt7l9RAxfMZp9tSNWpk/s1600-h/ipv6_5.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd7-ijLz0tQ0IMJCALZ8igiDM_3rSfRJ6ZRDngowMNr6bTtP5b1qfrtv-SBjT4p7vVwck1wvgtk-c5M8zqRJ6W0wvwFwiZnKDl8VWy6sSnd_ZYX65_CY3-7GlfEt7l9RAxfMZp9tSNWpk/s320/ipv6_5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5218768848962589266" /></a><br />Detail of virtual host (based on IP)<br /><br /><br />And test that it works:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipx_GCnJHxRKY73yNDi1GFayWobKZIeq3SRq2GJlV14wqZAwNWuiVrEy1r986qUQF7b5drtR36TCJyNj1ow9CX8ynR4lQXclHcaAQuBJgUUk-oso6D3RJ-V-bC_vMIennctEWWtXcvct8/s1600-h/ipv6_4.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipx_GCnJHxRKY73yNDi1GFayWobKZIeq3SRq2GJlV14wqZAwNWuiVrEy1r986qUQF7b5drtR36TCJyNj1ow9CX8ynR4lQXclHcaAQuBJgUUk-oso6D3RJ-V-bC_vMIennctEWWtXcvct8/s320/ipv6_4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5218769021452331826" /></a><br /><br />This is in version yast2-http-server-2.17.2Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com0tag:blogger.com,1999:blog-6201806627434571467.post-91471496869491867112008-06-22T11:16:00.003+01:002008-06-22T12:17:02.410+01:00web UI for YaSTWith <a href="http://en.opensuse.org/YaST/Development/Python_bindings">python-bindings</a> we can slowly move our wishes from impossible into possible group.One of our <a href="http://en.opensuse.org/Wishlist_For_YaST">wishes</a> is web UI. Today before lunch I did some research, and it works!<br /><br />Fist of all enable mod_python in apache2, then configure <a href=http://webpython.codepoint.net/mod_python_publisher_apache_configuration>Handler</a> for Python.<br /><br />Then write index.py with this code:<br /><span style="font-family: monospace;">def getDescription():<br /> import ycp<br /> ycp.import_module('Lan')<br /> ycp.import_module('LanItems')<br /> ycp.Lan.Read(ycp.Term('nocache'))<br /> interfaces=ycp.LanItems.Overview()<br /> descr="<table>"<br /> for interface in interfaces:<br /> descr+="<tr><td>"+interface['table_descr'][0]+"</td>"<br /> descr+="<td>"+interface['rich_descr']+"</td></tr>"<br /> descr+="</table>"<br /> return descr<br /><br />def index():<br /> s = """\<br /><html><br /><body><br />"""+getDescription()+"""<br /></body><br /></html><br />"""<br /> return s<br /></span><br /><br />It needs some hack - disable check if YaST code is running as root. I commented one line in Lan::Read() function. And result is here:<br /><br /><table><tr><td>PRO/Wireless 3945ABG Network Connection</td><td><b>PRO/Wireless 3945ABG Network Connection</b> <b>(Not connected)</b><br><b>MAC : </b>00:18:de:64:b8:0d<br><p>The device is not configured. Press <b>Edit</b><br />to configure.</p><br /></td></tr><tr><td>82573L Gigabit Ethernet Controller</td><td><b>82573L Gigabit Ethernet Controller</b> <b></b><br><b>MAC : </b>00:16:41:aa:74:56<br><ul><li>Device Name: eth0</li><li>Started automatically on cable connection</li><li>IP address assigned using DHCP</li></ul></td></tr></table><br /><br />It's just summary of network devices configuration. I know it's very simple example, but as I wrote - the plan was to do it before lunch, not instead of ;-)Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com0tag:blogger.com,1999:blog-6201806627434571467.post-7211607114237911462008-06-18T12:02:00.004+01:002008-06-18T12:31:12.706+01:00IPv6, prefixlenThis story started when I discussed with our openSUSE member <a href=http://www.m4r3k.org/>Marek Stopka</a> and he told me that he is running IPv6 network but because of really bad support in YaST2 he needs to configure that manually. <br />Oh, what a shame! So we made a deal that he'll test my patches and I'll try to implement initial support.<br />So now we have initial support for IPv6 in YaST. Initial means that you're able to configure "primary" address IPv6 type. Nothing more, nothing less.<br />Because of this I add new parameter to configure prefixlen (in v6 there is no netmask as we know from v4). In UI you can configure prefix with a little trick - instead of 255.255.255.0 you can write "/24".<br /><br />Ok, example of CLI:<br /><br /><pre><br />linux-1pi7:~ # yast lan list<br />0 79c970 [PCnet32 LANCE], Not configured<br /><br />1 79c970 [PCnet32 LANCE], Not configured<br /><br />linux-1pi7:~ # yast lan edit id=0 ip=2001:15c0:668e::5 prefix=48<br />Ethernet Network Card<br />MAC : 08:00:27:80:b5:07<br />Device Name: eth1<br />Started automatically at boot<br />IP address: 2001:15c0:668e::5/48<br /><br /><br />linux-1pi7:~ # yast lan list<br />0 Ethernet Network Card, 2001:15c0:668e::5<br /><br />1 79c970 [PCnet32 LANCE], Not configured<br /><br />linux-1pi7:~ #<br /></pre><br /><br />And some screenshots from ncurses UI:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_9vkBU2edSuXaGKerT-aFJqeSWRtN2nEHC_KRQc_M3yZmM79xTAXSEJw5eragQl4bgD9LFny55qkwJRd5KpolZ7YKhgjkEBd2rn4ar-qCep-pihRg0EeYNontMJ4swTNLrLCmQKdSMaA/s1600-h/ipv6_4.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_9vkBU2edSuXaGKerT-aFJqeSWRtN2nEHC_KRQc_M3yZmM79xTAXSEJw5eragQl4bgD9LFny55qkwJRd5KpolZ7YKhgjkEBd2rn4ar-qCep-pihRg0EeYNontMJ4swTNLrLCmQKdSMaA/s320/ipv6_4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5213178029938739426" /></a><br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhywYElrwTWFevQB38RUZyRM8yZrNn5AAd2xVBaNkk1xWd_9Qjl-U4ASbUwnRU2KGL16xh1_W2Ozcrw-Kesl2t9rUHGeSQfy9XQ5lXhDCFog19AU_fFiNjXkU-_mQ1FVlVjgvdb9GkpGWk/s1600-h/ipv6_5.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhywYElrwTWFevQB38RUZyRM8yZrNn5AAd2xVBaNkk1xWd_9Qjl-U4ASbUwnRU2KGL16xh1_W2Ozcrw-Kesl2t9rUHGeSQfy9XQ5lXhDCFog19AU_fFiNjXkU-_mQ1FVlVjgvdb9GkpGWk/s320/ipv6_5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5213178110444045362" /></a><br /><br />Of course there's still much work to implement full support, routing, network services support, test all possible cases, AutoYaST, etc.<br />Implemented in yast2-network-2.17.1Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com1tag:blogger.com,1999:blog-6201806627434571467.post-12294909612348605162008-06-14T15:40:00.005+01:002008-06-14T17:27:55.968+01:00running YaST in debuggerFirst of all - I like Python.<br />Second - we have some prototype for mysql-server configuration written in Python I never tried before.<br /><br />So I check-in code from subversion and try to run. Unfortunately it exits with some errors like "couldn't initialize UI". So I open the code in <a href=http://en.wikipedia.org/wiki/Eric_Python_IDE>Eric</a> - great Python debugger.<br /><br />With breakpoints, globals and locals variables dispatcher it was really easy to find problematic places in code. Also possibility to write code interactively into interpreter is very helpful.<br />And finally module runs ;-)<br /><br /><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dwWK_A1arDMsOCXS_mV2Hehq9AxSr4RkIKYcByAT_2i4uIPeD_xGZFAlmmt8CLsri-yhET-31r5TW-0siKKuw' class='b-hbp-video b-uploaded' frameborder='0'></iframe><br />Sorry, video is pretty slow - probably ati driver problem ;-(Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com2tag:blogger.com,1999:blog-6201806627434571467.post-31947634469387407202008-06-09T15:47:00.011+01:002008-06-09T17:06:34.652+01:00http-server, dns-server integrationActually this is not new feature, but because I re-tested that functionality today, I found it's good time to describe it in a few words.<br />Integration in this case means that you can configure DNS server records while adding new virtual hosts for apache HTTP server (with YaST, both on the same machine)<br /><br /><b>yast2-dns-server</b><br /><br />First - DNS server must be installed, enabled and running:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu9Wz_TTS8VqAzwY8ZUYYBxZH8lU0Idoh8Sz-wwqRFUze4PavYm0hcwvEhQTKdOqe6Hv0zMsc5yZCoXGj6RHbK8vyZUrFpeFUqUhQ4ZuuASVfekdTrRvO_HumbGhVN8Is4dYKwn1J039Q/s1600-h/snapshot1.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu9Wz_TTS8VqAzwY8ZUYYBxZH8lU0Idoh8Sz-wwqRFUze4PavYm0hcwvEhQTKdOqe6Hv0zMsc5yZCoXGj6RHbK8vyZUrFpeFUqUhQ4ZuuASVfekdTrRvO_HumbGhVN8Is4dYKwn1J039Q/s320/snapshot1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5209909965070463218" /></a><br /><br /><br />Then add new zone (it must be type "Master"):<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqxnk41-RoCjUFPnUkFwJqmPjQLjqCdCIErU0sKXsd7nabJ00saq45VZVpmmy7GRcFwtEMqx-ehGDmEVi9Gm3OGhMhpw1E6n32RROY8cOP5JOk-sESFT_RcYzBdZ_iYIbHgBcrlcB-2eE/s1600-h/snapshot2.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqxnk41-RoCjUFPnUkFwJqmPjQLjqCdCIErU0sKXsd7nabJ00saq45VZVpmmy7GRcFwtEMqx-ehGDmEVi9Gm3OGhMhpw1E6n32RROY8cOP5JOk-sESFT_RcYzBdZ_iYIbHgBcrlcB-2eE/s320/snapshot2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5209910262130528866" /></a><br /><br /><br /><b>yast2-http-server</b><br /><br />Then in yast2-http-server module add new virtual host. Server name belongs into dns zone "example.com" we configured in yast2-dns-server:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE0XFUue2X3XFQkChHH63PHBCqNfP0o9R8DgsgOfz2o8EsofkKKqmwSAsz1WKzPoS4kkJ5xH3-1hLSWCo3TmEaL9W_x9hQP3de7reC7zZSljKXbdUZae98OLlziw3MKkKZtCT1Lf0qAa4/s1600-h/snapshot3.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE0XFUue2X3XFQkChHH63PHBCqNfP0o9R8DgsgOfz2o8EsofkKKqmwSAsz1WKzPoS4kkJ5xH3-1hLSWCo3TmEaL9W_x9hQP3de7reC7zZSljKXbdUZae98OLlziw3MKkKZtCT1Lf0qAa4/s320/snapshot3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5209910574673723522" /></a><br />Virtual Host ID must be valid IP address<br /><br /><br />And here we can see there is button "Add to Zone" which in this case will add record www.example.com with IP address 10.20.30.40 into example.com zone<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZBSNzplZ-bPeA-i-dUpx1S73iCA0Pgb7BpWvQWC1JSANOw8LBafqplByzw3_raWuIY509rb7x_06SdNM6lmG6v0njLzJkdXi9a9spKIm_UjjGAP3DKPIiENjomYw6OcHkgl_75a-L5hc/s1600-h/snapshot4.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZBSNzplZ-bPeA-i-dUpx1S73iCA0Pgb7BpWvQWC1JSANOw8LBafqplByzw3_raWuIY509rb7x_06SdNM6lmG6v0njLzJkdXi9a9spKIm_UjjGAP3DKPIiENjomYw6OcHkgl_75a-L5hc/s320/snapshot4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5209910995934003506" /></a><br /><br /><br /><b>yast2-dns-server</b><br /><br />When you open YaST DNS server again, you can see that new record for "example.com" zone was correctly added. <br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLX_c6DpluWo8xx26N1vmQVQiOcuN0h1BH7DjaETRMf_hIUpLxyGitGzK7GDhOnfmQFkUTyHvbVZYoNTuPlEFdU7J1DzOoSICoaXUKX9-6DsETMtXsU0BwSIFyy86wgpiVtJpVfvSKWhw/s1600-h/snapshot5.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLX_c6DpluWo8xx26N1vmQVQiOcuN0h1BH7DjaETRMf_hIUpLxyGitGzK7GDhOnfmQFkUTyHvbVZYoNTuPlEFdU7J1DzOoSICoaXUKX9-6DsETMtXsU0BwSIFyy86wgpiVtJpVfvSKWhw/s320/snapshot5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5209912544649408738" /></a>Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com2tag:blogger.com,1999:blog-6201806627434571467.post-7985235465391765382008-06-05T17:58:00.002+01:002008-06-05T19:08:08.498+01:00Command Line InterfaceThis is probably nothing new but for those who don't know yet ...<br /><br />You can run every YaST2 module in Qt, GTK or Ncurses UI. Some of that modules has implemented also command line interface. Just type: <b>yast module_name help</b> and you will see something like this:<br /><br /><pre><br />linux:/home/mzugec # yast lan help<br /><br />YaST Configuration Module lan<br />------------------------------<br /><br />Network Card Configuration<br /><br />Basic Syntax:<br /> yast2 lan interactive<br /> yast2 lan <command> [verbose] [options]<br /> yast2 lan help<br /> yast2 lan longhelp<br /> yast2 lan xmlhelp<br /> yast2 lan <command> help<br /><br />Commands:<br /> add Add a network card<br /> delete Delete a network card<br /> edit Change existing configuration<br /> list Display configuration summary<br /> show Display configuration summary<br /><br />Run 'yast2 lan <command> help' for a list of available options.<br /></pre><br /><br />In case module doesn't support CLI, output is like:<br /><pre><br />linux:/home/mzugec # yast dsl help<br />There is no user interface available for this module.<br /></pre><br /><br /><br />Option <b>interactive</b> is useful when you want to do several actions, because read and write are done only one. Difference between using <b>ip</b> or <b>ifconfig</b> commands and <b>yast lan</b> is that yast lan works with configurations, not only current status.<br /><br />Ok, so let's start with example. List all network cards:<br /><pre><br />linux:/home/mzugec # yast lan list<br />0 Ethernet Network Card, DHCP<br /><br />1 79c970 [PCnet32 LANCE], Not configured<br /><br />2 79c970 [PCnet32 LANCE], DHCP<br /><br />3 Ethernet Network Card, 10.20.30.40<br /></pre><br /><br />See configuration of last device:<br /><pre><br />linux:/home/mzugec # yast lan show id=3<br />Ethernet Network Card<br />MAC : 08:00:27:d9:db:b7<br />Device Name: eth0<br />Started automatically at boot<br />IP address: 10.20.30.40, subnet mask 255.255.255.0<br /></pre><br /><br />Change configuration to DHCP :<br /><pre><br />linux:/home/mzugec # yast lan edit id=3 bootproto=dhcp<br />Device Type : eth<br />Bootproto : dhcp<br />IP Address :<br />Mask :<br /></pre><br /><br />Done, that was easy ;-)<br /><br />Bye,<br />MichalMichal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com2tag:blogger.com,1999:blog-6201806627434571467.post-34028539215491782792008-05-26T20:42:00.012+01:002008-05-27T21:19:30.930+01:00Research of possibility: running YaST anywhereHello !<br /><br />One week ago I installed Fedora Core 9 distribution. But (experienced from openSUSE) there was something I missed : YaST and zypper. So I decide to port them to Fedora (and maybe to other distributons later).<br /><br />I did something similar a long time ago (it was FC5) but now it seems much easier. Our developers makes <a href="http://kkaempf.blogspot.com/2008/05/declaring-ui-independence-earlier-this.html">UI part independent from ycp</a> language. So I just compile libyui, libyui-bindings, qt, ncurses and was able to run example code in both frontends. With GTK there is still problem that is not cleaned from libzypp dependency.<br /><br />Then I compiled libzypp and zypper. Then I add installation source - local CD-rom:<br /><pre><br />zypper ar cd:///?devices=/dev/sr0 CD<br /></pre><br />And it works perfectly!<br /><br />Compared to yum is zypper much, much faster. Just for an example (I turn autorefresh on, by default is autorefresh disabled):<br /><pre><br />[root@dhcp24 ~]# time zypper se rpmlint<br />Reading installed packages...<br /><br />S | Name | Summary | Type<br />--+---------+-------------------------------------------------+--------<br />| rpmlint | Tool for checking common errors in RPM packages | package<br /><br />real 0m0.958s<br />user 0m0.308s<br />sys 0m0.482s<br />[root@dhcp24 ~]# time yum search rpmlint<br />Loaded plugins: refresh-packagekit<br />======================================== Matched: rpmlint =========================================<br />rpmlint.noarch : Tool for checking common errors in RPM packages<br /><br />real 0m2.765s<br />user 0m1.826s<br />sys 0m0.788s<br /></pre><br />With autorefresh disabled search time is even better:<br /><pre><br />[root@dhcp24 ~]# time zypper se rpmlint<br />Reading installed packages...<br /><br />S | Name | Summary | Type<br />--+---------+-------------------------------------------------+--------<br />| rpmlint | Tool for checking common errors in RPM packages | package<br /><br />real 0m0.717s<br />user 0m0.289s<br />sys 0m0.362s<br /></pre><br /><br />Note: I don't wan't to say which tool is better (everybody knows ;-)). Just that you can use zypper on the same installation source like yum. There are some <a href="https://bugzilla.redhat.com/show_bug.cgi?id=447740">requests</a> on that porting from RH/Fedora users. And also some other people are <a href="http://blog.binaryhelix.net/2008/05/23/zypp-stack-in-fedora-hint-interoperability/">thinking</a> about this.<br /><br />Ok, after that I compiled yast2-core, yast2-devtools, yast2-testsuite, yast2-perl-bindings, yast2-ycp-ui-bindings, yast2, yast2-pkg-bindings (maybe I forgot something, sorry). Finally mine package yast2-iscsi-client. Some patch because of distribution differences ... and the result is:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgU-ETiCud-eoeX3y-lUXcz6p_bipYvF_Hk0IVWzzGVKy91QDNb1n-AUlnaoxk2TBCKnVfLSbjpJzQLqeCvFa0wYrZenuyA7jJlca8TMHRPoJnc-RMqFBOVhQ-KG0v_htQ1nmMPUA-fJw/s1600-h/yast2-iscsi-client.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgU-ETiCud-eoeX3y-lUXcz6p_bipYvF_Hk0IVWzzGVKy91QDNb1n-AUlnaoxk2TBCKnVfLSbjpJzQLqeCvFa0wYrZenuyA7jJlca8TMHRPoJnc-RMqFBOVhQ-KG0v_htQ1nmMPUA-fJw/s320/yast2-iscsi-client.png" alt="" id="BLOGGER_PHOTO_ID_5205148016696247666" border="0" /></a><br /><br />It works! ;-)<br />So we definitely can run YaST and its configuration modules on Fedora Core 9!<br /><br />Ok, some work is needed to be done: create <a href="http://en.opensuse.org/Build_Service">Build Service</a> project and as a first step some distribution based patches. After that we should find some system how to use different backends for different distributions (like NetworkManager does). But this is something for another post ...<br /><br />Good night,<br />MichalMichal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com6tag:blogger.com,1999:blog-6201806627434571467.post-40686916621189117112008-04-04T16:43:00.009+01:002008-04-06T11:00:34.824+01:00YaST2 Network - metric<div style="text-align: justify;">Last Friday I added support for metric into Route dialog. You can imagine metric as "preference" value.<br /></div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFlDUp262LW7mGBteMTNToxWWJFtmD9mb3Q3qqo56lA5SD8Ao9GynjKbeId_JTwknYMibGlWVvgsMwt0AgFU2L_ZUuBSgcb_SoM9btc0HwA1POMOhivqPFVc9QhRTR3Liuwtd_uqKvMbg/s1600-h/metric-01.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFlDUp262LW7mGBteMTNToxWWJFtmD9mb3Q3qqo56lA5SD8Ao9GynjKbeId_JTwknYMibGlWVvgsMwt0AgFU2L_ZUuBSgcb_SoM9btc0HwA1POMOhivqPFVc9QhRTR3Liuwtd_uqKvMbg/s320/metric-01.png" alt="" id="BLOGGER_PHOTO_ID_5185416544105425426" border="0" /></a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRGquUxL6fE83UXL7-SXt6w4MRqPspcxjGJD5u19kDEHgk_sRVL6k3BKEMPb3OAjSK1THpBxT2hf6LWHwJJVdhb9aSlAp5XEhhXF1NKSlDkrEh3Eg72E6Ehz9wQskpanqY3b9hq68pG6w/s1600-h/metric02.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRGquUxL6fE83UXL7-SXt6w4MRqPspcxjGJD5u19kDEHgk_sRVL6k3BKEMPb3OAjSK1THpBxT2hf6LWHwJJVdhb9aSlAp5XEhhXF1NKSlDkrEh3Eg72E6Ehz9wQskpanqY3b9hq68pG6w/s320/metric02.png" alt="" id="BLOGGER_PHOTO_ID_5185416703019215394" border="0" /></a><br /><br /><br /><b>Example of use:</b><br /><div style="text-align: justify;">We have 2 interfaces, eth0 and eth1. Both of them are connected into different networks with different routes (we have 2 possible gateways). Here we can set one of them as default gateway. When it somehow failed we lost connetion.<br /></div><br /><b>Solution:</b><br /><div style="text-align: justify;">In situation above we can set both routes as a default route with different metrics. Set devices controled with ifplugd daemon. Route with higher metric is used as default. When device is disconnected, it's route is removed and the next one is used.<br /></div><br /><b>Note:</b><br /><div style="text-align: justify;">Current kernel doesn't use metric in static routing, Only routing daemons like multipathd does.<br /></div>Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com0tag:blogger.com,1999:blog-6201806627434571467.post-5471151224798491562008-03-17T21:28:00.006+00:002008-03-20T09:51:44.127+00:00YaST2 network, driver optionsI've added support for driver options for openSUSE-11.0.<br />This is feature I don't really use, but some of openSUSE or SLES users does. Maybe I'll need it when I will play more with bonding devices.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCFegylObUvFpVKOYl7yjsEQc-ENaDcSGF5CXb_NyNoR3W2Kis7_hj8Ccyx-eZ2KTqu2yh_lohJSVXY_ngCXDeCQcW4WmLf_GDEO6AheEVhVFW3he7cfiI3pqWYzLGVWp0Ivl6Nzlih-w/s1600-h/driver_options.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCFegylObUvFpVKOYl7yjsEQc-ENaDcSGF5CXb_NyNoR3W2Kis7_hj8Ccyx-eZ2KTqu2yh_lohJSVXY_ngCXDeCQcW4WmLf_GDEO6AheEVhVFW3he7cfiI3pqWYzLGVWp0Ivl6Nzlih-w/s320/driver_options.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5179758568938038402" /></a><br /><br /><br />Hm, feature ...<br />In fact it brings back functionality that there was already there. But it was done in "<span style="font-weight: bold;">hwcfg</span>" files - deprecated configuration files for hardware devices. Now that configuration is stored in <span style="font-weight: bold;">/etc/modprobe.d/network</span>. But it's probably not final solution.<br /><br />Why? because all that options are stored "on one place" but options packaged by driver rpms are stored in /etc/modprobe.d/$driver_name.<br /><br />Maybe in future I'll change that place or enhance functionality to work on whole directory, but I need some feedback or opinions. Are there any?Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com0tag:blogger.com,1999:blog-6201806627434571467.post-23843791749716258472008-03-16T14:24:00.000+00:002008-03-16T17:02:14.727+00:00YaST2 network, bridge devicesHello,<br />this is my first (and very short) blog about YaST2 development.<br />I put some screenshots here: <a href="http://en.opensuse.org/YaST/Network/11.0-new_features">new features</a>::<a href="http://en.opensuse.org/YaST/Network/11.0-bridge">bridge</a>.<br /><br />What is bridged network good for? Mostly for network used with virtualisation (Xen, VirtualBox, Vmware, etc.). For this purpose all virtualisation products has their own tools, configurations and scripts.<br />This (per-virtualisation-application) has some disadvantages:<br />- possible conflict between sysconfig<br />- not unified way how to configure<br />- network configuration can't be clone by AutoYaST<br />That's why it makes sense to be implemented in YaST<br /><br />Briefed introduction : when you want for any of your hosted machine to be seen from network, create <a href="http://en.wikipedia.org/wiki/Network_bridge">bridge</a> attached with physical network interface and some <a href="http://en.wikipedia.org/wiki/TUN/TAP">tun</a> device. TUN device will be attached into your virtual machine and it makes virtual hosted machine be directly connected to real LAN.<br /><br />The plan is (together with bridge) to implement also support for tun/tap devices (this should be done in sysconfig first) and <a href="http://wiki.xensource.com/xenwiki/XenNetworking">Xen networking</a> to confgure all this staff in one place.<br /><br />Do you like this feature? If you have any feedback, comment or enhancement request - please let me know.Michal Žugechttp://www.blogger.com/profile/15797057723895398388noreply@blogger.com0