Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-ci
Path: blob/main/artifact/set-link.py
1130 views
1
#!/usr/local/bin/python3
2
3
from http.server import BaseHTTPRequestHandler, HTTPServer
4
import base64
5
import configparser
6
import errno
7
import json
8
import os
9
import sys
10
11
key = None
12
basedir = '/home/artifact/snapshot'
13
14
def set_link(x):
15
branch = x['branch']
16
if 'commit' in x:
17
revision = str(x['commit'])
18
else:
19
revision = 'r' + str(x['revision'])
20
target = x['target']
21
target_arch = x['target_arch']
22
link_type = x['link_type']
23
24
dst = os.path.join(branch, link_type, target, target_arch)
25
dst_dir = os.path.dirname(os.path.join(basedir, dst))
26
dst_base = os.path.basename(dst)
27
os.makedirs(dst_dir, exist_ok=True)
28
os.chdir(dst_dir)
29
src = os.path.join('../..', revision, target, target_arch)
30
try:
31
os.symlink(src, dst_base)
32
except OSError as e:
33
if e.errno == errno.EEXIST:
34
os.remove(dst_base)
35
os.symlink(src, dst_base)
36
37
return "{} -> {}".format(dst, src)
38
39
class RequestHandler(BaseHTTPRequestHandler):
40
41
def do_POST(self):
42
global key
43
44
auth_header = self.headers['Authorization']
45
46
if auth_header == ('Basic ' + key):
47
length = int(self.headers['Content-Length'])
48
post_data = self.rfile.read(length).decode('utf-8')
49
json_data = json.loads(post_data)
50
51
msg = None
52
try:
53
r = set_link(json_data)
54
self.send_response(201)
55
msg = 'Link created: {}\n'.format(r)
56
except:
57
self.send_response(500)
58
msg = 'Link not created\n'
59
60
self.send_header('Content-type', 'text/html; charset=UTF-8')
61
self.end_headers()
62
63
self.wfile.write(bytes(json.dumps(msg), 'utf-8'))
64
65
elif auth_header is None:
66
self.send_response(401)
67
self.send_header('WWW-Authenticate', 'Basic realm=\"artifact\"')
68
self.send_header('Content-type', 'text/html; charset=UTF-8')
69
self.end_headers()
70
71
msg = 'No auth header received\n'
72
self.wfile.write(bytes(json.dumps(msg), 'utf-8'))
73
74
else:
75
self.send_response(403)
76
self.send_header('WWW-Authenticate', 'Basic realm=\"artifact\"')
77
self.send_header('Content-type', 'text/html; charset=UTF-8')
78
self.end_headers()
79
80
msg = 'Auth header wrong\n'
81
self.wfile.write(bytes(json.dumps(msg), 'utf-8'))
82
83
if __name__ == "__main__":
84
if len(sys.argv) < 2:
85
print('Usage: ' + sys.argv[0] + ' set-link.ini')
86
sys.exit()
87
88
config_file = sys.argv[1]
89
config = configparser.ConfigParser()
90
config.read(config_file)
91
username = config['set-link']['username']
92
password = config['set-link']['password']
93
log_file = config['set-link']['log_file']
94
95
key = base64.b64encode(bytes(username + ':' + password, 'ascii')).decode('ascii')
96
97
sys.stderr = open(log_file, 'a')
98
99
server_address = ('127.0.0.1', 4080)
100
httpd = HTTPServer(server_address, RequestHandler)
101
httpd.serve_forever()
102
103