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