[pkg-fso-commits] [SCM] FSO frameworkd Debian packaging branch, master, updated. milestone4-368-g700ab82
Michael 'Mickey' Lauer
mickey at vanille-media.de
Mon Feb 2 18:51:33 UTC 2009
The following commit has been merged in the master branch:
commit 71e1807d068da6c04f66fa12d37cb6e4308e0be5
Author: Michael 'Mickey' Lauer <mickey at vanille-media.de>
Date: Thu Dec 11 20:08:46 2008 +0100
ogsmd: ppp has a serious shutdown problem :/ working around it
diff --git a/framework/subsystems/ogsmd/modems/abstract/mediator.py b/framework/subsystems/ogsmd/modems/abstract/mediator.py
index 9dfcacf..20b0726 100644
--- a/framework/subsystems/ogsmd/modems/abstract/mediator.py
+++ b/framework/subsystems/ogsmd/modems/abstract/mediator.py
@@ -1444,11 +1444,14 @@ class PdpActivateContext( PdpMediator ):
class PdpDeactivateContext( PdpMediator ):
#=========================================================================#
def trigger( self ):
- self._commchannel.enqueue( '+CGACT=0', self.responseFromChannel, self.errorFromChannel )
+ # the right way... leading to a hanging pppd :(
+ #self._commchannel.enqueue( '+CGACT=0', self.responseFromChannel, self.errorFromChannel )
+ # the workaround
+ global pdpConnection
+ if pdpConnection is not None and pdpConnection.isActive():
+ pdpConnection.deactivate()
self._ok()
- # FIXME do we want to wait and honor the result?
-
#=========================================================================#
class PdpGetContextStatus( PdpMediator ):
#=========================================================================#
diff --git a/framework/subsystems/ogsmd/modems/abstract/pdp.py b/framework/subsystems/ogsmd/modems/abstract/pdp.py
index e7d2af6..cacb55a 100644
--- a/framework/subsystems/ogsmd/modems/abstract/pdp.py
+++ b/framework/subsystems/ogsmd/modems/abstract/pdp.py
@@ -19,7 +19,7 @@ from .mediator import AbstractMediator
from .overlay import OverlayFile
import gobject
-import os, signal, copy
+import os, subprocess, signal, copy
import logging
logger = logging.getLogger( "ogsmd.pdp" )
@@ -36,7 +36,7 @@ class Pdp( AbstractMediator ):
self._callchannel = self._object.modem.communicationChannel( "PdpMediator" )
self.state = "release" # initial state
- self.cpid = -1
+ self.ppp = None
self.overlays = []
#
@@ -92,7 +92,7 @@ class Pdp( AbstractMediator ):
self.overlays = []
def _activate( self ):
- if self.cpid >= 0:
+ if self.ppp is not None and self.ppp.poll() is None:
raise Exception( "already active" )
self.port = str( self._object.modem.dataPort() )
@@ -100,30 +100,17 @@ class Pdp( AbstractMediator ):
raise Exception( "no device" )
logger.debug( "activate got port %s" % self.port )
- ppp_arguments = [ self.__class__.PPP_BINARY, self.port ] + self.ppp_options
- logger.info( "launching ppp with commandline %s" % ppp_arguments )
+ ppp_commandline = [ self.__class__.PPP_BINARY, self.port ] + self.ppp_options
+ logger.info( "launching ppp as commandline %s" % ppp_commandline )
self._prepareFiles()
- self.cpid, fdin, fdout, fderr = gobject.spawn_async(
- ppp_arguments,
- standard_input = False,
- standard_output = True,
- standard_error = True,
- flags = gobject.SPAWN_DO_NOT_REAP_CHILD )
+ self.ppp = subprocess.Popen( ppp_commandline )
- # FIXME launch watchdog here -- if the ppp is not getting launched, we have allocated
- # a virtual channel that never gets freed (need to open and close it)
-
- self.fds = fdin, fdout, fderr
-
- self.output_sources = [ gobject.io_add_watch( fdout, gobject.IO_IN, self._spawnedProcessOutput ),
- gobject.io_add_watch( fderr, gobject.IO_IN, self._spawnedProcessOutput ) ]
- self.childwatch_source = gobject.child_watch_add( self.cpid, self._spawnedProcessDone )
# FIXME bad polling here
self.timeout_source = gobject.timeout_add_seconds( 2, self._pollInterface )
- logger.info( "pppd launched, pid %d. See logread -f for output." % self.cpid )
+ logger.info( "pppd launched, pid %d. See logread -f for output." % self.ppp.pid )
# FIXME that's premature. we might adopt the following states:
# "setup", "active", "shutdown", "release"
@@ -136,49 +123,25 @@ class Pdp( AbstractMediator ):
self._object.ContextStatus( 1, newstate, {} )
def _deactivate( self ):
- if self.cpid < 0:
- raise Exception('already inactive')
-
- logger.info( "shutting down pppd, pid %d." % self.cpid )
-
- os.kill( self.cpid, signal.SIGINT )
+ if self.ppp.poll() is not None:
+ return
- # control flow will continue in self._spawnedProcessDone
- #p, r = waitpid(self.cpid, 0)
+ logger.info( "shutting down pppd, pid %d." % self.ppp.pid )
- def _spawnedProcessOutput( self, source, condition ):
- """Gets called when ppp outputs anything."""
- data = os.read( source, 512 )
- logger.debug( "got output from ppp: %s" % repr(data) )
- return True
-
- def _spawnedProcessDone( self, pid, condition ):
- """Gets called from mainloop when ppp exits."""
+ os.kill( self.ppp.pid, signal.SIGTERM )
+ #os.kill( self.ppp.pid, signal.SIGKILL )
- # FIXME find a way to distinguish between a planned shutdown
- # (our kill) and an unexpected shutdown
- #
- # Exit codes:
- # 8 - connect script failed
- # 5 - normal abort due to SIGINT
- #
+ logger.debug( "waiting for process to quit..." )
+ self.ppp.wait()
- for source in [ self.childwatch_source, self.timeout_source ] + self.output_sources:
- if source is not None:
- gobject.source_remove( source )
- for fd in self.fds:
- if fd is not None:
- os.close( fd )
+ self._spawnedProcessDone()
- exitcode = (condition >> 8) & 0xFF
- exitsignal = condition & 0xFF
- logger.info( "pppd exited with code %d and signal %d" % ( exitcode, exitsignal ) )
+ def _spawnedProcessDone( self ):
+ logger.info( "pppd exited with code %d" % self.ppp.returncode )
# FIXME check whether this was a planned exit or not, if not, try to recover
self._updateState( "release" )
-
- self.cpid = -1
self._recoverFiles()
# FIXME find a better way to restore the default route
@@ -245,19 +208,7 @@ exec /usr/sbin/chat -v\
"""
PPP_DAEMON_SETUP[ PPP_DISCONNECT_CHAT_FILENAME ] = r"""#!/bin/sh -e
-exec /usr/sbin/chat -v\
- 'ABORT' 'OK'\
- 'ABORT' 'BUSY'\
- 'ABORT' 'DELAYED'\
- 'ABORT' 'NO ANSWER'\
- 'ABORT' 'NO CARRIER'\
- 'ABORT' 'NO DIALTONE'\
- 'ABORT' 'VOICE'\
- 'ABORT' 'ERROR'\
- 'ABORT' 'RINGING'\
- 'TIMEOUT' '60'\
- '' '\k\k\k\d+++ATH'\
- 'NO CARRIER-AT-OK' ''
+echo disconnect script running...
"""
PPP_DAEMON_SETUP["/etc/ppp/ip-up.d/08setupdns"] = """#!/bin/sh -e
diff --git a/framework/subsystems/ogsmd/modems/ti_calypso/modem.py b/framework/subsystems/ogsmd/modems/ti_calypso/modem.py
index 99e0a41..6c825b5 100644
--- a/framework/subsystems/ogsmd/modems/ti_calypso/modem.py
+++ b/framework/subsystems/ogsmd/modems/ti_calypso/modem.py
@@ -98,8 +98,8 @@ class TiCalypso( AbstractModem ):
'holdoff', '3',
'ipcp-accept-local',
'ktune',
- 'lcp-echo-failure', '10',
- 'lcp-echo-interval', '20',
+ #'lcp-echo-failure', '10',
+ #'lcp-echo-interval', '20',
'ipcp-max-configure', '4',
'lock',
'noauth',
--
FSO frameworkd Debian packaging
More information about the pkg-fso-commits
mailing list