port_publisher: improve logging outputs -q/-v
diff --git a/examples/port_publisher.py b/examples/port_publisher.py
index bf25ed1..e527693 100755
--- a/examples/port_publisher.py
+++ b/examples/port_publisher.py
@@ -96,11 +96,12 @@
     - Zeroconf publish/unpublish on open/close.

     """

 

-    def __init__(self, device, name, network_port, on_close=None):

+    def __init__(self, device, name, network_port, on_close=None, log=None):

         ZeroconfService.__init__(self, name, network_port, stype='_serial_port._tcp')

         self.alive = False

         self.network_port = network_port

         self.on_close = on_close

+        self.log = log

         self.device = device

         self.serial = serial.Serial()

         self.serial.port = device

@@ -147,8 +148,8 @@
         except socket.error as msg:

             self.handle_server_error()

             #~ raise

-        if not options.quiet:

-            print("%s: Waiting for connection on %s..." % (self.device, self.network_port))

+        if self.log is not None:

+            self.log.info("%s: Waiting for connection on %s..." % (self.device, self.network_port))

 

         # zeroconfig

         self.publish()

@@ -158,8 +159,8 @@
 

     def close(self):

         """Close all resources and unpublish service"""

-        if not options.quiet:

-            print("%s: closing..." % (self.device, ))

+        if self.log is not None:

+            self.log.info("%s: closing..." % (self.device, ))

         self.alive = False

         self.unpublish()

         if self.server_socket: self.server_socket.close()

@@ -284,18 +285,19 @@
             self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 3)

             self.socket.setblocking(0)

             self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

-            if not options.quiet:

-                print('%s: Connected by %s:%s' % (self.device, addr[0], addr[1]))

+            if self.log is not None:

+                self.log.info('%s: Connected by %s:%s' % (self.device, addr[0], addr[1]))

             self.serial.setRTS(True)

             self.serial.setDTR(True)

-            # XXX set logger only optionally

-            #~ self.rfc2217 = serial.rfc2217.PortManager(self.serial, self, logger=logging.getLogger('rfc2217.%s' % self.device))

-            self.rfc2217 = serial.rfc2217.PortManager(self.serial, self)

+            if self.log is not None:

+                self.rfc2217 = serial.rfc2217.PortManager(self.serial, self, logger=log.getChild(self.device))

+            else:

+                self.rfc2217 = serial.rfc2217.PortManager(self.serial, self)

         else:

             # reject connection if there is already one

             connection.close()

-            if not options.quiet:

-                print('%s: Rejecting connect from %s:%s' % (self.device, addr[0], addr[1]))

+            if self.log is not None:

+                self.log.info('%s: Rejecting connect from %s:%s' % (self.device, addr[0], addr[1]))

 

     def handle_server_error(self):

         """Socket server fails"""

@@ -318,8 +320,8 @@
             if self.socket is not None:

                 self.socket.close()

                 self.socket = None

-                if not options.quiet:

-                    print('%s: Disconnected' % self.device)

+                if self.log is not None:

+                    self.log.info('%s: Disconnected' % self.device)

 

 

 def test():

@@ -333,6 +335,13 @@
     import logging

     import optparse

 

+    VERBOSTIY = [

+            logging.ERROR,      # 0

+            logging.WARNING,    # 1 (default)

+            logging.INFO,       # 2

+            logging.DEBUG,      # 3

+            ]

+

     parser = optparse.OptionParser(usage="""\

 %prog [options]

 

@@ -346,11 +355,18 @@
 """)

 

     parser.add_option("-q", "--quiet",

-            dest="quiet",

-            action="store_true",

-            help="suppress non error messages",

+            dest="verbosity",

+            action="store_const",

+            const=0,

+            help="suppress most diagnostic messages",

             default=False)

 

+    parser.add_option("-v", "--verbose",

+            dest="verbosity",

+            action="count",

+            help="increase diagnostic messages",

+            default=1)

+

     parser.add_option("-o", "--logfile",

             dest="log_file",

             help="write messages file instead of stdout",

@@ -384,8 +400,9 @@
 

     (options, args) = parser.parse_args()

 

-    # XXX make it depend on command line option

-    #~ logging.basicConfig(level=logging.DEBUG)

+    # set up logging

+    logging.basicConfig(level=VERBOSTIY[min(options.verbosity, len(VERBOSTIY) - 1)])

+    log = logging.getLogger('port_publisher')

 

     # redirect output if specified

     if options.log_file is not None:

@@ -397,7 +414,7 @@
                 self.fileobj.flush()

             def close(self):

                 self.fileobj.close()

-                sys.stdout = sys.stderr = WriteFlushed(open(options.log_file, 'a'))

+        sys.stdout = sys.stderr = WriteFlushed(open(options.log_file, 'a'))

         # atexit.register(lambda: sys.stdout.close())

 

     if options.daemonize:

@@ -412,7 +429,7 @@
                 # exit first parent

                 sys.exit(0)

         except OSError as e:

-            sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))

+            log.critical("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))

             sys.exit(1)

 

         # decouple from parent environment

@@ -430,7 +447,7 @@
                     open(options.pid_file,'w').write("%d"%pid)

                 sys.exit(0)

         except OSError as e:

-            sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))

+            log.critical("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))

             sys.exit(1)

 

         if options.log_file is None:

@@ -470,7 +487,7 @@
         except KeyError:

             pass

         else:

-            if not options.quiet: print("unpublish: %s" % (forwarder))

+            log.info("unpublish: %s" % (forwarder))

 

     alive = True

     next_check = 0

@@ -484,7 +501,7 @@
                 connected = [d for d, p, i in serial.tools.list_ports.grep(options.ports_regex)]

                 # Handle devices that are published, but no longer connected

                 for device in set(published).difference(connected):

-                    if not options.quiet: print("unpublish: %s" % (published[device]))

+                    log.info("unpublish: %s" % (published[device]))

                     unpublish(published[device])

                 # Handle devices that are connected but not yet published

                 for device in set(connected).difference(published):

@@ -497,9 +514,10 @@
                         device,

                         "%s on %s" % (device, hostname),

                         port,

-                        on_close=unpublish

+                        on_close=unpublish,

+                        log=log

                     )

-                    if not options.quiet: print("publish: %s" % (published[device]))

+                    log.warning("publish: %s" % (published[device]))

                     published[device].open()

 

             # select_start = time.time()