summaryrefslogtreecommitdiffstats
path: root/legacy/findks.cgi
diff options
context:
space:
mode:
Diffstat (limited to 'legacy/findks.cgi')
-rwxr-xr-xlegacy/findks.cgi153
1 files changed, 153 insertions, 0 deletions
diff --git a/legacy/findks.cgi b/legacy/findks.cgi
new file mode 100755
index 0000000..39adbcf
--- /dev/null
+++ b/legacy/findks.cgi
@@ -0,0 +1,153 @@
+#!/usr/bin/env python
+
+# 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.
+
+# based on:
+# Cobbler ks-serving script
+# July 5 2007
+# Adam Wolf <adamwolf@feelslikeburning.com>
+# http://feelslikeburning.com/projects/live-cd-restoring-with-cobbler/
+
+import cgi
+import cgitb
+import time
+import os
+import sys
+import socket
+import xmlrpclib
+
+COBBLER_BASE = "/var/www/cobbler"
+XMLRPC_SERVER = "http://127.0.0.1/cobbler_api_rw"
+
+#----------------------------------------------------------------------
+
+class ServerProxy(xmlrpclib.ServerProxy):
+
+ def __init__(self, url=None):
+ xmlrpclib.ServerProxy.__init__(self, url, allow_none=True)
+
+#----------------------------------------------------------------------
+
+def parse_query():
+
+ form = cgi.parse()
+
+ if form.has_key("system"):
+ name = form["system"][0]
+ type = "system"
+ elif form.has_key("profile"):
+ name = form["profile"][0]
+ type = "profile"
+ else:
+ type = "system"
+ name = autodetect()
+ return (name,type)
+
+#----------------------------------------------------------------------
+
+def autodetect():
+
+ # connect to cobblerd and get the list of systems
+
+ try:
+ xmlrpc_server = ServerProxy(XMLRPC_SERVER)
+ systems = xmlrpc_server.get_systems()
+ except:
+ print "# could not contact cobblerd at %s" % XMLRPC_SERVER
+ sys.exit(1)
+
+ # if kssendmac was in the kernel options line, see
+ # if a system can be found matching the MAC address. This
+ # is more specific than an IP match.
+
+ if os.environ.has_key("HTTP_X_RHN_PROVISIONING_MAC_0"):
+ # FIXME: will not key off other NICs
+ devicepair = os.environ["HTTP_X_RHN_PROVISIONING_MAC_0"]
+ mac = devicepair.split()[1].strip()
+ # mac is the macaddress of the first nic reported by anaconda
+
+ candidates = []
+ for x in systems:
+
+ for y in x["interfaces"]:
+ if x["interfaces"][y]["ip_address"] == ip:
+ candidates.append(x)
+
+ if len(candidates) == 0:
+ print "# no system entries with MAC %s found" % mac
+ print "# trying IP lookup"
+ elif len(candidates) > 1:
+ print "# multiple system entries with MAC %s found" % mac
+ sys.exit(1)
+ elif len(candidates) == 1:
+ print "# kickstart matched by MAC: %s" % mac
+ return candidates[0]
+
+ # attempt to match by the IP.
+
+ ip = os.environ["REMOTE_ADDR"]
+ candidates = [system['name'] for system in systems if system['ip_address'] == ip]
+
+ if len(candidates) == 0:
+ print "# no system entries with ip %s found" % ip
+ sys.exit(1)
+ elif len(candidates) > 1:
+ print "# multiple system entries with ip %s found" % ip
+ sys.exit(1)
+ elif len(candidates) == 1:
+ return candidates[0]
+
+#----------------------------------------------------------------------
+
+def serve_file(name):
+
+ # never hurts to be safe...
+ name = name.replace("/","")
+ name = name.replace("..","")
+ name = name.replace(";","")
+
+ if type == "system":
+ ks_path = "%s/kickstarts_sys/%s/ks.cfg" % (COBBLER_BASE, name)
+ elif type == "profile":
+ ks_path = "%s/kickstarts/%s/ks.cfg" % (COBBLER_BASE, name)
+
+ if not os.path.exists(ks_path):
+ print "# no such cobbler object"
+ sys.exit(1)
+
+ try:
+ ksfile = open(ks_path)
+ except:
+ print "# Cannot open file %s" % ks_path
+ sys.exit(1)
+
+ for line in ksfile:
+ print line.strip()
+ ksfile.close()
+
+#----------------------------------------------------------------------
+
+def header():
+ print "Content-type: text/plain"
+ print
+ print "# kickstart managed by Cobbler -- http://cobbler.et.redhat.com"
+ print "# served on %s" % time.ctime()
+
+#----------------------------------------------------------------------
+
+if __name__ == "__main__":
+ cgitb.enable(format='text')
+ header()
+ (name, type) = parse_query()
+ print "# %s %s" % (type,name)
+ print "# requestor ip = %s" % os.environ["REMOTE_ADDR"]
+ print "# ============================="
+ print " "
+ serve_file(name)
+
+