source: trunk/src/pxeconfigd.py @ 172

Last change on this file since 172 was 172, checked in by bas, 15 years ago

debian/changelog, Changelog:

  • announce new version

src/pxeconfig.py:

  • did not execute client hook script

src/pxeconfigd.py:

examples/pxeconfigd.xinetd:

  • removed server args options
  • Property keywords set to Id
  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 3.9 KB
Line 
1# Copyright (C) 2002
2#
3# This file is part of the pxeconfig utils
4#
5# This program is free software; you can redistribute it and/or modify it
6# under the terms of the GNU General Public License as published by the
7# Free Software Foundation; either version 2, or (at your option) any
8# later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program; if not, write to the Free Software
17# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
18#
19# SVN info
20#  $Id: pxeconfigd.py 172 2009-08-19 10:21:25Z bas $
21"""
22Author: Bas van der Vlies <basv@sara.nl>
23Date  : 12 February 2002
24Desc. : This script is used to control how a node is booted with PXE
25        enabled network cards. The node boots and fetch a pxe
26        config file which tells how the node must boot. This daemon
27        enables a client to remove his/here pxe config file. With the
28        next boot it will use the default one.
29
30        command line option:
31          -V/--version
32            Prints the version number and exits
33         
34        Note:
35          This server can ONLY be started from inetd.
36"""
37import time
38import socket
39import sys
40import os
41import string
42import syslog
43import getopt
44
45# PXE modules
46from pxe_global import *
47
48# DEBUG
49#
50DEBUG=1
51
52# Some Global Constants
53#
54BUFSIZE=4096
55STDIN=0
56STDOUT=1
57SHORTOPT_LIST='V'
58LONGOPT_LIST=['version']
59
60PXE_CONF_DIR = '/tftpboot/pxelinux.cfg'
61VERSION = '3.0.0'
62
63# Give the current time
64#
65def now():
66    return time.ctime(time.time())
67
68
69def remove_link(filename):
70  """This removes the pxe config filename for the host that is connected:
71      filename : string
72  """
73
74  file = os.path.join(PXE_CONF_DIR, filename)
75
76  if DEBUG:
77    print 'file = %s' %file
78
79  if not os.path.exists(file): return
80
81  if os.path.islink(file): 
82    try:
83      os.unlink(file)
84      syslog.openlog("pxeconfigd")
85      syslog.syslog(syslog.LOG_INFO, file)
86      syslog.closelog()
87    except OSError:
88      err_msg = "No permission at directory: %s" %PXE_CONF_DIR
89      os.write(STDOUT, err_msg)
90      sys.exit(1)
91
92# This function handles the client connection. It closes
93# the connection if there is no data
94#
95def handleConnection(settings):
96        """
97        Determines which host connects to the server
98        """ 
99       
100        # Determine client address
101        #
102        try:
103                client_addr = socket.fromfd(sys.stdin.fileno(), socket.AF_INET, 
104                          socket.SOCK_STREAM)
105                client_ip = client_addr.getpeername()[0] 
106        except socket.error, detail:
107                error =  "pxeconfigd can only be started from inetd!!!"
108                raise PxeConfig, error
109               
110        # translate ip address ---> hex address
111        #
112        d = string.split(client_ip, '.')
113        client_haddr = '%02X%02X%02X%02X' %(int(d[0]), int(d[1]), int(d[2]), int(d[3])) 
114       
115        if DEBUG:
116                print 'ip = %s, hex = %s' %(client_ip, client_haddr) 
117
118        try:
119                settings['daemon_script_hook']
120                cmd = '%s %s' %(settings['daemon_script_hook'], client_ip)
121                print cmd
122                os.system(cmd)
123        except KeyError:
124                pass
125
126        remove_link(client_haddr)
127        sys.exit(0)
128
129def check_args(argv, settings):
130        """
131        Must we use another directory for the PXE configuration
132        """
133        global PXE_CONF_DIR
134       
135        try:
136                opts, args = getopt.getopt(argv[1:], SHORTOPT_LIST, LONGOPT_LIST)
137        except getopt.error, detail:
138                print __doc__
139                print detail
140                sys.exit(1) 
141               
142        for opt, value in opts:
143                if opt in ['-V', '--version']:
144                        print VERSION
145                        sys.exit(0)
146
147        try:
148                PXE_CONF_DIR = settings['pxe_config_dir']
149        except KeyError:
150                pass 
151               
152        PXE_CONF_DIR = os.path.realpath(PXE_CONF_DIR) 
153        if not os.path.isdir(PXE_CONF_DIR):
154                error =  'pxeconfig directory: %s does not exists' %(PXE_CONF_DIR)
155                raise PxeConfig, error
156
157def server():
158  """Start the daemon
159  """
160  config = ReadConfig()
161  check_args(sys.argv, config)
162  handleConnection(config)
163
164if __name__ == '__main__':
165  server()
Note: See TracBrowser for help on using the repository browser.