Spacewalk: "rhnpackageevr" violates check constraint "vn_rhnpackageevr_release"

Spacewalk logó
Probléma: Nem megy egyes kliensek rendszerhez történő regisztrálása. Az rhnreg_ks parancs csak internal server error hibaüzenettel tér vissza. A /var/log/httpd/error.log és/vagy /var/log/rhn/rhn_server_xmlrpc naplóállományok a következő hibaüzenetet tartalmazzák:

[Mon Feb 03 11:46:40.564242 2020] [:error] [pid 105370] Exception Handler Information
[Mon Feb 03 11:46:40.564245 2020] [:error] [pid 105370] Traceback (most recent call last):
[Mon Feb 03 11:46:40.564249 2020] [:error] [pid 105370]   File "/usr/lib/python2.7/site-packages/spacewalk/server/apacheRequest.py", line 135, in call_function
[Mon Feb 03 11:46:40.564256 2020] [:error] [pid 105370]     response = func(*params)
[Mon Feb 03 11:46:40.564260 2020] [:error] [pid 105370]   File "/usr/share/rhn/server/handlers/xmlrpc/registration.py", line 848, in add_packages
[Mon Feb 03 11:46:40.564263 2020] [:error] [pid 105370]     server.save_packages()
[Mon Feb 03 11:46:40.564267 2020] [:error] [pid 105370]   File "/usr/lib/python2.7/site-packages/spacewalk/server/rhnServer/server_wrapper.py", line 72, in save_packages
[Mon Feb 03 11:46:40.564270 2020] [:error] [pid 105370]     ret = self.save_packages_byid(self.server["id"], schedule=schedule)
[Mon Feb 03 11:46:40.564274 2020] [:error] [pid 105370]   File "/usr/lib/python2.7/site-packages/spacewalk/server/rhnServer/server_packages.py", line 242, in save_packages_byid
[Mon Feb 03 11:46:40.564278 2020] [:error] [pid 105370]     h.execute_bulk(package_data)
[Mon Feb 03 11:46:40.564281 2020] [:error] [pid 105370]   File "/usr/lib/python2.7/site-packages/spacewalk/server/rhnSQL/sql_base.py", line 185, in execute_bulk
[Mon Feb 03 11:46:40.564285 2020] [:error] [pid 105370]     ret = ret + self.executemany(**subdict)
[Mon Feb 03 11:46:40.564288 2020] [:error] [pid 105370]   File "/usr/lib/python2.7/site-packages/spacewalk/server/rhnSQL/sql_base.py", line 160, in executemany
[Mon Feb 03 11:46:40.564291 2020] [:error] [pid 105370]     return self._execute_wrapper(self._executemany, *p, **kw)
[Mon Feb 03 11:46:40.564296 2020] [:error] [pid 105370]   File "/usr/lib/python2.7/site-packages/spacewalk/server/rhnSQL/driver_postgresql.py", line 295, in _execute_wrapper
[Mon Feb 03 11:46:40.564302 2020] [:error] [pid 105370]     retval = function(*p, **kw)
[Mon Feb 03 11:46:40.564307 2020] [:error] [pid 105370]   File "/usr/lib/python2.7/site-packages/spacewalk/server/rhnSQL/driver_postgresql.py", line 345, in _executemany
[Mon Feb 03 11:46:40.564312 2020] [:error] [pid 105370]     self._real_cursor.executemany(self.sql, all_kwargs)
[Mon Feb 03 11:46:40.564317 2020] [:error] [pid 105370] CheckViolation: new row for relation "rhnpackageevr" violates check constraint "vn_rhnpackageevr_release"
[Mon Feb 03 11:46:40.564320 2020] [:error] [pid 105370] DETAIL:  Failing row contains (17278, 0, 6.2.3, , (0,6.2.3,"")).
[Mon Feb 03 11:46:40.564324 2020] [:error] [pid 105370] CONTEXT:  while executing command on dblink connection named "at_conn"
[Mon Feb 03 11:46:40.564327 2020] [:error] [pid 105370] SQL statement "SELECT dblink_exec('at_conn', in_sql, true)"
[Mon Feb 03 11:46:40.564332 2020] [:error] [pid 105370] PL/pgSQL function pg_dblink_exec(character varying) line 8 at PERFORM
[Mon Feb 03 11:46:40.564338 2020] [:error] [pid 105370] SQL statement "SELECT pg_dblink_exec(
[Mon Feb 03 11:46:40.564342 2020] [:error] [pid 105370]                 'insert into rhnPackageEVR(id, epoch, version, release, evr) values (' ||
[Mon Feb 03 11:46:40.564345 2020] [:error] [pid 105370]                 evr_id || ', ' || e_text || ', ' || v_text || ', ' || r_text
[Mon Feb 03 11:46:40.564350 2020] [:error] [pid 105370] \t\t|| ', evr_t(' || e_text || ', ' || v_text || ', ' || r_text || '))'
[Mon Feb 03 11:46:40.564355 2020] [:error] [pid 105370]             )"
[Mon Feb 03 11:46:40.564358 2020] [:error] [pid 105370] PL/pgSQL function lookup_evr(character varying,character varying,character varying) line 19 at PERFORM

Megoldás: Most nincs gyors és azonnal érthető megoldás, így kezdem az elejéről. Az RPM csomagok készítésekor erősen ajánlott, de nem megkövetelt címke a „Release”. Éppen ezért lehetnek olyan – mondjuk valamilyen ismeretlen helyről – telepített csomagok, amik nem tartalmazzák ezt. A Spacewalk viszont támaszkodik ennek a meglétére, amit ennek megfelelően meg is követel.

