gdp-if / rest-gateway / gdp-rest.py @ master
History | View | Annotate | Download (3.82 KB)
1 | 14d8f25a | Nitesh Mor | #!/usr/bin/env python
|
---|---|---|---|
2 | |||
3 | from twisted.internet import reactor |
||
4 | from twisted.web.resource import Resource |
||
5 | from twisted.web.server import Site |
||
6 | |||
7 | import urlparse |
||
8 | import argparse |
||
9 | import json |
||
10 | import gdp |
||
11 | |||
12 | |||
13 | class GDPWriterResource(Resource): |
||
14 | |||
15 | isLeaf = True
|
||
16 | |||
17 | ae956f60 | Nitesh Mor | def __init__(self, logname, keyfile, nolist, allow_nop, convert_num): |
18 | 14d8f25a | Nitesh Mor | |
19 | Resource.__init__(self)
|
||
20 | |||
21 | gdp.gdp_init() |
||
22 | self.logname = logname
|
||
23 | self.nolist = nolist
|
||
24 | self.allow_nop = allow_nop
|
||
25 | ae956f60 | Nitesh Mor | self.convert_num = convert_num
|
26 | 14d8f25a | Nitesh Mor | open_info = {} |
27 | |||
28 | if keyfile is not None: |
||
29 | skey = gdp.EP_CRYPTO_KEY(filename=keyfile, |
||
30 | keyform=gdp.EP_CRYPTO_KEYFORM_PEM, |
||
31 | flags=gdp.EP_CRYPTO_F_SECRET) |
||
32 | open_info['skey'] = skey
|
||
33 | |||
34 | self.gcl = gdp.GDP_GCL(gdp.GDP_NAME(logname), gdp.GDP_MODE_AO,
|
||
35 | open_info=open_info) |
||
36 | |||
37 | def __process(self, uri, d): |
||
38 | |||
39 | if self.allow_nop == False and len(d.keys())==0: |
||
40 | return "" |
||
41 | |||
42 | if self.nolist == True: |
||
43 | for k in d.keys(): |
||
44 | d[k] = d[k][0]
|
||
45 | ae956f60 | Nitesh Mor | |
46 | if self.convert_num == True: |
||
47 | for k in d.keys(): |
||
48 | try:
|
||
49 | d[k] = float(d[k])
|
||
50 | except (TypeError, ValueError): |
||
51 | pass
|
||
52 | |||
53 | 14d8f25a | Nitesh Mor | try:
|
54 | d["_meta"] = uri
|
||
55 | self.gcl.append({"data": json.dumps(d)}) |
||
56 | return "Ok" |
||
57 | except gdp.MISC.EP_STAT_Exception as e: |
||
58 | return str(e) |
||
59 | |||
60 | |||
61 | def render_GET(self, request): |
||
62 | print "Received GET request:", request.uri, request.args |
||
63 | return self.__process(request.uri, request.args) |
||
64 | |||
65 | def render_PUT(self, request): |
||
66 | print "Received PUT request:", request.uri, request.args |
||
67 | return self.__process(request.uri, request.args) |
||
68 | |||
69 | |||
70 | if __name__ == "__main__": |
||
71 | |||
72 | # Set up argument parsing code
|
||
73 | parser = argparse.ArgumentParser() |
||
74 | parser.add_argument("-p", "--port", type=int, default=8080, |
||
75 | help="TCP port to serve requests on, default=8080")
|
||
76 | parser.add_argument("--nolist", action="store_true", default=False, |
||
77 | help="Attempt to write a JSON object as a " + \
|
||
78 | "key=>value format, as opposed to a " + \
|
||
79 | "key=>[value] format. If an applicaiton " + \
|
||
80 | "sends multiple values for the same key, " + \
|
||
81 | "a random value will be picked. Default: False")
|
||
82 | parser.add_argument("--allow-nop", action="store_true", default=False, |
||
83 | help="Do not ignore requests that don't look " +\
|
||
84 | "like a key-value pair. By default, any " + \
|
||
85 | "requests that don't have a key=value pair " + \
|
||
86 | "are ignored")
|
||
87 | ae956f60 | Nitesh Mor | parser.add_argument("--convert-num", action="store_true", default=False, |
88 | help="Do a best effort attempt to convert " + \
|
||
89 | "values to numbers. Everything is a string, " + \
|
||
90 | "otherwise. Does not make very much sense " + \
|
||
91 | "without --nolist. Default: False")
|
||
92 | 14d8f25a | Nitesh Mor | parser.add_argument("-k", "--keyfile", |
93 | help="Path to a signature key file for the log")
|
||
94 | parser.add_argument("logname", help="Name of log") |
||
95 | |||
96 | # Get the actual arguments
|
||
97 | args = parser.parse_args() |
||
98 | |||
99 | # Create a 'site' object to serve requests on
|
||
100 | site = Site(GDPWriterResource(args.logname, args.keyfile, |
||
101 | ae956f60 | Nitesh Mor | args.nolist, args.allow_nop, args.convert_num)) |
102 | 14d8f25a | Nitesh Mor | # Setup the reactor with the port
|
103 | reactor.listenTCP(args.port, site) |
||
104 | print "Starting REST interface on port %d, appending data to log %s" % \ |
||
105 | (args.port, args.logname) |
||
106 | reactor.run() |