Index: /trunk.old/pxeconfig/AUTHORS
===================================================================
--- /trunk.old/pxeconfig/AUTHORS	(revision 66)
+++ /trunk.old/pxeconfig/AUTHORS	(revision 66)
@@ -0,0 +1,12 @@
+pxeconfig and pxeconfigd
+========================
+Bas van der Vlies <basv@sara.nl>
+
+hexls.py
+========================
+Walter de Jong <walter@sara.nl>
+
+DEBIAN package utilities
+========================
+Gijs Molenaar   (initial setup)
+Ramon Bastiaans (xinetd implementation)
Index: /trunk.old/pxeconfig/COPYING
===================================================================
--- /trunk.old/pxeconfig/COPYING	(revision 66)
+++ /trunk.old/pxeconfig/COPYING	(revision 66)
@@ -0,0 +1,345 @@
+ GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+Copyright (C) <year> <name of author>
+
+This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: /trunk.old/pxeconfig/Changelog
===================================================================
--- /trunk.old/pxeconfig/Changelog	(revision 66)
+++ /trunk.old/pxeconfig/Changelog	(revision 66)
@@ -0,0 +1,65 @@
+0.6.5
+ - added reading symlinks to hexls; this produces output like
+    C0A811DD => 192.168.17.221 => gb-r13n5.irc.sara.nl -> default.node_install
+
+0.6.4:
+ - Fixed a bug in hexls with non resolving hostnames
+   Reported by:  Ole Holm Nielsen
+
+0.6.3:
+ - Added hostname lookup feature to hexls. If succes it will display the 
+   HEX address, ip-number, hostname, eg:
+    C0A811DD => 192.168.17.221 => gb-r13n5.irc.sara.nl
+
+0.6.2:
+  - Fixed a bug in the non-interactive mode reported by and fixed
+    by: Charles Galpin from defenderhosting.com
+
+0.6.1:
+  - Interactive mode did not work anymore. Fixed it by adding 
+    -i/--interactive command line options.
+    Thanks to: Walter de Jong
+
+0.6:
+  - Added -r|--remove option. Now it is possible to remove the
+    pxe boot file, eg:
+    	pxeconfig --remove dummy.sara.nl
+
+    Works also for the other options.
+
+0.5
+  - Added support for hostnames on the command line instead of network
+    numbers, eg:
+    	pxeconfig -f default.node_install bas.ka.sara.nl walter.ka.sara.nl
+
+0.4.4
+  - Updated documentation for xinetd support + example config
+  - Added support for xinetd in the debian package scripts
+    Implemented by: Ramon Bastiaans
+
+0.4.3
+  - Added make_deb_pkg.sh utility to make an DEBIAN package
+  - changed port number to 6611 for pxeconfigd. Webmin is using the 10000
+    port number.
+
+0.4.2
+  Minor change to pxeconfig/pxeconfigd utiltites. Added '-V/--version' 
+  flag for printing version info.
+
+  Updated the INSTALL instructions. Howto use it for systemimager 3.X
+  versions
+
+0.4
+  Pxeconfig can now be used interactively or via command line
+  options.
+
+0.3
+  Fixed a bug in hexls. The regular expression to determine if
+  a filename is pxe hex filename or ordinary filename was wrong.
+
+0.2.1
+  Bugfix now we can run pxeconfig a second time to change the pxe boot file.
+  Reported by: Ole Holm Nielsen
+
+  Phrase change use 'Select a number:' instead of 'Choice a number'
+  Proposed by: Ole Holm Nielsen
Index: /trunk.old/pxeconfig/DEBIAN/control
===================================================================
--- /trunk.old/pxeconfig/DEBIAN/control	(revision 66)
+++ /trunk.old/pxeconfig/DEBIAN/control	(revision 66)
@@ -0,0 +1,9 @@
+Package: beo-pxeconfig
+Priority: extra
+Section: admin
+Installed-Size: 52
+Maintainer: basv@sara.nl
+Depends: python
+Architecture: i386
+Version: 0.6.4-1
+Description: utilities to boot computers with PXE-enabled network cards
Index: /trunk.old/pxeconfig/DEBIAN/postinst
===================================================================
--- /trunk.old/pxeconfig/DEBIAN/postinst	(revision 66)
+++ /trunk.old/pxeconfig/DEBIAN/postinst	(revision 66)
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+DAEMON=beo_pxeconfigd
+PORT=6611
+
+PXE_TEST=`grep $DAEMON /etc/services`
+
+if [ ! -z "$PXE_TEST" ]; then
+  echo "WARNING: $DAEMON already in /etc/services"
+else
+  echo -e "$DAEMON\t$PORT/tcp\t\t\t# pxe config daemon\n" >> /etc/services
+fi
+
+if [ -d /etc/xinetd.d ] && [ ! -r /etc/xinetd.d/$DAEMON ]
+  then
+    cat <<EOF >/etc/xinetd.d/$DAEMON
+service $DAEMON
+{
+	disable         = no
+	socket_type     = stream
+	protocol        = tcp
+	user            = root
+	group           = sys
+	wait            = no
+	server          = /usr/sbin/$DAEMON
+}
+EOF
+
+    /etc/init.d/xinetd reload
+fi
+
+if [ -r /etc/inetd.conf ]
+  then
+    update-inetd --add "$DAEMON\tstream\ttcp\tnowait\troot.sys\t/usr/sbin/tcpd\t/usr/sbin/$DAEMON"
+    /etc/init.d/inetd reload
+fi
Index: /trunk.old/pxeconfig/DEBIAN/postrm
===================================================================
--- /trunk.old/pxeconfig/DEBIAN/postrm	(revision 66)
+++ /trunk.old/pxeconfig/DEBIAN/postrm	(revision 66)
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+DAEMON=beo_pxeconfigd
+
+if [ "$1" = "purge" ]
+then
+  update-inetd --remove "$DAEMON\tstream\ttcp\tnowait\troot.sys\t/usr/sbin/tcpd\t/usr/sbin/$DAEMON"
+  rm /etc/xinetd.d/pxe
+  /etc/init.d/inetd reload
+  /etc/init.d/xinetd reload
+
+  PXE_TEST=`grep $DAEMON /etc/services`
+
+  if [ ! -z "$PXE_TEST" ]; then
+    grep -v "$DAEMON" /etc/services > /tmp/services.tmp
+    mv /tmp/services.tmp /etc/services
+  else
+    echo "WARNING: no $DAEMON in /etc/services to remove"
+  fi
+
+fi
Index: /trunk.old/pxeconfig/INSTALL
===================================================================
--- /trunk.old/pxeconfig/INSTALL	(revision 66)
+++ /trunk.old/pxeconfig/INSTALL	(revision 66)
@@ -0,0 +1,83 @@
+Here follow some basic installation instructions.
+
+If you are using DEBIAN then you can run the following utility:
+ make_deb_pkg.sh) This will make debian package that you can install
+		  with dpkg -i <packagename>
+	
+
+To activate the 'pxeconfigd' daemon utility on other platforms use this 
+procedure:
+ 1) edit '/etc/services', eg:
+      pxeconfigd      6611/tcp                       # pxe config daemon
+
+ 2) Install the server:
+    a) inetd.conf
+      - edit '/etc/inetd.conf', eg:
+        pxeconfigd stream  tcp nowait  root.sys /usr/sbin/tcpd \
+          /usr/sara/sbin/pxeconfigd
+
+      - /etc/init.d/inetd reload 
+
+    b) xinetd
+      - cp pxeconfigd.xinetd /etc/xinetd.d/pxeconfigd
+      - /etc/init.d/xinetd reload 
+       
+    NOTE: the pxeconfigd can only be started from inetd or xinetd!!!
+
+
+ 4) You can test it by: 
+     telnet localhost pxeconfigd (or port number)
+
+     output:
+       Trying 127.0.0.1...
+       Connected to localhost.
+       Escape character is '^]'.
+       ip = 127.0.0.1, hex = 7F000001
+       file = /tftpboot/pxelinux.cfg/7F000001
+       Connection closed by foreign host.
+
+     In syslog a line will be added if the removal is succesful:
+      Feb 20 09:32:40 test pxeconfigd: /tftpboot/pxelinux.cfg/7F000001
+
+ 4) As you can see '/tftpboot/pxelinux.cfg/' is the default directory. If
+    you placed the config files somewhere else you can add the 
+    '-d/--directory' option, eg:
+       pxeconfigd stream  tcp nowait  root.sys /usr/sbin/tcpd \
+        /usr/sara/sbin/pxeconfigd -d /<some>/<other>/<place>
+
+If the daemon works and you want to install/reinstall a node, a link
+must be placed in the '/tftpboot/pxelinux.cfg' directory. This can
+be done with the 'pxeconfig' utility. This utility will ask some
+questions and will make the links for you. The utility requires the following
+setup:
+  1) All the pxe configuration files must start with the keyword 'default.' 
+     N.B.: yes, the dot after 'default' is part and parcel of the keyword!
+     In this distribution two examples are included. Pxeconfig lets the
+     user decide which 'default.' config file to use.
+
+  2) If default is a symbolic link to for example default.harddisk, then
+     default.harddisk is not included in the list where the user can
+     choose from.
+
+  3) You can give a command line switch to specify where the
+     pxe config files reside:
+        pxeconfig -d /<some>/<other>/<place>
+
+The last utility is 'hexls'. This utility will display the hex pxe config
+file with the corresponding ip-addresses.
+
+To activate this on a client you must add the following line to the 'master'
+script of the node. It will remove the pxe config file for the node
+from the pxe bootserver. I personally place the line just before the umount
+commands. See below which command to use for which systemimager version.
+Telnet is not included in the 3.X versions.
+   # Remove the <hex_ipaddr> file from the pxelinux.cfg directory.
+   # So the client will boot from disk
+   #        
+   3.X)  chroot /a telnet $IMAGESERVER 6611
+   2.X)  telnet $IMAGESERVER 6611
+
+
+Comments or Suggestions mail them to:
+ Bas van der Vlies <basv@sara.nl>
+ http://www.sara.nl for more info about SARA
Index: /trunk.old/pxeconfig/README
===================================================================
--- /trunk.old/pxeconfig/README	(revision 66)
+++ /trunk.old/pxeconfig/README	(revision 66)
@@ -0,0 +1,53 @@
+PXE-utilities
+-------------
+
+This is a release of the SARA package of utilities that we use to boot
+our nodes with PXE-enabled network cards. This was developed because we
+always want to use the PXE-enabled network card as our first boot device.
+With pxelinux, which is a derivative of syslinux, you can specify with a PXE 
+configuration file how the node must boot. This configuration is placed in, 
+e.g. '/tftpboot/pxelinux.cfg' directory.
+
+In our setup we have a default setup. The default setup is to boot from
+harddisk. When a node boots it fetches the default configuration file and the
+configuration file tells the node to boot from the harddisk. This setup
+is used for nodes that have already been installed by systemimager.
+
+At SARA we have developed the following  strategy how to install a fresh node.
+
+ 1) The ip-address in our setup is known for the new node. So
+    we make a link in the '/tftpboot/pxelinux.cfg' directory to a 
+    pxe config file which tells that it has to fetch the kernel en 
+    root filesystem from our bootserver, eg:
+         0A000A02 ---> default.node_install (10.0.10.2)
+
+ 2) The client starts and  uses the systemimager software to install
+    the node. The last line of installation script connects to a
+    daemon on the bootserver. This daemon will remove the PXE config file
+    for this node.
+
+ 3) The node reboots and will use the default pxe config file which will
+    instruct the node to boot from harddisk.
+
+This release contains the following utilities:
+
+  pxeconfigd)
+     This is daemon that removes the pxe configuration file of a node.
+
+  pxeconfig)
+     With this program we can specify which pxe config file
+     a node or nodes must use. This utility will create the links
+     in '/tftpboot/pxelinux.cfg'
+
+  hexls)
+      Is a utility that diplays a directory, and, if in this directory
+      contains HEX files, it will convert them to IP-numbers.
+
+All these utilities are written in Python. 
+
+I useful link about how to use Systemimager and the pxeconfig tools is:
+	http://www.fysik.dtu.dk/CAMP/Niflheim/systemimager.html
+
+Comments or Suggestions mail them to:
+Bas van der Vlies <basv@sara.nl>
+http://www.sara.nl for more info about SARA.
Index: /trunk.old/pxeconfig/default.harddisk
===================================================================
--- /trunk.old/pxeconfig/default.harddisk	(revision 66)
+++ /trunk.old/pxeconfig/default.harddisk	(revision 66)
@@ -0,0 +1,4 @@
+default harddisk
+
+label harddisk
+  localboot 0
Index: /trunk.old/pxeconfig/default.node_install
===================================================================
--- /trunk.old/pxeconfig/default.node_install	(revision 66)
+++ /trunk.old/pxeconfig/default.node_install	(revision 66)
@@ -0,0 +1,5 @@
+default netboot
+
+label netboot
+  kernel kernel_2.4.16_xfs
+  append vga=extended load_ramdisk=1 prompt_ramdisk=0 initrd=sarard_xfs.gz root=/dev/ram rw
Index: /trunk.old/pxeconfig/downloads
===================================================================
--- /trunk.old/pxeconfig/downloads	(revision 66)
+++ /trunk.old/pxeconfig/downloads	(revision 66)
@@ -0,0 +1,4 @@
+Thu Feb 21 17:44:23 2002 0 sheridan.bis.pasteur.fr 5889 /data/ftp/pub/outgoing/pxeconfig-0.1.tar.gz b _ o a tru@sheridan.bis.pasteur.fr ftp 0 * c
+Thu Feb 21 20:08:53 2002 0 ns.lucasfilm.com 5889 /data/ftp/pub/outgoing/pxeconfig-0.1.tar.gz b _ o a Squid@ ftp 0 * c
+Thu Feb 21 21:23:23 2002 0 cacheflowisp10.cv.hp.com 5889 /data/ftp/pub/outgoing/pxeconfig-0.1.tar.gz b _ o a proxy@ ftp 0 * c
+Thu Feb 21 21:46:16 2002 0 13.philadelphia02rh.16.pa.dial-access.att.net 5889 /data/ftp/pub/outgoing/pxeconfig-0.1.tar.gz b _ o a IEUser@ ftp 0 * c
Index: /trunk.old/pxeconfig/gpl.header
===================================================================
--- /trunk.old/pxeconfig/gpl.header	(revision 66)
+++ /trunk.old/pxeconfig/gpl.header	(revision 66)
@@ -0,0 +1,18 @@
+# Copyright (C) 2002
+#
+# This file is part of the pxeconfig utils
+#
+# This program is free software; you can redistribute it and/or modify it 
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+#
Index: /trunk.old/pxeconfig/hexls
===================================================================
--- /trunk.old/pxeconfig/hexls	(revision 66)
+++ /trunk.old/pxeconfig/hexls	(revision 66)
@@ -0,0 +1,86 @@
+#! /usr/bin/env python
+# Copyright (C) 2002
+#
+# This file is part of the pxeconfig utils
+#
+# This program is free software; you can redistribute it and/or modify it 
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+#
+'''
+hexls.py - Lists directory contents, but converts the hexadecimal IP numbers
+to dotted decimal notation (so you can at least see what you're doing..!!)
+
+Author: Walter de Jong <walter@sara.nl>
+Date:   January 2002
+
+Changes: Bas van der Vlies <basv@sara.nl>
+Date:    September 2002
+
+SVN info 
+  $Id$
+'''
+
+import os
+import string
+import re
+import socket
+
+def hexls(path):
+	'''list directory, convert hexadecimal to dotted decimal'''
+
+	regexp = re.compile('[' + string.hexdigits + ']{8}' )
+	for f in os.listdir(path):
+		fullpath = os.path.join(path, f)
+		if os.path.islink(fullpath):
+			symlink_dest = os.readlink(fullpath)
+		else:
+			symlink_dest = None
+
+		if regexp.match(f) and len(f) == 8:
+			digit1 = string.atoi(f[:2], 16)
+			digit2 = string.atoi(f[2:4], 16)
+			digit3 = string.atoi(f[4:6], 16)
+			digit4 = string.atoi(f[6:], 16)
+
+			ipaddr = '%d.%d.%d.%d' % (digit1, digit2, digit3, digit4) 
+			try:
+				hostname = socket.gethostbyaddr(ipaddr)
+			except socket.herror, detail:
+				hostname = ( detail[1], 'dummy' )
+
+			if hostname:
+				output = '%s => %s => %s' % (f, ipaddr, hostname[0])
+			else:
+				output = '%s => %s' % (f, ipaddr)
+
+			if symlink_dest:
+				output = '%s -> %s' % (output, symlink_dest)
+
+			print output
+		else:
+			if f[0] != '.':
+				print f
+
+
+if __name__ == '__main__':
+	import sys
+
+	if len(sys.argv) > 1:
+		for dir in sys.argv[1:]:
+			hexls(dir)
+	else:
+		hexls('.')
+
+# EOB
+
Index: /trunk.old/pxeconfig/make_deb_pkg.sh
===================================================================
--- /trunk.old/pxeconfig/make_deb_pkg.sh	(revision 66)
+++ /trunk.old/pxeconfig/make_deb_pkg.sh	(revision 66)
@@ -0,0 +1,51 @@
+#!/bin/sh
+#
+# Description: Script for generation .deb package
+# Author: Gijs Molenaar <gijs@sara.nl>
+#
+# Changed: Bas van der Vlies <basv@sara.nl>
+# Added some variables
+#
+# SVN Info:
+# 	$Id$	
+
+TOPDIR=tmp
+DEST_BIN=$TOPDIR/usr/bin
+DEST_SBIN=$TOPDIR/usr/sbin
+DEST_DOC=$TOPDIR/usr/share/doc/beo-pxeconfig
+
+PKG_NAME=`grep Package DEBIAN/control | cut -d: -f2`
+VERSION=`grep Version DEBIAN/control  | cut -d: -f2`
+VERSION=`echo $VERSION | sed 's/ //g'`
+
+
+
+echo ""
+echo "making tree"
+echo "-----------"
+mkdir -vp $DEST_BIN $DEST_SBIN $DEST_DOC
+
+echo ""
+echo "copying files to their home"
+echo "---------------------------"
+cp -v hexls $DEST_BIN/beo_hexls
+cp -v pxeconfig $DEST_BIN/beo_pxeconfig
+cp -v pxeconfigd $DEST_SBIN/beo_pxeconfigd
+cp -v AUTHORS COPYING Changelog INSTALL README $DEST_DOC
+
+echo ""
+echo "copying Debian package config files"
+echo "-----------------------------------"
+cp -rv DEBIAN $TOPDIR
+
+echo ""
+echo "Making the Debian package"
+echo "-------------------------"
+dpkg -b $TOPDIR
+echo ${PKG_NAME}_${VERSION}
+mv -v $TOPDIR.deb ${PKG_NAME}_${VERSION}.deb
+
+echo ""
+echo "removing $TOPDIR dir"
+echo "----------------"
+rm -rf $TOPDIR
Index: /trunk.old/pxeconfig/pxeconfig
===================================================================
--- /trunk.old/pxeconfig/pxeconfig	(revision 66)
+++ /trunk.old/pxeconfig/pxeconfig	(revision 66)
@@ -0,0 +1,350 @@
+#!/usr/bin/env python
+#
+# Author: Bas van der Vlies <basv@sara.nl>
+# Date  : 16 February 2002
+#
+# Tester: Walter de Jong <walter@sara.nl>
+#
+# SVN info
+#  $Id$
+#
+# Copyright (C) 2002
+#
+# This file is part of the pxeconfig utils
+#
+# This program is free software; you can redistribute it and/or modify it 
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+#
+"""
+Usage: pxeconfig 
+
+ [-d|--directory <pxe_config_dir>]
+ [-f|--file <filename>] [hostname(s)]
+ [-i|--interactive]
+ [-n|--net <C-net> -s|--start <number> -e|--end <number> -f|--file <filename>]
+ [-r|--remove]
+ [-V|--version]
+
+With this program you can configure which PXE configuration file a node
+will use when it boots. The program can be started interactivly or via
+command line options.
+
+When this program is started interactive it will ask the following questions:
+  1) Network address (Class C-network address only)
+  2) Starting number
+  3) Ending number
+  4) Which PXE config file to use 
+
+For example, if the answers are: 
+  1) 10.168.44
+  2) 2
+  3) 4
+  4) default.node_install
+
+Then the result is that is create symbolic links in /tftpboot/pxelinux.cfg:
+  0AA82C02 ----> default.node_install
+  0AA82C03 ----> default.node_install
+  0AA82C04 ----> default.node_install
+"""
+
+import string
+import sys
+import os
+import glob
+import getopt
+import socket
+
+# DEBUG
+#
+DEBUG=0
+
+# Constants
+#
+PXE_CONF_DIR='/tftpboot/pxelinux.cfg'
+NETWORK='network'
+FILENAME='filename'
+START='start'
+END='end'
+VERSION='0.6.2'
+REMOVE='remove'
+INTERACTIVE='interactive'
+
+SHORTOPT_LIST='hVd:n:s:e:f:ri'
+LONGOPT_LIST=['help', 'version', 'directory=', 'net=', 'start=', 'end=', 'file=', 'remove', 'debug' , 'interactive' ]
+
+def select_pxe_configfile():
+  """
+  Let user choose which pxeconfig file to use.
+  """
+
+  os.chdir(PXE_CONF_DIR)
+
+  # Try to determine to which file the default symlink points, and 
+  # if it exists, remove it from the list.
+  #
+  try:
+    default_file = os.readlink('default')
+  except OSError:
+    default_file = None
+    pass
+
+  files = glob.glob('default.*')
+  if not files:
+    print 'There are no pxe config files starting with: default.'
+    sys.exit(1)
+
+  if default_file:
+    files.remove(default_file)
+ 
+
+  print 'Which pxe config file must we use: ?' 
+  i = 1   
+  for file in files:
+    print "%d : %s" %(i,file)
+    i = i +1
+
+  while 1:
+    index = raw_input('Select a number: ')
+    try:
+      index = int(index)
+    except ValueError:
+      index = len(files) + 1
+
+    # Is the user smart enough to select
+    # the right value??
+    #
+    if 0 < index <= len(files): break
+
+  return files[index-1]
+
+def manage_links(dict):
+  """
+  Create the links in the PXE_CONF_DIR,
+    list : A list containing: network hex address, pxe config file, 
+           start number, end number
+  """
+  os.chdir(PXE_CONF_DIR)
+  naddr = dict[NETWORK]
+  pxe_filename = dict[FILENAME]
+  for i in range(dict[START], dict[END]+1):
+    haddr = '%s%02X' %(naddr, i)
+
+    if dict[REMOVE]:
+       if DEBUG:
+          print 'removing %s/%s' %(PXE_CONF_DIR, haddr)
+       if os.path.exists(haddr):
+          os.unlink(haddr)
+    else:
+       if DEBUG:
+          print 'linking %s to %s' %(haddr, pxe_filename)
+       if os.path.exists(haddr):
+          os.unlink(haddr)
+       os.symlink(pxe_filename, haddr)
+
+def convert_network(net, prefix=''):
+  """
+  This function checks if the give network is a Class C-network and will
+  convert the network address to a hex address if true.
+  """
+  d = string.split(net, '.')
+
+  if len(d) != 3:
+    if prefix:
+      net = prefix + ' : ' + net
+      
+    print '%s is not a valid  C-class network address!!!' %net
+    sys.exit(1)
+
+
+  # Display right message for interactive/commandline
+  if prefix:
+    prefix = prefix + ' ' + net
+  else:
+    prefix = net
+
+  # Check if we have valid network values
+  r = ''
+  for i in d:
+    i = check_number(i, prefix)
+    r = '%s%02X' %(r,i)
+
+  if DEBUG:
+    print r
+
+  return r
+
+def check_number(number, prefix=''):
+  """
+  This functions checks if the input is between 0 < number < 255:
+     number : is a string
+     prefix ; a string that must be displayed if an error occurs
+  """
+  try:
+    n = int(number)
+  except ValueError, detail:
+    print prefix,detail
+    sys.exit(1)
+
+  if 0 <= n <= 255:
+    return n
+  else:
+
+    if prefix:
+      number = prefix +' : ' + number
+
+    print '%s is not a valid number, must be between 0 and 255' %number
+    sys.exit(1)
+
+def interactive(binfo):
+
+  print __doc__
+
+  network = raw_input('Give network address (xxx.xxx.xxx): ') 
+  naddr = convert_network(network)
+
+  start = raw_input('Starting number: ') 
+  start = check_number(start)
+
+  end = raw_input('Ending number: ') 
+  end = check_number(end)
+
+  pxe_filename = select_pxe_configfile()
+
+  binfo[NETWORK] = naddr
+  binfo[START] = int(start)
+  binfo[END] = int(end)
+  binfo[FILENAME] = pxe_filename
+
+  if DEBUG:
+    print network, binfo
+
+def check_cmd_line(binfo):
+  if len(binfo.keys()) != 5:
+    print __doc__
+    print 'Not enough arguments to create the links!!'
+    sys.exit(1)
+
+  # check_filename
+  #
+  if not os.path.isfile(os.path.join(PXE_CONF_DIR, binfo[FILENAME])):
+    print '%s: Filename does not exists' %binfo[FILENAME]
+    sys.exit(1)
+
+def check_args(argv, binfo):
+  """
+  This function parses the command line options and returns the rest as
+  an list of hostnames:
+    argv     : a list of command line options.
+    binfo    : returning a dict with the netinfo. if used non-interactively
+    hostnames: the rest of the command lines options that are not-parseble.
+  """
+  global PXE_CONF_DIR
+  global DEBUG
+
+  try:
+    opts, args = getopt.getopt(argv[1:], SHORTOPT_LIST, LONGOPT_LIST)
+  except getopt.error, detail:
+    print __doc__
+    print detail
+    sys.exit(1)
+
+  # Check given options
+  #
+  for opt,value in opts:
+
+    if opt in ['-d', '--directory']:
+      if os.path.isdir(value):
+        PXE_CONF_DIR = value
+      else:
+        print 'Directory %s does not exists\n' %value
+	sys.exit(1)
+
+    elif opt in ['-i', '--interactive']:
+      binfo[INTERACTIVE] = 1
+
+    elif opt in ['-n', '--net']:
+      network = value
+      binfo[NETWORK] = convert_network(value, opt)
+
+    elif opt in ['-s', '--start']:
+      binfo[START] = check_number(value, opt)
+
+    elif opt in ['-e', '--end']:
+      binfo[END] = check_number(value, opt)
+
+    elif opt in ['-f', '--file']:
+      binfo[FILENAME] = value
+
+    elif opt in ['-V', '--version']:
+      print VERSION
+      sys.exit(0)
+
+    elif opt in ['-r', '--remove']:
+      binfo[REMOVE] = 1
+
+    elif opt in ['--debug']:
+      DEBUG = 1
+
+    elif opt in ['-h', '--help']:
+      print __doc__
+      sys.exit(0)
+
+  if args:
+  	return args
+
+def hosts_links(hosts, binfo):
+	for host in hosts:
+		try:
+			addr = socket.gethostbyname(host)
+		except socket.error,detail:
+			print '%s not an valid hostname: %s' %(host,detail)
+			sys.exit(1)
+			
+		net = string.splitfields(addr, '.')
+		cnet = string.joinfields(net[0:3], '.')
+
+		binfo[NETWORK] = convert_network(cnet)
+		binfo[START] = int(net[3])
+		binfo[END] =  int(net[3])
+		manage_links(binfo)
+
+
+def main():
+  # A dictionary holding the boot info
+  #
+  bootinfo = {}
+  bootinfo[REMOVE] = 0
+
+  hostnames = check_args(sys.argv, bootinfo)
+
+  if bootinfo[REMOVE]:
+     bootinfo[FILENAME] = 'remove_boot_file'
+
+
+  # If we supplied args then make links for the supplied hosts
+  # else make links for class C-networks
+  #
+  if hostnames:
+	if not bootinfo.has_key(FILENAME):
+	      bootinfo[FILENAME] = select_pxe_configfile()
+	hosts_links(hostnames,bootinfo)
+  else:
+  	if bootinfo.has_key(INTERACTIVE):    
+		interactive(bootinfo)
+  	else:
+		check_cmd_line(bootinfo)
+  	manage_links(bootinfo)
+
+if __name__ == '__main__':
+  main()
Index: /trunk.old/pxeconfig/pxeconfigd
===================================================================
--- /trunk.old/pxeconfig/pxeconfigd	(revision 66)
+++ /trunk.old/pxeconfig/pxeconfigd	(revision 66)
@@ -0,0 +1,156 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2002
+#
+# This file is part of the pxeconfig utils
+#
+# This program is free software; you can redistribute it and/or modify it 
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+#
+# SVN info
+#  $Id$
+"""
+Author: Bas van der Vlies <basv@sara.nl>
+Date  : 12 February 2002
+Desc. : This script is used to control how a node is booted with PXE
+        enabled network cards. The node boots and fetch a pxe
+        config file which tells how the node must boot. This daemon
+        enables a client to remove his/here pxe config file. With the
+	next boot it will use the default one.
+
+	command line option:
+	  -d/--directory <dir>
+	    Where <dir> is the directory where the pxe config files reside.
+	  -V/--version 
+	    Prints the version number and exits
+          
+        Note:
+          This server can ONLY be started from inetd.
+"""
+import time
+import socket
+import sys
+import os
+import string
+import syslog
+import getopt
+
+# DEBUG
+#
+DEBUG=1
+
+# Some Global Constants
+#
+BUFSIZE=4096
+STDIN=0
+STDOUT=1
+SHORTOPT_LIST='Vd:'
+LONGOPT_LIST=['version', 'directory=']
+
+PXE_CONF_DIR = '/tftpboot/pxelinux.cfg'
+VERSION = '0.4.4'
+
+# Give the current time
+#
+def now():
+    return time.ctime(time.time())
+
+
+def remove_link(filename):
+  """This removes the pxe config filename for the host that is connected:
+      filename : string
+  """
+
+  file = os.path.join(PXE_CONF_DIR, filename)
+
+  if DEBUG:
+    print 'file = %s' %file
+
+  if not os.path.exists(file): return
+
+  if os.path.islink(file): 
+    try:
+      os.unlink(file)
+      syslog.openlog("pxeconfigd")
+      syslog.syslog(syslog.LOG_INFO, file)
+      syslog.closelog()
+    except OSError:
+      err_msg = "No permission at directory: %s" %PXE_CONF_DIR
+      os.write(STDOUT, err_msg)
+      sys.exit(1)
+
+# This function handles the client connection. It closes
+# the connection if there is no data
+#
+def handleConnection():
+  """Determines which host connects to the server
+  """
+
+  # Determine client address
+  # 
+  try:
+    client_addr = socket.fromfd(sys.stdin.fileno(), socket.AF_INET, 
+                          socket.SOCK_STREAM)
+    client_ip = client_addr.getpeername()[0] 
+
+  except socket.error, detail:
+    print "pxeconfigd can only be started from inetd!!!"
+    sys.exit(1)
+
+
+  # translate ip address ---> hex address
+  #
+  d = string.split(client_ip, '.')
+  client_haddr = '%02X%02X%02X%02X' %(int(d[0]), int(d[1]), int(d[2]), int(d[3]))
+
+  if DEBUG:
+    print 'ip = %s, hex = %s' %(client_ip, client_haddr)
+
+  remove_link(client_haddr)
+  sys.exit(0)
+
+def check_args(argv):
+  """
+  Must we use another directory for the PXE configuration
+  """
+  global PXE_CONF_DIR
+
+  try:
+    opts, args = getopt.getopt(argv[1:], SHORTOPT_LIST, LONGOPT_LIST)
+  except getopt.error, detail:
+    print __doc__
+    print detail
+    sys.exit(1)
+
+  for opt, value in opts:
+
+    if opt in ['-d', '--directory']:
+      if not os.path.isdir(value):
+        os.write(STDOUT, "PXE booting is not configured")
+        sys.exit(1)
+      else:
+        PXE_CONF_DIR = value
+
+    elif opt in ['-V', '--version']:
+      print VERSION
+      sys.exit(0)
+
+def server():
+  """Start the daemon
+  """
+  check_args(sys.argv)
+  handleConnection()
+
+if __name__ == '__main__':
+  server()
Index: /trunk.old/pxeconfig/pxeconfigd.xinetd
===================================================================
--- /trunk.old/pxeconfig/pxeconfigd.xinetd	(revision 66)
+++ /trunk.old/pxeconfig/pxeconfigd.xinetd	(revision 66)
@@ -0,0 +1,11 @@
+service pxeconfigd
+{
+	disable		= no
+	socket_type	= stream
+	protocol	= tcp
+	user		= root
+	group		= sys
+	wait		= no
+	server		= /usr/sbin/pxeconfigd
+	server_args	= -d /tftpboot
+}
