1
2 '''
3 # DESCRIPTION:
4 # Entropy Object Oriented Interface
5
6 Copyright (C) 2007-2009 Fabio Erculiani
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 '''
22
23 import os
24 from entropy.services.skel import SocketCommands
25 from entropy.const import etpConst
26
27 -class Base(SocketCommands):
28
29 import entropy.tools as entropyTools
31
32 import copy
33 self.copy = copy
34 SocketCommands.__init__(self, HostInterface, inst_name = "systemsrv")
35 self.raw_commands = [
36 'systemsrv:add_to_pinboard',
37 'systemsrv:write_to_running_command_pipe'
38 ]
39
40 self.valid_commands = {
41 'systemsrv:get_queue': {
42 'auth': True,
43 'built_in': False,
44 'cb': self.docmd_get_queue,
45 'args': ["myargs"],
46 'as_user': False,
47 'desc': "get current queue",
48 'syntax': "<SESSION_ID> systemsrv:get_queue",
49 'from': unicode(self),
50 },
51 'systemsrv:get_queue_item_by_id': {
52 'auth': True,
53 'built_in': False,
54 'cb': self.docmd_get_queue_item_by_id,
55 'args': ["myargs"],
56 'as_user': False,
57 'desc': "get current queue item through its queue id",
58 'syntax': "<SESSION_ID> systemsrv:get_queue_item_by_id <queue_id>",
59 'from': unicode(self),
60 },
61 'systemsrv:get_queue_id_stdout': {
62 'auth': True,
63 'built_in': False,
64 'cb': self.docmd_get_queue_id_stdout,
65 'args': ["myargs"],
66 'as_user': False,
67 'desc': "get current queue item stdout/stderr output",
68 'syntax': "<SESSION_ID> systemsrv:get_queue_id_stdout <queue_id> <how many bytes (from tail)>",
69 'from': unicode(self),
70 },
71 'systemsrv:get_queue_id_result': {
72 'auth': True,
73 'built_in': False,
74 'cb': self.docmd_get_queue_id_result,
75 'args': ["myargs"],
76 'as_user': False,
77 'desc': "get current queue item result output",
78 'syntax': "<SESSION_ID> systemsrv:get_queue_id_result <queue_id>",
79 'from': unicode(self),
80 },
81 'systemsrv:remove_queue_ids': {
82 'auth': True,
83 'built_in': False,
84 'cb': self.docmd_remove_queue_ids,
85 'args': ["myargs"],
86 'as_user': False,
87 'desc': "remove queue items using their queue ids",
88 'syntax': "<SESSION_ID> systemsrv:remove_queue_ids <queue_id 1> <queue_id 2> <...>",
89 'from': unicode(self),
90 },
91 'systemsrv:pause_queue': {
92 'auth': True,
93 'built_in': False,
94 'cb': self.docmd_pause_queue,
95 'args': ["myargs"],
96 'as_user': False,
97 'desc': "toggle queue pause (understood?)",
98 'syntax': "<SESSION_ID> systemsrv:pause_queue <True/False>",
99 'from': unicode(self),
100 },
101 'systemsrv:kill_processing_queue_id': {
102 'auth': True,
103 'built_in': False,
104 'cb': self.docmd_kill_processing_queue_id,
105 'args': ["myargs"],
106 'as_user': False,
107 'desc': "kill a running process using its queue id",
108 'syntax': "<SESSION_ID> systemsrv:kill_processing_queue_id <queue_id>",
109 'from': unicode(self),
110 },
111 'systemsrv:swap_items_in_queue': {
112 'auth': True,
113 'built_in': False,
114 'cb': self.docmd_swap_items_in_queue,
115 'args': ["myargs"],
116 'as_user': False,
117 'desc': "swap items in queue to change their order",
118 'syntax': "<SESSION_ID> systemsrv:swap_items_in_queue <queue_id1> <queue_id1>",
119 'from': unicode(self),
120 },
121 'systemsrv:get_pinboard_data': {
122 'auth': True,
123 'built_in': False,
124 'cb': self.docmd_get_pinboard_data,
125 'args': [],
126 'as_user': False,
127 'desc': "get pinboard content",
128 'syntax': "<SESSION_ID> systemsrv:get_pinboard_data",
129 'from': unicode(self),
130 },
131 'systemsrv:add_to_pinboard': {
132 'auth': True,
133 'built_in': False,
134 'cb': self.docmd_add_to_pinboard,
135 'args': ["myargs"],
136 'as_user': False,
137 'desc': "add item to pinboard",
138 'syntax': "<SESSION_ID> systemsrv:add_to_pinboard <xml string containing pinboard note and extended text>",
139 'from': unicode(self),
140 },
141 'systemsrv:remove_from_pinboard': {
142 'auth': True,
143 'built_in': False,
144 'cb': self.docmd_remove_from_pinboard,
145 'args': ["myargs"],
146 'as_user': False,
147 'desc': "remove item from pinboard",
148 'syntax': "<SESSION_ID> systemsrv:remove_from_pinboard <pinboard identifier 1> <pinboard identifier 2> <...>",
149 'from': unicode(self),
150 },
151 'systemsrv:set_pinboard_items_done': {
152 'auth': True,
153 'built_in': False,
154 'cb': self.docmd_set_pinboard_items_done,
155 'args': ["myargs"],
156 'as_user': False,
157 'desc': "set pinboard items status using their pinboard identifiers",
158 'syntax': "<SESSION_ID> systemsrv:set_pinboard_items_done <pinboard identifier 1> <pinboard identifier 2> <...> <status (True/False)>",
159 'from': unicode(self),
160 },
161 'systemsrv:write_to_running_command_pipe': {
162 'auth': True,
163 'built_in': False,
164 'cb': self.docmd_write_to_running_command_pipe,
165 'args': ["myargs"],
166 'as_user': False,
167 'desc': "write text to stdin of a running command",
168 'syntax': "<SESSION_ID> systemsrv:write_to_running_command_pipe <queue_id> <write stdout (True/False)> <txt ...>",
169 'from': unicode(self),
170 },
171 }
172
174
175 myqueue = self.copy.deepcopy(self.HostInterface.ManagerQueue)
176
177 extended = False
178 if myargs:
179 extended = myargs[0]
180
181 if not extended:
182 for key in self.HostInterface.done_queue_keys:
183 for queue_id in myqueue.get(key):
184 item = myqueue[key].get(queue_id)
185 if not item.has_key('extended_result'):
186 continue
187 item['extended_result'] = None
188
189 return True, myqueue
190
192
193 if not myargs:
194 return False,'wrong arguments'
195 queue_id = myargs[0]
196 try:
197 queue_id = int(queue_id)
198 except ValueError:
199 return False,'wrong argument: queue_id'
200
201 item, key = self.HostInterface.get_item_by_queue_id(queue_id, copy = True)
202 if item == None:
203 return False,'wrong queue id'
204
205 return True,item
206
208
209 if len(myargs) < 1:
210 return False,'wrong arguments'
211 queue_id = myargs[0]
212 bytes_from_tail = myargs[1]
213
214 try:
215 queue_id = int(queue_id)
216 except ValueError:
217 return False,'wrong argument: queue_id'
218 try:
219 bytes_from_tail = int(bytes_from_tail)
220 except ValueError:
221 return False,'wrong argument: lines from tail'
222
223 item, key = self.HostInterface.get_item_by_queue_id(queue_id, copy = True)
224 if item == None:
225 return False,'wrong queue id'
226
227 file_path = item['stdout']
228 if not (os.path.isfile(file_path) and os.access(file_path,os.R_OK)):
229 text = ''
230 else:
231 f = open(file_path,"r")
232 f.seek(0,os.SEEK_END)
233 tell_me = f.tell()
234 if bytes_from_tail < 1:
235 bytes_from_tail = tell_me
236 if bytes_from_tail > tell_me:
237 bytes_from_tail = tell_me
238 f.seek(-1*bytes_from_tail,os.SEEK_END)
239 text = f.read()
240 f.close()
241
242 return True,text
243
245
246 if not myargs:
247 return False,'wrong arguments'
248 queue_id = myargs[0]
249 try:
250 queue_id = int(queue_id)
251 except ValueError:
252 return False,'wrong argument: queue_id'
253
254 item, key = self.HostInterface.get_item_by_queue_id(queue_id, copy = True)
255 if item == None:
256 return False,'wrong queue id'
257
258 if key not in self.HostInterface.done_queue_keys:
259 return False,'process not completed yet'
260
261 if not item.has_key('result'):
262 return False,'result not available'
263
264 ext_result = None
265 if item.has_key('extended_result'):
266 ext_result = self.HostInterface.load_queue_ext_rc(queue_id)
267
268 return True,(item['result'],ext_result,)
269
271
272 if not myargs:
273 return False,'wrong arguments'
274
275 valid_queue_ids = set()
276 for queue_id in myargs:
277 item, key = self.HostInterface.get_item_by_queue_id(queue_id, copy = True)
278 if (item != None) and (key in self.HostInterface.removable_queue_keys):
279 valid_queue_ids.add(queue_id)
280
281 if not valid_queue_ids:
282 return False,'no valid queue ids'
283
284
285 self.HostInterface.remove_from_queue(valid_queue_ids)
286
287 return True,'ok'
288
290
291 if not myargs:
292 return False,'wrong arguments'
293
294 do = myargs[0]
295 if do:
296 self.HostInterface.pause_queue()
297 else:
298 self.HostInterface.play_queue()
299
300 return self.HostInterface.ManagerQueue['pause'],'ok'
301
303
304 if not myargs:
305 return False,'wrong arguments'
306
307 queue_id = myargs[0]
308 self.HostInterface.kill_processing_queue_id(queue_id)
309 return True,'ok'
310
312
313 if len(myargs) < 2:
314 return False,'wrong arguments'
315
316 queue_id1 = myargs[0]
317 queue_id2 = myargs[1]
318 status = self.HostInterface.swap_items_in_queue(queue_id1,queue_id2)
319 if status:
320 return True,'ok'
321 return False,'not done'
322
326
328
329 if not myargs:
330 return False,'wrong arguments'
331
332 xml_string = ' '.join(myargs)
333 try:
334 mydict = self.entropyTools.dict_from_xml(xml_string)
335 except Exception, e:
336 return None,"error: %s" % (e,)
337
338 if not (mydict.has_key('note') and mydict.has_key('extended_text')):
339 return None,'wrong dict arguments, xml must have 2 items with attr value -> note, extended_text'
340 note = mydict.get('note')
341 extended_text = mydict.get('extended_text')
342
343 self.HostInterface.add_to_pinboard(note, extended_text)
344 return True,'ok'
345
347
348 if not myargs:
349 return False,'wrong arguments'
350
351 for pinboard_id in myargs:
352 try:
353 pinboard_id = int(pinboard_id)
354 except ValueError:
355 continue
356 self.HostInterface.remove_from_pinboard(pinboard_id)
357 return True,'ok'
358
360
361 if len(myargs) < 2:
362 return False,'wrong arguments'
363
364 status = myargs[-1]
365 pinboard_ids = myargs[:-1]
366
367 for pinboard_id in pinboard_ids:
368 try:
369 pinboard_id = int(pinboard_id)
370 except ValueError:
371 continue
372 self.HostInterface.set_pinboard_item_status(pinboard_id, status)
373 return True,'ok'
374
376
377 if len(myargs) < 2:
378 return False, 'wrong arguments'
379
380 try:
381 queue_id = int(myargs[0])
382 except ValueError:
383 return False,'invalid queue id'
384
385 try:
386 write_stdout = bool(myargs[1])
387 except ValueError:
388 write_stdout = False
389
390 txt = ' '.join(myargs[2:])+'\n'
391 item, key = self.HostInterface.get_item_by_queue_id(queue_id, copy = True)
392 if key not in self.HostInterface.processing_queue_keys:
393 return False,'not running'
394 mypipe = self.HostInterface.ManagerQueueStdInOut.get(queue_id)
395 if mypipe == None:
396 return False,'pipe not available'
397 try:
398 w_fd = mypipe[1]
399 except (IndexError, ValueError,):
400 return False,'pipe vanished'
401 if not isinstance(w_fd,int):
402 return False,'stdout fd not an int'
403
404 if write_stdout:
405 stdout = open(item['stdout'],"a+")
406 try:
407 os.write(w_fd,txt)
408 if write_stdout:
409 stdout.write(txt)
410 except OSError, e:
411 return False,'OSError: %s' % (e,)
412 except IOError, e:
413 return False,'IOError: %s' % (e,)
414 finally:
415 if write_stdout:
416 stdout.flush()
417 stdout.close()
418
419 return True,'ok'
420
422
423 import entropy.dump as dumpTools
424 import entropy.tools as entropyTools
426
427 SocketCommands.__init__(self, HostInterface, inst_name = "srvrepo")
428 self.raw_commands = [
429 'srvrepo:enable_uses_for_atoms',
430 'srvrepo:disable_uses_for_atoms',
431 'srvrepo:compile_atoms',
432 'srvrepo:spm_remove_atoms',
433 'srvrepo:run_custom_shell_command',
434 'srvrepo:remove_entropy_packages',
435 'srvrepo:search_entropy_packages',
436 'srvrepo:run_entropy_database_updates',
437 'srvrepo:run_entropy_mirror_updates',
438 'srvrepo:add_notice_board_entry'
439 ]
440 self.valid_commands = {
441 'srvrepo:sync_spm': {
442 'auth': True,
443 'built_in': False,
444 'cb': self.docmd_sync_spm,
445 'args': ["cmd","myargs","authenticator"],
446 'as_user': False,
447 'desc': "spawn portage sync (emerge --sync)",
448 'syntax': "<SESSION_ID> srvrepo:sync_spm",
449 'from': unicode(self)
450 },
451 'srvrepo:compile_atoms': {
452 'auth': True,
453 'built_in': False,
454 'cb': self.docmd_compile_atoms,
455 'args': ["cmd","myargs","authenticator"],
456 'as_user': False,
457 'desc': "compile specified atoms using Spm (Portage?)",
458 'syntax': "<SESSION_ID> srvrepo:compile_atoms <xml string containing atoms and compile options>",
459 'from': unicode(self)
460 },
461 'srvrepo:spm_remove_atoms': {
462 'auth': True,
463 'built_in': False,
464 'cb': self.docmd_spm_remove_atoms,
465 'args': ["cmd","myargs","authenticator"],
466 'as_user': False,
467 'desc': "remove specified atoms using Spm (Portage?)",
468 'syntax': "<SESSION_ID> srvrepo:spm_remove_atoms <xml string containing atoms and remove options>",
469 'from': unicode(self)
470 },
471 'srvrepo:get_spm_categories_updates': {
472 'auth': True,
473 'built_in': False,
474 'cb': self.docmd_get_spm_categories_updates,
475 'args': ["cmd","myargs","authenticator"],
476 'as_user': False,
477 'desc': "get SPM updates for the specified package categories",
478 'syntax': "<SESSION_ID> srvrepo:get_spm_categories_updates <category 1> <category 2> <...>",
479 'from': unicode(self)
480 },
481 'srvrepo:get_spm_categories_installed': {
482 'auth': True,
483 'built_in': False,
484 'cb': self.docmd_get_spm_categories_installed,
485 'args': ["cmd","myargs","authenticator"],
486 'as_user': False,
487 'desc': "get SPM installed packages for the specified package categories",
488 'syntax': "<SESSION_ID> srvrepo:get_spm_categories_installed <category 1> <category 2> <...>",
489 'from': unicode(self)
490 },
491 'srvrepo:enable_uses_for_atoms': {
492 'auth': True,
493 'built_in': False,
494 'cb': self.docmd_enable_uses_for_atoms,
495 'args': ["cmd","myargs","authenticator"],
496 'as_user': False,
497 'desc': "enable use flags for the specified atom",
498 'syntax': "<SESSION_ID> srvrepo:enable_uses_for_atom <xml string containing atoms and use flags>",
499 'from': unicode(self)
500 },
501 'srvrepo:disable_uses_for_atoms': {
502 'auth': True,
503 'built_in': False,
504 'cb': self.docmd_disable_uses_for_atoms,
505 'args': ["cmd","myargs","authenticator"],
506 'as_user': False,
507 'desc': "enable use flags for the specified atom",
508 'syntax': "<SESSION_ID> srvrepo:disable_uses_for_atom <xml string containing atoms and use flags>",
509 'from': unicode(self)
510 },
511 'srvrepo:get_spm_atoms_info': {
512 'auth': True,
513 'built_in': False,
514 'cb': self.docmd_get_spm_atoms_info,
515 'args': ["cmd","myargs","authenticator"],
516 'as_user': False,
517 'desc': "get info from SPM for the specified atoms",
518 'syntax': "<SESSION_ID> srvrepo:get_spm_atoms_info <atom1> <atom2> <atom3>",
519 'from': unicode(self)
520 },
521 'srvrepo:run_spm_info': {
522 'auth': True,
523 'built_in': False,
524 'cb': self.docmd_run_spm_info,
525 'args': ["cmd","authenticator"],
526 'as_user': False,
527 'desc': "run SPM info command",
528 'syntax': "<SESSION_ID> srvrepo:run_spm_info",
529 'from': unicode(self)
530 },
531 'srvrepo:run_custom_shell_command': {
532 'auth': True,
533 'built_in': False,
534 'cb': self.docmd_run_custom_shell_command,
535 'args': ["cmd","myargs","authenticator"],
536 'as_user': False,
537 'desc': "run custom shell command",
538 'syntax': "<SESSION_ID> srvrepo:run_custom_shell_command <shell command blah blah>",
539 'from': unicode(self)
540 },
541 'srvrepo:get_spm_glsa_data': {
542 'auth': True,
543 'built_in': False,
544 'cb': self.docmd_get_spm_glsa_data,
545 'args': ["cmd","myargs","authenticator"],
546 'as_user': False,
547 'desc': "get SPM security updates info",
548 'syntax': "<SESSION_ID> srvrepo:get_spm_glsa_data <list_type string (affected,new,all)>",
549 'from': unicode(self)
550 },
551 'srvrepo:get_available_repositories': {
552 'auth': True,
553 'built_in': False,
554 'cb': self.docmd_get_available_repositories,
555 'args': [],
556 'as_user': False,
557 'desc': "get information about available Entropy repositories",
558 'syntax': "<SESSION_ID> srvrepo:get_available_repositories",
559 'from': unicode(self)
560 },
561 'srvrepo:set_default_repository': {
562 'auth': True,
563 'built_in': False,
564 'cb': self.docmd_set_default_repository,
565 'args': ["myargs"],
566 'as_user': False,
567 'desc': "set a new default Entropy Server repository",
568 'syntax': "<SESSION_ID> srvrepo:set_default_repository <repoid>",
569 'from': unicode(self)
570 },
571 'srvrepo:get_available_entropy_packages': {
572 'auth': True,
573 'built_in': False,
574 'cb': self.docmd_get_available_entropy_packages,
575 'args': ["myargs"],
576 'as_user': False,
577 'desc': "get available Entropy packages from the chosen repository id",
578 'syntax': "<SESSION_ID> srvrepo:get_available_entropy_packages <repoid>",
579 'from': unicode(self)
580 },
581 'srvrepo:get_entropy_idpackage_information': {
582 'auth': True,
583 'built_in': False,
584 'cb': self.docmd_get_entropy_idpackage_information,
585 'args': ["myargs"],
586 'as_user': False,
587 'desc': "get Entropy package metadata using its idpackage and repository id",
588 'syntax': "<SESSION_ID> srvrepo:get_entropy_idpackage_information <idpackage> <repoid>",
589 'from': unicode(self)
590 },
591 'srvrepo:remove_entropy_packages': {
592 'auth': True,
593 'built_in': False,
594 'cb': self.docmd_remove_entropy_packages,
595 'args': ["myargs"],
596 'as_user': False,
597 'desc': "remove Entropy packages using their match -> (idpackage,repo)",
598 'syntax': "<SESSION_ID> srvrepo:remove_entropy_packages idpackage:repoid,idpackage,repoid,...",
599 'from': unicode(self)
600 },
601 'srvrepo:search_entropy_packages': {
602 'auth': True,
603 'built_in': False,
604 'cb': self.docmd_search_entropy_packages,
605 'args': ["myargs"],
606 'as_user': False,
607 'desc': "search Entropy packages using a defined search type, search string inside the specified repository",
608 'syntax': "<SESSION_ID> srvrepo:search_entropy_packages <repoid> <search_type> <search string...>",
609 'from': unicode(self)
610 },
611 'srvrepo:move_entropy_packages_to_repository': {
612 'auth': True,
613 'built_in': False,
614 'cb': self.docmd_move_entropy_packages_to_repository,
615 'args': ["cmd","myargs","authenticator"],
616 'as_user': False,
617 'desc': "move or copy Entropy packages from a repository to another",
618 'syntax': "<SESSION_ID> srvrepo:move_entropy_packages_to_repository <from_repo> <to_repo> <do_copy (True: copy, False: move)> <idpackages...>",
619 'from': unicode(self)
620 },
621 'srvrepo:scan_entropy_packages_database_changes': {
622 'auth': True,
623 'built_in': False,
624 'cb': self.docmd_scan_entropy_packages_database_changes,
625 'args': ["cmd","authenticator"],
626 'as_user': False,
627 'desc': "scan Spm package changes to retrieve a list of action that should be run on the repositories",
628 'syntax': "<SESSION_ID> srvrepo:scan_entropy_packages_database_changes",
629 'from': unicode(self)
630 },
631 'srvrepo:run_entropy_database_updates': {
632 'auth': True,
633 'built_in': False,
634 'cb': self.docmd_run_entropy_database_updates,
635 'args': ["cmd","myargs","authenticator"],
636 'as_user': False,
637 'desc': "run Entropy database updates",
638 'syntax': "<SESSION_ID> srvrepo:run_entropy_database_updates <to_add: atom:counter:repoid,atom:counter:repoid,...> <to_remove: idpackage:repoid,idpackage:repoid,...> <to_inject: idpackage:repoid,idpackage:repoid,...>",
639 'from': unicode(self)
640 },
641 'srvrepo:run_entropy_dependency_test': {
642 'auth': True,
643 'built_in': False,
644 'cb': self.docmd_run_entropy_dependency_test,
645 'args': ["cmd","authenticator"],
646 'as_user': False,
647 'desc': "run Entropy dependency test",
648 'syntax': "<SESSION_ID> srvrepo:run_entropy_dependency_test",
649 'from': unicode(self)
650 },
651 'srvrepo:run_entropy_library_test': {
652 'auth': True,
653 'built_in': False,
654 'cb': self.docmd_run_entropy_library_test,
655 'args': ["cmd","authenticator"],
656 'as_user': False,
657 'desc': "run Entropy dependency test",
658 'syntax': "<SESSION_ID> srvrepo:run_entropy_library_test",
659 'from': unicode(self)
660 },
661 'srvrepo:run_entropy_treeupdates': {
662 'auth': True,
663 'built_in': False,
664 'cb': self.docmd_run_entropy_treeupdates,
665 'args': ["cmd","myargs","authenticator"],
666 'as_user': False,
667 'desc': "run Entropy database treeupdates",
668 'syntax': "<SESSION_ID> srvrepo:run_entropy_treeupdates <repoid>",
669 'from': unicode(self)
670 },
671 'srvrepo:scan_entropy_mirror_updates': {
672 'auth': True,
673 'built_in': False,
674 'cb': self.docmd_scan_entropy_mirror_updates,
675 'args': ["cmd","myargs","authenticator"],
676 'as_user': False,
677 'desc': "scan mirror updates for the specified repository identifiers",
678 'syntax': "<SESSION_ID> srvrepo:scan_entropy_mirror_updates <repoid 1> <repoid 2> <...>",
679 'from': unicode(self)
680 },
681 'srvrepo:run_entropy_mirror_updates': {
682 'auth': True,
683 'built_in': False,
684 'cb': self.docmd_run_entropy_mirror_updates,
685 'args': ["cmd","myargs","authenticator"],
686 'as_user': False,
687 'desc': "run mirror updates for the provided repositories",
688 'syntax': "<SESSION_ID> srvrepo:run_entropy_mirror_updates <xml data, properly formatted>",
689 'from': unicode(self)
690 },
691 'srvrepo:run_entropy_checksum_test': {
692 'auth': True,
693 'built_in': False,
694 'cb': self.docmd_run_entropy_checksum_test,
695 'args': ["cmd","myargs","authenticator"],
696 'as_user': False,
697 'desc': "run Entropy packages checksum verification tool",
698 'syntax': "<SESSION_ID> srvrepo:run_entropy_checksum_test <repoid> <mode>",
699 'from': unicode(self)
700 },
701 'srvrepo:get_notice_board': {
702 'auth': True,
703 'built_in': False,
704 'cb': self.docmd_get_notice_board,
705 'args': ["cmd","myargs","authenticator"],
706 'as_user': False,
707 'desc': "get repository notice board",
708 'syntax': "<SESSION_ID> srvrepo:get_notice_board <repoid>",
709 'from': unicode(self)
710 },
711 'srvrepo:remove_notice_board_entries': {
712 'auth': True,
713 'built_in': False,
714 'cb': self.docmd_remove_notice_board_entries,
715 'args': ["cmd","myargs","authenticator"],
716 'as_user': False,
717 'desc': "remove notice board entries",
718 'syntax': "<SESSION_ID> srvrepo:remove_notice_board_entries <repoid> <entry_id1> <entry_id2> <...>",
719 'from': unicode(self)
720 },
721 'srvrepo:add_notice_board_entry': {
722 'auth': True,
723 'built_in': False,
724 'cb': self.docmd_add_notice_board_entry,
725 'args': ["cmd","myargs","authenticator"],
726 'as_user': False,
727 'desc': "remove notice board entry",
728 'syntax': "<SESSION_ID> srvrepo:add_notice_board_entry <xml formatted data>",
729 'from': unicode(self)
730 },
731 }
732
734
735 status, userdata, err_str = authenticator.docmd_userdata()
736 uid = userdata.get('uid')
737 gid = userdata.get('gid')
738
739 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'sync_spm', [], {}, False, False, interactive = True)
740 if queue_id < 0: return False, queue_id
741 return True, queue_id
742
744
745 if not myargs:
746 return False,'wrong arguments'
747
748 xml_string = ' '.join(myargs)
749
750 try:
751 mydict = self.entropyTools.dict_from_xml(xml_string)
752 except Exception, e:
753 return None,"error: %s" % (e,)
754
755 if not ( mydict.has_key('atoms') and mydict.has_key('pretend') and \
756 mydict.has_key('oneshot') and mydict.has_key('verbose') and \
757 mydict.has_key('fetchonly') and mydict.has_key('buildonly') and \
758 mydict.has_key('nodeps') and \
759 mydict.has_key('nocolor') and mydict.has_key('custom_use') and \
760 mydict.has_key('ldflags') and mydict.has_key('cflags') ):
761 return None,'wrong dict arguments, xml must have 10 items with attr value' + \
762 ' -> atoms, pretend, oneshot, verbose, nocolor, fetchonly, ' + \
763 'buildonly, nodeps, custom_use, ldflags, cflags'
764
765 atoms = mydict.get('atoms')
766 if atoms: atoms = atoms.split()
767 pretend = mydict.get('pretend')
768 oneshot = mydict.get('oneshot')
769 verbose = mydict.get('verbose')
770 nocolor = mydict.get('nocolor')
771 fetchonly = mydict.get('fetchonly')
772 buildonly = mydict.get('buildonly')
773 nodeps = mydict.get('nodeps')
774 custom_use = mydict.get('custom_use')
775 ldflags = mydict.get('ldflags')
776 cflags = mydict.get('cflags')
777
778 if pretend == "1": pretend = True
779 else: pretend = False
780 if oneshot == "1": oneshot = True
781 else: oneshot = False
782 if verbose == "1": verbose = True
783 else: verbose = False
784 if nocolor == "1": nocolor = True
785 else: nocolor = False
786 if fetchonly == "1": fetchonly = True
787 else: fetchonly = False
788 if buildonly == "1": buildonly = True
789 else: buildonly = False
790 if nodeps == "1": nodeps = True
791 else: nodeps = False
792
793 status, userdata, err_str = authenticator.docmd_userdata()
794 uid = userdata.get('uid')
795 gid = userdata.get('gid')
796
797 add_dict = {
798 'pretend': pretend,
799 'oneshot': oneshot,
800 'verbose': verbose,
801 'nocolor': nocolor,
802 'fetchonly': fetchonly,
803 'buildonly': buildonly,
804 'nodeps': nodeps,
805 'custom_use': custom_use,
806 'ldflags': ldflags,
807 'cflags': cflags,
808 }
809
810 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs),
811 uid, gid, 'compile_atoms', [atoms[:]], add_dict.copy(), False, False, interactive = True)
812 if queue_id < 0: return False, queue_id
813 return True, queue_id
814
816 if not myargs:
817 return False,'wrong arguments'
818
819 xml_string = ' '.join(myargs)
820
821 try:
822 mydict = self.entropyTools.dict_from_xml(xml_string)
823 except Exception, e:
824 return None,"error: %s" % (e,)
825
826 if not ( mydict.has_key('atoms') and mydict.has_key('pretend') and \
827 mydict.has_key('verbose') and mydict.has_key('nocolor') ):
828 return None,'wrong dict arguments, xml must have 4 items with attr value -> atoms, pretend, verbose, nocolor'
829
830 atoms = mydict.get('atoms')
831 if atoms: atoms = atoms.split()
832 pretend = mydict.get('pretend')
833 verbose = mydict.get('verbose')
834 nocolor = mydict.get('nocolor')
835
836 if pretend == "1": pretend = True
837 else: pretend = False
838 if verbose == "1": verbose = True
839 else: verbose = False
840 if nocolor == "1": nocolor = True
841 else: nocolor = False
842
843 status, userdata, err_str = authenticator.docmd_userdata()
844 uid = userdata.get('uid')
845 gid = userdata.get('gid')
846
847 add_dict = {
848 'pretend': pretend,
849 'verbose': verbose,
850 'nocolor': nocolor,
851 }
852
853 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'spm_remove_atoms', [atoms[:]], add_dict.copy(), False, False, interactive = True)
854 if queue_id < 0: return False, queue_id
855 return True, queue_id
856
858 if not myargs:
859 return False,'wrong arguments'
860
861 status, userdata, err_str = authenticator.docmd_userdata()
862 uid = userdata.get('uid')
863 gid = userdata.get('gid')
864
865 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'get_spm_categories_updates', [myargs], {}, True, True, interactive = True)
866 if queue_id < 0: return False, queue_id
867 return True, queue_id
868
870
871 status, userdata, err_str = authenticator.docmd_userdata()
872 uid = userdata.get('uid')
873 gid = userdata.get('gid')
874
875 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'get_spm_categories_installed', [myargs], {}, True, True, interactive = True)
876 if queue_id < 0: return False, queue_id
877 return True, queue_id
878
880 if not myargs:
881 return False,'wrong arguments'
882
883 xml_string = ' '.join(myargs)
884 try:
885 mydict = self.entropyTools.dict_from_xml(xml_string)
886 except Exception, e:
887 return None,"error: %s" % (e,)
888 if not (mydict.has_key('atoms') and mydict.has_key('useflags')):
889 return None,'wrong dict arguments, xml must have 2 items with attr value -> atoms, useflags'
890
891 atoms = mydict.get('atoms')
892 useflags = mydict.get('useflags')
893 if atoms: atoms = atoms.split()
894 if useflags: useflags = useflags.split()
895
896 status, userdata, err_str = authenticator.docmd_userdata()
897 uid = userdata.get('uid')
898 gid = userdata.get('gid')
899
900 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'enable_uses_for_atoms', [atoms,useflags], {}, True, True)
901 if queue_id < 0: return False, queue_id
902 return True, queue_id
903
905 if not myargs:
906 return False,'wrong arguments'
907
908 xml_string = ' '.join(myargs)
909 try:
910 mydict = self.entropyTools.dict_from_xml(xml_string)
911 except Exception, e:
912 return None,"error: %s" % (e,)
913 if not (mydict.has_key('atoms') and mydict.has_key('useflags')):
914 return None,'wrong dict arguments, xml must have 2 items with attr value -> atoms, useflags'
915
916 atoms = mydict.get('atoms')
917 useflags = mydict.get('useflags')
918 if atoms: atoms = atoms.split()
919 if useflags: useflags = useflags.split()
920
921 status, userdata, err_str = authenticator.docmd_userdata()
922 uid = userdata.get('uid')
923 gid = userdata.get('gid')
924
925 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'disable_uses_for_atoms', [atoms,useflags], {}, True, True)
926 if queue_id < 0: return False, queue_id
927 return True, queue_id
928
930 if not myargs:
931 return False,'wrong arguments'
932
933 status, userdata, err_str = authenticator.docmd_userdata()
934 uid = userdata.get('uid')
935 gid = userdata.get('gid')
936
937 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'get_spm_atoms_info', [myargs], {}, True, True)
938 if queue_id < 0: return False, queue_id
939 return True, queue_id
940
942
943 status, userdata, err_str = authenticator.docmd_userdata()
944 uid = userdata.get('uid')
945 gid = userdata.get('gid')
946
947 queue_id = self.HostInterface.add_to_queue(cmd, '', uid, gid, 'run_spm_info', [], {}, True, False, interactive = True)
948 if queue_id < 0: return False, queue_id
949 return True, queue_id
950
952 if not myargs:
953 return False,'wrong arguments'
954
955 status, userdata, err_str = authenticator.docmd_userdata()
956 uid = userdata.get('uid')
957 gid = userdata.get('gid')
958 command = ' '.join(myargs)
959
960 queue_id = self.HostInterface.add_to_queue(cmd, command, uid, gid, 'run_custom_shell_command', [command], {}, True, False, interactive = True)
961 if queue_id < 0: return False, queue_id
962 return True, queue_id
963
965 if not myargs:
966 return False,'wrong arguments'
967
968 status, userdata, err_str = authenticator.docmd_userdata()
969 uid = userdata.get('uid')
970 gid = userdata.get('gid')
971
972 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'get_spm_glsa_data', [myargs[0]], {}, True, True)
973 if queue_id < 0: return False, queue_id
974 return True, queue_id
975
977 data = {}
978 data['available'] = self.HostInterface.Entropy.get_available_repositories()
979 if etpConst['clientserverrepoid'] in data['available']:
980 data['available'].pop(etpConst['clientserverrepoid'])
981 data['community_mode'] = self.HostInterface.Entropy.community_repo
982 data['current'] = self.HostInterface.Entropy.default_repository
983 sys_settings_srv_plugin_id = \
984 etpConst['system_settings_plugins_ids']['server_plugin']
985 data['branch'] = self.HostInterface.Entropy.SystemSettings['repositories']['branch']
986 return True, data
987
989
990 if not myargs:
991 return False,'wrong arguments'
992 repoid = myargs[0]
993 if repoid not in self.HostInterface.Entropy.get_available_repositories():
994 return False,'repository id not available'
995
996 status = True
997 msg = 'ok'
998 try:
999 self.HostInterface.Entropy.switch_default_repository(repoid, save = True, handle_uninitialized = False)
1000 except Exception, e:
1001 status = False
1002 msg = unicode(e)
1003 return status, msg
1004
1006
1007 if not myargs:
1008 return False,'wrong arguments'
1009 repoid = myargs[0]
1010 if repoid not in self.HostInterface.Entropy.get_available_repositories():
1011 return False,'repository id not available'
1012
1013 dbconn = self.HostInterface.Entropy.open_server_repository(repo = repoid, just_reading = True, warnings = False, do_cache = False)
1014 idpackages = dbconn.listAllIdpackages(order_by = 'atom')
1015 package_data = []
1016 package_data = {
1017 'ordered_idpackages': idpackages,
1018 'data': {},
1019 }
1020 for idpackage in idpackages:
1021
1022 data = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1023 if not data: continue
1024 package_data['data'][idpackage] = data.copy()
1025 dbconn.closeDB()
1026 return True,package_data
1027
1039
1041 if not myargs:
1042 return False,'wrong arguments'
1043 string = myargs[0].split(",")
1044 matched_atoms = []
1045 try:
1046 for item in string:
1047 mysplit = item.split(":")
1048 matched_atoms.append((int(mysplit[0]),mysplit[1],))
1049 except:
1050 return False,'cannot eval() string correctly'
1051
1052 repo_data = {}
1053 for idpackage,repoid in matched_atoms:
1054 if not repo_data.has_key(repoid):
1055 repo_data[repoid] = []
1056 repo_data[repoid].append(idpackage)
1057
1058 status = True
1059 msg = 'ok'
1060 try:
1061 for repoid in repo_data:
1062 self.HostInterface.Entropy.remove_packages(repo_data[repoid],repo = repoid)
1063 except Exception, e:
1064 status = False
1065 msg = unicode(e)
1066
1067 return status, msg
1068
1070
1071 if len(myargs) < 4:
1072 return False,'wrong arguments'
1073
1074 status, userdata, err_str = authenticator.docmd_userdata()
1075 uid = userdata.get('uid')
1076 gid = userdata.get('gid')
1077
1078 from_repo = myargs[0]
1079 to_repo = myargs[1]
1080 do_copy = myargs[2]
1081 idpackages = myargs[3:]
1082
1083 queue_id = self.HostInterface.add_to_queue(
1084 cmd, ' '.join([str(x) for x in myargs]),
1085 uid, gid, 'move_entropy_packages_to_repository',
1086 [from_repo,to_repo,idpackages,do_copy], {}, False, True,
1087 interactive = True
1088 )
1089 if queue_id < 0: return False, queue_id
1090 return True, queue_id
1091
1093
1094 status, userdata, err_str = authenticator.docmd_userdata()
1095 uid = userdata.get('uid')
1096 gid = userdata.get('gid')
1097
1098 queue_id = self.HostInterface.add_to_queue(cmd, '', uid, gid, 'scan_entropy_packages_database_changes', [], {}, True, True, interactive = True)
1099 if queue_id < 0: return False, queue_id
1100 return True, queue_id
1101
1103
1104 status, userdata, err_str = authenticator.docmd_userdata()
1105 uid = userdata.get('uid')
1106 gid = userdata.get('gid')
1107
1108 queue_id = self.HostInterface.add_to_queue(cmd, '', uid, gid, 'run_entropy_dependency_test', [], {}, True, True, interactive = True)
1109 if queue_id < 0: return False, queue_id
1110 return True, queue_id
1111
1113
1114 status, userdata, err_str = authenticator.docmd_userdata()
1115 uid = userdata.get('uid')
1116 gid = userdata.get('gid')
1117
1118 queue_id = self.HostInterface.add_to_queue(cmd, '', uid, gid, 'run_entropy_library_test', [], {}, True, True, interactive = True)
1119 if queue_id < 0: return False, queue_id
1120 return True, queue_id
1121
1123 if len(myargs) < 2:
1124 return False,'wrong arguments'
1125 repoid = myargs[0]
1126 mode = myargs[1]
1127
1128 status, userdata, err_str = authenticator.docmd_userdata()
1129 uid = userdata.get('uid')
1130 gid = userdata.get('gid')
1131
1132 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'run_entropy_checksum_test', [repoid,mode], {}, True, False, interactive = True)
1133 if queue_id < 0: return False, queue_id
1134 return True, queue_id
1135
1137
1138 if not myargs:
1139 return False,'wrong arguments'
1140
1141 status, userdata, err_str = authenticator.docmd_userdata()
1142 uid = userdata.get('uid')
1143 gid = userdata.get('gid')
1144
1145 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'run_entropy_treeupdates', [myargs[0]], {}, False, False, interactive = True)
1146 if queue_id < 0: return False, queue_id
1147 return True, queue_id
1148
1150
1151 if not myargs:
1152 return False,'wrong arguments'
1153
1154 status, userdata, err_str = authenticator.docmd_userdata()
1155 uid = userdata.get('uid')
1156 gid = userdata.get('gid')
1157
1158 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'scan_entropy_mirror_updates', [myargs], {}, True, True, interactive = True)
1159 if queue_id < 0: return False, queue_id
1160 return True, queue_id
1161
1163
1164 if not myargs:
1165 return False,'wrong arguments'
1166
1167 serialized_string = '\n'.join(myargs)
1168 try:
1169 mydict = self.dumpTools.unserialize_string(serialized_string)
1170 except Exception, e:
1171 return False,'cannot parse data: %s' % (e,)
1172
1173 status, userdata, err_str = authenticator.docmd_userdata()
1174 uid = userdata.get('uid')
1175 gid = userdata.get('gid')
1176
1177 queue_id = self.HostInterface.add_to_queue(cmd, '<raw data>', uid, gid, 'run_entropy_mirror_updates', [mydict], {}, False, False, interactive = True)
1178 if queue_id < 0: return False, queue_id
1179 return True, queue_id
1180
1182
1183 to_add = {}
1184 to_remove = []
1185 to_inject = []
1186 to_add_string = ''
1187 to_remove_string = ''
1188 to_inject_string = ''
1189 if myargs:
1190 to_add_string = myargs[0].split(",")
1191 if len(myargs) > 1:
1192 to_remove_string = myargs[1].split(",")
1193 if len(myargs) > 2:
1194 to_inject_string = myargs[2].split(",")
1195 try:
1196
1197 for item in to_add_string:
1198 atom, counter, repoid = item.split(":")
1199 if not to_add.has_key(repoid):
1200 to_add[repoid] = []
1201 to_add[repoid].append(atom)
1202
1203 for item in to_remove_string:
1204 idpackage, repoid = item.split(":")
1205 to_remove.append((idpackage, repoid,))
1206
1207 for item in to_inject_string:
1208 idpackage, repoid = item.split(":")
1209 to_inject.append((idpackage, repoid,))
1210
1211 except Exception, e:
1212 return False,'cannot run database updates properly: %s' % (e,)
1213
1214 status, userdata, err_str = authenticator.docmd_userdata()
1215 uid = userdata.get('uid')
1216 gid = userdata.get('gid')
1217
1218 queue_id = self.HostInterface.add_to_queue(
1219 cmd, ' '.join(myargs), uid, gid,
1220 'run_entropy_database_updates', [to_add,to_remove,to_inject],
1221 {}, False, True, interactive = True
1222 )
1223 if queue_id < 0: return False, queue_id
1224 return True, queue_id
1225
1226
1228 if len(myargs) < 3:
1229 return False,'wrong arguments'
1230
1231 repoid = myargs[0]
1232 search_type = myargs[1]
1233 search_string = ' '.join(myargs[2:])
1234 avail_search_types = ['atom','needed','depends','tag','file','description']
1235
1236 if search_type not in avail_search_types:
1237 return False, 'available search types: %s' % (avail_search_types,)
1238
1239 search_results = {
1240 'ordered_idpackages': set(),
1241 'data': {},
1242 }
1243
1244 dbconn = self.HostInterface.Entropy.open_server_repository(repo = repoid, just_reading = True, warnings = False, do_cache = False)
1245
1246 if search_type == "atom":
1247
1248 mysearchlist = search_string.split()
1249 for mystring in mysearchlist:
1250 results = dbconn.searchPackages(mystring)
1251 for atom, idpackage, branch in results:
1252 data = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1253 if not data: continue
1254 search_results['ordered_idpackages'].add(idpackage)
1255 search_results['data'][idpackage] = data.copy()
1256
1257 elif search_type == "needed":
1258
1259 mysearchlist = search_string.split()
1260 for mystring in mysearchlist:
1261 idpackages = dbconn.searchNeeded(mystring, like = True)
1262 for idpackage in idpackages:
1263 search_results['ordered_idpackages'].add(idpackage)
1264 search_results['data'][idpackage] = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1265
1266 elif search_type == "depends":
1267
1268 mysearchlist = search_string.split()
1269 for mystring in mysearchlist:
1270 m_idpackage, m_result = dbconn.atomMatch(mystring)
1271 if m_idpackage == -1: continue
1272 idpackages = dbconn.retrieveDepends(m_idpackage)
1273 for idpackage in idpackages:
1274 search_results['ordered_idpackages'].add(idpackage)
1275 search_results['data'][idpackage] = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1276
1277 elif search_type == "tag":
1278
1279 mysearchlist = search_string.split()
1280 for mystring in mysearchlist:
1281 idpackages = dbconn.searchTaggedPackages(mystring)
1282 for idpackage in idpackages:
1283 search_results['ordered_idpackages'].add(idpackage)
1284 search_results['data'][idpackage] = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1285
1286 elif search_type == "file":
1287
1288
1289 like = False
1290 if search_string.find("*") != -1:
1291 search_string.replace("*","%")
1292 like = True
1293 idpackages = dbconn.searchBelongs(search_string, like)
1294 for idpackage in idpackages:
1295 search_results['ordered_idpackages'].add(idpackage)
1296 search_results['data'][idpackage] = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1297
1298 elif search_type == "description":
1299
1300 results = dbconn.searchPackagesByDescription(search_string)
1301 for atom, idpackage in results:
1302 search_results['ordered_idpackages'].add(idpackage)
1303 search_results['data'][idpackage] = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1304
1305 elif search_type == "eclass":
1306
1307 mysearchlist = search_string.split()
1308 for eclass in mysearchlist:
1309 idpackages = dbconn.searchEclassedPackages(eclass)
1310 for idpackage in idpackages:
1311 search_results['ordered_idpackages'].add(idpackage)
1312 search_results['data'][idpackage] = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1313
1314
1315 dbconn.closeDB()
1316 return True, search_results
1317
1319
1320 if not myargs:
1321 return False,'wrong arguments'
1322 repoid = myargs[0]
1323
1324 status, userdata, err_str = authenticator.docmd_userdata()
1325 uid = userdata.get('uid')
1326 gid = userdata.get('gid')
1327
1328 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'get_notice_board', [repoid], {}, True, True, interactive = True)
1329 if queue_id < 0: return False, queue_id
1330 return True, queue_id
1331
1333
1334 if len(myargs) < 2:
1335 return False,'wrong arguments'
1336 repoid = myargs[0]
1337 entry_ids = myargs[1:]
1338
1339 status, userdata, err_str = authenticator.docmd_userdata()
1340 uid = userdata.get('uid')
1341 gid = userdata.get('gid')
1342
1343 queue_id = self.HostInterface.add_to_queue(
1344 cmd, ' '.join([unicode(x) for x in myargs]), uid, gid,
1345 'remove_notice_board_entries', [repoid,entry_ids], {}, True, False, interactive = True
1346 )
1347 if queue_id < 0: return False, queue_id
1348 return True, queue_id
1349
1350 - def docmd_add_notice_board_entry(self, cmd, myargs, authenticator):
1351
1352 if not myargs:
1353 return False,'wrong arguments'
1354
1355 xml_string = ' '.join(myargs)
1356 try:
1357 mydict = self.entropyTools.dict_from_xml(xml_string)
1358 except Exception, e:
1359 return None,"error: %s" % (e,)
1360 if not (mydict.has_key('repoid') and mydict.has_key('title') and \
1361 mydict.has_key('notice_text') and mydict.has_key('link')):
1362 return None,'wrong dict arguments, xml must have 4 items with attr value -> repoid, title, notice_text, link'
1363
1364 repoid = mydict.get('repoid')
1365 title = mydict.get('title')
1366 notice_text = mydict.get('notice_text')
1367 link = mydict.get('link')
1368
1369 status, userdata, err_str = authenticator.docmd_userdata()
1370 uid = userdata.get('uid')
1371 gid = userdata.get('gid')
1372
1373 queue_id = self.HostInterface.add_to_queue(
1374 cmd, ' '.join(myargs), uid, gid,
1375 'add_notice_board_entry', [repoid,title,notice_text,link], {}, True, False, interactive = True
1376 )
1377 if queue_id < 0: return False, queue_id
1378 return True, queue_id
1379
1381 data = {}
1382 try:
1383 data['atom'], data['name'], data['version'], data['versiontag'], \
1384 data['description'], data['category'], data['chost'], \
1385 data['cflags'], data['cxxflags'],data['homepage'], \
1386 data['license'], data['branch'], data['download'], \
1387 data['digest'], data['slot'], data['etpapi'], \
1388 data['datecreation'], data['size'], data['revision'] = dbconn.getBaseData(idpackage)
1389 except TypeError:
1390 return data
1391 data['injected'] = dbconn.isInjected(idpackage)
1392 data['repoid'] = repoid
1393 data['idpackage'] = idpackage
1394 return data
1395