xref: /OK3568_Linux_fs/yocto/poky/meta/lib/oe/prservice.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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