home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / system-config-printer / troubleshoot / CheckNetworkServerSanity.py < prev    next >
Encoding:
Python Source  |  2009-05-05  |  7.1 KB  |  184 lines

  1. #!/usr/bin/env python
  2.  
  3. ## Printing troubleshooter
  4.  
  5. ## Copyright (C) 2008 Red Hat, Inc.
  6. ## Copyright (C) 2008 Tim Waugh <twaugh@redhat.com>
  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., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22. import cups
  23. import os
  24. import smburi
  25. import socket
  26. import subprocess
  27. from timedops import TimedSubprocess, TimedOperation
  28. from base import *
  29.  
  30. try:
  31.     import smbc
  32. except:
  33.     pass
  34.  
  35. class CheckNetworkServerSanity(Question):
  36.     def __init__ (self, troubleshooter):
  37.         Question.__init__ (self, troubleshooter, "Check network server sanity")
  38.         troubleshooter.new_page (gtk.Label (), self)
  39.  
  40.     def display (self):
  41.         # Collect useful information.
  42.  
  43.         self.answers = {}
  44.         answers = self.troubleshooter.answers
  45.         if (not answers.has_key ('remote_server_name') and
  46.             not answers.has_key ('remote_server_ip_address')):
  47.             return False
  48.  
  49.         parent = self.troubleshooter.get_window ()
  50.  
  51.         server_name = answers['remote_server_name']
  52.         server_port = answers.get('remote_server_port', 631)
  53.         if server_name:
  54.             # Try resolving the hostname.
  55.             try:
  56.                 ai = socket.getaddrinfo (server_name, server_port)
  57.                 resolves = map (lambda (family, socktype,
  58.                                         proto, canonname, sockaddr):
  59.                                     sockaddr[0], ai)
  60.             except socket.gaierror:
  61.                 resolves = False
  62.  
  63.             self.answers['remote_server_name_resolves'] = resolves
  64.  
  65.             if resolves:
  66.                 ipaddr = answers.get ('remote_server_ip_address', '')
  67.                 if ipaddr:
  68.                     try:
  69.                         resolves.index (ipaddr)
  70.                     except ValueError:
  71.                         # The IP address given doesn't match the server name.
  72.                         # Use the IP address instead of the name.
  73.                         server_name = ipaddr
  74.         else:
  75.             server_name = answers['remote_server_ip_address']
  76.             # Validate it.
  77.             try:
  78.                 ai = socket.getaddrinfo (server_name, server_port)
  79.                 resolves = map (lambda (family, socktype,
  80.                                         proto, canonname, sockaddr):
  81.                                     sockaddr[0], ai)
  82.             except socket.gaierror:
  83.                 resolves = False
  84.  
  85.             self.answers['remote_server_name_resolves'] = resolves
  86.  
  87.         self.answers['remote_server_try_connect'] = server_name
  88.  
  89.         if (self.answers['remote_server_name_resolves'] and
  90.             answers.get ('cups_device_uri_scheme', 'ipp') == 'ipp'):
  91.             try:
  92.                 cups.setServer (server_name)
  93.                 cups.setPort (server_port)
  94.                 self.op = TimedOperation (cups.Connection, parent=parent)
  95.                 c = self.op.run ()
  96.                 ipp_connect = True
  97.             except RuntimeError:
  98.                 ipp_connect = False
  99.  
  100.             self.answers['remote_server_connect_ipp'] = ipp_connect
  101.  
  102.             if ipp_connect:
  103.                 try:
  104.                     self.op = TimedOperation (c.getPrinters, parent=parent)
  105.                     self.op.run ()
  106.                     cups_server = True
  107.                 except:
  108.                     cups_server = False
  109.  
  110.                 self.answers['remote_server_cups'] = cups_server
  111.  
  112.                 if cups_server and answers.get ('cups_queue', False):
  113.                     try:
  114.                         self.op = TimedOperation (c.getPrinterAttributes,
  115.                                                   args=(answers['cups_queue'],),
  116.                                                   parent=parent)
  117.                         attr = self.op.run ()
  118.                         self.answers['remote_cups_queue_attributes'] = attr
  119.                     except:
  120.                         pass
  121.  
  122.         if (self.answers['remote_server_name_resolves'] and
  123.             not self.answers.get ('remote_server_connect_ipp', False)):
  124.             # Try to see if we can connect using smbc.
  125.             context = None
  126.             try:
  127.                 context = smbc.Context ()
  128.                 name = self.answers['remote_server_try_connect']
  129.                 self.op = TimedOperation (context.opendir,
  130.                                           args=("smb://%s/" % name,),
  131.                                           parent=parent)
  132.                 dir = self.op.run ()
  133.                 self.op = TimedOperation (dir.getdents, parent=parent)
  134.                 shares = self.op.run ()
  135.                 self.answers['remote_server_smb'] = True
  136.                 self.answers['remote_server_smb_shares'] = shares
  137.             except NameError:
  138.                 # No smbc support
  139.                 pass
  140.             except RuntimeError, (e, s):
  141.                 self.answers['remote_server_smb_shares'] = (e, s)
  142.  
  143.             if context != None and answers.has_key ('cups_printer_dict'):
  144.                 uri = answers['cups_printer_dict'].get ('device-uri', '')
  145.                 u = smburi.SMBURI (uri)
  146.                 (group, host, share, user, password) = u.separate ()
  147.                 accessible = False
  148.                 try:
  149.                     self.op = TimedOperation (context.open,
  150.                                               args=("smb://%s/%s" % (host,
  151.                                                                      share),
  152.                                                     os.O_RDWR,
  153.                                                     0777),
  154.                                               parent=parent)
  155.                     f  = self.op.run ()
  156.                     accessible = True
  157.                 except RuntimeError, (e, s):
  158.                     accessible = (e, s)
  159.  
  160.                 self.answers['remote_server_smb_share_anon_access'] = accessible
  161.  
  162.         # Try traceroute if we haven't already.
  163.         if (self.answers['remote_server_name_resolves'] and
  164.             not answers.has_key ('remote_server_traceroute')):
  165.             try:
  166.                 self.op = TimedSubprocess (parent=parent,
  167.                                            args=['traceroute', '-w', '1',
  168.                                                  server_name],
  169.                                            stdin=file("/dev/null"),
  170.                                            stdout=subprocess.PIPE,
  171.                                            stderr=subprocess.PIPE)
  172.                 self.answers['remote_server_traceroute'] = self.op.run ()
  173.             except:
  174.                 # Problem executing command.
  175.                 pass
  176.  
  177.         return False
  178.  
  179.     def collect_answer (self):
  180.         return self.answers
  181.  
  182.     def cancel_operation (self):
  183.         self.op.cancel ()
  184.