diff options
Diffstat (limited to 'contrib/smsweb/inform.rb')
-rw-r--r-- | contrib/smsweb/inform.rb | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/contrib/smsweb/inform.rb b/contrib/smsweb/inform.rb new file mode 100644 index 0000000..e710cc8 --- /dev/null +++ b/contrib/smsweb/inform.rb @@ -0,0 +1,131 @@ +# vim: set sw=2 ts=2 expandtab: +# +# Copyright (C) 2010 by James Maki +# +# Author: James Maki <jamescmaki@gmail.com> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +require 'syslog' + +# Inform.syslog = false +# if Inform.syslog +# Syslog.open("smsws", Syslog::LOG_NDELAY, Syslog::LOG_LOCAL7) +# else +# Inform.level = Inform::LOG_ERR +# Inform.file = $stdout +# end + +module Inform + include Syslog + + LEVELS = { + LOG_EMERG => :emerg, + LOG_ALERT => :alert, + LOG_CRIT => :crit, + LOG_ERR => :err, + LOG_WARNING => :warning, + LOG_NOTICE => :notice, + LOG_INFO => :info, + LOG_DEBUG => :debug, + } + + LEVELS.each_pair do |key, value| + module_eval <<-EOS + def #{value}(msg) + inform(#{key}, msg, caller[0]) + end + EOS + + module_function value + end + + module_function + + def level=(level) + raise ArgumentError, "bad level" unless level >= LOG_EMERG && level <= LOG_DEBUG + + @level = level + end + + def level + @level + end + + def file=(file) + @file = file + end + + def file + @file + end + + def syslog=(syslog) + @syslog = syslog + end + + def syslog + @syslog + end + + def inform(level, msg, from = caller[0]) + time = Time.now.strftime('%Y-%m-%d %H:%M:%S') + + from =~ /(.+)\:(\d+)(?:\:in \`(\S+)\')?/ + file = File.basename($1) + line = $2 + func = $3 + func ||= 'main' + + str = "#{time} [#{LEVELS[level].to_s.upcase}] #{file}:#{func}:#{line}: " + + if msg.is_a?(Exception) + str << "#{msg.class} #{msg}" + else + str << "#{msg}" + end + + log(level, str) + + if msg.is_a?(Exception) + msg.backtrace[0..9].each do |line| + log(level, "> #{line}") + end + end + end + + def escape_spec(str) + new = "" + str.each_byte { |c| + #if c == "%".ord + if c == ?% + new << "%%" + else + new << c + end + } + + return new + end + + def log(level, msg) + if @syslog + Syslog.log(level, escape_spec(msg)) + elsif @level && @file + @file.puts(msg) if level <= @level + end + end +end |