diff --git a/linux/keyman-config/install_kmp.py b/linux/keyman-config/install_kmp.py new file mode 100755 index 0000000000..3948c2c9c8 --- /dev/null +++ b/linux/keyman-config/install_kmp.py @@ -0,0 +1,76 @@ +#!/usr/bin/python3 + +import tempfile +import zipfile +import sys +import os.path +from kmpmetadata import parsemetadata, determine_filetype +from os import listdir, makedirs +from shutil import copy2 + +def list_files(directory, extension): + return (f for f in listdir(directory) if f.endswith('.' + extension)) + +def main(argv): + if len(sys.argv) != 2: + print("install_kmp.py ") + sys.exit(2) + inputfile = sys.argv[1] + + if not os.path.isfile(inputfile): + print("install_kmp.py Input file ", inputfile, " not found") + print("install_kmp.py ") + sys.exit(2) + + name, ext = os.path.splitext(inputfile) + if ext != ".kmp": + print("install_kmp.py Input file ", inputfile, "is not a kmp file") + print("install_kmp.py ") + sys.exit(2) + + # create a temporary directory using the context manager + with tempfile.TemporaryDirectory() as tmpdirname: + print('created temporary directory', tmpdirname) + with zipfile.ZipFile(inputfile,"r") as zip_ref: + zip_ref.extractall(tmpdirname) +# jsonfiles = list_files(tmpdirname, "json") +# for f in jsonfiles: +# print(f) + kmpjson = os.path.join(tmpdirname, "kmp.json") + if os.path.isfile(kmpjson): + info, system, options, keyboards, files = parsemetadata(kmpjson, False) + kbid = keyboards[0]['id'] + print("Installing", info['name']['description']) + if not os.access('/usr/local/share/keyman', os.X_OK | os.W_OK)): # Check for write access of keyman dir + print("You do not have permissions to install the keyboard files. You need to be a member of the keyman group. `sudo adduser keyman`") + exit(3) + kbdir = os.path.join('/usr/local/share/keyman', kbid) + if not os.access('/usr/local/share/doc/keyman', os.X_OK | os.W_OK): # Check for write access of keyman doc dir + print("You do not have permissions to install the documentation. You need to be a member of the keyman group. `sudo adduser keyman`") + exit(3) + kbdocdir = os.path.join('/usr/local/share/doc/keyman', kbid) + if not os.access('/usr/local/share/fonts/keyman', os.X_OK | os.W_OK): # Check for write access of keyman fonts + print("You do not have permissions to install the font files. You need to be a member of the keyman group. `sudo adduser keyman`") + exit(3) + kbfontdir = os.path.join('/usr/local/share/fonts/keyman', kbid) + for f in files: + fpath = os.path.join(tmpdirname, f['name']) + ftype = determine_filetype(f['name']) + if ftype == "Documentation": + print("Installing", f['name'], "as documentation") + if not os.path.isdir(kbdocdir): + os.makedirs(kbdocdir) + copy2(fpath, kbdocdir) + elif ftype == "Font": + print("Installing", f['name'], "as font") + if not os.path.isdir(kbfontdir): + os.makedirs(kbfontdir) + copy2(fpath, kbfontdir) + elif ftype == "Metadata" or ftype == "Image" or ftype == "Keyboard icon" or ftype == "Keyboard icon" or ftype == "Compiled keyboard" or ftype == "Compiled on screen keyboard": + print("Installing", f['name'], "as keyman file") + if not os.path.isdir(kbdir): + os.makedirs(kbdir) + copy2(fpath, kbdir) + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/linux/keyman-config/kmpmetadata.py b/linux/keyman-config/kmpmetadata.py new file mode 100755 index 0000000000..b8fd744e65 --- /dev/null +++ b/linux/keyman-config/kmpmetadata.py @@ -0,0 +1,136 @@ +#!/usr/bin/python3 + +import json +import sys +import os.path +import magic + +def print_info(info): + try: + print("---- Info ----") + print("Name: ", info['name']['description']) + print("Copyright: ", info['copyright']['description']) + print("Version: ", info['version']['description']) + print("Author: ", info['author']['description']) + print("URL: ", info['author']['url']) + except Exception: + pass + +def print_system(system): + try: + print("---- System ----") + print("File Version: ", system['fileVersion']) + print("Keyman Developer Version: ", system['keymanDeveloperVersion']) + except Exception: + pass + +def print_options(options): + try: + print("---- Options ----") + print("Readme File: ", options['readmeFile']) + except Exception: + pass + +def print_keyboards(keyboards): + try: + print("---- Keyboards ----") + for kb in keyboards: + print("Keyboard Name: ", kb['name']) + print("Keyboard Id: ", kb['id']) + print("Keyboard Version: ", kb['version']) + print("Languages") + for lang in kb['languages']: + print(" Name: ", lang['name'], "Id: ", lang['id']) + except Exception: + pass + +def determine_filetype(filename): + name, ext = os.path.splitext(filename) + if ext == ".ico": + return "Keyboard icon" + elif ext == ".kmn": + return "Keyboard source" + elif ext == ".kmx": + return "Compiled keyboard" + elif ext == ".kvk": + return "Compiled on screen keyboard" + elif ext == ".ttf" or ext == ".otf": + return "Font" + elif ext == ".txt" or ext == ".pdf" or ext == ".htm" or ext == ".html": + return "Documentation" + elif ext == ".inf" or ext == ".json": + return "Metadata" + elif ext == ".png" or ext == ".jpeg" or ext == ".jpg": + return "Image" + else: + return "Unknown type" + +def print_files(files, extracted_dir): + try: + print("---- Files ----") + for kbfile in files: + print("* File name: ", kbfile['name']) + print(" Description: ", kbfile['description']) + print(" Type: ", determine_filetype(kbfile['name'])) + file = os.path.join(extracted_dir, kbfile['name']) + if os.path.isfile(file): + print(" File", file, "exists") + ms = magic.open(magic.MAGIC_NONE) + ms.load() + ftype = ms.file(file) + print (" Type: ", ftype) + ms.close() + else: + print(" File", file, "does not exist") + + except Exception: + pass + +def parsemetadata(jsonfile, verbose): + info = system = keyboards = files = options = nonexistent = None + extracted_dir = os.path.dirname(jsonfile) + + with open(jsonfile, "r") as read_file: + data = json.load(read_file) + for x in data: +# print("%s: %s" % (x, data[x])) + if x == 'info': + info = data[x] + elif x == 'system': + system = data[x] + elif x == 'keyboards': + keyboards = data[x] + elif x == 'files': + files = data[x] + elif x == 'options': + options = data[x] + elif x == 'nonexistent': + nonexistent = data[x] + if nonexistent != None: + print("This should not happen") + if verbose: + print_info(info) + print_system(system) + if options: + print_options(options) + print_keyboards(keyboards) + print_files(files, extracted_dir) + return info, system, options, keyboards, files + +def main(argv): + if len(sys.argv) != 2: + print("kmpmetadata.py ") + sys.exit(2) + inputfile = sys.argv[1] + + if not os.path.isfile(inputfile): + print("kmpmetadata.py Input file ", inputfile, " not found") + print("kmpmetadata.py ") + sys.exit(2) + + parsemetadata(inputfile, True) + + +if __name__ == "__main__": + main(sys.argv[1:]) + diff --git a/linux/keyman-config/uninstall_kmp.py b/linux/keyman-config/uninstall_kmp.py new file mode 100755 index 0000000000..29512c7971 --- /dev/null +++ b/linux/keyman-config/uninstall_kmp.py @@ -0,0 +1,49 @@ +#!/usr/bin/python3 + +import sys +import os.path +from shutil import rmtree + +def uninstall_kmp(keyboardid): + kbdir = os.path.join('/usr/local/share/keyman', keyboardid) + if not os.path.isdir(kbdir): + print("Keyboard directory for", keyboardid, "does not exist. Aborting") + exit(3) + + kbdocdir = os.path.join('/usr/local/share/doc/keyman', keyboardid) + kbfontdir = os.path.join('/usr/local/share/fonts/keyman', keyboardid) + + print("Uninstalling keyboard:", keyboardid) + if not os.access(kbdir, os.X_OK | os.W_OK): # Check for write access of keyman dir + print("You do not have permissions to uninstall the keyboard files. You need to be a member of the keyman group. `sudo adduser keyman`") + exit(3) + if os.path.isdir(kbdocdir): + if not os.access(kbdocdir, os.X_OK | os.W_OK): # Check for write access of keyman doc dir + print("You do not have permissions to uninstall the documentation. You need to be a member of the keyman group. `sudo adduser keyman`") + exit(3) + rmtree(kbdocdir) + print("Removed documentation directory:", kbdocdir) + else: + print("No documentation directory") + if os.path.isdir(kbfontdir): + if not os.access(kbfontdir, os.X_OK | os.W_OK): # Check for write access of keyman fonts + print("You do not have permissions to uninstall the font files. You need to be a member of the keyman group. `sudo adduser keyman`") + exit(3) + rmtree(kbfontdir) + print("Removed font directory:", kbfontdir) + else: + print("No font directory") + rmtree(kbdir) + print("Removed keyman directory:", kbdir) + print("Finished uninstalling keyboard:", keyboardid) + + +def main(argv): + if len(sys.argv) != 2: + print("uninstall_kmp.py ") + sys.exit(2) + keyboardid = sys.argv[1] + uninstall_kmp(keyboardid) + +if __name__ == "__main__": + main(sys.argv[1:])