著者:しょっさん
1月号ではありますが、この号が出る頃はちょうどクリスマス。一息ついて、年末の忙しい時期に入っていく頃でしょうか。年末は大晦日まで大掃除に明け暮れて、正月の三が日はこれ以上ないほどにゆっくり過ごすことが、我が家の慣例です。年初からお仕事のないみなさまは、場所はちがえど、三が日の過ごし方は同じようなものでしょう。お雑煮とおせちをいただきながら、2017年に想いをはせつ
つ、さぁプログラミングしましょう!!
記事本文掲載のシェルスクリプトマガジンvol.45は以下リンク先でご購入できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#!/usr/bin/env ruby # coding: utf-8 # filename: logger.rb require 'logger' # ログを出力するだけのクラス class TestLog LOGLEVEL = {} LOGLEVEL[Logger::UNKNOWN] = 'UNKNOWN' LOGLEVEL[Logger::FATAL] = 'FATAL' LOGLEVEL[Logger::ERROR] = 'ERROR' LOGLEVEL[Logger::WARN] = 'WARNING' LOGLEVEL[Logger::INFO] = 'INFORMATION' LOGLEVEL[Logger::DEBUG] = 'DEBUG' # Logger::xxxx は、DEBUG=0、UNKNOWN=5 の数値なので次のように配列でも書き換えられます # LOGLEVEL = ["DEBUG", "INFORMATION", "WARNING", "ERROR", "FATAL", "UNKNOWN"] # 初期化時にログファイルを宣誓させる def initialize(logfile = '/tmp/log') @log = Logger.new(logfile) end def PutLog(loglevel) # Logger::level で出力するログレベルを、その都度変更できます @log.level = loglevel @log.unknown("Loglevel #{LOGLEVEL[loglevel]} の場合") @log.fatal('fatal') @log.error('error') @log.warn('warning') @log.info('infomation') @log.debug('debug message') end end ["/tmp/log", STDOUT, STDERR].each do |out| puts "出力先 > #{out}" log = TestLog.new(out) [Logger::UNKNOWN, Logger::FATAL, Logger::ERROR, Logger::WARN, Logger::INFO, Logger::DEBUG].each do |lv| log.PutLog(lv) end # 上記同様 Logger::xxxx は整数値なので、次のように記述することもできます。 # 5.step(0, -1) do |lv| # 0.step(5) でも同様の動きですが、逆順になります end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
$ ./logger.rb 出力先 > /tmp/log 出力先 > #<IO:0x007fbe620c6520> A, [2016-xx-xxTxx:xx:xx.xxxxx #51744] ANY -- : Logle vel UNKNOWN の場合 A, [2016-xx-xxTxx:xx:xx.xxxxx #51744] ANY -- : Logle vel FATAL の場合 F, [2016-xx-xxTxx:xx:xx.xxxxx #51744] FATAL -- : fatal A, [2016-xx-xxTxx:xx:xx.xxxxx #51744] ANY -- : Logle vel ERROR の場合 F, [2016-xx-xxTxx:xx:xx.xxxxx #51744] FATAL -- : fatal E, [2016-xx-xxTxx:xx:xx.xxxxx #51744] ERROR -- : error A, [2016-xx-xxTxx:xx:xx.xxxxx #51744] ANY -- : Logle vel WARNING の場合 F, [2016-xx-xxTxx:xx:xx.xxxxx #51744] FATAL -- : fatal E, [2016-xx-xxTxx:xx:xx.xxxxx #51744] ERROR -- : error W, [2016-xx-xxTxx:xx:xx.xxxxx #51744] WARN -- : warni ng A, [2016-xx-xxTxx:xx:xx.xxxxx #51744] ANY -- : Logle vel INFORMATION の場合 F, [2016-xx-xxTxx:xx:xx.xxxxx #51744] FATAL -- : fatal E, [2016-xx-xxTxx:xx:xx.xxxxx #51744] ERROR -- : error W, [2016-xx-xxTxx:xx:xx.xxxxx #51744] WARN -- : warni ng I, [2016-xx-xxTxx:xx:xx.xxxxx #51744] INFO -- : infom ation A, [2016-xx-xxTxx:xx:xx.xxxxx #51744] ANY -- : Logle vel DEBUG の場合 F, [2016-xx-xxTxx:xx:xx.xxxxx #51744] FATAL -- : fatal E, [2016-xx-xxTxx:xx:xx.xxxxx #51744] ERROR -- : error W, [2016-xx-xxTxx:xx:xx.xxxxx #51744] WARN -- : warni ng I, [2016-xx-xxTxx:xx:xx.xxxxx #51744] INFO -- : infom ation D, [2016-xx-xxTxx:xx:xx.xxxxx #51744] DEBUG -- : debu g message 出力先 > #<IO:0x007fbe620c64a8> <後略 (上記と同じ)> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#filename: auth_spec.rb require_relative '../auth' describe "Authクラス" do describe "#authenticate メソッド" do context "正常に認証された場合" do it '標準で登録されている認証コードでコール' do a = Auth.new expect(a.authenticate('DEMO', '192.168.0.10')).not_to eq(false) end it '変更された認証コードでコール' do a = Auth.new('6996e0d11d644910e921ecc240f3cea8') expect(a.authenticate('40ruby', '192.168.0.10')).to eq('067745a1ca5c03b681e5935bb2f87ab7') end end context "異なる認証キーでコール" do it '標準で登録されている認証コード以外でコール' do a = Auth.new expect(a.authenticate('TEST', '192.168.0.10')).to eq(false) end it '変更された認証コードに対し、標準コードでコール' do a = Auth.new('6996e0d11d644910e921ecc240f3cea8') expect(a.authenticate('DEMO', '192.168.0.10')).to eq(false) end end end describe "#varid メソッド" do before do @a = Auth.new @key = [] 0.step(10) do |num| @key[num] = @a.authenticate('DEMO', "192.168.0.#{num}") end end context "正常に登録されている場合" do it 'IPアドレスと登録されているコードがマッチしている' do 0.step(10) do |num| expect(@a.varid(@key[num])).to eq("192.168.0.#{num}") end end end end end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# filename: auth.rb require "digest/md5" class Auth # サーバの認証キーを定義する # == パラメータ # auth_code:: MD5 でハッシュ化されたキーを指定する # == 返り値 # 特になし。@key_list 配列を初期化 def initialize(auth_code = 'bd6dbd063f5ab7394879e3c08781cd72') @auth_code = auth_code @key_list = {} end # クライアント認証を行う # 接続元が要求してきたキーが、サーバ側で設定されているハッシュ値と比較する # == パラメータ # key:: ハッシュ化される前のキー # ip:: 接続元のIPアドレス # == 返り値 # 認証:: ハッシュ化されたクライアント固有の識別キー # 否認:: false def authenticate(key, ip) auth_key = Digest::MD5.hexdigest(key) return false unless @auth_code == auth_key client_key = Digest::MD5.hexdigest(auth_key+ip) @key_list[client_key] = ip return client_key end # クライアントの識別を行う # 要求されたクライアント固有の識別キーが登録されているものか判断する # == パラメータ # key:: クライアント固有の識別キー # == 返り値 # 識別された場合:: 登録されているIPアドレス # 否認された場合:: false def proof(key) return @key_list[key] if @key_list.has_key?(key) return false end end |