Skip to content

Commit c860fdc

Browse files
author
Korney Gedert
committed
Implement selecting runner(apt1 default)
1 parent 645d181 commit c860fdc

5 files changed

Lines changed: 167 additions & 6 deletions

File tree

gpoa/frontend/package_applier.py

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,20 @@
2424
applier_frontend
2525
, check_enabled
2626
)
27+
import os
28+
29+
def select_runner() -> None | str:
30+
"""
31+
Select runner to use for package applier
32+
33+
Returns:
34+
str if backend is selected
35+
None otherwise
36+
"""
37+
proc = subprocess.run(['/usr/libexec/gpupdate/select_runner'], stdout=subprocess.PIPE)
38+
if proc.returncode != 0:
39+
return None
40+
return proc.stdout.decode('utf-8').strip()
2741

2842
class package_applier(applier_frontend):
2943
__module_name = 'PackagesApplier'
@@ -40,8 +54,16 @@ def __init__(self, storage):
4054
install_branch = '{}\\{}%'.format(self.__hklm_branch, self.__install_key_name)
4155
remove_branch = '{}\\{}%'.format(self.__hklm_branch, self.__remove_key_name)
4256
sync_branch = '{}\\{}%'.format(self.__hklm_branch, self.__sync_key_name)
57+
58+
runner = select_runner()
59+
if runner is None:
60+
log('E81')
61+
raise Exception('No package runner selected')
62+
log('D236', {'runner': runner})
63+
self.runner = runner + '_runner'
64+
4365
self.fulcmd = []
44-
self.fulcmd.append('/usr/libexec/gpupdate/pkcon_runner')
66+
self.fulcmd.append('/usr/libexec/gpupdate/' + self.runner)
4567
self.fulcmd.append('--loglevel')
4668
logger = logging.getLogger()
4769
self.fulcmd.append(str(logger.level))
@@ -65,13 +87,19 @@ def run(self):
6587
subprocess.check_call(self.fulcmd)
6688
except Exception as exc:
6789
logdata = {'msg': str(exc)}
68-
log('E55', logdata)
90+
if self.runner == 'pkcon_runner':
91+
log('E55', logdata)
92+
elif self.runner == 'apt1_runner':
93+
log('E79', logdata)
6994
else:
7095
try:
7196
subprocess.Popen(self.fulcmd,close_fds=False)
7297
except Exception as exc:
7398
logdata = {'msg': str(exc)}
74-
log('E61', logdata)
99+
if self.runner == 'pkcon_runner':
100+
log('E61', logdata)
101+
elif self.runner == 'apt1_runner':
102+
log('E80', logdata)
75103

76104
def apply(self):
77105
if self.__module_enabled:
@@ -91,10 +119,17 @@ class package_applier_user(applier_frontend):
91119
__hkcu_branch = 'Software\\BaseALT\\Policies\\Packages'
92120

93121
def __init__(self, storage, username):
122+
runner = select_runner()
123+
if runner is None:
124+
log('E81')
125+
raise Exception('No package applier runner found')
126+
log('D236', {'runner': runner})
127+
self.runner = runner + '_runner'
128+
94129
self.storage = storage
95130
self.username = username
96131
self.fulcmd = []
97-
self.fulcmd.append('/usr/libexec/gpupdate/pkcon_runner')
132+
self.fulcmd.append('/usr/libexec/gpupdate/' + self.runner)
98133
self.fulcmd.append('--user')
99134
self.fulcmd.append(self.username)
100135
self.fulcmd.append('--loglevel')
@@ -129,13 +164,19 @@ def run(self):
129164
subprocess.check_call(self.fulcmd)
130165
except Exception as exc:
131166
logdata = {'msg': str(exc)}
132-
log('E60', logdata)
167+
if self.runner == 'pkcon_runner':
168+
log('E60', logdata)
169+
elif self.runner == 'apt1_runner':
170+
log('E77', logdata)
133171
else:
134172
try:
135173
subprocess.Popen(self.fulcmd,close_fds=False)
136174
except Exception as exc:
137175
logdata = {'msg': str(exc)}
138-
log('E62', logdata)
176+
if self.runner == 'pkcon_runner':
177+
log('E62', logdata)
178+
elif self.runner == 'apt1_runner':
179+
log('E78', logdata)
139180

