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