Quellcode durchsuchen

Make reportbot a service.

master
Chris Smith vor 6 Jahren
Ursprung
Commit
e4bbd1396f
4 geänderte Dateien mit 35 neuen und 24 gelöschten Zeilen
  1. 4
    4
      README.md
  2. 9
    0
      lineandsinker/services/__init__.py
  3. 17
    0
      lineandsinker/services/reportbot.py
  4. 5
    20
      main.py

+ 4
- 4
README.md Datei anzeigen

59
 
59
 
60
 Environment variable | Description
60
 Environment variable | Description
61
 -------------------- | --------------------------------------------------------
61
 -------------------- | --------------------------------------------------------
62
- `LAS_REPORTBOT_ADDRESS` | The host:port combination to send messages to
63
- `LAS_REPORTBOT_PREFIX`  | The text to send to the socket before any messages (e.g. API key)
62
+ `LAS_REPORTBOT_URL` | The full URL to the report API endpoint
63
+ `LAS_REPORTBOT_KEY` | The authentication key to use
64
+ `LAS_REPORTBOT_CHANNEL` | The channel to send messages to
64
 
65
 
65
-LaS can send messages to a ReportBot instance (sending plain text over a TCP
66
-connection with a specified prefix).
66
+LaS can send messages to a ReportBot instance.
67
 
67
 
68
 ## Contributing
68
 ## Contributing
69
 
69
 

+ 9
- 0
lineandsinker/services/__init__.py Datei anzeigen

2
 
2
 
3
 from .jenkins import Jenkins
3
 from .jenkins import Jenkins
4
 from .gitea import Gitea
4
 from .gitea import Gitea
5
+from .reportbot import ReportBot
5
 
6
 
6
 
7
 
7
 def gitea_factory():
8
 def gitea_factory():
16
     )
17
     )
17
 
18
 
18
 
19
 
20
+def reportbot_factory():
21
+    return ReportBot(
22
+        os.environ["LAS_REPORTBOT_URL"],
23
+        os.environ["LAS_REPORTBOT_KEY"],
24
+        os.environ["LAS_REPORTBOT_CHANNEL"],
25
+    )
26
+
27
+
19
 factories = {"gitea": gitea_factory, "jenkins": jenkins_factory}
28
 factories = {"gitea": gitea_factory, "jenkins": jenkins_factory}

+ 17
- 0
lineandsinker/services/reportbot.py Datei anzeigen

1
+import requests
2
+
3
+from .service import Service
4
+
5
+
6
+class ReportBot(Service):
7
+    def __init__(self, url, key, channel):
8
+        super().__init__("reportbot")
9
+        self._url = url
10
+        self._key = key
11
+        self._channel = channel
12
+
13
+    def announce(self, message):
14
+        requests.get(
15
+            self._url,
16
+            {"key": self._key, "command": f"CM {self._channel}", "args": message},
17
+        )

+ 5
- 20
main.py Datei anzeigen

1
-import os
2
 import re
1
 import re
3
-import socket
4
 from functools import wraps
2
 from functools import wraps
5
 
3
 
6
 from flask import Flask, abort, request, Response
4
 from flask import Flask, abort, request, Response
7
 
5
 
8
 from lineandsinker.common import get_hook_key
6
 from lineandsinker.common import get_hook_key
9
-from lineandsinker.services import gitea_factory, jenkins_factory
10
-
7
+from lineandsinker.services import gitea_factory, jenkins_factory, reportbot_factory
11
 
8
 
12
 url_pattern = re.compile(
9
 url_pattern = re.compile(
13
     "^/hooks/(?P<service>[^/]+)/(?P<identifier>.*)/(?P<key>[^/]+)$"
10
     "^/hooks/(?P<service>[^/]+)/(?P<identifier>.*)/(?P<key>[^/]+)$"
33
     return wrapper
30
     return wrapper
34
 
31
 
35
 
32
 
36
-def reportbot_announce(message):
37
-    try:
38
-        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
39
-            host = os.environ["LAS_REPORTBOT_ADDRESS"].split(":")
40
-            sock.connect((host[0], int(host[1])))
41
-            sock.sendall(
42
-                f"{os.environ['LAS_REPORTBOT_PREFIX']} {message}\n".encode("utf-8")
43
-            )
44
-            app.logger.info(f"Report bot response: {sock.recv(512)}")
45
-    except:
46
-        app.logger.exception("Unable to send report bot message")
47
-
48
-
49
 jenkins_service = jenkins_factory()
33
 jenkins_service = jenkins_factory()
50
 gitea_service = gitea_factory()
34
 gitea_service = gitea_factory()
35
+reportbot_service = reportbot_factory()
51
 repos = dict((name, [ssh, clone]) for name, ssh, clone in gitea_service.get_repos())
36
 repos = dict((name, [ssh, clone]) for name, ssh, clone in gitea_service.get_repos())
52
 jobs = list(jenkins_service.get_jobs())
37
 jobs = list(jenkins_service.get_jobs())
53
 app = Flask(__name__)
38
 app = Flask(__name__)
82
             compare = data["compare_url"]
67
             compare = data["compare_url"]
83
             pusher = data["pusher"]["login"]
68
             pusher = data["pusher"]["login"]
84
 
69
 
85
-            reportbot_announce(
70
+            reportbot_service.announce(
86
                 f"\002[git]\002 {pusher} pushed {commits} commit{'s' if commits != 1 else ''} to {repo}: {compare}"
71
                 f"\002[git]\002 {pusher} pushed {commits} commit{'s' if commits != 1 else ''} to {repo}: {compare}"
87
             )
72
             )
88
             for commit in data["commits"][:3]:
73
             for commit in data["commits"][:3]:
89
-                reportbot_announce(
74
+                reportbot_service.announce(
90
                     f"\002[git]\002 {commit['id'][:10]}: {commit['message'][:100]}"
75
                     f"\002[git]\002 {commit['id'][:10]}: {commit['message'][:100]}"
91
                 )
76
                 )
92
 
77
 
106
             tag = event["target"]["tag"]
91
             tag = event["target"]["tag"]
107
             host = event["request"]["host"]
92
             host = event["request"]["host"]
108
             user = event["actor"]["name"]
93
             user = event["actor"]["name"]
109
-            reportbot_announce(
94
+            reportbot_service.announce(
110
                 f"\002[registry]\002 New manifest pushed to {host}/{repo}:{tag} by {user}"
95
                 f"\002[registry]\002 New manifest pushed to {host}/{repo}:{tag} by {user}"
111
             )
96
             )
112
 
97
 

Laden…
Abbrechen
Speichern