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,2)
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,2)
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['branches'] = self.HostInterface.Entropy.SystemSettings[sys_settings_srv_plugin_id]['server']['branches']
986 data['branch'] = self.HostInterface.Entropy.SystemSettings['repositories']['branch']
987 return True, data
988
990
991 if not myargs:
992 return False,'wrong arguments'
993 repoid = myargs[0]
994 if repoid not in self.HostInterface.Entropy.get_available_repositories():
995 return False,'repository id not available'
996
997 status = True
998 msg = 'ok'
999 try:
1000 self.HostInterface.Entropy.switch_default_repository(repoid, save = True, handle_uninitialized = False)
1001 except Exception, e:
1002 status = False
1003 msg = unicode(e)
1004 return status, msg
1005
1007
1008 if not myargs:
1009 return False,'wrong arguments'
1010 repoid = myargs[0]
1011 if repoid not in self.HostInterface.Entropy.get_available_repositories():
1012 return False,'repository id not available'
1013
1014 dbconn = self.HostInterface.Entropy.open_server_repository(repo = repoid, just_reading = True, warnings = False, do_cache = False)
1015 idpackages = dbconn.listAllIdpackages(order_by = 'atom')
1016 package_data = []
1017 package_data = {
1018 'ordered_idpackages': idpackages,
1019 'data': {},
1020 }
1021 for idpackage in idpackages:
1022
1023 data = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1024 if not data: continue
1025 package_data['data'][idpackage] = data.copy()
1026 dbconn.closeDB()
1027 return True,package_data
1028
1040
1042 if not myargs:
1043 return False,'wrong arguments'
1044 string = myargs[0].split(",")
1045 matched_atoms = []
1046 try:
1047 for item in string:
1048 mysplit = item.split(":")
1049 matched_atoms.append((int(mysplit[0]),mysplit[1],))
1050 except:
1051 return False,'cannot eval() string correctly'
1052
1053 repo_data = {}
1054 for idpackage,repoid in matched_atoms:
1055 if not repo_data.has_key(repoid):
1056 repo_data[repoid] = []
1057 repo_data[repoid].append(idpackage)
1058
1059 status = True
1060 msg = 'ok'
1061 try:
1062 for repoid in repo_data:
1063 self.HostInterface.Entropy.remove_packages(repo_data[repoid],repo = repoid)
1064 except Exception, e:
1065 status = False
1066 msg = unicode(e)
1067
1068 return status, msg
1069
1071
1072 if len(myargs) < 4:
1073 return False,'wrong arguments'
1074
1075 status, userdata, err_str = authenticator.docmd_userdata()
1076 uid = userdata.get('uid')
1077 gid = userdata.get('gid')
1078
1079 from_repo = myargs[0]
1080 to_repo = myargs[1]
1081 do_copy = myargs[2]
1082 idpackages = myargs[3:]
1083
1084 queue_id = self.HostInterface.add_to_queue(
1085 cmd, ' '.join([str(x) for x in myargs]),
1086 uid, gid, 'move_entropy_packages_to_repository',
1087 [from_repo,to_repo,idpackages,do_copy], {}, False, True,
1088 interactive = True
1089 )
1090 if queue_id < 0: return False, queue_id
1091 return True, queue_id
1092
1094
1095 status, userdata, err_str = authenticator.docmd_userdata()
1096 uid = userdata.get('uid')
1097 gid = userdata.get('gid')
1098
1099 queue_id = self.HostInterface.add_to_queue(cmd, '', uid, gid, 'scan_entropy_packages_database_changes', [], {}, True, True, interactive = True)
1100 if queue_id < 0: return False, queue_id
1101 return True, queue_id
1102
1104
1105 status, userdata, err_str = authenticator.docmd_userdata()
1106 uid = userdata.get('uid')
1107 gid = userdata.get('gid')
1108
1109 queue_id = self.HostInterface.add_to_queue(cmd, '', uid, gid, 'run_entropy_dependency_test', [], {}, True, True, interactive = True)
1110 if queue_id < 0: return False, queue_id
1111 return True, queue_id
1112
1114
1115 status, userdata, err_str = authenticator.docmd_userdata()
1116 uid = userdata.get('uid')
1117 gid = userdata.get('gid')
1118
1119 queue_id = self.HostInterface.add_to_queue(cmd, '', uid, gid, 'run_entropy_library_test', [], {}, True, True, interactive = True)
1120 if queue_id < 0: return False, queue_id
1121 return True, queue_id
1122
1124 if len(myargs) < 2:
1125 return False,'wrong arguments'
1126 repoid = myargs[0]
1127 mode = myargs[1]
1128
1129 status, userdata, err_str = authenticator.docmd_userdata()
1130 uid = userdata.get('uid')
1131 gid = userdata.get('gid')
1132
1133 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'run_entropy_checksum_test', [repoid,mode], {}, True, False, interactive = True)
1134 if queue_id < 0: return False, queue_id
1135 return True, queue_id
1136
1138
1139 if not myargs:
1140 return False,'wrong arguments'
1141
1142 status, userdata, err_str = authenticator.docmd_userdata()
1143 uid = userdata.get('uid')
1144 gid = userdata.get('gid')
1145
1146 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'run_entropy_treeupdates', [myargs[0]], {}, False, False, interactive = True)
1147 if queue_id < 0: return False, queue_id
1148 return True, queue_id
1149
1151
1152 if not myargs:
1153 return False,'wrong arguments'
1154
1155 status, userdata, err_str = authenticator.docmd_userdata()
1156 uid = userdata.get('uid')
1157 gid = userdata.get('gid')
1158
1159 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'scan_entropy_mirror_updates', [myargs], {}, True, True, interactive = True)
1160 if queue_id < 0: return False, queue_id
1161 return True, queue_id
1162
1164
1165 if not myargs:
1166 return False,'wrong arguments'
1167
1168 serialized_string = '\n'.join(myargs)
1169 try:
1170 mydict = self.dumpTools.unserialize_string(serialized_string)
1171 except Exception, e:
1172 return False,'cannot parse data: %s' % (e,)
1173
1174 status, userdata, err_str = authenticator.docmd_userdata()
1175 uid = userdata.get('uid')
1176 gid = userdata.get('gid')
1177
1178 queue_id = self.HostInterface.add_to_queue(cmd, '<raw data>', uid, gid, 'run_entropy_mirror_updates', [mydict], {}, False, False, interactive = True)
1179 if queue_id < 0: return False, queue_id
1180 return True, queue_id
1181
1183
1184 to_add = {}
1185 to_remove = []
1186 to_inject = []
1187 to_add_string = ''
1188 to_remove_string = ''
1189 to_inject_string = ''
1190 if myargs:
1191 to_add_string = myargs[0].split(",")
1192 if len(myargs) > 1:
1193 to_remove_string = myargs[1].split(",")
1194 if len(myargs) > 2:
1195 to_inject_string = myargs[2].split(",")
1196 try:
1197
1198 for item in to_add_string:
1199 atom, counter, repoid = item.split(":")
1200 if not to_add.has_key(repoid):
1201 to_add[repoid] = []
1202 to_add[repoid].append(atom)
1203
1204 for item in to_remove_string:
1205 idpackage, repoid = item.split(":")
1206 to_remove.append((idpackage, repoid,))
1207
1208 for item in to_inject_string:
1209 idpackage, repoid = item.split(":")
1210 to_inject.append((idpackage, repoid,))
1211
1212 except Exception, e:
1213 return False,'cannot run database updates properly: %s' % (e,)
1214
1215 status, userdata, err_str = authenticator.docmd_userdata()
1216 uid = userdata.get('uid')
1217 gid = userdata.get('gid')
1218
1219 queue_id = self.HostInterface.add_to_queue(
1220 cmd, ' '.join(myargs), uid, gid,
1221 'run_entropy_database_updates', [to_add,to_remove,to_inject],
1222 {}, False, True, interactive = True
1223 )
1224 if queue_id < 0: return False, queue_id
1225 return True, queue_id
1226
1227
1229 if len(myargs) < 3:
1230 return False,'wrong arguments'
1231
1232 repoid = myargs[0]
1233 search_type = myargs[1]
1234 search_string = ' '.join(myargs[2:])
1235 avail_search_types = ['atom','needed','depends','tag','file','description']
1236
1237 if search_type not in avail_search_types:
1238 return False, 'available search types: %s' % (avail_search_types,)
1239
1240 search_results = {
1241 'ordered_idpackages': set(),
1242 'data': {},
1243 }
1244
1245 dbconn = self.HostInterface.Entropy.open_server_repository(repo = repoid, just_reading = True, warnings = False, do_cache = False)
1246
1247 if search_type == "atom":
1248
1249 mysearchlist = search_string.split()
1250 for mystring in mysearchlist:
1251 results = dbconn.searchPackages(mystring)
1252 for atom, idpackage, branch in results:
1253 data = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1254 if not data: continue
1255 search_results['ordered_idpackages'].add(idpackage)
1256 search_results['data'][idpackage] = data.copy()
1257
1258 elif search_type == "needed":
1259
1260 mysearchlist = search_string.split()
1261 for mystring in mysearchlist:
1262 idpackages = dbconn.searchNeeded(mystring, like = True)
1263 for idpackage in idpackages:
1264 search_results['ordered_idpackages'].add(idpackage)
1265 search_results['data'][idpackage] = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1266
1267 elif search_type == "depends":
1268
1269 mysearchlist = search_string.split()
1270 for mystring in mysearchlist:
1271 m_idpackage, m_result = dbconn.atomMatch(mystring)
1272 if m_idpackage == -1: continue
1273 idpackages = dbconn.retrieveDepends(m_idpackage)
1274 for idpackage in idpackages:
1275 search_results['ordered_idpackages'].add(idpackage)
1276 search_results['data'][idpackage] = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1277
1278 elif search_type == "tag":
1279
1280 mysearchlist = search_string.split()
1281 for mystring in mysearchlist:
1282 idpackages = dbconn.searchTaggedPackages(mystring)
1283 for idpackage in idpackages:
1284 search_results['ordered_idpackages'].add(idpackage)
1285 search_results['data'][idpackage] = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1286
1287 elif search_type == "file":
1288
1289
1290 like = False
1291 if search_string.find("*") != -1:
1292 search_string.replace("*","%")
1293 like = True
1294 idpackages = dbconn.searchBelongs(search_string, like)
1295 for idpackage in idpackages:
1296 search_results['ordered_idpackages'].add(idpackage)
1297 search_results['data'][idpackage] = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1298
1299 elif search_type == "description":
1300
1301 results = dbconn.searchPackagesByDescription(search_string)
1302 for atom, idpackage in results:
1303 search_results['ordered_idpackages'].add(idpackage)
1304 search_results['data'][idpackage] = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1305
1306 elif search_type == "eclass":
1307
1308 mysearchlist = search_string.split()
1309 for eclass in mysearchlist:
1310 idpackages = dbconn.searchEclassedPackages(eclass)
1311 for idpackage in idpackages:
1312 search_results['ordered_idpackages'].add(idpackage)
1313 search_results['data'][idpackage] = self._get_entropy_pkginfo(dbconn, idpackage, repoid)
1314
1315
1316 dbconn.closeDB()
1317 return True, search_results
1318
1320
1321 if not myargs:
1322 return False,'wrong arguments'
1323 repoid = myargs[0]
1324
1325 status, userdata, err_str = authenticator.docmd_userdata()
1326 uid = userdata.get('uid')
1327 gid = userdata.get('gid')
1328
1329 queue_id = self.HostInterface.add_to_queue(cmd, ' '.join(myargs), uid, gid, 'get_notice_board', [repoid], {}, True, True, interactive = True)
1330 if queue_id < 0: return False, queue_id
1331 return True, queue_id
1332
1334
1335 if len(myargs) < 2:
1336 return False,'wrong arguments'
1337 repoid = myargs[0]
1338 entry_ids = myargs[1:]
1339
1340 status, userdata, err_str = authenticator.docmd_userdata()
1341 uid = userdata.get('uid')
1342 gid = userdata.get('gid')
1343
1344 queue_id = self.HostInterface.add_to_queue(
1345 cmd, ' '.join([unicode(x) for x in myargs]), uid, gid,
1346 'remove_notice_board_entries', [repoid,entry_ids], {}, True, False, interactive = True
1347 )
1348 if queue_id < 0: return False, queue_id
1349 return True, queue_id
1350
1351 - def docmd_add_notice_board_entry(self, cmd, myargs, authenticator):
1352
1353 if not myargs:
1354 return False,'wrong arguments'
1355
1356 xml_string = ' '.join(myargs)
1357 try:
1358 mydict = self.entropyTools.dict_from_xml(xml_string)
1359 except Exception, e:
1360 return None,"error: %s" % (e,)
1361 if not (mydict.has_key('repoid') and mydict.has_key('title') and \
1362 mydict.has_key('notice_text') and mydict.has_key('link')):
1363 return None,'wrong dict arguments, xml must have 4 items with attr value -> repoid, title, notice_text, link'
1364
1365 repoid = mydict.get('repoid')
1366 title = mydict.get('title')
1367 notice_text = mydict.get('notice_text')
1368 link = mydict.get('link')
1369
1370 status, userdata, err_str = authenticator.docmd_userdata()
1371 uid = userdata.get('uid')
1372 gid = userdata.get('gid')
1373
1374 queue_id = self.HostInterface.add_to_queue(
1375 cmd, ' '.join(myargs), uid, gid,
1376 'add_notice_board_entry', [repoid,title,notice_text,link], {}, True, False, interactive = True
1377 )
1378 if queue_id < 0: return False, queue_id
1379 return True, queue_id
1380
1382 data = {}
1383 try:
1384 data['atom'], data['name'], data['version'], data['versiontag'], \
1385 data['description'], data['category'], data['chost'], \
1386 data['cflags'], data['cxxflags'],data['homepage'], \
1387 data['license'], data['branch'], data['download'], \
1388 data['digest'], data['slot'], data['etpapi'], \
1389 data['datecreation'], data['size'], data['revision'] = dbconn.getBaseData(idpackage)
1390 except TypeError:
1391 return data
1392 data['injected'] = dbconn.isInjected(idpackage)
1393 data['repoid'] = repoid
1394 data['idpackage'] = idpackage
1395 return data
1396