+++ /dev/null
-"""Parse slices.xml. This file will become obsolete when the new API comes online."""
-
-import base64
-import sys
-sys.path.append('/usr/local/planetlab/bin')
-import SslFetch
-import time
-import xml.parsers.expat
-
-from config import *
-import database
-import logger
-
-
-_worker = SslFetch.Worker(SA_HOSTNAME, cacert_file='/usr/boot/cacert.pem')
-
-def fetch(filename):
- logger.log('fetching %s' % filename)
- (rc, data) = _worker.fetch(filename)
- if rc == 0:
- logger.log('fetch succeeded')
- return data
- else:
- # XXX - should get a better error message from SslFetch/libcurl
- curl_doc = 'http://curl.haxx.se/libcurl/c/libcurl-errors.html'
- raise 'fetch failed, rc=%d (see %s)' % (rc, curl_doc)
-
-
-delegate_key = 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAzNQIrVC9ZV9iDgu5/WXxcH/SyGdLG45CWXoWWh37UNA4dCVVlxtQ96xF7poolnxnM1irKUiXx85FsjA37z6m7IWl1h9uMYEJEvYkkxApsCmwm8C02m/BsOWK4Zjh4sv7QTeDgDnqhwnBw/U4jnkt8yKfVTBTNUY01dESzOgBfBc= root@yankee.cs.princeton.edu'
-
-def fetch_and_update():
- sx = slices_xml(fetch('/xml/slices-0.5.xml'))
- # sx = slices_xml(open('/root/slices-0.5.xml').read())
- recs = [{'record_key': 'timestamp', 'type': 'timestamp', 'timestamp': time.time()}]
- recs.append({'record_key': 'delegate_del_snoop', 'timestamp': time.time(), 'account_type': 'delegate', 'name': 'del_snoop', 'ssh_keys': delegate_key, 'plc_instantiated': True})
- recs.append({'record_key': 'bwcap', 'timestamp': time.time(), 'cap': 5000000000, 'exempt_ips': ['127.0.0.1']})
- for id, name in sx.id_name.iteritems():
- rec = {}
- rec['record_key'] = 'sliver_' + name
- rec['account_type'] = 'sliver'
- rec['name'] = name
- rec['expiry'] = sx.id_expiry[id]
- rec['timestamp'] = sx.id_ts.get(id) or time.time()
- rec['delegations'] = [('del_snoop', 'GetRSpec')]
- rec['id'] = id
- rec['rspec'] = sx.get_rspec(id)
- ssh_keys = []
- for uid in sx.id_uids[id]: ssh_keys.extend(sx.uid_keys[uid])
- rec['ssh_keys'] = '\n'.join(ssh_keys)
- rec['plc_instantiated'] = True
- rec['initscript'] = base64.b64encode('#!/bin/sh\n/bin/echo hello >/world.txt')
- recs.append(rec)
- database.deliver_records(recs)
-
-
-node_id = None
-
-def get_node_id():
- global node_id
- if node_id == None:
- filename = '/etc/planetlab/node_id'
- logger.log('reading node id from %s' % filename)
- id_file = open(filename)
- node_id = int(id_file.readline())
- id_file.close()
- return node_id
-
-
-class slices_xml:
- def __init__(self, data):
- self.node_id = get_node_id()
- self.id_name = {}
- self.id_expiry = {}
- self.id_uids = {}
- self.uid_keys = {}
- self.id_rspec = {}
- self.id_ts = {}
- parser = xml.parsers.expat.ParserCreate()
- parser.StartElementHandler = self._start_element
- parser.CharacterDataHandler = self._char_data
- isfinal = True
- parser.Parse(data, isfinal)
-
- def get_rspec(self, id):
- rspec = DEFAULT_RSPEC.copy()
- rspec.update(self.id_rspec[id])
- return rspec
-
- def _start_element(self, name, attrs):
- self.last_tag = name
- if name == u'slice':
- self.id = int(attrs[u'id'])
- self.name = str(attrs[u'name'])
- self.expiry = int(attrs[u'expiry'])
- elif name == u'timestamp':
- self.id_ts[self.id] = int(attrs[u'value'])
- elif name == u'node':
- # remember slices with slivers on us
- nid = int(attrs[u'id'])
- if nid == self.node_id:
- self.id_name[self.id] = self.name
- self.id_expiry[self.id] = self.expiry
- self.id_uids[self.id] = []
- self.id_rspec[self.id] = {}
- elif name == u'user':
- # remember users with slices with slivers on us
- if self.id in self.id_name:
- uid = int(attrs[u'person_id'])
- self.id_uids[self.id].append(uid)
- self.uid_keys[uid] = []
- elif name == u'resource':
- self.rname = str(attrs[u'name'])
- elif name == u'key':
- # remember keys of users with slices with slivers on us
- uid = int(attrs[u'person_id'])
- if uid in self.uid_keys:
- self.uid_keys[uid].append(str(attrs[u'value']))
-
- def _char_data(self, data):
- if self.last_tag == u'value' and self.id in self.id_name:
- try: self.id_rspec[self.id][self.rname] = int(data)
- except ValueError: pass
- self.last_tag = u''