1# 2# Copyright OpenEmbedded Contributors 3# 4# SPDX-License-Identifier: GPL-2.0-only 5# 6 7def prserv_make_conn(d, check = False): 8 import prserv.serv 9 host_params = list([_f for _f in (d.getVar("PRSERV_HOST") or '').split(':') if _f]) 10 try: 11 conn = None 12 conn = prserv.serv.connect(host_params[0], int(host_params[1])) 13 if check: 14 if not conn.ping(): 15 raise Exception('service not available') 16 except Exception as exc: 17 bb.fatal("Connecting to PR service %s:%s failed: %s" % (host_params[0], host_params[1], str(exc))) 18 19 return conn 20 21def prserv_dump_db(d): 22 if not d.getVar('PRSERV_HOST'): 23 bb.error("Not using network based PR service") 24 return None 25 26 conn = prserv_make_conn(d) 27 if conn is None: 28 bb.error("Making connection failed to remote PR service") 29 return None 30 31 #dump db 32 opt_version = d.getVar('PRSERV_DUMPOPT_VERSION') 33 opt_pkgarch = d.getVar('PRSERV_DUMPOPT_PKGARCH') 34 opt_checksum = d.getVar('PRSERV_DUMPOPT_CHECKSUM') 35 opt_col = ("1" == d.getVar('PRSERV_DUMPOPT_COL')) 36 d = conn.export(opt_version, opt_pkgarch, opt_checksum, opt_col) 37 conn.close() 38 return d 39 40def prserv_import_db(d, filter_version=None, filter_pkgarch=None, filter_checksum=None): 41 if not d.getVar('PRSERV_HOST'): 42 bb.error("Not using network based PR service") 43 return None 44 45 conn = prserv_make_conn(d) 46 if conn is None: 47 bb.error("Making connection failed to remote PR service") 48 return None 49 #get the entry values 50 imported = [] 51 prefix = "PRAUTO$" 52 for v in d.keys(): 53 if v.startswith(prefix): 54 (remain, sep, checksum) = v.rpartition('$') 55 (remain, sep, pkgarch) = remain.rpartition('$') 56 (remain, sep, version) = remain.rpartition('$') 57 if (remain + '$' != prefix) or \ 58 (filter_version and filter_version != version) or \ 59 (filter_pkgarch and filter_pkgarch != pkgarch) or \ 60 (filter_checksum and filter_checksum != checksum): 61 continue 62 try: 63 value = int(d.getVar(remain + '$' + version + '$' + pkgarch + '$' + checksum)) 64 except BaseException as exc: 65 bb.debug("Not valid value of %s:%s" % (v,str(exc))) 66 continue 67 ret = conn.importone(version,pkgarch,checksum,value) 68 if ret != value: 69 bb.error("importing(%s,%s,%s,%d) failed. DB may have larger value %d" % (version,pkgarch,checksum,value,ret)) 70 else: 71 imported.append((version,pkgarch,checksum,value)) 72 conn.close() 73 return imported 74 75def prserv_export_tofile(d, metainfo, datainfo, lockdown, nomax=False): 76 import bb.utils 77 #initilize the output file 78 bb.utils.mkdirhier(d.getVar('PRSERV_DUMPDIR')) 79 df = d.getVar('PRSERV_DUMPFILE') 80 #write data 81 with open(df, "a") as f, bb.utils.fileslocked(["%s.lock" % df]) as locks: 82 if metainfo: 83 #dump column info 84 f.write("#PR_core_ver = \"%s\"\n\n" % metainfo['core_ver']); 85 f.write("#Table: %s\n" % metainfo['tbl_name']) 86 f.write("#Columns:\n") 87 f.write("#name \t type \t notn \t dflt \t pk\n") 88 f.write("#----------\t --------\t --------\t --------\t ----\n") 89 for i in range(len(metainfo['col_info'])): 90 f.write("#%10s\t %8s\t %8s\t %8s\t %4s\n" % 91 (metainfo['col_info'][i]['name'], 92 metainfo['col_info'][i]['type'], 93 metainfo['col_info'][i]['notnull'], 94 metainfo['col_info'][i]['dflt_value'], 95 metainfo['col_info'][i]['pk'])) 96 f.write("\n") 97 98 if lockdown: 99 f.write("PRSERV_LOCKDOWN = \"1\"\n\n") 100 101 if datainfo: 102 idx = {} 103 for i in range(len(datainfo)): 104 pkgarch = datainfo[i]['pkgarch'] 105 value = datainfo[i]['value'] 106 if pkgarch not in idx: 107 idx[pkgarch] = i 108 elif value > datainfo[idx[pkgarch]]['value']: 109 idx[pkgarch] = i 110 f.write("PRAUTO$%s$%s$%s = \"%s\"\n" % 111 (str(datainfo[i]['version']), pkgarch, str(datainfo[i]['checksum']), str(value))) 112 if not nomax: 113 for i in idx: 114 f.write("PRAUTO_%s_%s = \"%s\"\n" % (str(datainfo[idx[i]]['version']),str(datainfo[idx[i]]['pkgarch']),str(datainfo[idx[i]]['value']))) 115 116def prserv_check_avail(d): 117 host_params = list([_f for _f in (d.getVar("PRSERV_HOST") or '').split(':') if _f]) 118 try: 119 if len(host_params) != 2: 120 raise TypeError 121 else: 122 int(host_params[1]) 123 except TypeError: 124 bb.fatal('Undefined/incorrect PRSERV_HOST value. Format: "host:port"') 125 else: 126 conn = prserv_make_conn(d, True) 127 conn.close() 128