[4.20] VR: fix issue if userdata is binary data (#8739)

This commit is contained in:
Wei Zhou 2024-07-25 10:04:58 +02:00 committed by GitHub
parent 817251f1f8
commit 1662af131e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 37 additions and 29 deletions

View File

@ -630,31 +630,32 @@ class CsVmMetadata(CsDataBag):
if os.path.exists(datafile): if os.path.exists(datafile):
os.remove(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): def __createfile(self, ip, folder, file, data):
dest = "/var/www/html/" + folder + "/" + ip + "/" + file dest = "/var/www/html/" + folder + "/" + ip + "/" + file
metamanifestdir = "/var/www/html/" + folder + "/" + ip metamanifestdir = "/var/www/html/" + folder + "/" + ip
metamanifest = metamanifestdir + "/meta-data" metamanifest = metamanifestdir + "/meta-data"
# base64 decode userdata if data is not None:
if folder == "userdata" or folder == "user-data": # base64 decode userdata
if data is not None: if folder == "userdata" or folder == "user-data":
# need to pad data if it is not valid base 64 # need to pad data if it is not valid base 64
if len(data) % 4 != 0: if len(data) % 4 != 0:
data += (4 - (len(data) % 4)) * "=" data += (4 - (len(data) % 4)) * "="
data = base64.b64decode(data) data = base64.b64decode(data)
fh = open(dest, "w")
self.__exflock(fh)
if data is not None:
if isinstance(data, str): if isinstance(data, str):
fh.write(data) self.__writefile(dest, data, "w")
elif isinstance(data, bytes): elif isinstance(data, bytes):
fh.write(data.decode()) self.__writefile(dest, data, "wb")
else: else:
fh.write("") self.__writefile(dest, "", "w")
self.__unflock(fh)
fh.close()
os.chmod(dest, 0o644)
if folder == "metadata" or folder == "meta-data": if folder == "metadata" or folder == "meta-data":
try: try:

View File

@ -34,7 +34,7 @@ import threading
import urllib.parse import urllib.parse
from http.server import BaseHTTPRequestHandler, HTTPServer from http.server import BaseHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn #, ForkingMixIn from socketserver import ThreadingMixIn
passMap = {} passMap = {}

View File

@ -87,14 +87,16 @@ install_package() {
if [ "$os" == "" ]; then if [ "$os" == "" ]; then
return return
fi fi
local package=${package_properties["package_name"]}
local file=${package_properties["file_name"]}
local DEBIAN_RELEASE=$(lsb_release -rs) local DEBIAN_RELEASE=$(lsb_release -rs)
if [ "$os" != "$DEBIAN_RELEASE" ]; then 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." log_it "Skipped the installation of package $package on Debian $DEBIAN_RELEASE as it can only be installed on Debian $os."
return return
fi fi
local package=${package_properties["package_name"]}
local file=${package_properties["file_name"]}
if [ -z "$package" ] || [ -z "$file" ]; then if [ -z "$package" ] || [ -z "$file" ]; then
log_it "Skipped the installation due to empty package of file name (package name: $package, file name: $file)." log_it "Skipped the installation due to empty package of file name (package name: $package, file name: $file)."
return return

View File

@ -81,28 +81,33 @@ def deletefile(ip, folder, file):
os.remove(datafile) 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): def createfile(ip, folder, file, data):
dest = "/var/www/html/" + folder + "/" + ip + "/" + file dest = "/var/www/html/" + folder + "/" + ip + "/" + file
metamanifestdir = "/var/www/html/" + folder + "/" + ip metamanifestdir = "/var/www/html/" + folder + "/" + ip
metamanifest = metamanifestdir + "/meta-data" 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: 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): if isinstance(data, str):
fh.write(data) writefile(dest, data, "w")
elif isinstance(data, bytes): elif isinstance(data, bytes):
fh.write(data.decode()) writefile(dest, data, "wb")
else: else:
fh.write("") writefile(dest, "", "w")
unflock(fh)
fh.close()
os.chmod(dest, 0o644)
if folder == "metadata" or folder == "meta-data": if folder == "metadata" or folder == "meta-data":
try: try: