net-ops/global/overlay/etc/puppet/setup_cosmos_modules

160 lines
4.6 KiB
Plaintext
Raw Normal View History

2024-09-20 12:06:44 +00:00
#!/usr/bin/env python3
""" Write out a puppet cosmos-modules.conf """
import hashlib
import os
import os.path
import platform
import sys
import socket
2024-09-20 12:06:44 +00:00
from debian import debian_support
try:
from configobj import ConfigObj
OS_INFO = ConfigObj("/etc/os-release")
except (IOError, ModuleNotFoundError):
OS_INFO = None
2024-09-27 11:11:15 +00:00
try:
fqdn = socket.getfqdn()
hostname = fqdn.split('.')[0]
except OSError:
host_info = None
else:
domainname = '.'.join(fqdn.split(".")[1:])
environ = "beta" if (domainname.find("test") != -1) else "prod"
print(domainname.find("thiss"))
host_info = {
"domainname": domainname,
"environment": environ,
"fqdn": fqdn,
"hostname": hostname,
}
2024-09-20 12:06:44 +00:00
def get_file_hash(modulesfile):
"""
Based on https://github.com/python/cpython/pull/31930: should use
hashlib.file_digest() but it is only available in python 3.11
"""
try:
with open(modulesfile, "rb") as fileobj:
digestobj = hashlib.sha256()
_bufsize = 2**18
buf = bytearray(_bufsize) # Reusable buffer to reduce allocations.
view = memoryview(buf)
while True:
size = fileobj.readinto(buf)
if size == 0:
break # EOF
digestobj.update(view[:size])
except FileNotFoundError:
return ""
return digestobj.hexdigest()
def get_list_hash(file_lines):
"""Get hash of list contents"""
file_lines_hash = hashlib.sha256()
for line in file_lines:
file_lines_hash.update(line)
return file_lines_hash.hexdigest()
def create_file_content(modules):
"""
Write out the expected file contents to a list so we can check the
expected checksum before writing anything
"""
file_lines = []
file_lines.append(
"# Generated by {}\n".format( # pylint: disable=consider-using-f-string
os.path.basename(sys.argv[0])
).encode("utf-8")
)
for key in modules:
file_lines.append(
"{0:11} {1} {2} {3}\n".format( # pylint: disable=consider-using-f-string
key,
modules[key]["repo"],
modules[key]["upgrade"],
modules[key]["tag"],
).encode("utf-8")
)
return file_lines
def main():
"""Starting point of the program"""
modulesfile: str = "/etc/puppet/cosmos-modules.conf"
modulesfile_tmp: str = modulesfile + ".tmp"
modules: dict = {
2024-10-15 13:58:40 +00:00
"nagioscfg": {
"repo": "https://github.com/SUNET/puppet-nagioscfg.git",
"upgrade": "yes",
"tag": "sunet-2*",
2024-10-15 13:58:40 +00:00
},
2024-09-20 12:06:44 +00:00
"sunet": {
"repo": "https://github.com/SUNET/puppet-sunet.git",
"upgrade": "yes",
"tag": "stable-2023v1-2*",
},
}
if OS_INFO:
# Make test machines use special test branch of puppet-sunet:
if OS_INFO["ID"] == "ubuntu":
nodename = platform.node()
name_parts = nodename.split("-")
if len(name_parts) > 1:
if name_parts[1] == "test":
modules["sunet"]["tag"] = "testing-2*"
2024-09-27 11:11:15 +00:00
if host_info:
if host_info["fqdn"] == "metrics-cd-test-1.sunet.se":
2024-09-27 11:14:10 +00:00
modules["sunet"]["tag"] = "pahol-influx*"
if host_info["fqdn"] == "pahol-test1.sunet.se":
modules["sunet"]["tag"] = "pahol-baas2-2*"
if host_info["fqdn"] == "lb-tug-test-1.sunet.se":
modules["sunet"]["tag"] = "thorslund_ubuntu24_lb*"
if host_info["fqdn"] == "lb-sthb-test-1.sunet.se":
modules["sunet"]["tag"] = "thorslund_ubuntu24_lb*"
2024-10-16 11:36:31 +00:00
if host_info["fqdn"] == "monitornetops-sto1-prod-1.sunet.se":
modules["sunet"]["tag"] = "pahol-puppet8-compatibility-2*"
2024-09-27 11:11:15 +00:00
2024-09-20 12:06:44 +00:00
# Build list of expected file content
file_lines = create_file_content(modules)
# Get hash of the list
list_hash = get_list_hash(file_lines)
# Get hash of the existing file on disk
file_hash = get_file_hash(modulesfile)
# Update the file if necessary
if list_hash != file_hash:
# Since we are reading the file with 'rb' when computing our hash use 'wb' when
# writing so we dont end up creating a file that does not match the
# expected hash
with open(modulesfile_tmp, "wb") as fileobj:
for line in file_lines:
fileobj.write(line)
# Rename it in place so the update is atomic for anything else trying to
# read the file
os.rename(modulesfile_tmp, modulesfile)
if __name__ == "__main__":
main()