list installed kmp and data about them

use that data to only install kmp if it is newer
than existing one
This commit is contained in:
glasseyes 2018-05-15 16:35:40 +07:00
parent e4413f1e28
commit 6ae5ed93e1
3 changed files with 111 additions and 18 deletions

View file

@ -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 <kmpfile>")
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 <kmpfile>")
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)

View file

@ -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)

View file

@ -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()