#!/usr/bin/python3 # Auto-calculate IIAB + EduPack disk space needs, in advance [& design review] # https://github.com/iiab/iiab/pull/3594 import os, sys, syslog from datetime import date import pwd, grp import shutil import argparse import sqlite3 import iiab.iiab_lib as iiab import iiab.adm_lib as adm import requests import json all_menu_defs = adm.get_all_menu_defs() def main(): parser = argparse.ArgumentParser(description="Get size for item.") parser.add_argument("name", help="Name item.") # menu_dir args = parser.parse_args() name = args.name content= get_item_size(name) #print('size: ',iiab.human_readable(content["size"])) print(f'content ', content) sys.exit() def get_zims_size_from_header(url): #url = 'https://download.kiwix.org/zim/other/mdwiki_en_all_2023-03.zim' response = requests.head(url, allow_redirects=True) size = 0 if (response.status_code == 200): size = int(response.headers.get('Content-Length', 0)) return size def get_zims_size_from_file(name): data_output = {} data_output['download_url']= '' data_output['size'] = 0 with open('/etc/iiab/kiwix_catalog.json') as json_file: data = json.load(json_file)['zims'] result = { data[element]['perma_ref']: data[element] for element in list(data.keys())} if result.get(name) is not None: data_output['download_url']= result[name]['download_url'] data_output['size']= (int(result[name].get('size',0)) * 1024) + 1023 return data_output def get_zims_size(name): data = get_zims_size_from_file(name) #if data['size'] <= 1023: # data['size'] = get_zims_size_from_header(data['download_url']) return data def get_oer2go_size_from_file(name): data_output = {} data_output['download_url']= '' data_output['size'] = 0 with open('/etc/iiab/oer2go_catalog.json') as json_file: data = json.load(json_file)['modules'] if data.get(name) is not None: data_output['download_url']= data[name]['rsync_url'] data_output['size']= (int(data[name].get('ksize',0)) * 1024) + 1023 return data_output def get_map_size_from_file(name): data_output = {} data_output['download_url']= '' data_output['size'] = 0 with open('/etc/iiab/map-catalog.json') as json_file: data = json.load(json_file)['base'] result = { data[element]['perma_ref']: data[element] for element in list(data.keys())} if result.get(name) is not None: data_output['download_url']= result[name]['archive_url'] data_output['size']= (int(result[name].get('size',0))) + 1023 return data_output def get_item_size(name_input): return [get_size(element) for element in [name_input]] def get_items_size(name_input): return [get_size(element) for element in name_input] def element_unknown(name): return {"size":0} def build_otput(name, type_element, function): data = function(name) if data['size']== 0: print(name, ": the size of this",type_element,"element is unknown") return { "name": name ,"type": type_element ,"size": data['size'] } intended_use_dict = { "azuracast":{ "name":"name" ,"type":"azuracast" ,"function":element_unknown } ,"calibre":{ "name":"name" ,"type":"calibre" ,"function":element_unknown } ,"external":{ "name":"name" ,"type":"external" ,"function":element_unknown } ,"html":{ "name":"moddir" ,"type":"module" ,"function":get_oer2go_size_from_file } ,"info":{ "name":"name" ,"type":"info" ,"function":element_unknown } ,"internetarchive":{ "name":"name" ,"type":"internetarchive" ,"function":element_unknown } ,"kalite":{ "name":"name" ,"type":"kalite" ,"function":element_unknown } ,"kolibri":{ "name":"name" ,"type":"kolibri" ,"function":element_unknown } ,"map":{ "name":"name" ,"type":"map" ,"function":get_map_size_from_file } ,"webroot":{ "name":"name" ,"type":"webroot" ,"function":element_unknown } ,"zim":{ "name":"zim_name" ,"type":"zim" ,"function":get_zims_size } } def get_size(name_input): if name_input in all_menu_defs: info = all_menu_defs[name_input] intended_use = info["intended_use"] try: data_intend = intended_use_dict[intended_use] name_element = info[data_intend["name"]] return build_otput(name_element, data_intend["type"], data_intend["function"]) except: pass return build_otput(name_input, "unknown", element_unknown) # Now start the application if __name__ == "__main__": main()