source: trunk/src/pxeconfigd.py @ 171

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

configure. configure.in, Makefile.in:

  • added new files

src/pxeconfigd.in:

  • new daemon code, like client side

src/pxeconfigd.py:

  • use the common function defined in pxe_global.py
  • reformat the code
  • added daemon hook script

setup.py:

  • added some new modules


  • Property keywords set to Id
  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 3.8 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 171 2009-08-19 08:53:16Z 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        if settings['daemon_script_hook']:
119                cmd = '%s %s' %(settings['daemon_script_hook'], client_ip)
120                print cmd
121                os.system(cmd)
122
123        remove_link(client_haddr)
124        sys.exit(0)
125
126def check_args(argv, settings):
127        """
128        Must we use another directory for the PXE configuration
129        """
130        global PXE_CONF_DIR
131       
132        try:
133                opts, args = getopt.getopt(argv[1:], SHORTOPT_LIST, LONGOPT_LIST)
134        except getopt.error, detail:
135                print __doc__
136                print detail
137                sys.exit(1) 
138               
139        for opt, value in opts:
140                if opt in ['-V', '--version']:
141                        print VERSION
142                        sys.exit(0)
143
144        try:
145                PXE_CONF_DIR = settings['pxe_config_dir']
146        except KeyError:
147                pass 
148               
149        PXE_CONF_DIR = os.path.realpath(PXE_CONF_DIR) 
150        if not os.path.isdir(PXE_CONF_DIR):
151                error =  'pxeconfig directory: %s does not exists' %(PXE_CONF_DIR)
152                raise PxeConfig, error
153
154def server():
155  """Start the daemon
156  """
157  config = ReadConfig()
158  check_args(sys.argv, config)
159  handleConnection(config)
160
161if __name__ == '__main__':
162  server()
Note: See TracBrowser for help on using the repository browser.