From 6ae5ed93e166c3bf63dfd87146e65423e4e77e4f Mon Sep 17 00:00:00 2001 From: glasseyes Date: Tue, 15 May 2018 16:35:40 +0700 Subject: [PATCH] list installed kmp and data about them use that data to only install kmp if it is newer than existing one --- linux/keyman-config/install_kmp.py | 59 ++++++++++++++------ linux/keyman-config/kmpmetadata.py | 2 +- linux/keyman-config/list_installed_kmp.py | 68 +++++++++++++++++++++++ 3 files changed, 111 insertions(+), 18 deletions(-) create mode 100755 linux/keyman-config/list_installed_kmp.py diff --git a/linux/keyman-config/install_kmp.py b/linux/keyman-config/install_kmp.py index 146eae6186..e4abfc5530 100755 --- a/linux/keyman-config/install_kmp.py +++ b/linux/keyman-config/install_kmp.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 import argparse +import json import tempfile import zipfile import sys @@ -8,6 +9,8 @@ import os.path import requests from kmpmetadata import parsemetadata, determine_filetype from get_kmp import get_kmp, get_keyboard_data +from list_installed_kmp import kmp_version +from uninstall_kmp import uninstall_kmp from os import listdir, makedirs from shutil import copy2 @@ -53,21 +56,29 @@ def install_kmp(inputfile, withkmn=False): # if 'lastModifiedDate' in kbdata: # lastModifiedDate = datetime(kbdata['lastModifiedDate']) # print("Last Modified Date:", lastModifiedDate) - if 'sourcePath' in kbdata: - base_url = "https://raw.github.com/keymanapp/keyboards/master/" + kbdata['sourcePath'] - kmn_url = base_url + "/source/" + kbid + ".kmn" - response = requests.get(kmn_url) - if response.status_code == 200: - downloadfile = os.path.join(tmpdirname, kbid + ".kmn") - with open(downloadfile, 'wb') as f: - f.write(response.content) - print("Installing", kbid + ".kmn", "as keyman file, mininum version:", kbdata['minKeymanVersion']) - if not os.path.isdir(kbdir): + if kbdata: + if 'sourcePath' in kbdata: + base_url = "https://raw.github.com/keymanapp/keyboards/master/" + kbdata['sourcePath'] + kmn_url = base_url + "/source/" + kbid + ".kmn" + response = requests.get(kmn_url) + if response.status_code == 200: + downloadfile = os.path.join(tmpdirname, kbid + ".kmn") + with open(downloadfile, 'wb') as f: + f.write(response.content) + print("Installing", kbid + ".kmn", "as keyman file, mininum version:", kbdata['minKeymanVersion']) + if not os.path.isdir(kbdir): + os.makedirs(kbdir) + copy2(downloadfile, kbdir) + else: + print("install_kmp.py: error: no kmn source file so not installing") + exit(4) + if not os.path.isdir(kbdir): os.makedirs(kbdir) - copy2(downloadfile, kbdir) - else: - print("no kmn source file so not installing") - exit(4) + with open(os.path.join(kbdir, kbid + '.json'), 'w') as outfile: + json.dump(kbdata, outfile) + print("Installing api data file", kbid + ".json", "as keyman file") + else: + print("install_kmp.py: error: cannot download keyboard data so not installing.") for f in files: fpath = os.path.join(tmpdirname, f['name']) @@ -88,7 +99,7 @@ def install_kmp(inputfile, withkmn=False): os.makedirs(kbdir) copy2(fpath, kbdir) else: - print("No kmp.json found in", inputfile) + print("install_kmp.py: error: No kmp.json found in", inputfile) def main(): @@ -104,17 +115,31 @@ def main(): if args.f: name, ext = os.path.splitext(args.f) if ext != ".kmp": - print("install_kmp.py Input file", args.f, "is not a kmp file") + print("install_kmp.py Input file", args.f, "is not a kmp file.") print("install_kmp.py -f ") sys.exit(2) if not os.path.isfile(args.f): - print("install_kmp.py Keyman kmp file", args.f, "not found") + print("install_kmp.py Keyman kmp file", args.f, "not found.") print("install_kmp.py -f ") sys.exit(2) install_kmp(args.f) elif args.k: + installed_kmp_ver = kmp_version(args.k) + kbdata = get_keyboard_data(args.k) + if not kbdata: + print("install_kmp.py: error: Could not download keyboard data for", args.k) + if installed_kmp_ver: +# print("Found installed version", installed_kmp_ver) +# print("Api knows about version", kbdata['version']) + if kbdata['version'] == installed_kmp_ver: + print("install_kmp.py The %s version of the %s keyboard is already installed." % (installed_kmp_ver, args.k)) + sys.exit(0) + elif float(kbdata['version']) > float(installed_kmp_ver): + print("install_kmp.py A newer version of %s keyboard is available. Uninstalling old version %s then downloading and installing new version %s." % (args.k, installed_kmp_ver, kbdata['version'])) + uninstall_kmp(args.k) + kmpfile = get_kmp(args.k) if kmpfile: install_kmp(kmpfile, True) diff --git a/linux/keyman-config/kmpmetadata.py b/linux/keyman-config/kmpmetadata.py index b8fd744e65..44f7d910c3 100755 --- a/linux/keyman-config/kmpmetadata.py +++ b/linux/keyman-config/kmpmetadata.py @@ -86,7 +86,7 @@ def print_files(files, extracted_dir): except Exception: pass -def parsemetadata(jsonfile, verbose): +def parsemetadata(jsonfile, verbose=False): info = system = keyboards = files = options = nonexistent = None extracted_dir = os.path.dirname(jsonfile) diff --git a/linux/keyman-config/list_installed_kmp.py b/linux/keyman-config/list_installed_kmp.py new file mode 100755 index 0000000000..bacf762a50 --- /dev/null +++ b/linux/keyman-config/list_installed_kmp.py @@ -0,0 +1,68 @@ +#!/usr/bin/python3 + +import os +#import configparser +import json +from kmpmetadata import parsemetadata +from get_kmp import get_keyboard_data + +def get_installed_kmp(): + installed_keyboards = {} + check_paths = [ "/usr/share/keyman", "/usr/local/share/keyman" ] + for keymanpath in check_paths: + for o in os.listdir(keymanpath): + if os.path.isdir(os.path.join(keymanpath,o)): + metadata = parsemetadata(os.path.join(keymanpath, o, "kmp.json")) + name = md_name = version = md_version = description = kbdata = None + kbjson = os.path.join(keymanpath, o, o + ".json") + if os.path.isfile(kbjson): + with open(kbjson, "r") as read_file: + kbdata = json.load(read_file) + else: + kbdata = get_keyboard_data(o) + if kbdata: + if 'description' in kbdata: + description = kbdata['description'] + version = kbdata['version'] + name = kbdata['name'] + if metadata: + info = metadata[0] + md_version = info['version']['description'] + md_name = info['name']['description'] + if not name: + version = md_version + name = md_name + + installed_keyboards[o] = { "id" : o, "name" : name, "kmpname" : md_name, "version" : version, "kmpversion" : md_version, "path" : keymanpath, "description" : description} + return installed_keyboards + + +def kmp_version(keyboardid): + installed_kmp = get_installed_kmp() + if keyboardid in installed_kmp: + return installed_kmp[keyboardid]['version'] + else: + return None + + +def main(): + installed_kmp = get_installed_kmp() +# print(installed_kmp) +# print(sorted(installed_kmp)) + print("--- Installed keyboards ---") + for kmp in sorted(installed_kmp): + print(installed_kmp[kmp]['name'] + ", version:", installed_kmp[kmp]['version'] + ", id:", kmp) + if installed_kmp[kmp]['version'] != installed_kmp[kmp]['kmpversion']: + print("Version mismatch. Installed keyboard is %s. Website says it is %s." % (installed_kmp[kmp]['kmpversion'], installed_kmp[kmp]['version'])) + if installed_kmp[kmp]['name'] != installed_kmp[kmp]['kmpname']: + print("Name mismatch. Installed keyboard is %s. Website says it is %s." % (installed_kmp[kmp]['name'], installed_kmp[kmp]['kmpname'])) + + if installed_kmp[kmp]['description']: + print(installed_kmp[kmp]['description']) + else: + print("No description") + print(os.linesep) + + +if __name__ == "__main__": + main() \ No newline at end of file