Hatena::Grouprubyist

Going My Ruby Way このページをアンテナに追加 RSSフィード

Ruby ロゴ (C) Ruby Association LLC

2011年08月06日(土)

SSH サーバを作る (その4) ログ出力 (3)

| 11:45 | SSH サーバを作る (その4) ログ出力 (3) - Going My Ruby Way を含むブックマーク はてなブックマーク - SSH サーバを作る (その4) ログ出力 (3) - Going My Ruby Way SSH サーバを作る (その4) ログ出力 (3) - Going My Ruby Way のブックマークコメント

「挑戦:SSHサーバを作る」です。

作った logger を Server::Service で使えるようにします。

GServer

Server::Service を載っけるサーバですが、service.rb の if __FILE__ == $0 の部分に書いていたものを切り出しました。

gmrw/ssh2/server/gserver.rb

#!/usr/bin/env ruby
# -*- coding: UTF-8 -*-

require 'gserver'
require 'gmrw/utils/property'
require 'gmrw/ssh2/server/constants'
require 'gmrw/ssh2/server/service'
require 'gmrw/ssh2/server/logger/gserver_logger'

class GMRW::SSH2::Server::GServer < ::GServer
  include GMRW::SSH2

  def initialize(port=Server::DEFAULT_PORT, *)
    super
  end

  property :log_threshold, ':info'

  def serve(conn)
    service                   = Server::Service.new(conn)
    service.logger            = Server::Logger::GServerLogger.new(self)
    service.logger.threshold  = audit ? log_threshold : :any

    service.start
  end

  class << self
    def start(*a)
      server       = new(*a)
      server.audit = true
      server.start
    end

    def resident(*a)
      start(*a).join
    end
  end
end

if __FILE__ == $0
  unless :with_option

    GMRW::SSH2::Server::GServer.resident

  else
    require 'optparse'

    args = Struct.new(:port, :host).new(GMRW::SSH2::Server::DEFAULT_PORT)
    conf = Struct.new(:quiet, :debug).new

    OptionParser.new do |opt|
      opt.on('-p PORT', '--port PORT', 'port number') {|v| args.port = v.to_i }
      opt.on('-h HOST', '--host HOST', 'host')        {|v| args.host = v      }
      opt.on('-q',      '--quiet',     'no logging')  {|v| conf.quiet = v     }
      opt.on('-d',      '--debug',     'debug mode')  {|v| conf.debug = v     }

      opt.parse!
    end

    server               = GMRW::SSH2::Server::GServer.new(*args.to_a.compact)
    server.audit         = !conf.quiet
    server.log_threshold = conf.debug ? :debug : :info

    server.start.join
  end
end

# vim:set ts=2 sw=2 et fenc=UTF-8:

Server::Gserver#serve の中で Server::Logger::GServerLogger を new しています。

Server::Service

Server::Service は以下のように修正しました。

gmrw/ssh2/server/service.rb

#!/usr/bin/env ruby
# -*- coding: UTF-8 -*-

require 'gmrw/utils/string'
require 'gmrw/ssh2/server/constants'
require 'gmrw/ssh2/server/logger'

class GMRW::SSH2::Server::Service
  include GMRW::SSH2
  include Server::Loggable

  def initialize(conn)
    @connection = conn
  end

  attr_reader :connection

  def logger=(*)
    super.tap {|l| l.format {|s| "[#{connection.object_id}] #{s}" } }
  end

  def start
    log(:info) { "SSH service start" }

    # ここで、実質的なサービス

  rescue => e
    log(:fatal) { "#{e.class}: #{e}" }
    log:debug ; e.backtrace.each {|bt| log{ bt >> 2 } }

  ensure
    connection.shutdown rescue nil
    connection.close    rescue nil
    log(:info) { "SSH service terminated" }
  end
end

# vim:set ts=2 sw=2 et fenc=UTF-8:

logger= をオーバーライドしました。logger の format を設定しています。

ログメッセージには connection の object_id を含めるようにしました。これは、実質的に Server::Service インスタンスの ID です。

ensure 節で connection の shutdown と close を行なうようにしました。

ログ出力

以上の作業で、以下のようなログが出るようになりました。

(ruby gserver.rb でサーバを起動して、telnet localhost 50022 したログです)

$ ruby gserver.rb                                                
[Sat Aug  6 13:32:23 2011] GMRW::SSH2::Server::GServer 127.0.0.1:50022 start
[Sat Aug  6 13:32:57 2011] GMRW::SSH2::Server::GServer 127.0.0.1:50022 client:59232 127.0.0.1<127.0.0.1> connect
[Sat Aug  6 13:32:57 2011] info: [10232100] SSH service start
[Sat Aug  6 13:32:57 2011] info: [10232100] SSH service terminated
[Sat Aug  6 13:32:57 2011] GMRW::SSH2::Server::GServer 127.0.0.1:50022 client:59232 disconnect
^C[Sat Aug  6 13:33:02 2011] GMRW::SSH2::Server::GServer 127.0.0.1:50022 stop

----

次回は、ここまでのまとめ、です。

また、日記改題

10:53 | また、日記改題  - Going My Ruby Way を含むブックマーク はてなブックマーク - また、日記改題  - Going My Ruby Way また、日記改題  - Going My Ruby Way のブックマークコメント

旧題「lnznt の Going My Ruby Way」

新題「Going My Ruby Way」