#! /opt/rocks/bin/python
#
# $Id: EC2kickstart61.py,v 1.3 2012/11/27 03:20:12 clem Exp $
#
# @Copyright@
# 
# 				Rocks(r)
# 		         www.rocksclusters.org
# 		         version 5.5 (Mamba)
# 		         version 6.0 (Mamba)
# 
# Copyright (c) 2000 - 2012 The Regents of the University of California.
# All rights reserved.	
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
# 
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 
# 2. Redistributions in binary form must reproduce the above copyright
# notice unmodified and in its entirety, this list of conditions and the
# following disclaimer in the documentation and/or other materials provided 
# with the distribution.
# 
# 3. All advertising and press materials, printed or electronic, mentioning
# features or use of this software must display the following acknowledgement: 
# 
# 	"This product includes software developed by the Rocks(r)
# 	Cluster Group at the San Diego Supercomputer Center at the
# 	University of California, San Diego and its contributors."
# 
# 4. Except as permitted for the purposes of acknowledgment in paragraph 3,
# neither the name or logo of this software nor the names of its
# authors may be used to endorse or promote products derived from this
# software without specific prior written permission.  The name of the
# software includes the following terms, and any derivatives thereof:
# "Rocks", "Rocks Clusters", and "Avalanche Installer".  For licensing of 
# the associated name, interested parties should contact Technology 
# Transfer & Intellectual Property Services, University of California, 
# San Diego, 9500 Gilman Drive, Mail Code 0910, La Jolla, CA 92093-0910, 
# Ph: (858) 534-5815, FAX: (858) 534-7345, E-MAIL:invent@ucsd.edu
# 
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS''
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# 
# @Copyright@
#

import imp
import syslog
import sys

# I need to do this in order to import a python file which is not postfixed 
# with .py
kickstart = imp.load_source("kickstart", "/export/rocks/install/sbin/kickstart.cgi")

class AppEC2(kickstart.App):
	"""We are extending App in kickstart.cgi and overloading the method:
	  isInternal 
	  getNodeName
	so they do what we want in this case """

	def isInternal(self):
		"""Returns true if the client request is inside our private
		network."""

		syslog.syslog("EC2kickstart.cgi: client is " + str(self.clientList))

		query = 'select ip from nodes, networks, subnets ' +\
			'where nodes.id = networks.node and ' +\
			'subnets.name = "ec2public" and subnets.id = networks.subnet ' +\
			'and nodes.name = "%s";' % self.clientList[0]
		self.execute(query)

		for ip in self.fetchall()[0]:
			if self.clientList[-1] == ip :
				#remote ip matches the one in the database
				return True

		return False

        def getNodeName(self, id):
                self.execute("""select networks.name from networks,subnets
                        where node = %d and
                        networks.subnet = subnets.id and
                        (networks.device is NULL or
                        networks.device not like 'vlan%%') """ % id)
                try:
                        name, = self.fetchone()
                except TypeError:
                        name = 'localhost'
                return name



if __name__ == "__main__":
	#print dir(AppEC2)
	app = AppEC2(sys.argv)
	app.parseArgs('kcgi')
	try:
		app.run()
	except KickstartError, msg:
		sys.stderr.write("kcgi error - %s\n" % msg)
		sys.exit(-1)
    

