module TaskJuggler::ProcessIntercom
Public Instance Methods
checkKey(authKey, command)
click to toggle source
# File lib/taskjuggler/daemon/ProcessIntercom.rb, line 128 def checkKey(authKey, command) if authKey == @authKey debug('', "Accepted authentication key for command '#{command}'") else warning('auth_key_rejected', "Rejected wrong authentication key #{authKey}" + "for command '#{command}'") return false end true end
connect(stdout, stderr, stdin, silent)
click to toggle source
# File lib/taskjuggler/daemon/ProcessIntercom.rb, line 93 def connect(stdout, stderr, stdin, silent) # Set the client lock. @clientConnection.lock debug('', 'Rerouting ProjectServer standard IO to client') # Make sure that all output to STDOUT and STDERR is sent to the client. # Input is read from the client STDIN. We save a copy of the old file # handles so we can restore then later again. @stdout = $stdout @stderr = $stderr @stdin = $stdin $stdout = stdout if stdout $stderr = stderr if stdout $stdin = stdin if stdin Log.silent = silent Term::ANSIColor.coloring = !silent debug('', 'IO is now routed to the client') true end
disconnect()
click to toggle source
# File lib/taskjuggler/daemon/ProcessIntercom.rb, line 112 def disconnect debug('', 'Restoring IO') Log.silent = true $stdout = @stdout if @stdout $stderr = @stderr if @stderr $stdin = @stdin if @stdin debug('', 'Standard IO has been restored') # Release the client lock @clientConnection.unlock true end
generateAuthKey()
click to toggle source
# File lib/taskjuggler/daemon/ProcessIntercom.rb, line 124 def generateAuthKey rand(1000000000).to_s end
initIntercom()
click to toggle source
# File lib/taskjuggler/daemon/ProcessIntercom.rb, line 71 def initIntercom # This is the authentication key that clients will need to provide to # execute DRb methods. @authKey = generateAuthKey # This flag will be set to true by DRb method calls to terminate the # process. @terminate = false # This mutex is locked while a client is connected. @clientConnection = Mutex.new # This lock protects the @timerStart @timeLock = Monitor.new # The time stamp of the last client interaction. @timerStart = nil end
restartTimer()
click to toggle source
This function must be called after each client interaction to restart the client connection timer.
# File lib/taskjuggler/daemon/ProcessIntercom.rb, line 142 def restartTimer @timeLock.synchronize do debug('', 'Reseting client connection timer') @timerStart = Time.new end end
startTerminator()
click to toggle source
This method starts a new thread and waits for the @terminate variable to be true. If that happens, it waits for the @clientConnection lock or forces an exit after the timeout has been reached. It shuts down the DRb server.
# File lib/taskjuggler/daemon/ProcessIntercom.rb, line 163 def startTerminator Thread.new do loop do if @terminate # We wait for the client to propery disconnect. In case this does # not happen, we'll wait for the timeout and exit anyway. restartTimer while @clientConnection.locked? && !timerExpired? do sleep 1 end if timerExpired? warning('drb_timeout_shutdown', 'Shutting down DRb server due to timeout') else debug('', 'Shutting down the DRb server') end DRb.stop_service break else sleep 1 end end end end
terminate()
click to toggle source
# File lib/taskjuggler/daemon/ProcessIntercom.rb, line 88 def terminate debug('', 'Terminating on external request') @terminate = true end
timerExpired?()
click to toggle source
Check if the client interaction timer has already expired.
# File lib/taskjuggler/daemon/ProcessIntercom.rb, line 150 def timerExpired? res = nil @timeLock.synchronize do # We should see client interaction every 2 minutes. res = (Time.new > @timerStart + 2 * 60) end res end