-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnotifier.py
143 lines (109 loc) · 4.42 KB
/
notifier.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import configparser
import datetime
import json
import os
import smtplib
import sys
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import requests
class EnvInjection(configparser.Interpolation):
"""
Derived interpolation to take env variable before file variable.
Permit to keep the ini file for local / traditionnal use
And use env variable to overload configuration in a Docker usage.
"""
def before_get(self, parser, section, option, value, defaults):
file_value = super().before_get(parser, section, option, value, defaults)
if section != parser.default_section:
return file_value
env_value = os.getenv(option.upper())
return env_value if env_value else file_value
def main():
script_dir = os.path.dirname(__file__)
conf_file = os.path.join(script_dir, "conf.ini")
template_file = os.path.join(script_dir, "template.html")
parser = configparser.ConfigParser(
default_section="config", interpolation=EnvInjection()
)
parser.read(conf_file)
default_config = parser["config"]
try:
projects = json.loads(parser.get("projects", "projects"))
except json.decoder.JSONDecodeError as jse:
print("ERROR: config file is not correctly JSON formatted!", end="\n\t")
print(jse)
sys.exit(1)
new_releases = []
new_projects = []
if not parser.has_section("release"):
parser.add_section("release")
for project in projects:
last_release = get_last_release(project)
if not parser.has_option("release", project):
new_projects.append(last_release)
else:
last_config_tag = parser.get("release", project)
if last_config_tag != last_release["release_tag"]:
last_release["previous_tag"] = last_config_tag
new_releases.append(last_release)
parser.set("release", project, last_release["release_tag"])
if not new_releases and not new_projects:
print("No new projets or new release detected. Bye!")
return
content = ""
for new_r in new_releases:
content += f"""
<li><a href="{new_r["release_url"]}" target="_blank">{new_r["project_name"]}</a>
: new release
<a href="{new_r["release_url"]}" target="_blank">{new_r["release_tag"]}</a>
available (old: {new_r["previous_tag"]}).
(published {convert_date(new_r["published_date"])})</li>"""
for new_p in new_projects:
content += f"""
<li><a href="{new_p["release_url"]}" target="_blank">{new_p["project_name"]}</a>
was added to your configuration.
Last release:
<a href="{new_p["release_url"]}" target="_blank">{new_p["release_tag"]}</a>
(published {convert_date(new_p["published_date"])})</li>"""
with open(template_file, "r", encoding="utf-8") as f_template:
template = f_template.read()
send_mail(template.replace("{{content}}", content), default_config)
with open("conf.ini", "w", encoding="utf-8") as configfile:
parser.write(configfile)
def get_last_release(project):
url = f"https://api.github.com/repos/{project}/releases/latest"
result = requests.get(url, timeout=10)
print(project)
print(url)
release = result.json()
release_tag = release["tag_name"]
published_date = release["published_at"]
# body = release['body']
release_url = release["html_url"]
return {
"release_tag": release_tag,
"published_date": published_date,
# 'body': body,
"project_name": project,
"release_url": release_url,
}
def send_mail(content, config):
smtp_port = config.get("smtp_port")
smtp_server = config.get("smtp_server")
sender_email = config.get("sender_email")
receiver_email = config.get("receiver_email")
message = MIMEMultipart("alternative")
message["Subject"] = "New Github releases"
message["From"] = sender_email
message["To"] = receiver_email
# part1 = MIMEText(text, "plain")
part2 = MIMEText(content, "html")
# message.attach(part1)
message.attach(part2)
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.sendmail(sender_email, receiver_email, message.as_string())
def convert_date(date: str, dest_format="%d %b %Y at %H:%M") -> str:
return datetime.datetime.strptime(date, "%Y-%m-%dT%H:%M:%SZ").strftime(dest_format)
if __name__ == "__main__":
main()