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