1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
# Mod Python service functions for Cobbler's public interface
# (aka cool stuff that works with wget)
#
# Copyright 2007 Albert P. Tobey <tobert@gmail.com>
# additions: Michael DeHaan <mdehaan@redhat.com>
#
# This software may be freely redistributed under the terms of the GNU
# general public license.
#
# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
import exceptions
import xmlrpclib
import os
import traceback
import string
import sys
import time
def log_exc(apache):
"""
Log active traceback to logfile.
"""
(t, v, tb) = sys.exc_info()
apache.log_error("Exception occured: %s" % t )
apache.log_error("Exception value: %s" % v)
apache.log_error("Exception Info:\n%s" % string.join(traceback.format_list(traceback.extract_tb(tb))))
class CobblerSvc(object):
"""
Interesting mod python functions are all keyed off the parameter
mode, which defaults to index. All options are passed
as parameters into the function.
"""
def __init__(self, server=None, apache=None):
self.server = server
self.apache = apache
self.remote = None
def __xmlrpc_setup(self):
"""
Sets up the connection to the Cobbler XMLRPC server.
This is the version that does not require logins.
"""
self.remote = xmlrpclib.Server(self.server, allow_none=True)
def modes(self):
"""
Returns a list of methods in this object that can be run as web
modes.
"""
retval = list()
for m in dir(self):
func = getattr( self, m )
if hasattr(func, 'exposed') and getattr(func,'exposed'):
retval.append(m)
return retval
def index(self,**args):
return "no mode specified"
def ks(self,profile=None,system=None,REMOTE_ADDR=None,REMOTE_MAC=None,**rest):
"""
Generate kickstart files...
"""
self.__xmlrpc_setup()
data = self.remote.generate_kickstart(profile,system,REMOTE_ADDR,REMOTE_MAC)
return u"%s" % data
def trig(self,mode="?",profile=None,system=None,REMOTE_ADDR=None,**rest):
"""
Hook to call install triggers.
"""
self.__xmlrpc_setup()
ip = REMOTE_ADDR
if profile:
rc = self.remote.run_install_triggers(mode,"profile",profile,ip)
else:
rc = self.remote.run_install_triggers(mode,"system",system,ip)
return str(rc)
def nopxe(self,system=None,**rest):
self.__xmlrpc_setup()
return str(self.remote.disable_netboot(system))
# =======================================================
# list of functions that are callable via mod_python:
modes.exposed = False
index.exposed = True
ks.exposed = True
trig.exposed = True
|