This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/main by this push:
     new 1662af131e7 [4.20] VR: fix issue if userdata is binary data (#8739)
1662af131e7 is described below

commit 1662af131e7076d7ea3f4c4078742bf56a5ebedf
Author: Wei Zhou <[email protected]>
AuthorDate: Thu Jul 25 10:04:58 2024 +0200

    [4.20] VR: fix issue if userdata is binary data (#8739)
---
 systemvm/debian/opt/cloud/bin/configure.py        | 27 ++++++++++----------
 systemvm/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:

Reply via email to