| 839 | |
| 840 | |
| 841 | class CsVmMetadata(CsDataBag): |
| 842 | |
| 843 | def process(self): |
| 844 | for ip in self.dbag: |
| 845 | if ("id" == ip): |
| 846 | continue |
| 847 | logging.info("Processing metadata for %s" % ip) |
| 848 | for item in self.dbag[ip]: |
| 849 | folder = item[0] |
| 850 | file = item[1] |
| 851 | data = item[2] |
| 852 | |
| 853 | # process only valid data |
| 854 | if folder != "userdata" and folder != "metadata": |
| 855 | continue |
| 856 | |
| 857 | if file == "": |
| 858 | continue |
| 859 | |
| 860 | self.__htaccess(ip, folder, file) |
| 861 | |
| 862 | if data == "": |
| 863 | self.__deletefile(ip, folder, file) |
| 864 | else: |
| 865 | self.__createfile(ip, folder, file, data) |
| 866 | |
| 867 | def __deletefile(self, ip, folder, file): |
| 868 | datafile = "/var/www/html/" + folder + "/" + ip + "/" + file |
| 869 | |
| 870 | if os.path.exists(datafile): |
| 871 | os.remove(datafile) |
| 872 | |
| 873 | def __writefile(self, dest, data, mode): |
| 874 | fh = open(dest, mode) |
| 875 | self.__exflock(fh) |
| 876 | fh.write(data) |
| 877 | self.__unflock(fh) |
| 878 | fh.close() |
| 879 | os.chmod(dest, 0o644) |
| 880 | |
| 881 | def __createfile(self, ip, folder, file, data): |
| 882 | dest = "/var/www/html/" + folder + "/" + ip + "/" + file |
| 883 | metamanifestdir = "/var/www/html/" + folder + "/" + ip |
| 884 | metamanifest = metamanifestdir + "/meta-data" |
| 885 | |
| 886 | if data is not None: |
| 887 | # base64 decode userdata |
| 888 | if folder == "userdata" or folder == "user-data": |
| 889 | # need to pad data if it is not valid base 64 |
| 890 | if len(data) % 4 != 0: |
| 891 | data += (4 - (len(data) % 4)) * "=" |
| 892 | data = base64.b64decode(data) |
| 893 | if isinstance(data, str): |
| 894 | self.__writefile(dest, data, "w") |
| 895 | elif isinstance(data, bytes): |
| 896 | self.__writefile(dest, data, "wb") |
| 897 | else: |
| 898 | self.__writefile(dest, "", "w") |