From 1662af131e7076d7ea3f4c4078742bf56a5ebedf Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 25 Jul 2024 10:04:58 +0200 Subject: [PATCH] [4.20] VR: fix issue if userdata is binary data (#8739) --- systemvm/debian/opt/cloud/bin/configure.py | 27 ++++++++-------- .../debian/opt/cloud/bin/passwd_server_ip.py | 2 +- systemvm/debian/opt/cloud/bin/setup/patch.sh | 6 ++-- systemvm/debian/opt/cloud/bin/vmdata.py | 31 +++++++++++-------- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/systemvm/debian/opt/cloud/bin/configure.py b/systemvm/debian/opt/cloud/bin/configure.py index 9dcef7eeaa2..5215c2c6315 100755 --- a/systemvm/debian/opt/cloud/bin/configure.py +++ b/systemvm/debian/opt/cloud/bin/configure.py @@ -630,31 +630,32 @@ class CsVmMetadata(CsDataBag): if os.path.exists(datafile): os.remove(datafile) + def __writefile(self, dest, data, mode): + fh = open(dest, mode) + self.__exflock(fh) + fh.write(data) + self.__unflock(fh) + fh.close() + os.chmod(dest, 0o644) + def __createfile(self, ip, folder, file, data): dest = "/var/www/html/" + folder + "/" + ip + "/" + file metamanifestdir = "/var/www/html/" + folder + "/" + ip metamanifest = metamanifestdir + "/meta-data" - # base64 decode userdata - if folder == "userdata" or folder == "user-data": - if data is not None: + if data is not None: + # base64 decode userdata + if folder == "userdata" or folder == "user-data": # need to pad data if it is not valid base 64 if len(data) % 4 != 0: data += (4 - (len(data) % 4)) * "=" data = base64.b64decode(data) - - fh = open(dest, "w") - self.__exflock(fh) - if data is not None: if isinstance(data, str): - fh.write(data) + self.__writefile(dest, data, "w") elif isinstance(data, bytes): - fh.write(data.decode()) + self.__writefile(dest, data, "wb") else: - fh.write("") - self.__unflock(fh) - fh.close() - os.chmod(dest, 0o644) + self.__writefile(dest, "", "w") if folder == "metadata" or folder == "meta-data": try: diff --git a/systemvm/debian/opt/cloud/bin/passwd_server_ip.py b/systemvm/debian/opt/cloud/bin/passwd_server_ip.py index 08e6b838f18..7df4ec27763 100755 --- a/systemvm/debian/opt/cloud/bin/passwd_server_ip.py +++ b/systemvm/debian/opt/cloud/bin/passwd_server_ip.py @@ -34,7 +34,7 @@ import threading import urllib.parse from http.server import BaseHTTPRequestHandler, HTTPServer -from socketserver import ThreadingMixIn #, ForkingMixIn +from socketserver import ThreadingMixIn passMap = {} diff --git a/systemvm/debian/opt/cloud/bin/setup/patch.sh b/systemvm/debian/opt/cloud/bin/setup/patch.sh index fc0f7d35e6f..01cc03cf5c7 100755 --- a/systemvm/debian/opt/cloud/bin/setup/patch.sh +++ b/systemvm/debian/opt/cloud/bin/setup/patch.sh @@ -87,14 +87,16 @@ install_package() { if [ "$os" == "" ]; then return fi + + local package=${package_properties["package_name"]} + local file=${package_properties["file_name"]} + local DEBIAN_RELEASE=$(lsb_release -rs) if [ "$os" != "$DEBIAN_RELEASE" ]; then log_it "Skipped the installation of package $package on Debian $DEBIAN_RELEASE as it can only be installed on Debian $os." return fi - local package=${package_properties["package_name"]} - local file=${package_properties["file_name"]} if [ -z "$package" ] || [ -z "$file" ]; then log_it "Skipped the installation due to empty package of file name (package name: $package, file name: $file)." return diff --git a/systemvm/debian/opt/cloud/bin/vmdata.py b/systemvm/debian/opt/cloud/bin/vmdata.py index 8a1636ca1b7..3adfa99b309 100755 --- a/systemvm/debian/opt/cloud/bin/vmdata.py +++ b/systemvm/debian/opt/cloud/bin/vmdata.py @@ -81,28 +81,33 @@ def deletefile(ip, folder, file): os.remove(datafile) +def writefile(dest, data, mode): + fh = open(dest, mode) + exflock(fh) + fh.write(data) + unflock(fh) + fh.close() + os.chmod(dest, 0o644) + + def createfile(ip, folder, file, data): dest = "/var/www/html/" + folder + "/" + ip + "/" + file metamanifestdir = "/var/www/html/" + folder + "/" + ip metamanifest = metamanifestdir + "/meta-data" - # base64 decode userdata - if folder == "userdata" or folder == "user-data": - if data is not None: - data = base64.b64decode(data) - - fh = open(dest, "w") - exflock(fh) if data is not None: + # base64 decode userdata + if folder == "userdata" or folder == "user-data": + # need to pad data if it is not valid base 64 + if len(data) % 4 != 0: + data += (4 - (len(data) % 4)) * "=" + data = base64.b64decode(data) if isinstance(data, str): - fh.write(data) + writefile(dest, data, "w") elif isinstance(data, bytes): - fh.write(data.decode()) + writefile(dest, data, "wb") else: - fh.write("") - unflock(fh) - fh.close() - os.chmod(dest, 0o644) + writefile(dest, "", "w") if folder == "metadata" or folder == "meta-data": try: