示例#1
0
 def reply_exception(self, exc, info, socket):
     # hook for subclassing
     reply_exception(exc, info, socket)
示例#2
0
   def start(self):
       """after init, listen for commands."""
       from gfsocket import READY, ERROR, unpack_certified_data
       verbose = self.verbose
       socket = self.socket
       connection = self.connection
       policies = self.policies
       admin_policy = self.admin_policy
       pending_connects = {}
       while 1:
           try:
               # main loop
               if self.check_loop < 0:
                   self.check_loop=5
               for i in xrange(self.check_loop):
                   if verbose:
                       print "main loop on", socket, connection
                   # checkpoint loop
                   sockets = [socket]
                   if pending_connects:
                       sockets = sockets + pending_connects.keys()
                   # wait for availability
                   if verbose:
                       print "server: waiting for connection(s)"
                   (readables, dummy, errors) = select.select(\
                      sockets, [], sockets[:], self.select_timeout)
                   if socket in errors:
                       raise ServerError, \
                         "listening socket in error state: aborting"
                   # clean up error connection sockets
                   for s in errors:
                       del pending_connects[s]
                       s.close()
                   # get a new connection, if available
                   if socket in readables:
                       readables.remove(socket)
                       (conn, addr) = socket.accept()
                       if 1 or verbose:
                           print "connect %s" % (addr,)
                       reader = Packet_Reader(conn)
                       pending_connects[conn] = reader
                   # poll readable pending connections, if possible
                   for conn in readables:
                       reader = pending_connects[conn]
                       mode = reader.mode
                       if not mode==READY:
                           if mode == ERROR:
                               # shouldn't happen
                               try:
                                   conn.close()
                                   del pending_connects[conn]
                               except: pass
                               continue
                           else:
                               try:
                                   reader.poll()
                               finally:
                                   pass # AFTER DEBUG CHANGE THIS!
                   # in blocking mode, service ready request,
                   # commit on no error
                   for conn in pending_connects.keys():
                       reader = pending_connects[conn]
                       mode = reader.mode
                       if mode == ERROR:
                           try:
                               del pending_connects[conn]
                               conn.close()
                           except: pass
                       elif mode == READY:
                           try:
                               del pending_connects[conn]
                               data = reader.data
                               (actor_name, cert, md) = \
                                 unpack_certified_data(data)
                               # find the policy for this actor
                               if not policies.has_key(actor_name):
                                   if verbose:
                                       print "no such policy: "+actor_name
                                   reply_exception(NameError,
                                    "no such policy: "+actor_name, conn)
                                   policy = None
                               else:
                                   if verbose:
                                       print "executing for", actor_name
                                   policy = policies[actor_name]
                                   policy.action(cert, md, conn)
                           except SHUTDOWN:
                               if policy is admin_policy:
                                   print \
 "shutdown on admin policy: terminating"
                                   connection.close()
                                   socket.close()
                                   # NORMAL TERMINATION:
                                   return
                           except RESTART:
                               if policy is admin_policy:
                                   print \
 "restart from admin policy: restarting connection"
                                   connection.restart()
                           except CHECKPOINT:
                               if policy is admin_policy:
                                   print \
 "checkpoint from admin policy: checkpointing now."
                                   connection.checkpoint()
                           except:
                               tb = sys.exc_traceback
                               info = "%s %s" % (sys.exc_type,
                                            str(sys.exc_value))
                               if verbose:
                                   from traceback import print_tb
                                   print_tb(tb)
                               print "error in executing action: "+info
                               reply_exception(
 ServerError, "exception: "+info, conn)
                       #break # stop after first request serviced!
           except:
               # except of main while 1 try statement
               tb = sys.exc_traceback
               ty = sys.exc_type
               va = sys.exc_value
               print "UNEXPECTED EXCEPTION ON MAINLOOP"
               from traceback import print_tb
               print_tb(tb)
               print "exception:", ty, va
           if not pending_connects:
               pending_connects = {}
           print "server: checkpointing"
           connection.checkpoint()
示例#3
0
   def start(self):
       """after init, listen for commands."""
       from gfsocket import READY, ERROR, unpack_certified_data
       import sys
       verbose = self.verbose
       socket = self.socket
       connection = self.connection
       policies = self.policies
       admin_policy = self.admin_policy
       from select import select
       pending_connects = {}
       while 1:
           try:
               # main loop
               if self.check_loop < 0: self.check_loop = 5
               for i in xrange(self.check_loop):
                   if verbose:
                       print "main loop on", socket, connection
                   # checkpoint loop
                   sockets = [socket]
                   if pending_connects:
                       sockets = sockets + pending_connects.keys()
                   # wait for availability
                   if verbose:
                       print "server: waiting for connection(s)"
                   (readables, dummy, errors) = select(\
                      sockets, [], sockets[:], self.select_timeout)
                   if socket in errors:
                       raise ServerError, \
                         "listening socket in error state: aborting"
                   # clean up error connection sockets
                   for s in errors:
                       del pending_connects[s]
                       s.close()
                   # get a new connection, if available
                   if socket in readables:
                       readables.remove(socket)
                       (conn, addr) = socket.accept()
                       if 1 or verbose:
                           print "connect %s" % (addr, )
                       reader = Packet_Reader(conn)
                       pending_connects[conn] = reader
                   # poll readable pending connections, if possible
                   for conn in readables:
                       reader = pending_connects[conn]
                       mode = reader.mode
                       if not mode == READY:
                           if mode == ERROR:
                               # shouldn't happen
                               try:
                                   conn.close()
                                   del pending_connects[conn]
                               except:
                                   pass
                               continue
                           else:
                               try:
                                   reader.poll()
                               finally:
                                   pass  # AFTER DEBUG CHANGE THIS!
                   # in blocking mode, service ready request,
                   # commit on no error
                   for conn in pending_connects.keys():
                       reader = pending_connects[conn]
                       mode = reader.mode
                       if mode == ERROR:
                           try:
                               del pending_connects[conn]
                               conn.close()
                           except:
                               pass
                       elif mode == READY:
                           try:
                               del pending_connects[conn]
                               data = reader.data
                               (actor_name, cert, md) = \
                                 unpack_certified_data(data)
                               # find the policy for this actor
                               if not policies.has_key(actor_name):
                                   if verbose:
                                       print "no such policy: " + actor_name
                                   reply_exception(
                                       NameError,
                                       "no such policy: " + actor_name, conn)
                                   policy = None
                               else:
                                   if verbose:
                                       print "executing for", actor_name
                                   policy = policies[actor_name]
                                   policy.action(cert, md, conn)
                           except SHUTDOWN:
                               if policy is admin_policy:
                                   print \
 "shutdown on admin policy: terminating"
                                   connection.close()
                                   socket.close()
                                   # NORMAL TERMINATION:
                                   return
                           except RESTART:
                               if policy is admin_policy:
                                   print \
 "restart from admin policy: restarting connection"
                                   connection.restart()
                           except CHECKPOINT:
                               if policy is admin_policy:
                                   print \
 "checkpoint from admin policy: checkpointing now."
                                   connection.checkpoint()
                           except:
                               tb = sys.exc_traceback
                               info = "%s %s" % (sys.exc_type,
                                                 str(sys.exc_value))
                               if verbose:
                                   from traceback import print_tb
                                   print_tb(tb)
                               print "error in executing action: " + info
                               reply_exception(ServerError,
                                               "exception: " + info, conn)
                       #break # stop after first request serviced!
           except:
               # except of main while 1 try statement
               tb = sys.exc_traceback
               ty = sys.exc_type
               va = sys.exc_value
               print "UNEXPECTED EXCEPTION ON MAINLOOP"
               from traceback import print_tb
               print_tb(tb)
               print "exception:", ty, va
           if not pending_connects:
               pending_connects = {}
           print "server: checkpointing"
           connection.checkpoint()
示例#4
0
 def reply_exception(self, exc, info, socket):
     # hook for subclassing
     reply_exception(exc, info, socket)