A hiba ismert. Mind a Redhat, mind a Spacewalk csapat tud a problémáról. Ugyanakkor nem adtak ki rá javítást, mivel a „Release” címke hiánya a nem megfelelő viselkedés szerintük, nem a Spacewalké.

Kapcsolódó Redhat KDB itt és levelezés a Spacewalk levelezőlistán itt.

Hivatalos megoldás nincs, csak kerülőmegoldások:

  • Gondot okozó csomagok törlése (erről később)
  • Szerver regisztrációja --nopackages kapcsolóval:
    rhnreg_ks --nopackages --activationkey <activation_key> --serverUrl  <satellite_server_fqdn/XMLRPC> --sslCACert=/usr/share/rhn/RHN-ORG-TRUSTED-SSL-CERT --force

    és amennyiben szükséges az rhnsd daemon leállítása és kikapcsolása, amivel az egész Spacewalk kb. értelmét veszti.

Nyilvánvaló, hogy a legritkább esetben járható mind a problémát okozó csomag(ok) törlése, mind az rhnsd démon kikapcsolása.

1. lépés: keressük meg a problémát okozó csomag(ok)at

Felhívnám a figyelmet a következő sorra:
[Mon Feb 03 11:46:40.564320 2020] [:error] [pid 105370] DETAIL:  Failing row contains (17278, 0, 6.2.3, , (0,6.2.3,"")).
Ez tartalmazza a problémát okozó csomag verzióját (6.2.3). Nézzük meg, hogy mely(ek) ezek, hátha megússzuk a dolgot azzal, hogy telepítünk valami frissebbet, vagy szólunk a csomag karbantartónak/beszállítónak, hogy legyenek szívesek rendes rpm-et adni.

rpm -qa | grep '\-6.2.3\-\.'
Ez a parancs egy csomaglistát ad vissza. Megnézhetjük, hogy tényleg hiányzik-e a "Release" címke:

# yum info <csomag1> <csomag2>...<csomagn>
Loaded plugins: fastestmirror, langpacks, tmprepo
Loading mirror speeds from cached hostfile
 * base: mirror.karneval.cz
 * epel: mirror.karneval.cz
 * extras: mirror.karneval.cz
 * updates: mirror.karneval.cz
Installed Packages
Name        : <csomag1>
Arch        : x86_64
Version     : 6.2.3
Release     :
Size        : 674 M
Repo        : installed
Summary     : <csomag1>
License     :
Description :
 
Name        : <csomag2>
Arch        : x86_64
Version     : 6.2.3
Release     :
Size        : 595 M
Repo        : installed
Summary     :  <csomag2>
License     :
Description :

Itt dönthetünk, hogy törlünk-e. Ha nem törlünk, akkor itt az ideje a Spacewalk kódjának a módosítására.

2. lépés: Spacewalk szerver módosítása

Nyissuk meg szerkesztésre a /usr/lib/python2.7/site-packages/spacewalk/server/rhnServer/server_packages.py Python fájlt és a 240. sorba illesszük be a következő kódot, ügyelve az indentálásra:

            #
            # Bugfix
            #
            releases = []
            for i in package_data['r']:
                if i == '':
                   i = 'un-sw'
                releases.append(i)
            package_data['r'] = releases

Ez a kód nem csinál mást, mint végignézi, hogy a feldolgozandó csomagok között van-e olyan, aminek üres/nincs release címkéje. Ha ilyet talál, akkor azt lecseréli "un-sw"-re. Szép kód? Dehogy, köze sincs hozzá. És persze van ennél jóval "pitonikusabb" kód még Python 2.7-ben is, de most az a fontos, hogy az is értse mi történik itt, aki még sosem használt Pythont.

Tehát a kód környéke nézzen ki így:

            package_data = {
                'sysid': [sysid] * len(alist),
                'n': [a.n for a in alist],
                'v': [a.v for a in alist],
                'r': [a.r for a in alist],
                'e': list(map(lambdaae, alist)),
                'a': [a.a for a in alist],
                'instime': [self.__expand_installtime(a.installtime) for a in alist],
            }
            #
            # Bugfix
            #
            releases = []
            for i in package_data['r']:
                if i == '':
                   i = 'un-sw'
                releases.append(i)
            package_data['r'] = releases
            #
            #
            #
            try:
                h.execute_bulk(package_data)
                rhnSQL.commit()
            except rhnSQL.SQLSchemaError:
                e = sys.exc_info()[1]
                # LOOKUP_PACKAGE_ARCH failed
                if e.errno == 20243:
                    log_debug(2, "Unknown package arch found", e)
                    raise_with_tb(rhnFault(45, "Unknown package arch found"), sys.exc_info()[2])
            commits = commits + len(alist)
            del alist

Ha minden rendben van, akkor indítsd újra a Spacewalk szervert a sudo spacewalk-service restart paranccsal. Ezután már regisztálódnia kell a kérdéses gépeknek. Annyi extra dologra nyilván számítani kell, hogy a kérdéses, Release címkét nem töltő csomagok verziójánál megjelenik az "un-sw" jelzés.

Készen vagyunk! :)

u.i.: Milyen csodálatos is, hogy a Spacewalk szabad szoftver, így forráskód szinten módosíthattam a probléma megoldása érdekében.