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: