source: fedd/fixed_resource.py @ dab4d56

axis_examplecompt_changesinfo-opsversion-1.30version-2.00version-3.01version-3.02
Last change on this file since dab4d56 was f8582c9, checked in by Ted Faber <faber@…>, 16 years ago

Resource allocation and deallocation really working
Access handler selects allocation ID
Fedid allocation IDs work
Revamp of util code for maodifying messages (e.g. binaries)
Handlers now see fedids as objects in messages
Fedid bug in handlers in fedd_util

This should have been multiple commits

  • Property mode set to 100755
File size: 4.9 KB
Line 
1#!/usr/local/bin/python
2
3# Encode the set of fixed keys as a colon-separated user/key pairs.  This also
4# includes a command line utility to manipulate the DB.
5
6def read_key_db(file):
7    """
8    Read the set of fixed keys fom the file
9    """
10    keys = set()
11
12    f = open(file, "r")
13    for line in f:
14        u, k = line.rstrip().split(':', 2)
15        keys.add((u, k))
16    f.close()
17    return keys
18
19def write_key_db(file, keys):
20    """
21    Write the set of keys to the given file
22    """
23
24    f = open(file, 'w')
25    for t in keys:
26        print >>f, "%s:%s" % t
27    f.close()
28
29def read_project_db(file):
30    """
31    Read the set of fixed keys fom the file
32    """
33    projects = set()
34
35    f = open(file, "r")
36    for line in f:
37        projects.add(line.rstrip())
38    f.close()
39    return projects
40
41def write_project_db(file, projects):
42    """
43    Write the set of keys to the given file
44    """
45
46    f = open(file, 'w')
47    for p in projects:
48        print >>f, "%s" % p
49    f.close()
50
51
52# This is the command line utility
53if __name__ =='__main__':
54    import sys
55    import MySQLdb
56    from optparse import OptionParser
57
58    actions = set(("initall", "init", "add", "delete"))
59
60    def read_key_file(file):
61        """
62        Read a single line from a keyfile and trim the whitespace
63        """
64        f = open(file, 'r')
65        key = f.readline().rstrip()
66        f.close()
67        return key
68
69    class key_opts(OptionParser):
70        """
71        Options to the command line, pretty self describing
72        """
73        def __init__(self):
74            OptionParser.__init__(self, usage="%prog " + \
75                    "(init|add|delete|initall) " + \
76                    "[opts] (--help for details)", version="0.1")
77            self.add_option('-t','--type', dest='type', type='choice', 
78                    choices=['keys','projects'], help="database type")
79            self.add_option('-u','--user', dest='user', default=None,
80                    action='store', help='user to add/delete')
81            self.add_option('-p','--project', dest='project', default=None,
82                    action='store', help='project to add/delete')
83            self.add_option('-k','--key', dest='key', default=None,
84                    action='store', help='key to add/delete (string)')
85            self.add_option('-K','--keyfile', dest='keyfile', default=None,
86                    action='store', help='key to add/delete (file)')
87            self.add_option('-d', '--database', dest='file', default=None,
88                    action='store', help='database file')
89            self.add_option('-f', '--file', dest='file', action='store',
90                    help='database file (synonym for --database)')
91
92
93    parser = key_opts()
94    action = sys.argv[1]
95
96    # Check the action
97    if action in actions: del sys.argv[1]
98    else: sys.exit("Bad action, must be one of %s" % ", ".join(actions))
99
100    # Parse and check the the options for consistency
101    (opts, args) = parser.parse_args()
102    if not opts.file:
103        sys.exit("Must specify DB file")
104    if not opts.type:
105        sys.exit("Must specify database type (--type)")
106    elif opts.type == 'keys':
107        if action != "init" and action != "initall" and action != "addall":
108            if opts.user and (opts.key or opts.keyfile):
109                user = opts.user
110                if opts.key:
111                    key = opts.key
112                elif opts.keyfile: 
113                    try:
114                        key = read_key_file(opts.keyfile)
115                    except IOError, e:
116                        sys.exit("Error reading keyfile: %s" % e)
117            else:
118                sys.exit("Must specify user and key")
119    elif opts.type == 'projects':
120        if action != "init" and action != "initall" and action != "addall":
121            if opts.project: project = opts.project
122            else: sys.exit("Must specify project")
123    else:
124        sys.exit("Invalid --type field (how'd you do that?)")
125
126    if opts.type == 'keys':
127        if action != 'init' and action != 'initall':
128            keys = read_key_db(opts.file)
129        else:
130            keys = set()
131       
132        if action == 'initall':
133            # Add all users from the Emulab DB
134            try:
135                db = MySQLdb.connect(db="tbdb")
136            except:
137                sys.exit("Cannot access the Emulab database")
138
139            c = db.cursor()
140            c.execute("SELECT uid, pubkey FROM user_pubkeys")
141            for u, k in c.fetchall():
142                keys.add((u, k))
143            c.close()
144            db.close()
145        elif action == 'add':
146            keys.add((user, key))
147        elif action == 'delete': 
148            if (user, key) in keys:
149                keys.remove((user, key))
150            else:
151                print >>sys.stderr, "Cannot delete (%s, %s): not in db" % \
152                        (user, key)
153        # init action falls through to write an empty DB
154        write_key_db(opts.file, keys)
155    else:
156        if action != 'init' and action != 'initall':
157            projects = read_project_db(opts.file)
158        else:
159            projects = set()
160       
161        if action == 'initall':
162            # Add all projects from the Emulab DB
163            try:
164                db = MySQLdb.connect(db="tbdb")
165            except:
166                sys.exit("Cannot access the Emulab database")
167
168            c = db.cursor()
169            c.execute("SELECT pid FROM projects")
170            for p in c.fetchall():
171                projects.add(p)
172            c.close()
173            db.close()
174        elif action == 'add':
175            projects.add(project)
176        elif action == 'delete': 
177            if project in projects:
178                projects.remove(project)
179            else:
180                print >>sys.stderr, "Cannot delete %s: not in db" % project
181
182        # init action falls through to write an empty DB
183        write_project_db(opts.file, projects)
184
185    sys.exit(0)
Note: See TracBrowser for help on using the repository browser.