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 from __future__ import with_statement
24 import os
25 from entropy.exceptions import *
26 from entropy.const import etpConst
27 from entropy.output import darkblue, bold, blue, darkgreen, darkred, brown
28 from entropy.i18n import _
29 from entropy.core import SystemSettings
30
32
33 - def __init__(self, OutputInterface, Service):
34
35 if not hasattr(OutputInterface,'updateProgress'):
36 mytxt = _("OutputInterface does not have an updateProgress method")
37 raise IncorrectParameter("IncorrectParameter: %s, (! %s !)" % (OutputInterface,mytxt,))
38 elif not callable(OutputInterface.updateProgress):
39 mytxt = _("OutputInterface does not have an updateProgress method")
40 raise IncorrectParameter("IncorrectParameter: %s, (! %s !)" % (OutputInterface,mytxt,))
41
42 from entropy.services.ugc.interfaces import Client as Cl
43 if not isinstance(Service, (Cl,)):
44 mytxt = _("A valid entropy.services.ugc.interfaces.Client based instance is needed")
45 raise IncorrectParameter("IncorrectParameter: %s, (! %s !)" % (Service,mytxt,))
46
47 import socket, zlib, struct
48 import entropy.tools as entropyTools
49 import entropy.dump as dumpTools
50 self.entropyTools, self.socket, self.zlib, self.struct, self.dumpTools = entropyTools, socket, zlib, struct, dumpTools
51 self.Output = OutputInterface
52 self.Service = Service
53 self.output_header = ''
54 self.SystemSettings = SystemSettings()
55
57 do_skip = False
58
59 if data == None:
60 mytxt = _("feature not supported remotely")
61 self.Output.updateProgress(
62 "[%s:%s|%s:%s|%s:%s] %s" % (
63 darkblue(_("repo")),
64 bold(str(repository)),
65 darkred(_("arch")),
66 bold(str(arch)),
67 darkgreen(_("product")),
68 bold(str(product)),
69 blue(mytxt),
70 ),
71 importance = 1,
72 type = "error",
73 header = self.output_header
74 )
75 do_skip = True
76 elif not data:
77 mytxt = _("service temporarily not available")
78 self.Output.updateProgress(
79 "[%s:%s|%s:%s|%s:%s] %s" % (
80 darkblue(_("repo")),
81 bold(str(repository)),
82 darkred(_("arch")),
83 bold(str(arch)),
84 darkgreen(_("product")),
85 bold(str(product)),
86 blue(mytxt),
87 ),
88 importance = 1,
89 type = "error",
90 header = self.output_header
91 )
92 do_skip = True
93 elif data == self.Service.answers['no']:
94
95 mytxt = _("command failed")
96 self.Output.updateProgress(
97 "[%s:%s|%s:%s|%s:%s] %s" % (
98 darkblue(_("repo")),
99 bold(str(repository)),
100 darkred(_("arch")),
101 bold(str(arch)),
102 darkgreen(_("product")),
103 bold(str(product)),
104 blue(mytxt),
105 ),
106 importance = 1,
107 type = "error",
108 header = self.output_header
109 )
110 elif data != self.Service.answers['ok']:
111 mytxt = _("received wrong answer")
112 self.Output.updateProgress(
113 "[%s:%s|%s:%s|%s:%s] %s: %s" % (
114 darkblue(_("repo")),
115 bold(str(repository)),
116 darkred(_("arch")),
117 bold(str(arch)),
118 darkgreen(_("product")),
119 bold(str(product)),
120 blue(mytxt),
121 repr(data),
122 ),
123 importance = 1,
124 type = "error",
125 header = self.output_header
126 )
127 do_skip = True
128 return do_skip
129
131
132 cmd = "%s rc" % (session,)
133 self.Service.transmit(cmd)
134 try:
135 data = self.Service.receive()
136 return data
137 except:
138 self.entropyTools.print_traceback()
139 return None
140
142
143
144 error = False
145 try:
146 data = self.Service.stream_to_object(data, gzipped)
147 except (EOFError,IOError,self.zlib.error,self.dumpTools.pickle.UnpicklingError,):
148 mytxt = _("cannot convert stream into object")
149 self.Output.updateProgress(
150 "[%s:%s|%s:%s|%s:%s] %s" % (
151 darkblue(_("repo")),
152 bold(unicode(repository)),
153 darkred(_("arch")),
154 bold(unicode(arch)),
155 darkgreen(_("product")),
156 bold(unicode(product)),
157 blue(mytxt),
158 ),
159 importance = 1,
160 type = "error",
161 header = self.output_header
162 )
163 data = None
164 error = True
165 return data, error
166
167 - def retrieve_command_answer(self, cmd, session_id, repository = None, arch = None, product = None, compression = False):
168
169 tries = 3
170 lasterr = None
171 while 1:
172
173 if tries <= 0:
174 return lasterr
175 tries -= 1
176
177 try:
178
179 self.Service.transmit(cmd)
180 except (SSLError,):
181 return None
182
183 data = self.Service.receive()
184
185 skip = self.handle_standard_answer(data, repository, arch, product)
186 if skip:
187 continue
188
189 data = self.get_result(session_id)
190 if data == None:
191 lasterr = None
192 continue
193 elif not data:
194 lasterr = False
195 continue
196
197 objdata, error = self.convert_stream_to_object(data, compression, repository, arch, product)
198 if not error:
199 return objdata
200
202
203 self.Service.check_socket_connection()
204
205 while 1:
206 try:
207 result = self.retrieve_command_answer(cmd, session_id, compression = compression)
208 if result == None:
209 return False,'command not supported'
210 return result
211 except (self.socket.error,self.struct.error,):
212 self.Service.reconnect_socket()
213 tries -= 1
214 if tries < 1:
215 raise
216
218 self.Service.check_socket_connection()
219 cmd = "%s %s %s %s zlib" % (session, 'session_config', 'compression', do,)
220 self.Service.transmit(cmd)
221 data = self.Service.receive()
222 if data == self.Service.answers['ok']:
223 return True
224 return False
225
227
228 cmd = "%s %s %s %s" % (
229 session_id,
230 'login',
231 username,
232 password,
233 )
234 return self.do_generic_handler(cmd, session_id)
235
237
238 cmd = "%s %s %s" % (
239 session_id,
240 'logout',
241 username,
242 )
243 return self.do_generic_handler(cmd, session_id)
244
246
247 cmd = "%s %s" % (
248 session_id,
249 'user_data',
250 )
251 return self.do_generic_handler(cmd, session_id)
252
254
255 cmd = "%s %s" % (
256 session_id,
257 'is_user',
258 )
259 return self.do_generic_handler(cmd, session_id)
260
262
263 cmd = "%s %s" % (
264 session_id,
265 'is_developer',
266 )
267 return self.do_generic_handler(cmd, session_id)
268
270
271 cmd = "%s %s" % (
272 session_id,
273 'is_moderator',
274 )
275 return self.do_generic_handler(cmd, session_id)
276
278
279 cmd = "%s %s" % (
280 session_id,
281 'is_administrator',
282 )
283 return self.do_generic_handler(cmd, session_id)
284
286
287 cmd = "%s %s" % (
288 session_id,
289 'available_commands',
290 )
291 return self.do_generic_handler(cmd, session_id)
292
293
295
296 - def __init__(self, EntropyInterface, ServiceInterface):
298
300
301 myidlist = ' '.join([str(x) for x in idpackages])
302 cmd = "%s %s %s %s %s %s %s" % (
303 session_id,
304 'repository_server:dbdiff',
305 repository,
306 arch,
307 product,
308 self.SystemSettings['repositories']['branch'],
309 myidlist,
310 )
311
312
313 compression = self.set_gzip_compression(session_id, True)
314
315 data = self.do_generic_handler(cmd, session_id, tries = 5, compression = compression)
316
317
318 self.set_gzip_compression(session_id, False)
319
320 return data
321
323
324 cmd = "%s %s %s %s %s %s" % (
325 session_id,
326 'repository_server:treeupdates',
327 repository,
328 arch,
329 product,
330 self.SystemSettings['repositories']['branch'],
331 )
332 return self.do_generic_handler(cmd, session_id, tries = 5)
333
335
336 cmd = "%s %s %s %s %s %s" % (
337 session_id,
338 'repository_server:get_package_sets',
339 repository,
340 arch,
341 product,
342 self.SystemSettings['repositories']['branch'],
343 )
344 return self.do_generic_handler(cmd, session_id, tries = 5)
345
357
380
403
405
406 cmd = "%s %s %s" % (
407 session_id,
408 'ugc:do_downloads',
409 ' '.join(pkgkeys),
410 )
411 return self.do_generic_handler(cmd, session_id)
412
414
415 release_string = '--N/A--'
416 rel_file = etpConst['systemreleasefile']
417 if os.path.isfile(rel_file) and os.access(rel_file,os.R_OK):
418 with open(rel_file,"r") as f:
419 release_string = f.read(512)
420
421 hw_hash = self.SystemSettings['hw_hash']
422 if not hw_hash:
423 hw_hash = ''
424
425 mydict = {
426 'branch': self.SystemSettings['repositories']['branch'],
427 'release_string': release_string,
428 'hw_hash': hw_hash,
429 'pkgkeys': ' '.join(pkgkeys),
430 }
431 xml_string = self.entropyTools.xml_from_dict(mydict)
432
433 cmd = "%s %s %s" % (
434 session_id,
435 'ugc:do_download_stats',
436 xml_string,
437 )
438 return self.do_generic_handler(cmd, session_id)
439
441
442 cmd = "%s %s %s" % (
443 session_id,
444 'ugc:get_downloads',
445 pkgkey,
446 )
447 return self.do_generic_handler(cmd, session_id)
448
450
451 cmd = "%s %s" % (
452 session_id,
453 'ugc:get_alldownloads',
454 )
455
456
457 compression = self.set_gzip_compression(session_id, True)
458
459 rc = self.do_generic_handler(cmd, session_id, compression = compression)
460
461
462 self.set_gzip_compression(session_id, False)
463
464 return rc
465
467
468 cmd = "%s %s %s %s" % (
469 session_id,
470 'ugc:do_vote',
471 pkgkey,
472 vote,
473 )
474 return self.do_generic_handler(cmd, session_id)
475
477
478 cmd = "%s %s %s" % (
479 session_id,
480 'ugc:get_vote',
481 pkgkey,
482 )
483 return self.do_generic_handler(cmd, session_id)
484
486
487 cmd = "%s %s" % (
488 session_id,
489 'ugc:get_allvotes',
490 )
491
492
493 compression = self.set_gzip_compression(session_id, True)
494
495 rc = self.do_generic_handler(cmd, session_id, compression = compression)
496
497
498 self.set_gzip_compression(session_id, False)
499
500 return rc
501
519
536
545
547
548 cmd = "%s %s %s" % (
549 session_id,
550 'ugc:remove_image',
551 iddoc,
552 )
553 return self.do_generic_handler(cmd, session_id)
554
556
557 cmd = "%s %s %s" % (
558 session_id,
559 'ugc:remove_file',
560 iddoc,
561 )
562 return self.do_generic_handler(cmd, session_id)
563
565
566 cmd = "%s %s %s" % (
567 session_id,
568 'ugc:remove_youtube_video',
569 iddoc,
570 )
571 return self.do_generic_handler(cmd, session_id)
572
574
575 cmd = "%s %s %s" % (
576 session_id,
577 'ugc:get_alldocs',
578 pkgkey,
579 )
580 return self.do_generic_handler(cmd, session_id)
581
582 - def ugc_get_textdocs(self, session_id, pkgkey):
583
584 cmd = "%s %s %s" % (
585 session_id,
586 'ugc:get_textdocs',
587 pkgkey,
588 )
589 return self.do_generic_handler(cmd, session_id)
590
591 - def ugc_get_textdocs_by_identifiers(self, session_id, identifiers):
592
593 cmd = "%s %s %s" % (
594 session_id,
595 'ugc:get_textdocs_by_identifiers',
596 ' '.join([str(x) for x in identifiers]),
597 )
598 return self.do_generic_handler(cmd, session_id)
599
601
602 cmd = "%s %s %s" % (
603 session_id,
604 'ugc:get_documents_by_identifiers',
605 ' '.join([str(x) for x in identifiers]),
606 )
607 return self.do_generic_handler(cmd, session_id)
608
610
611 if not (os.path.isfile(file_path) and os.access(file_path,os.R_OK)):
612 return False,False,'cannot read file_path'
613
614 import zlib
615
616 cmd = "%s %s %s on" % (
617 session_id,
618 'session_config',
619 'stream',
620 )
621 status, msg = self.do_generic_handler(cmd, session_id)
622 if not status:
623 return False,status,msg
624
625
626 compression = self.set_gzip_compression(session_id, True)
627
628
629 stream_status = True
630 stream_msg = 'ok'
631 f = open(file_path,"rb")
632 chunk = f.read(8192)
633 base_path = os.path.basename(file_path)
634 transferred = len(chunk)
635 max_size = self.entropyTools.get_file_size(file_path)
636 while chunk:
637
638 if (not self.Service.quiet) or self.Service.show_progress:
639 self.Output.updateProgress(
640 "%s, %s: %s" % (
641 blue(_("User Generated Content")),
642 darkgreen(_("sending file")),
643 darkred(base_path),
644 ),
645 importance = 1,
646 type = "info",
647 header = brown(" @@ "),
648 back = True,
649 count = (transferred,max_size,),
650 percent = True
651 )
652
653 chunk = zlib.compress(chunk, 7)
654 cmd = "%s %s %s" % (
655 session_id,
656 'stream',
657 chunk,
658 )
659 status, msg = self.do_generic_handler(cmd, session_id, compression = compression)
660 if not status:
661 stream_status = status
662 stream_msg = msg
663 break
664 chunk = f.read(8192)
665 transferred += len(chunk)
666
667 f.close()
668
669
670 self.set_gzip_compression(session_id, False)
671
672
673 cmd = "%s %s %s off" % (
674 session_id,
675 'session_config',
676 'stream',
677 )
678 status, msg = self.do_generic_handler(cmd, session_id)
679 if not status:
680 return False,status,msg
681
682 return True,stream_status,stream_msg
683
684 - def ugc_send_file(self, session_id, pkgkey, file_path, doc_type, title, description, keywords):
685
686 status, rem_status, err_msg = self.ugc_send_file_stream(session_id, file_path)
687 if not (status and rem_status):
688 return False,err_msg
689
690 mydict = {
691 'doc_type': str(doc_type),
692 'title': title,
693 'description': description,
694 'keywords': keywords,
695 'file_name': os.path.join(pkgkey,os.path.basename(file_path)),
696 'real_filename': os.path.basename(file_path),
697 }
698 xml_string = self.entropyTools.xml_from_dict(mydict)
699
700 cmd = "%s %s %s %s" % (
701 session_id,
702 'ugc:register_stream',
703 pkgkey,
704 xml_string,
705 )
706 return self.do_generic_handler(cmd, session_id)
707
709
710 import zlib
711 xml_string = self.entropyTools.xml_from_dict_extended(error_data)
712 xml_comp_string = zlib.compress(xml_string)
713
714 cmd = "%s %s %s" % (
715 session_id,
716 'ugc:report_error',
717 xml_comp_string,
718 )
719
720 return self.do_generic_handler(cmd, session_id)
721