#! /usr/local/bin/ruby require 'optparse' require 'gserver' require 'monitor' require 'smtpfilter' $ldebug = false $appver = '0.1' $appname = 'ruby-mailfilter' $appid = "#{$appname} v#{$appver}" $apphost = '[127.0.0.1]' class SMTPServer < GServer include MonitorMixin @@conns = 0 def SMTPServer.conns() @@conns end def initialize(port = '10025', host = 'localhost') super(port, host) end def serve(client) SMTPFilter.new(client) end def starting puts "Server starting on port #{self.port}" end def stopping puts "Server stopping on port #{self.port}" end def connecting(client) addr = client.peeraddr puts "Client connecting from #{addr[2]} <#{addr[3]}> on port #{addr[1]}" synchronize do @@conns += 1 end true end def disconnecting(client) puts "Client disconnecting from port #{client}" synchronize do @@conns -= 1 end true end end # -------------------------------------------------------------------- opts = OptionParser.new opts.on('--debug', '-d', 'Debug mode') \ { |v| $ldebug = true } opts.on('--fulldebug', '-D', 'Full debug mode') \ { |v| $ldebug = true ; $DEBUG = true } opts.on('--foreground', '-F', 'Foreground mode') \ { |v| $FORE = true } opts.parse(*ARGV) if(!$FORE) then exit if fork Process.setsid p = fork if(p) then File.open("/var/run/mailfilter.pid", "w") do |pf| pf.puts p end exit end Dir.chdir "/" $stdin.reopen("/dev/null", "r+") File.open(($ldebug ? "/root/ruby/mail/debug.log" : "/dev/null"), "a") do |d| $stdout.reopen(d) $stderr.reopen(d) end begin $stdout.sync = true $stderr.sync = true end end $s = SMTPServer.new(10025, nil) $s.audit = true begin $s.start $s.join rescue Exception end