refreshonly => true,
}
+ # Slack logger
+ $slack_logger = lookup("role::cryptoportfolio::front::slack_logger")
+ unless empty($slack_logger) {
+ file { "/usr/local/bin/api_logger":
+ mode => "0755",
+ content => template("role/cryptoportfolio/api_logger.py.erb"),
+ }
+ ->
+ file { "/etc/systemd/system/cryptoportfolio-log.service":
+ mode => "0644",
+ owner => "root",
+ group => "root",
+ content => template("role/cryptoportfolio/cryptoportfolio-log.service.erb"),
+ notify => Exec["systemctl daemon-reload"],
+ }
+ ->
+ service { 'cryptoportfolio-log':
+ enable => true,
+ ensure => "running",
+ require => [
+ Service["cryptoportfolio-app"],
+ ],
+ }
+ }
+
unless empty($webhook_url) {
exec { "front-slack-notify":
refreshonly => true,
--- /dev/null
+#!/usr/bin/python
+
+import time
+import urllib3
+import json
+from systemd import journal
+
+urllib3.disable_warnings()
+http = urllib3.PoolManager()
+
+webhook_url = "<%= @slack_logger %>"
+webhook_icon = "https://git.immae.eu/releases/logger.png"
+
+def send_to_discord(message):
+ def send_chunk(chunk):
+ data = {
+ "avatar_url": webhook_icon,
+ "username": "Logger",
+ "content": "```\n{}\n```".format(chunk),
+ }
+ encoded = json.dumps(data).encode('utf-8')
+
+ r = http.request("POST", webhook_url,
+ headers={'Content-Type': 'application/json'},
+ body=encoded)
+ if r.status == 429:
+ b = json.loads(r.data)
+ time.sleep(b["retry_after"] / 900)
+ r = http.request("POST", webhook_url,
+ headers={'Content-Type': 'application/json'},
+ body=encoded)
+ assert r.status < 299
+
+ chunk = ""
+ for line in message.split("\n"):
+ if len(line) + len(chunk) > 2000 - 17:
+ send_chunk(chunk)
+ chunk = line
+ else:
+ chunk += "\n" + line
+ send_chunk(chunk)
+
+j = journal.Reader()
+j.add_match(_SYSTEMD_UNIT="cryptoportfolio-app.service")
+j.seek_tail()
+list(j)
+
+while True:
+ lines = [entry["MESSAGE"] for entry in list(j)]
+ if len(lines) > 0:
+ send_to_discord("\n".join(lines))
+ time.sleep(3)