Project

General

Profile

Statistics
| Branch: | Revision:

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()