Ignore:
Timestamp:
Sep 2, 2009 10:36:18 AM (15 years ago)
Author:
Ted Faber <faber@…>
Branches:
axis_example, compt_changes, info-ops, master, version-2.00, version-3.01, version-3.02
Children:
f9ef40b
Parents:
cc8d8e9
Message:

checkpoint

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fedd/federation/access.py

    rcc8d8e9 r6c57fe9  
    1818from remote_service import xmlrpc_handler, soap_handler, service_caller
    1919
     20import topdl
     21import httplib
     22import tempfile
     23from urlparse import urlparse
     24
    2025
    2126# Make log messages disappear if noone configures a fedd logger
     
    5762        self.fileserver = config.get("access", "fileserver")
    5863        self.eventserver = config.get("access", "eventserver")
     64        self.certdir = config.get("access","certdir")
    5965
    6066        self.attrs = { }
     
    649655            for o in owners:
    650656                self.auth.set_attribute(o, allocID)
     657            try:
     658                f = open("%s/%s.pem" % (self.certdir, aid), "w")
     659                print >>f, alloc_cert
     660                f.close()
     661            except IOError, e:
     662                raise service_error(service_error.internal,
     663                        "Can't open %s/%s : %s" % (self.certdir, aid, e))
    651664            resp = self.build_response({ 'fedid': allocID } , ap)
    652665            return resp
     
    11241137
    11251138    def StartSegment(self, req, fid):
     1139        def get_url(url, cf, tmpdir):
     1140            po = urlparse(url)
     1141            fn = po.path.rpartition('/')[2]
     1142            try:
     1143                conn = httplib.HTTPSConnection(po.hostname, port=po.port,
     1144                        cert_file=cf, key_file=cf)
     1145                conn.putrequest('GET', po.path)
     1146                conn.endheaders()
     1147                response = conn.getresponse()
     1148
     1149                lf = open("%s/%s" % (tmpdir, fn), "w")
     1150                buf = response.read(4096)
     1151                while buf:
     1152                    lf.write(buf)
     1153                    buf = response.read(4096)
     1154                lf.close()
     1155            except IOError, e:
     1156                raise service_error(service_error.internal,
     1157                        "Erro writing tempfile: %s" %e)
     1158            except httplib.HTTPException, e:
     1159                raise service_error(service_error.internal,
     1160                        "Error retrieving data: %s" % e)
     1161
     1162        configs = set(('hosts', 'ssh_pubkey', 'ssh_secretkey'))
     1163
     1164
    11261165        try:
    11271166            req = req['StartSegmentRequestBody']
     
    11291168            raise service_error(server_error.req, "Badly formed request")
    11301169        auth_attr = req['allocID']['fedid']
     1170        attrs = req.get('fedAttr', [])
     1171        print auth_attr
     1172        print "%s" % auth_attr
    11311173        if self.auth.check_attribute(fid, auth_attr):
    11321174            print "OK"
    11331175        else:
    11341176            print "Fail"
     1177
     1178        if req.has_key('segmentdescription') and \
     1179                req['segmentdescription'].has_key('topdldescription'):
     1180            topo = \
     1181                topdl.Topology(**req['segmentdescription']['topdldescription'])
     1182        else:
     1183            raise service_error(service_error.req,
     1184                    "Request missing segmentdescription'")
     1185
     1186        certfile = "%s/%s.pem" % (self.certdir, auth_attr)
     1187        try:
     1188            tmpdir = tempfile.mkdtemp(prefix="access-")
     1189        except IOError:
     1190            raise service_error(service_error.internal, "Cannot create tmp dir")
     1191
     1192        sw = set()
     1193        for e in [c for c in topo.elements if getattr(c, 'software', False)]:
     1194            for s in e.software:
     1195                sw.add(s.location)
     1196        for s in sw:
     1197            get_url(s, certfile, tmpdir)
     1198
     1199        for a in attrs:
     1200            if a['attribute'] in configs:
     1201                get_url(a['value'], certfile, tmpdir)
     1202
    11351203        return { 'allocID': req['allocID'] }
Note: See TracChangeset for help on using the changeset viewer.