Changeset f77a256d1f481032d22a5052d21211d6cb913daa

Show
Ignore:
Timestamp:
01/11/12 16:02:07 (4 months ago)
Author:
Ted Faber <faber@…>
Children:
6886c5a287706d5b43064ea4e5ff217aee2b0319
Parents:
ee950c2260d0e0d90dc0a6a4d78740b92459415b
git-committer:
Ted Faber <faber@isi.edu> / 2012-01-11T16:02:07Z-0800
Message:

DETER plugin can act as users now

Location:
fedd
Files:
2 added
2 modified

Legend:

Unmodified
Added
Removed
  • fedd/access_to_abac.py

    rf3898f7 rf77a256  
    7171#  All the local parsing functions get the unparsed remainder of the line 
    7272#  (after the three-name and the attribute it maps to), the credential list to 
    73 #  add the new ABAC credential(s) that will be mapped into the loacl 
     73#  add the new ABAC credential(s) that will be mapped into the local 
    7474#  credentials, the fedid of this entity, a dict mapping the local credentials 
    7575#  to ABAC credentials that are required to exercise those local rights and the 
     
    7777def parse_emulab(l, creds, me, to_id, p, gp, gu, lr): 
    7878    ''' 
    79     Parse the emulab (project, allocation_user, access_user) format.  Access 
    80     users are deprecates and allocation users used for both.  This fuction 
    81     collapses them. 
    82     ''' 
    83     right_side_str = '\s*,\s*\(\s*%s\s*,\s*%s\s*,\s*%s\s*\)' % \ 
    84             (proj_same_str, id_same_str,id_same_str) 
     79    Parse the emulab (project, allocation_user, cert_file) format.  
     80    ''' 
     81    right_side_str = '\s*,\s*\(\s*%s\s*,\s*%s\s*,\s*(%s)\s*\)' % \ 
     82            (proj_same_str, id_same_str,path_str) 
    8583 
    8684    m = re.match(right_side_str, l) 
    8785    if m: 
    88         project, user = m.group(1,2) 
     86        project, user, cert = m.group(1,2,3) 
    8987        # Resolve "<same>"s in project and user 
    9088        if project == '<same>': 
     
    114112                [attribute(p, x, lr) for x in (gp, gu) if x is not None]) 
    115113        creds.add(c) 
    116         if (project, user) in to_id: to_id[(project,user)].append(c) 
    117         else: to_id[(project,user)] = [ c ] 
     114        if (project, user,cert) in to_id: to_id[(project,user,cert)].append(c) 
     115        else: to_id[(project,user,cert)] = [ c ] 
    118116    else: 
    119117        raise parse_error("Badly formatted local mapping: %s" % l) 
     
    320318id_str = '[a-zA-Z][\w_-]*' 
    321319proj_str = '[a-zA-Z][\w_/-]*' 
    322 path_str = '[a-zA-Z_/\.-]+' 
     320path_str = '[a-zA-Z0-9_/\.-]+' 
    323321id_any_str = '(%s|<any>)' % id_str 
    324322proj_any_str = '(%s|<any>)' % proj_str 
  • fedd/federation/emulab_access.py

    ree950c2 rf77a256  
    176176    def access_tuple(str): 
    177177        """ 
    178         Convert a string of the form (id, id) into an access_project.  This is 
    179         called by read_access to convert to local attributes.  It returns 
    180         a tuple of the form (project, user). 
     178        Convert a string of the form (id, id, id) into an access_project.  This 
     179        is called by read_access to convert to local attributes.  It returns a 
     180        tuple of the form (project, user, certificate_file). 
    181181        """ 
    182182 
    183183        str = str.strip() 
    184         if str.startswith('(') and str.endswith(')') and str.count(',') == 1: 
     184        if str.startswith('(') and str.endswith(')') and str.count(',') == 2: 
    185185            # The slice takes the parens off the string. 
    186             proj, user = str[1:-1].split(',') 
    187             return (proj.strip(), user.strip()) 
     186            proj, user, cert = str[1:-1].split(',') 
     187            return (proj.strip(), user.strip(), cert.strip()) 
    188188        else: 
    189189            raise self.parse_error( 
    190                     'Bad mapping (unbalanced parens or more than 1 comma)') 
     190                    'Bad mapping (unbalanced parens or more than 2 commas)') 
    191191 
    192192    # RequestAccess support routines 
    193193 
    194     def save_project_state(self, aid, pname, uname, owners): 
     194    def save_project_state(self, aid, pname, uname, certf, owners): 
    195195        """ 
    196196        Save the project, user, and owners associated with this allocation. 
     
    201201        self.allocation[aid]['project'] = pname 
    202202        self.allocation[aid]['user'] = uname 
     203        self.allocation[aid]['cert'] = certf 
    203204        self.allocation[aid]['owners'] = owners 
    204205        self.write_state() 
     
    272273        aid = unicode(allocID) 
    273274 
    274         pname, uname = self.save_project_state(aid, found[0], found[1], owners) 
     275        pname, uname = self.save_project_state(aid, found[0], found[1],  
     276                found[2], owners) 
    275277 
    276278        services, svc_state = self.export_services(req.get('service',[]), 
     
    690692        if aid in self.allocation: 
    691693            user = self.allocation[aid].get('user', None) 
     694            cert = self.allocation[aid].get('cert', None) 
    692695            self.allocation[aid]['experiment'] = ename 
    693696            self.allocation[aid]['nonce'] = nonce_experiment 
     
    711714                    "Can't find creation user for %s" %aid) 
    712715 
    713         return (ename, proj, user, pubkey_base, secretkey_base, alloc_log) 
     716        return (ename, proj, user, cert, pubkey_base, secretkey_base, alloc_log) 
    714717 
    715718    def decorate_topology(self, info, t): 
     
    853856        try: 
    854857            self.retrieve_software(topo, certfile, softdir) 
    855             ename, proj, user, pubkey_base, secretkey_base, alloc_log = \ 
    856                     self.initialize_experiment_info(attrs, aid,  
    857                             certfile, tmpdir) 
     858            ename, proj, user, xmlrpc_cert, pubkey_base, secretkey_base, \ 
     859                alloc_log =  self.initialize_experiment_info(attrs, aid,  
     860                        certfile, tmpdir) 
    858861 
    859862            if '/' in proj: proj, gid = proj.split('/') 
     
    877880            starter = self.start_segment(keyfile=self.ssh_privkey_file,  
    878881                    debug=self.create_debug, log=alloc_log, boss=self.boss, 
    879                     ops=self.ops, cert=self.xmlrpc_cert) 
     882                    ops=self.ops, cert=xmlrpc_cert) 
    880883            rv = starter(self, ename, proj, user, expfile, tmpdir, gid=gid) 
    881884        except service_error, e: 
     
    918921            proj = self.allocation[aid].get('project', None) 
    919922            user = self.allocation[aid].get('user', None) 
     923            xmlrpc_cert = self.allocation[aid].get('cert', None) 
    920924            ename = self.allocation[aid].get('experiment', None) 
    921925            nonce = self.allocation[aid].get('nonce', False) 
     
    925929            ename = None 
    926930            nonce = False 
     931            xmlrpc_cert = None 
    927932        self.state_lock.release() 
    928933 
     
    942947        stopper = self.stop_segment(keyfile=self.ssh_privkey_file, 
    943948                debug=self.create_debug, boss=self.boss, ops=self.ops, 
    944                 cert=self.xmlrpc_cert) 
     949                cert=xmlrpc_cert) 
    945950        stopper(self, user, proj, ename, gid, nonce) 
    946951        return { 'allocID': req['allocID'], 'proof': proof.to_dict() } 
     
    966971            proj = self.allocation[aid].get('project', None) 
    967972            user = self.allocation[aid].get('user', None) 
     973            xmlrpc_cert = self.allocation[aid].get('cert', None) 
    968974            ename = self.allocation[aid].get('experiment', None) 
    969975        else: 
     
    972978            ename = None 
    973979            topo = None 
     980            xmlrpc_cert = None 
    974981        self.state_lock.release() 
    975982 
     
    989996        info = self.info_segment(keyfile=self.ssh_privkey_file, 
    990997                debug=self.create_debug, boss=self.boss, ops=self.ops, 
    991                 cert=self.xmlrpc_cert) 
     998                cert=xmlrpc_cert) 
    992999        info(self, user, proj, ename) 
    9931000        self.decorate_topology(info, topo) 
     
    10381045            raise service_error(service_error.req, "no targets") 
    10391046 
     1047        self.state_lock.acquire() 
    10401048        if aid in self.allocation: 
    10411049            topo = self.allocation[aid].get('topo', None) 
    10421050            if topo: topo = topo.clone() 
     1051            xmlrpc_cert = self.allocation[aid].get('cert', None) 
    10431052        else: 
    10441053            topo = None 
     1054            xmlrpc_cert = None 
     1055        self.state_lock.release() 
    10451056 
    10461057        targets = copy.copy(targets) 
     
    10581069        ops = self.operation_segment(keyfile=self.ssh_privkey_file, 
    10591070                debug=self.create_debug, boss=self.boss, ops=self.ops, 
    1060                 cert=self.xmlrpc_cert) 
     1071                cert=xmlrpc_cert) 
    10611072        ops(self, op, ptargets, params, topo) 
    10621073