]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - lib/rbot/ircbot.rb
Revert "always print FATAL and ERROR logmessages to STDERR"
[user/henk/code/ruby/rbot.git] / lib / rbot / ircbot.rb
index 92f5fe55c88c400601abeb76367f2c8c189cec95..a1713c2d4a0ecc320d74600cb24a99928ef6c404 100644 (file)
@@ -278,6 +278,18 @@ class Bot
     Config.register Config::BooleanValue.new('server.ssl',
       :default => false, :requires_restart => true, :wizard => true,
       :desc => "Use SSL to connect to this server?")
+    Config.register Config::BooleanValue.new('server.ssl_verify',
+      :default => false, :requires_restart => true,
+      :desc => "Verify the SSL connection?",
+      :wizard => true)
+    Config.register Config::StringValue.new('server.ssl_ca_file',
+      :default => default_ssl_ca_file, :requires_restart => true,
+      :desc => "The CA file used to verify the SSL connection.",
+      :wizard => true)
+    Config.register Config::StringValue.new('server.ssl_ca_path',
+      :default => '', :requires_restart => true,
+      :desc => "Alternativly a directory that includes CA PEM files used to verify the SSL connection.",
+      :wizard => true)
     Config.register Config::StringValue.new('server.password',
       :default => false, :requires_restart => true,
       :desc => "Password for connecting to this server (if required)",
@@ -608,7 +620,12 @@ class Bot
         debug "server.list is now #{@config['server.list'].inspect}"
     end
 
-    @socket = Irc::Socket.new(@config['server.list'], @config['server.bindhost'], :ssl => @config['server.ssl'], :penalty_pct =>@config['send.penalty_pct'])
+    @socket = Irc::Socket.new(@config['server.list'], @config['server.bindhost'], 
+                              :ssl => @config['server.ssl'],
+                              :ssl_verify => @config['server.ssl_verify'],
+                              :ssl_ca_file => @config['server.ssl_ca_file'],
+                              :ssl_ca_path => @config['server.ssl_ca_path'],
+                              :penalty_pct => @config['send.penalty_pct'])
     @client = Client.new
 
     @plugins.scan
@@ -801,7 +818,18 @@ class Bot
       :purge_split => @config['send.purge_split'],
       :truncate_text => @config['send.truncate_text'].dup
 
-    trap_sigs
+    trap_signals
+  end
+
+  # Determine (if possible) a valid path to a CA certificate bundle. 
+  def default_ssl_ca_file
+    [ '/etc/ssl/certs/ca-certificates.crt', # Ubuntu/Debian
+      '/etc/ssl/certs/ca-bundle.crt', # Amazon Linux
+      '/etc/ssl/ca-bundle.pem', # OpenSUSE
+      '/etc/pki/tls/certs/ca-bundle.crt' # Fedora/RHEL
+    ].find do |file|
+      File.readable? file
+    end
   end
 
   def repopulate_botclass_directory
@@ -904,7 +932,15 @@ class Bot
   end
 
   # things to do when we receive a signal
-  def got_sig(sig, func=:quit)
+  def handle_signal(sig)
+    func = case sig
+           when 'SIGHUP'
+             :restart
+           when 'SIGUSR1'
+             :reconnect
+           else
+             :quit
+           end
     debug "received #{sig}, queueing #{func}"
     # this is not an interruption if we just need to reconnect
     $interrupted += 1 unless func == :reconnect
@@ -918,12 +954,11 @@ class Bot
   end
 
   # trap signals
-  def trap_sigs
+  def trap_signals
     begin
-      trap("SIGINT") { got_sig("SIGINT") }
-      trap("SIGTERM") { got_sig("SIGTERM") }
-      trap("SIGHUP") { got_sig("SIGHUP", :restart) }
-      trap("SIGUSR1") { got_sig("SIGUSR1", :reconnect) }
+      %w(SIGINT SIGTERM SIGHUP SIGUSR1).each do |sig|
+        trap(sig) { Thread.new { handle_signal sig } }
+      end
     rescue ArgumentError => e
       debug "failed to trap signals (#{e.pretty_inspect}): running on Windows?"
     rescue Exception => e
@@ -987,6 +1022,9 @@ class Bot
       end
 
       connect
+    rescue SystemExit
+      log_session_end
+      exit 0
     rescue DBFatal => e
       fatal "fatal db error: #{e.pretty_inspect}"
       DBTree.stats
@@ -1310,7 +1348,11 @@ class Bot
       save
       debug "\tcleaning up ..."
       @save_mutex.synchronize do
-        @plugins.cleanup
+        begin
+          @plugins.cleanup
+        rescue
+          debug "\tignoring cleanup error: #{$!}"
+        end
       end
       # debug "\tstopping timers ..."
       # @timer.stop