1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 import re
22 from twisted.web import resource, server
23 from twisted.python.reflect import namedModule
24 from twisted.python import log
25 from twisted.internet import defer
28
29 contentType = "text/html; charset=utf-8"
30 children = {}
32 """
33 The keys of 'dialects' select a modules to load under
34 master/buildbot/status/web/hooks/
35 The value is passed to the module's getChanges function, providing
36 configuration options to the dialect.
37 """
38 self.dialects = dialects
39 self.request_dialect = None
40
43
45 """
46 Reponds to events and starts the build process
47 different implementations can decide on what methods they will accept
48 """
49 return self.render_POST(request)
50
51 - def render_POST(self, request):
52 """
53 Reponds to events and starts the build process
54 different implementations can decide on what methods they will accept
55
56 :arguments:
57 request
58 the http request object
59 """
60
61 try:
62 changes, src = self.getChanges( request )
63 except ValueError, err:
64 request.setResponseCode(400, err.args[0])
65 return err.args[0]
66 except Exception, e:
67 log.err(e, "processing changes from web hook")
68 msg = "Error processing changes."
69 request.setResponseCode(500, msg)
70 return msg
71
72 log.msg("Payload: " + str(request.args))
73
74 if not changes:
75 log.msg("No changes found")
76 return "no changes found"
77 d = self.submitChanges( changes, request, src )
78 def ok(_):
79 request.setResponseCode(202)
80 request.finish()
81 def err(why):
82 log.err(why, "adding changes from web hook")
83 request.setResponseCode(500)
84 request.finish()
85 d.addCallbacks(ok, err)
86 return server.NOT_DONE_YET
87
88
90 """
91 Take the logic from the change hook, and then delegate it
92 to the proper handler
93 http://localhost/change_hook/DIALECT will load up
94 buildmaster/status/web/hooks/DIALECT.py
95
96 and call getChanges()
97
98 the return value is a list of changes
99
100 if DIALECT is unspecified, a sample implementation is provided
101 """
102 uriRE = re.search(r'^/change_hook/?([a-zA-Z0-9_]*)', request.uri)
103
104 if not uriRE:
105 log.msg("URI doesn't match change_hook regex: %s" % request.uri)
106 raise ValueError("URI doesn't match change_hook regex: %s" % request.uri)
107
108 changes = []
109 src = None
110
111
112 if uriRE.group(1):
113 dialect = uriRE.group(1)
114 else:
115 dialect = 'base'
116
117 if dialect in self.dialects.keys():
118 log.msg("Attempting to load module buildbot.status.web.hooks." + dialect)
119 tempModule = namedModule('buildbot.status.web.hooks.' + dialect)
120 changes, src = tempModule.getChanges(request,self.dialects[dialect])
121 log.msg("Got the following changes %s" % changes)
122 self.request_dialect = dialect
123 else:
124 m = "The dialect specified, '%s', wasn't whitelisted in change_hook" % dialect
125 log.msg(m)
126 log.msg("Note: if dialect is 'base' then it's possible your URL is malformed and we didn't regex it properly")
127 raise ValueError(m)
128
129 return (changes, src)
130
131 @defer.inlineCallbacks
137