From: Thierry Parmentelat Date: Sat, 25 Jul 2009 16:58:09 +0000 (+0000) Subject: remove obsolete methods X-Git-Tag: PLCAPI-4.3-23~27 X-Git-Url: http://git.onelab.eu/?p=plcapi.git;a=commitdiff_plain;h=06c665fabe62482dc1cebbe4b3a73dbbf0b6a097 remove obsolete methods --- diff --git a/PLC/Methods/AddDummynetBox.py b/PLC/Methods/AddDummynetBox.py deleted file mode 100644 index 25b4483..0000000 --- a/PLC/Methods/AddDummynetBox.py +++ /dev/null @@ -1,24 +0,0 @@ -# Add a dummynet box using Accessors -# -# Marta Carbone - unipi -# $Id$ -# $URL$ - -from PLC.Accessors.Accessors_dummynetbox import * # import dummynet accessors -from PLC.Methods.AddNode import AddNode - -class AddDummynetBox(AddNode): - """ - Adds a new dummynetbox, derived class from AddNode class. - """ - - def call(self, auth, site_id_or_login_base, node_fields): - node_fields.update({'node_type':'dummynet'}) - node_id = AddNode.call(self, auth, site_id_or_login_base, node_fields) - - # create a subclass object to have a handle to issue the call - subclass = SetNodeSubclass(self.api) - # set the subclass type - subclass.call(auth, int(node_id), dbox_subclass) - - return node_id diff --git a/PLC/Methods/DeleteDummynetBox.py b/PLC/Methods/DeleteDummynetBox.py deleted file mode 100644 index 19ad52d..0000000 --- a/PLC/Methods/DeleteDummynetBox.py +++ /dev/null @@ -1,18 +0,0 @@ -# Delete a Dummynet box using Accessors -# -# Marta Carbone - unipi -# $Id$ -# $URL$ - -from PLC.Accessors.Accessors_dummynetbox import * # import dummynet accessors -from PLC.Methods.DeleteNode import DeleteNode - -class DeleteDummynetBox(DeleteNode): - """ - Mark an existing dummynetbox as deleted, derived from DeleteNode. - XXX add type checks - """ - - def call(self, auth, node_id_or_hostname): - - return DeleteNode.call(self, auth, node_id_or_hostname) diff --git a/PLC/Methods/GetDummyBoxMedium.py b/PLC/Methods/GetDummyBoxMedium.py deleted file mode 100644 index 3ba8fd4..0000000 --- a/PLC/Methods/GetDummyBoxMedium.py +++ /dev/null @@ -1,169 +0,0 @@ -# -# Marta Carbone - UniPi -# $Id$ -# $URL$ -# -# This class requires the rpm package containing -# the picobsd image to be installed -# on the Central Site system. -# - -import base64 -import os -import datetime - -from PLC.Faults import * # faults library -from PLC.Method import Method # base class for methods -from PLC.Parameter import Parameter # use the Parameter wrapper -from PLC.Auth import Auth # import the Auth parameter -from PLC.Nodes import * # nodes functions -from PLC.Methods.GetBootMedium import compute_key # key generation function -from PLC.Accessors.Accessors_dummynetbox import * # import dummynet accessors - -WORK_DIR = "/var/tmp/DummynetBoxMedium" -BASE_IMAGE = "/usr/share/dummynet/picobsd" - -class GetDummyBoxMedium(Method): - """ - This method is used to fetch a boot image for the DummyNetBox - with its configuration file embedded. - - Every time this method is called, a new key is generated in the configuration file, - SO THIS OPERATION WILL INVALIDATE ANY PREVIOUSLY DUMMYNETBOX BOOT MEDIUM. - - This method updates the key fields in the database. - It returns a base64-encoded boot image. - """ - # I added the session role, because this method should be called from the web - roles = ['admin', 'pi', 'tech', 'session'] - - accepts = [ - Auth(), - Parameter(int, "The dummybox_id"), - Parameter(str, "The image type (bin or iso)") - ] - - returns = Parameter(str, "DummynetBox boot medium") - - # XXX add checks for picobsd.bin existence - - # Generate a new configuration file in the working directory - # input parameters follows: - # self is used to access instance data, - # dummybox is the dummybox_id, - # new_key is the new generated key, - # configfile is the output file of the configuration. - def generate_conf_file(self, dummybox, new_key, configfile): - - # Generate the dummynet box configuration file - today = datetime.date.today() - file = "" - file += "# This is the dummynetbox configuration file\n" - file += "# and was generated on %s\n" % str(today) - - host_domain = dummybox['hostname'] - host_domain = host_domain.split('.', 1) - file += 'HOST_NAME="%s"\n' % host_domain[0] - file += 'DOMAIN_NAME="%s"\n' % host_domain[1] - - file += 'IP_ADDRESS="%s"\n' % dummybox['ip'] - file += 'IP_NETMASK="%s"\n' % dummybox['netmask'] - file += 'IP_GATEWAY="%s"\n' % dummybox['gateway'] - file += 'IP_DNS1="%s"\n' % dummybox['dns1'] - file += 'IP_DNS2="%s"\n' % dummybox['dns2'] - file += 'DUMMYBOX_ID="%s"\n' % dummybox['node_id'] - file += 'DUMMYBOX_KEY="%s"\n' % new_key - - file += 'CS_IP="%s"\n' % self.api.config.PLC_API_HOST - - # write the configuration file - # WORK_DIR must be writable - FILE = open(configfile, "w") - FILE.write(file) - FILE.close() - - return - - # Here starts the execution of the call - def call(self, auth, dummybox_id, type): - - # check for dummynet box existence and get dummyboxes information - dummybox_info = Nodes(self.api, {'node_id':dummybox_id, 'node_type':'dummynet'}, \ - ['hostname', 'interface_ids']) - - if dummybox_id != None and not dummybox_info: - raise PLCInvalidArgument, "No such DummyBox %s" % dummybox_id - - # Get the dummynet box hostname - dummybox_hostname = dummybox_info[0]['hostname'] - print "dummybox hostname %s" % dummybox_hostname - - # get the node interface, if configured - interfaces = Interfaces(self.api, dummybox_info[0]['interface_ids']) - for i in interfaces: - if i['is_primary']: - interface_info = i - break - - if not interface_info: - raise PLCInvalidArgument, "No primary network configured on %s" % dummybox_hostname - - dummybox = interface_info - dummybox['hostname']=dummybox_hostname - - # Select the base image, default to bin image - if type != 'iso': - type="bin" - IMAGE_NAME = str(WORK_DIR) + "/dummybox_" + dummybox_hostname + str(type) - BASE_IMAGE = "/usr/share/dummynet/picobsd." + str(type) - configfile = WORK_DIR + '/dummybox.conf' - lockfile = WORK_DIR + '/lockfile' - - # Permission checks - assert self.caller is not None - - # Start the generation of the image - # Generate a new key - new_key = compute_key() - - # create working dir and lock file for concurrent runs - if not os.path.exists(WORK_DIR): - print "Creating working directory %s" % WORK_DIR - os.mkdir(WORK_DIR) - - if os.path.exists(lockfile): - raise PLCInvalidArgument, "Lockfile %s exist, try again " % lockfile - else: - print "Executing "+"touch %s" % lockfile - os.system("touch %s" % lockfile) - - # generate the configuration file - conf_file = self.generate_conf_file(dummybox, new_key, configfile) - - # build the shell script to customize the dummynetbox image - # copy the raw file and find the configuration file position - shell_script = "(cp %s %s; export MATCH=`grep -abo START_USER_DATA %s | cut -d: -f1`; " \ - % (BASE_IMAGE, IMAGE_NAME, IMAGE_NAME) - - # set permission file - shell_script += " chmod u+w %s; chmod u+w %s; " % (IMAGE_NAME, configfile) - - # cat the configuration file in the raw image - shell_script += " cat %s | dd of=%s seek=$MATCH conv=notrunc bs=1)" \ - % (configfile, IMAGE_NAME) - - # check returned values, 0 means OK, remove the lock file - os.system(shell_script) - os.system("rm %s" % (lockfile)) - - # if all goes fine store the key in the database - nodes = Nodes(self.api, dummybox_id) - if not nodes: - raise PLCInvalidArgument, "No such node %r"%node_id_or_hostname - nodes[0]['key'] = new_key - nodes.sync() - - # return the file's content base64-encoded - result = file(IMAGE_NAME).read() - os.unlink(IMAGE_NAME) - return base64.b64encode(result) diff --git a/PLC/Methods/GetDummyBoxUsers.py b/PLC/Methods/GetDummyBoxUsers.py deleted file mode 100644 index 74e586e..0000000 --- a/PLC/Methods/GetDummyBoxUsers.py +++ /dev/null @@ -1,192 +0,0 @@ -# -# Marta Carbone - UniPi -# $Id$ -# $URL$ -# -# This Method returns a list of tuples formatted as follow: -# -# -# -# and an authorized_keys file, to be used on a dummynet box. -# - -from PLC.Method import Method # base class used to derive methods -from PLC.Parameter import Parameter, Mixed # define input parameters -from PLC.Auth import Auth # import the Auth parameter -from PLC.Faults import * # faults library -from PLC.Nodes import Node, Nodes # main class for Nodes -from PLC.Slices import Slice, Slices # main class for Slices -from PLC.Keys import Key, Keys # main class for Keys -from PLC.Persons import Person, Persons # main class for Persons -from PLC.Interfaces import * # get the node primary ip address -from PLC.NodeTags import * # get node connected to a dummynet box -from PLC.Accessors.Accessors_dummynetbox import * # import dummynet accessors - -# authorized file delimiter string -NEWFILE_MARK = "authorized_keys_mark" - -# Dummynet box private key -KEY="/usr/share/dummynet/dbox_key" - -class GetDummyBoxUsers(Method): - """ - Return a list of information about - slice, users, user keys, nodes and dummyboxes. - - This Methods is mean to be used by a DummyBox. - - Return keys, 0 if there are no users. - """ - - roles = ['admin', 'pi', 'node'] - - accepts = [ - Auth(), - Parameter(int, 'DummyBox id'), - ] - - returns = Parameter(str, "DummyBox files") - - def call(self, auth, dummybox_id = None): - """ - Get information about users on nodes connected to the DummyBox. - - Given a dummybox_id we get the list of connected nodes - For each node_id we get a list of connected slices - For each slice we get a list of connected users - For each user we get a list of keys that we return to the caller. - """ - - # These variables contain some text to be used - # to format the output files - # port-forwarding should be denied in the main sshd configuration file - ssh_command = "/home/user/dbox.cmd " - ssh_configuration = ",no-port-forwarding,no-agent-forwarding,no-X11-forwarding " - - # check for dummynet box existence and get dummyboxes information - dummyboxes = Nodes(self.api, {'node_id':dummybox_id, 'node_type':'dummynet'}, ['site_id']) - - if dummybox_id != None and not dummyboxes: - raise PLCInvalidArgument, "No such DummyBox %s" % dummybox_id - - dummybox = dummyboxes[0] - - # this method needs authentication - assert self.caller is not None - - # XXX check if we have rights to do this operation: - # - admins can retrive all information they want, - # - dummyboxes can retrive information regarding their site, - # nodes and slice account present on their nodes. - - # Given a dummybox_id we get the list of connected nodes - connected_nodes = NodeTags(self.api, {'value': dummybox_id}, ['node_id']) - - node_list = [] - for i in connected_nodes: - node_list.append(i['node_id']) - - nodes = Nodes(self.api, node_list, ['node_id', 'hostname', 'slice_ids']) - if not nodes: return 0 - - # Here nodes should be an array of dict with 'node_id', 'hostname' and 'slice_ids' fields - - user_map = "# Permission file, check here if a user can configure a link\n" # store slice-node information - user_map+= "# Tuples are `owner slice_name' `hostname to reconfigure'\n" - authorized_keys_dict = {} # user's keys, dictionary - dbox_key_id = 0 # key_id used to identify users keys in the dummynetbox - - # For each node_id we get a list of connected slices - for node in nodes: - - # list of connected slices - slice_ids = node['slice_ids'] - if not slice_ids: continue - - # For each slice we get a list of connected users - for slice_id in slice_ids: - # field to return - slice_name = Slices(self.api, {'slice_id': slice_id}, ['name', 'person_ids']) - if not slice_name: continue - - # Given a slice we get a list of users - person_ids = slice_name[0]['person_ids'] - if not person_ids: continue - - # For each user we get a list of keys - for person_id in person_ids: - # Given a user we get a list of keys - person_list = Persons(self.api, {'person_id': person_id}, ['person_id','key_ids']) - person = person_list[0]['person_id'] - key_list = person_list[0]['key_ids'] - if not key_list: continue - - for key_id in key_list: - key = Keys(self.api, {'key_id': key_id}, ['key']) - - # Here we have all information we need - # to build the authorized key file and - # the user map file - - k = key[0]['key'] - - # split the key in type/ssh_key/comment - splitted_key = k.split(' ',2) - uniq_key = splitted_key[0]+" "+splitted_key[1] - - # retrieve/create a unique dbox_key_id for this ssh_key - if authorized_keys_dict.has_key(uniq_key): - dbox_key_id = authorized_keys_dict[uniq_key] - else: - dbox_key_id+=1 - authorized_keys_dict.update({uniq_key : dbox_key_id}) - - # get the node ip address - nodenetworks = Interfaces(self.api, \ - {'node_id':node['node_id'], 'is_primary':'t'}, ['ip']) - - # append user and slice data to the user_map file - item = str(dbox_key_id) - item +=" " + str(nodenetworks[0]['ip']) - item +=" " + str(slice_name[0]['name']) + "\n" - - user_map += item - - # format change for authorized_keys dict - authorized_keys_file="" - authorized_keys_file += "# generated automatically by GetUsersUpdate.py on the Central Site\n"; - authorized_keys_file += "# format file:\n"; - authorized_keys_file += '# command="command key_id $SSH_ORIGINAL_COMMAND",ssh_options key_type key comment\n' - authorized_keys_file += "# where command, key_id and ssh_options are filled by the Central Site script\n" - authorized_keys_file += "# and $SSH_ORIGINAL_COMMAND is the command line inserted by the node\n" - authorized_keys_file += "\n"; - - # read the central site key - # the dummynet public key is located under KEY - try: - pub_key=KEY+".pub" - dbox_key_file = open(pub_key, 'r') - dbox_key = dbox_key_file.readline() - - # upload the central site public key, used to - # send plcapi commands to the central site - # we use the special key_index = 0 value - authorized_keys_file += "# The Central Site key, it allows to jump some checks on the dbox\n" - authorized_keys_file += "command=\"" + ssh_command + "0"; - authorized_keys_file += " $SSH_ORIGINAL_COMMAND\"" + ssh_configuration + dbox_key + "\n" - dbox_key_file.close() - except: - authorized_keys_file += "# The Central Site public key not found, this dummynet box\n"; - authorized_keys_file += "# will not accept configuration request coming from the Central Site\n"; - - authorized_keys_file += "\n"; - # upload the users keys - for i in authorized_keys_dict: - # index of the key - key_index = str(authorized_keys_dict[i]) - - # create the dummynet box command - authorized_keys_file += "command=\"" + ssh_command + key_index; - authorized_keys_file += " $SSH_ORIGINAL_COMMAND\"" + ssh_configuration + str(i) + "\n" - - return user_map+NEWFILE_MARK+"\n"+authorized_keys_file diff --git a/PLC/Methods/__init__.py b/PLC/Methods/__init__.py index a68a7bd..61ad2d1 100644 --- a/PLC/Methods/__init__.py +++ b/PLC/Methods/__init__.py @@ -6,7 +6,6 @@ AddBootState AddConfFile AddConfFileToNodeGroup AddConfFileToNode -AddDummynetBox AddIlink AddInitScript AddInterface @@ -53,7 +52,6 @@ DeleteBootState DeleteConfFileFromNodeGroup DeleteConfFileFromNode DeleteConfFile -DeleteDummynetBox DeleteEmulationLink DeleteIlink DeleteInitScript @@ -92,8 +90,6 @@ GetAddressTypes GetBootMedium GetBootStates GetConfFiles -GetDummyBoxMedium -GetDummyBoxUsers GetEventObjects GetEvents GetIlinks