-
Notifications
You must be signed in to change notification settings - Fork 4
/
splunk_matrix_update.py
118 lines (97 loc) · 4.04 KB
/
splunk_matrix_update.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
import configparser
import json
import os
import re
import requests
from packaging import version
def get_token():
splunk_token_url = "https://auth.docker.io/token?service=registry.docker.io&scope=repository:splunk/splunk:pull"
response = requests.get(splunk_token_url)
response_json = json.loads(response.text)
token = response_json["token"]
return token
def get_images_list(token):
headers = {"Authorization": f"Bearer {token}"}
splunk_image_list_url = "https://registry.hub.docker.com/v2/splunk/splunk/tags/list"
response = requests.get(splunk_image_list_url, headers=headers)
response_json = json.loads(response.text)
return response_json["tags"]
def get_latest_image(stanza, images):
stanza = stanza.split(".")
stanza = r"\.".join(stanza)
regex_image = rf"'{stanza}\.\d+'|'{stanza}\.\d+\.\d+'"
filtered_images = re.findall(regex_image, str(images))
if filtered_images:
for i in range(len(filtered_images)):
filtered_images[i] = filtered_images[i].replace("'", "")
filtered_images.sort(key=lambda s: list(map(int, s.split("."))))
return filtered_images[-1]
def check_image_version(latest_image, stanza_image):
if version.parse(latest_image) > version.parse(stanza_image):
return True
else:
return False
def filter_image_list(images_list):
regex_filter_images = r"\'[0-9a-z]{12}\'"
filter_images = re.findall(regex_filter_images, str(images_list))
if filter_images:
for i in range(len(filter_images)):
filter_images[i] = filter_images[i].replace("'", "")
return filter_images
def get_image_digest(token, image):
headers = {
"Authorization": f"Bearer {token}",
"Accept": "application/vnd.docker.distribution.manifest.v2+json",
}
image_digest_url = (
f"https://registry.hub.docker.com/v2/splunk/splunk/manifests/{image}"
)
response = requests.get(image_digest_url, headers=headers)
if response.headers["Docker-Content-Digest"]:
return response.headers["Docker-Content-Digest"]
else:
token = get_token()
headers = {
"Authorization": f"Bearer {token}",
"Accept": "application/vnd.docker.distribution.manifest.v2+json",
}
image_digest_url = (
"https://registry.hub.docker.com/v2/splunk/splunk/manifests/{}".format(
image
)
)
response = requests.get(image_digest_url, headers=headers)
return response.headers["Docker-Content-Digest"]
def get_build_number(token, filter_images, latest_image_digest):
for image in filter_images:
if get_image_digest(token, image) == latest_image_digest:
return image
def update_splunk_version(token):
if os.path.isfile("config/splunk_matrix.conf"):
config = configparser.ConfigParser()
config.optionxform = str
config.read("config/splunk_matrix.conf")
update_file = False
images_list = get_images_list(token)
filter_images = filter_image_list(images_list)
for stanza in config.sections():
if stanza != "GENERAL":
latest_image_version = get_latest_image(stanza, images_list)
stanza_image_version = config.get(stanza, "VERSION")
if check_image_version(latest_image_version, stanza_image_version):
config.set(stanza, "VERSION", latest_image_version)
latest_image_digest = get_image_digest(token, latest_image_version)
build_number = get_build_number(
token, filter_images, latest_image_digest
)
config.set(stanza, "BUILD", build_number)
update_file = True
if update_file:
with open("config/splunk_matrix.conf", "w") as configfile:
config.write(configfile)
return "True"
return "False"
if __name__ == "__main__":
token = get_token()
update_file = update_splunk_version(token)
print(update_file)