| # |
| # SPDX-License-Identifier: GPL-2.0-only |
| # |
| |
| def prserv_make_conn(d, check = False): |
| import prserv.serv |
| host_params = list([_f for _f in (d.getVar("PRSERV_HOST") or '').split(':') if _f]) |
| try: |
| conn = None |
| conn = prserv.serv.connect(host_params[0], int(host_params[1])) |
| if check: |
| if not conn.ping(): |
| raise Exception('service not available') |
| d.setVar("__PRSERV_CONN",conn) |
| except Exception as exc: |
| bb.fatal("Connecting to PR service %s:%s failed: %s" % (host_params[0], host_params[1], str(exc))) |
| |
| return conn |
| |
| def prserv_dump_db(d): |
| if not d.getVar('PRSERV_HOST'): |
| bb.error("Not using network based PR service") |
| return None |
| |
| conn = d.getVar("__PRSERV_CONN") |
| if conn is None: |
| conn = prserv_make_conn(d) |
| if conn is None: |
| bb.error("Making connection failed to remote PR service") |
| return None |
| |
| #dump db |
| opt_version = d.getVar('PRSERV_DUMPOPT_VERSION') |
| opt_pkgarch = d.getVar('PRSERV_DUMPOPT_PKGARCH') |
| opt_checksum = d.getVar('PRSERV_DUMPOPT_CHECKSUM') |
| opt_col = ("1" == d.getVar('PRSERV_DUMPOPT_COL')) |
| return conn.export(opt_version, opt_pkgarch, opt_checksum, opt_col) |
| |
| def prserv_import_db(d, filter_version=None, filter_pkgarch=None, filter_checksum=None): |
| if not d.getVar('PRSERV_HOST'): |
| bb.error("Not using network based PR service") |
| return None |
| |
| conn = d.getVar("__PRSERV_CONN") |
| if conn is None: |
| conn = prserv_make_conn(d) |
| if conn is None: |
| bb.error("Making connection failed to remote PR service") |
| return None |
| #get the entry values |
| imported = [] |
| prefix = "PRAUTO$" |
| for v in d.keys(): |
| if v.startswith(prefix): |
| (remain, sep, checksum) = v.rpartition('$') |
| (remain, sep, pkgarch) = remain.rpartition('$') |
| (remain, sep, version) = remain.rpartition('$') |
| if (remain + '$' != prefix) or \ |
| (filter_version and filter_version != version) or \ |
| (filter_pkgarch and filter_pkgarch != pkgarch) or \ |
| (filter_checksum and filter_checksum != checksum): |
| continue |
| try: |
| value = int(d.getVar(remain + '$' + version + '$' + pkgarch + '$' + checksum)) |
| except BaseException as exc: |
| bb.debug("Not valid value of %s:%s" % (v,str(exc))) |
| continue |
| ret = conn.importone(version,pkgarch,checksum,value) |
| if ret != value: |
| bb.error("importing(%s,%s,%s,%d) failed. DB may have larger value %d" % (version,pkgarch,checksum,value,ret)) |
| else: |
| imported.append((version,pkgarch,checksum,value)) |
| return imported |
| |
| def prserv_export_tofile(d, metainfo, datainfo, lockdown, nomax=False): |
| import bb.utils |
| #initilize the output file |
| bb.utils.mkdirhier(d.getVar('PRSERV_DUMPDIR')) |
| df = d.getVar('PRSERV_DUMPFILE') |
| #write data |
| lf = bb.utils.lockfile("%s.lock" % df) |
| with open(df, "a") as f: |
| if metainfo: |
| #dump column info |
| f.write("#PR_core_ver = \"%s\"\n\n" % metainfo['core_ver']); |
| f.write("#Table: %s\n" % metainfo['tbl_name']) |
| f.write("#Columns:\n") |
| f.write("#name \t type \t notn \t dflt \t pk\n") |
| f.write("#----------\t --------\t --------\t --------\t ----\n") |
| for i in range(len(metainfo['col_info'])): |
| f.write("#%10s\t %8s\t %8s\t %8s\t %4s\n" % |
| (metainfo['col_info'][i]['name'], |
| metainfo['col_info'][i]['type'], |
| metainfo['col_info'][i]['notnull'], |
| metainfo['col_info'][i]['dflt_value'], |
| metainfo['col_info'][i]['pk'])) |
| f.write("\n") |
| |
| if lockdown: |
| f.write("PRSERV_LOCKDOWN = \"1\"\n\n") |
| |
| if datainfo: |
| idx = {} |
| for i in range(len(datainfo)): |
| pkgarch = datainfo[i]['pkgarch'] |
| value = datainfo[i]['value'] |
| if pkgarch not in idx: |
| idx[pkgarch] = i |
| elif value > datainfo[idx[pkgarch]]['value']: |
| idx[pkgarch] = i |
| f.write("PRAUTO$%s$%s$%s = \"%s\"\n" % |
| (str(datainfo[i]['version']), pkgarch, str(datainfo[i]['checksum']), str(value))) |
| if not nomax: |
| for i in idx: |
| f.write("PRAUTO_%s_%s = \"%s\"\n" % (str(datainfo[idx[i]]['version']),str(datainfo[idx[i]]['pkgarch']),str(datainfo[idx[i]]['value']))) |
| bb.utils.unlockfile(lf) |
| |
| def prserv_check_avail(d): |
| host_params = list([_f for _f in (d.getVar("PRSERV_HOST") or '').split(':') if _f]) |
| try: |
| if len(host_params) != 2: |
| raise TypeError |
| else: |
| int(host_params[1]) |
| except TypeError: |
| bb.fatal('Undefined/incorrect PRSERV_HOST value. Format: "host:port"') |
| else: |
| prserv_make_conn(d, True) |