Skip to content

Commit 1662af1

Browse files
[4.20] VR: fix issue if userdata is binary data (#8739)
1 parent 817251f commit 1662af1

File tree

4 files changed

+37
-29
lines changed

4 files changed

+37
-29
lines changed

systemvm/debian/opt/cloud/bin/configure.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -630,31 +630,32 @@ def __deletefile(self, ip, folder, file):
630630
if os.path.exists(datafile):
631631
os.remove(datafile)
632632

633+
def __writefile(self, dest, data, mode):
634+
fh = open(dest, mode)
635+
self.__exflock(fh)
636+
fh.write(data)
637+
self.__unflock(fh)
638+
fh.close()
639+
os.chmod(dest, 0o644)
640+
633641
def __createfile(self, ip, folder, file, data):
634642
dest = "/var/www/html/" + folder + "/" + ip + "/" + file
635643
metamanifestdir = "/var/www/html/" + folder + "/" + ip
636644
metamanifest = metamanifestdir + "/meta-data"
637645

638-
# base64 decode userdata
639-
if folder == "userdata" or folder == "user-data":
640-
if data is not None:
646+
if data is not None:
647+
# base64 decode userdata
648+
if folder == "userdata" or folder == "user-data":
641649
# need to pad data if it is not valid base 64
642650
if len(data) % 4 != 0:
643651
data += (4 - (len(data) % 4)) * "="
644652
data = base64.b64decode(data)
645-
646-
fh = open(dest, "w")
647-
self.__exflock(fh)
648-
if data is not None:
649653
if isinstance(data, str):
650-
fh.write(data)
654+
self.__writefile(dest, data, "w")
651655
elif isinstance(data, bytes):
652-
fh.write(data.decode())
656+
self.__writefile(dest, data, "wb")
653657
else:
654-
fh.write("")
655-
self.__unflock(fh)
656-
fh.close()
657-
os.chmod(dest, 0o644)
658+
self.__writefile(dest, "", "w")
658659

659660
if folder == "metadata" or folder == "meta-data":
660661
try:

systemvm/debian/opt/cloud/bin/passwd_server_ip.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import urllib.parse
3535

3636
from http.server import BaseHTTPRequestHandler, HTTPServer
37-
from socketserver import ThreadingMixIn #, ForkingMixIn
37+
from socketserver import ThreadingMixIn
3838

3939

4040
passMap = {}

systemvm/debian/opt/cloud/bin/setup/patch.sh

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,16 @@ install_package() {
8787
if [ "$os" == "" ]; then
8888
return
8989
fi
90+
91+
local package=${package_properties["package_name"]}
92+
local file=${package_properties["file_name"]}
93+
9094
local DEBIAN_RELEASE=$(lsb_release -rs)
9195
if [ "$os" != "$DEBIAN_RELEASE" ]; then
9296
log_it "Skipped the installation of package $package on Debian $DEBIAN_RELEASE as it can only be installed on Debian $os."
9397
return
9498
fi
9599

96-
local package=${package_properties["package_name"]}
97-
local file=${package_properties["file_name"]}
98100
if [ -z "$package" ] || [ -z "$file" ]; then
99101
log_it "Skipped the installation due to empty package of file name (package name: $package, file name: $file)."
100102
return

systemvm/debian/opt/cloud/bin/vmdata.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -81,28 +81,33 @@ def deletefile(ip, folder, file):
8181
os.remove(datafile)
8282

8383

84+
def writefile(dest, data, mode):
85+
fh = open(dest, mode)
86+
exflock(fh)
87+
fh.write(data)
88+
unflock(fh)
89+
fh.close()
90+
os.chmod(dest, 0o644)
91+
92+
8493
def createfile(ip, folder, file, data):
8594
dest = "/var/www/html/" + folder + "/" + ip + "/" + file
8695
metamanifestdir = "/var/www/html/" + folder + "/" + ip
8796
metamanifest = metamanifestdir + "/meta-data"
8897

89-
# base64 decode userdata
90-
if folder == "userdata" or folder == "user-data":
91-
if data is not None:
92-
data = base64.b64decode(data)
93-
94-
fh = open(dest, "w")
95-
exflock(fh)
9698
if data is not None:
99+
# base64 decode userdata
100+
if folder == "userdata" or folder == "user-data":
101+
# need to pad data if it is not valid base 64
102+
if len(data) % 4 != 0:
103+
data += (4 - (len(data) % 4)) * "="
104+
data = base64.b64decode(data)
97105
if isinstance(data, str):
98-
fh.write(data)
106+
writefile(dest, data, "w")
99107
elif isinstance(data, bytes):
100-
fh.write(data.decode())
108+
writefile(dest, data, "wb")
101109
else:
102-
fh.write("")
103-
unflock(fh)
104-
fh.close()
105-
os.chmod(dest, 0o644)
110+
writefile(dest, "", "w")
106111

107112
if folder == "metadata" or folder == "meta-data":
108113
try:

0 commit comments

Comments
 (0)