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.