140181
def admin_context_apply(self):
141182
'''

gpoa/locale/ru_RU/LC_MESSAGES/gpoa.po

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,21 @@ msgstr "Не удалось обновить LDAP новыми данными п
268268
msgid "Failed to change local user password"
269269
msgstr "Не удалось изменить пароль локального пользователя"
270270

271+
msgid "Error running apt1_runner sync for user"
272+
msgstr "Ошибка при запуске apt1_runner синхронно для пользователя"
273+
274+
msgid "Error running apt1_runner async for user"
275+
msgstr "Ошибка при запуске apt1_runner асинхронно для пользователя"
276+
277+
msgid "Error running apt1_runner sync for machine"
278+
msgstr "Ошибка при запуске apt1_runner синхронно для компьютера"
279+
280+
msgid "Error running apt1_runner async for machine"
281+
msgstr "Ошибка при запуске apt1_runner асинхронно для компьютера"
282+
283+
msgid "Error no package applier runner found"
284+
msgstr "Ошибка не найден исполнитель применения пакетов"
285+
271286
# Error_end
272287

273288
# Debug
@@ -961,6 +976,9 @@ msgstr "Не найдены входы после изменения парол
961976
msgid "Running apt1_runner to install and remove packages"
962977
msgstr "Запуск pkcon_runner для установки и удаления пакетов"
963978

979+
msgid "Package applier runner found"
980+
msgstr "Найдено средство применения пакета"
981+
964982
msgid "Unknown message type, no message assigned"
965983
msgstr "Неизвестный тип сообщения"
966984

gpoa/messages/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,12 @@ def error_code(code):
112112
error_ids[74] = 'Autofs restart failed'
113113
error_ids[75] = 'Failed to update LDAP with new password data'
114114
error_ids[76] = 'Failed to change local user password'
115+
error_ids[77] = 'Error running apt1_runner sync for user'
116+
error_ids[78] = 'Error running apt1_runner async for user'
117+
error_ids[79] = 'Error running apt1_runner sync for machine'
118+
error_ids[80] = 'Error running apt1_runner async for machine'
119+
error_ids[81] = 'Error no package applier runner found'
120+
115121
return error_ids.get(code, 'Unknown error code')
116122

117123
def debug_code(code):
@@ -350,6 +356,7 @@ def debug_code(code):
350356
debug_ids[233] = 'Calculating time since the first user login after their password change'
351357
debug_ids[234] = 'No logins found after password change'
352358
debug_ids[235] = 'Running apt1_runner to install and remove packages'
359+
debug_ids[236] = 'Package applier runner found'
353360

354361
return debug_ids.get(code, 'Unknown debug code')
355362

gpoa/select_runner

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
#!/usr/bin/python3
2+
3+
import dbus
4+
import logging
5+
from util.logging import log
6+
import argparse
7+
import gettext
8+
import locale
9+
10+
import os
11+
import dbus
12+
import dbus.mainloop.glib
13+
14+
15+
def check_apt1() -> bool:
16+
'''
17+
Check if apt1 is running and has ApplyAsync method
18+
19+
Returns:
20+
True if apt1 is running and has ApplyAsync method
21+
'''
22+
dbus_interface = 'org.altlinux.alterator.apt1'
23+
bus_name = 'org.altlinux.alterator'
24+
object_path = '/org/altlinux/alterator/apt'
25+
try:
26+
bus = dbus.SystemBus()
27+
28+
if not bus.name_has_owner(bus_name):
29+
bus.close()
30+
return False
31+
32+
if not bus.get_object(bus_name, object_path).has_method(dbus_interface, 'ApplyAsync'):
33+
bus.close()
34+
return False
35+
36+
bus.close()
37+
return True
38+
except dbus.exceptions.DBusException as e:
39+
return False
40+
41+
def check_pkcon() -> bool:
42+
"""
43+
Check if pkcon is installed and executable
44+
45+
Returns:
46+
True if pkcon is installed and executable
47+
"""
48+
if os.path.isfile('/usr/bin/pkcon') and os.access('/usr/bin/pkcon', os.X_OK):
49+
return True
50+
return False
51+
52+
def main() -> int:
53+
"""
54+
Check if apt1 or pkcon is running and return the name of the backend
55+
56+
Returns:
57+
0 if apt1 or pkcon is running, 1 otherwise
58+
"""
59+
60+
backends = { "apt1": check_apt1,"pkcon": check_pkcon }
61+
62+
locale.bindtextdomain('gpoa', '/usr/lib/python3/site-packages/gpoa/locale')
63+
gettext.bindtextdomain('gpoa', '/usr/lib/python3/site-packages/gpoa/locale')
64+
gettext.textdomain('gpoa')
65+
logger = logging.getLogger()
66+
parser = argparse.ArgumentParser(description='Package applier')
67+
parser.add_argument('-b', '--backend', type=str, choices=backends.keys(), default='apt1', help='priority backend (default: %(default)s)')
68+
parser.add_argument('--loglevel', type=int, help='loglevel', nargs='?', default=30)
69+
70+
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
71+
72+
args = parser.parse_args()
73+
logger.setLevel(args.loglevel)
74+
75+
if backends[args.backend]():
76+
print(args.backend)
77+
return 0
78+
79+
for el in backends:
80+
if el == args.backend:
81+
continue
82+
if backends[el]():
83+
print(el)
84+
return 0
85+
return 1
86+
87+
if __name__ == '__main__':
88+
try:
89+
exit(main())
90+
except Exception as exc:
91+
exit(1)

gpupdate.spec

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ mkdir -p \
108108

109109
ln -s %python3_sitelibdir/gpoa/apt1_runner \
110110
%buildroot%_prefix/libexec/%name/apt1_runner
111+
ln -s %python3_sitelibdir/gpoa/select_runner \
112+
%buildroot%_prefix/libexec/%name/select_runner
111113
ln -s %python3_sitelibdir/gpoa/pkcon_runner \
112114
%buildroot%_prefix/libexec/%name/pkcon_runner
113115
ln -s %python3_sitelibdir/gpoa/scripts_runner \
@@ -169,12 +171,14 @@ fi
169171
%_prefix/libexec/%name/scripts_runner
170172
%_prefix/libexec/%name/pkcon_runner
171173
%_prefix/libexec/%name/apt1_runner
174+
%_prefix/libexec/%name/select_runner
172175
%attr(755,root,root) %python3_sitelibdir/gpoa/gpoa
173176
%attr(755,root,root) %python3_sitelibdir/gpoa/gpupdate
174177
%attr(755,root,root) %python3_sitelibdir/gpoa/gpupdate-setup
175178
%attr(755,root,root) %python3_sitelibdir/gpoa/scripts_runner
176179
%attr(755,root,root) %python3_sitelibdir/gpoa/pkcon_runner
177180
%attr(755,root,root) %python3_sitelibdir/gpoa/apt1_runner
181+
%attr(755,root,root) %python3_sitelibdir/gpoa/select_runner
178182
%python3_sitelibdir/gpoa
179183
%_datadir/%name
180184
%_unitdir/%name.service

0 commit comments

Comments
 (0)