commit ccab26de9450c362f61c0c391e47f9861d5d35d9
Author: Marc Dequènes (Duck) <Duck@DuckCorp.org>
Date:   Sun Mar 8 12:26:48 2009 +0100

    [fix] gettext domains are binded correctly now (using a new PostmanHome submodule to separate domains easily)

diff --git a/Rakefile b/Rakefile
index 5139f50..6bce65a 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,4 +1,5 @@
-Dir.chdir(File.dirname(File.expand_path(__FILE__)))
+APP_ROOT = File.dirname(File.expand_path(__FILE__))
+Dir.chdir(APP_ROOT)
 $: << "./lib"
 
 ENV['LC_ALL'] = "C"
@@ -15,12 +16,12 @@ desc "Create mo-files for l10n"
 
   desc "Update pot/po files to match new version."
   task :updatepo do
-    GetText.update_pofiles(CyborgHood::PRODUCT,
+    GetText.update_pofiles("cyborghood",
       Dir.glob("lib/**/*.{rb,rhtml}"),
       CyborgHood::PRODUCT + " " + CyborgHood::VERSION)
     # temporary component listing
     ["Postman"].each do |component|
-      GetText.update_pofiles(CyborgHood::PRODUCT + "_" + component,
+      GetText.update_pofiles("cyborghood_" + component.downcase,
         component.downcase,
         CyborgHood::PRODUCT + " " + CyborgHood::VERSION)
     end
diff --git a/lib/cyborghood/base.rb b/lib/cyborghood/base.rb
index a2e921b..9b85803 100644
--- a/lib/cyborghood/base.rb
+++ b/lib/cyborghood/base.rb
@@ -26,14 +26,11 @@ require 'gettext'
 
 module CyborgHood
   include GetText
+  bindtextdomain("cyborghood", {:path => File.join(APP_ROOT, "locale"), :charset => "UTF-8"})
 
   PRODUCT = "CyborgHood"
   VERSION = "0.2.0~dev"
 
-  bindtextdomain(PRODUCT, {:path => File.join(APP_ROOT, "locale"), :charset => "UTF-8"})
-  textdomain(PRODUCT)
-  #textdomain_to(self.class, PRODUCT + "_" + self.human_name)
-
   # severities: # :dangerous :unrecoverable :ignorable
   # categories:
   #  - db
diff --git a/po/CyborgHood.pot b/po/CyborgHood.pot
deleted file mode 100644
index b9cb6f4..0000000
--- a/po/CyborgHood.pot
+++ /dev/null
@@ -1,49 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: CyborgHood 0.2.0~dev\n"
-"POT-Creation-Date: 2009-03-07 21:55+0100\n"
-"PO-Revision-Date: 2009-03-07 21:38+0100\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: lib/cyborghood/mail.rb:177
-msgid "Mail does not contain a proper text part for commands."
-msgstr ""
-
-#: lib/cyborghood/mail.rb:205
-msgid "Mail not formatted correctly (signed part)."
-msgstr ""
-
-#: lib/cyborghood/mail.rb:208
-msgid "Mail content tampered or badly signed: "
-msgstr ""
-
-#: lib/cyborghood/mail.rb:213
-msgid "Mail is from an unknown person."
-msgstr ""
-
-#: lib/cyborghood/mail.rb:225
-msgid ""
-"The signature was made too long ago (check your system clock). Rejected "
-"message to avoid replay attacks."
-msgstr ""
-
-#: lib/cyborghood/mail.rb:230
-msgid ""
-"The signature was made in the future (check your system clock). Rejected "
-"message to avoid replay attacks."
-msgstr ""
-
-#: lib/cyborghood/mail.rb:272
-msgid "Mail not formatted correctly (encrypted part)."
-msgstr ""
diff --git a/po/CyborgHood_Postman.pot b/po/CyborgHood_Postman.pot
deleted file mode 100644
index 6307052..0000000
--- a/po/CyborgHood_Postman.pot
+++ /dev/null
@@ -1,69 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: CyborgHood 0.2.0~dev\n"
-"POT-Creation-Date: 2009-03-07 21:55+0100\n"
-"PO-Revision-Date: 2009-03-07 21:38+0100\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: postman:49
-msgid "Command not recognized."
-msgstr ""
-
-#: postman:63 postman:181
-msgid "Internal error. Administrator is warned."
-msgstr ""
-
-#: postman:93
-msgid "You are manager of the following zones: %s."
-msgstr ""
-
-#: postman:107 postman:129
-msgid "You are not allowed to manage this zone."
-msgstr ""
-
-#: postman:113
-msgid "Requested zone content attached."
-msgstr ""
-
-#: postman:125
-msgid "This zone is not hosted here."
-msgstr ""
-
-#: postman:139
-msgid "Attachment number not found."
-msgstr ""
-
-#: postman:144
-msgid "Attachment has wrong content-type."
-msgstr ""
-
-#: postman:159
-msgid "Invalid zone data."
-msgstr ""
-
-#: postman:166
-msgid "Zone serial is not superior to current serial."
-msgstr ""
-
-#: postman:177
-msgid "Zone updated."
-msgstr ""
-
-#: postman:306
-msgid "Hello %s,"
-msgstr ""
-
-#: postman:308
-msgid "Follows the transcript of your commands:"
-msgstr ""
diff --git a/po/cyborghood.pot b/po/cyborghood.pot
new file mode 100644
index 0000000..d1dfae0
--- /dev/null
+++ b/po/cyborghood.pot
@@ -0,0 +1,49 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: CyborgHood 0.2.0~dev\n"
+"POT-Creation-Date: 2009-03-08 12:17+0100\n"
+"PO-Revision-Date: 2009-03-07 21:38+0100\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: lib/cyborghood/mail.rb:181
+msgid "Mail does not contain a proper text part for commands."
+msgstr ""
+
+#: lib/cyborghood/mail.rb:210
+msgid "Mail not formatted correctly (signed part)."
+msgstr ""
+
+#: lib/cyborghood/mail.rb:213
+msgid "Mail content tampered or badly signed: "
+msgstr ""
+
+#: lib/cyborghood/mail.rb:218
+msgid "Mail is from an unknown person."
+msgstr ""
+
+#: lib/cyborghood/mail.rb:230
+msgid ""
+"The signature was made too long ago (check your system clock). Rejected "
+"message to avoid replay attacks."
+msgstr ""
+
+#: lib/cyborghood/mail.rb:235
+msgid ""
+"The signature was made in the future (check your system clock). Rejected "
+"message to avoid replay attacks."
+msgstr ""
+
+#: lib/cyborghood/mail.rb:278
+msgid "Mail not formatted correctly (encrypted part)."
+msgstr ""
diff --git a/po/cyborghood_postman.pot b/po/cyborghood_postman.pot
new file mode 100644
index 0000000..5cc092a
--- /dev/null
+++ b/po/cyborghood_postman.pot
@@ -0,0 +1,75 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: CyborgHood 0.2.0~dev\n"
+"POT-Creation-Date: 2009-03-08 12:17+0100\n"
+"PO-Revision-Date: 2009-03-07 21:38+0100\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: postman:144
+msgid ""
+"A message (ID: %s), apparently from you, was rejected for the following "
+"reason:"
+msgstr ""
+
+#: postman:157
+msgid "Hello %s,"
+msgstr ""
+
+#: postman:159
+msgid "Follows the transcript of your commands:"
+msgstr ""
+
+#: postman:224
+msgid "Command not recognized."
+msgstr ""
+
+#: postman:238 postman:356
+msgid "Internal error. Administrator is warned."
+msgstr ""
+
+#: postman:268
+msgid "You are manager of the following zones: %s."
+msgstr ""
+
+#: postman:282 postman:304
+msgid "You are not allowed to manage this zone."
+msgstr ""
+
+#: postman:288
+msgid "Requested zone content attached."
+msgstr ""
+
+#: postman:300
+msgid "This zone is not hosted here."
+msgstr ""
+
+#: postman:314
+msgid "Attachment number not found."
+msgstr ""
+
+#: postman:319
+msgid "Attachment has wrong content-type."
+msgstr ""
+
+#: postman:334
+msgid "Invalid zone data."
+msgstr ""
+
+#: postman:341
+msgid "Zone serial is not superior to current serial."
+msgstr ""
+
+#: postman:352
+msgid "Zone updated."
+msgstr ""
diff --git a/po/fr/CyborgHood.po b/po/fr/CyborgHood.po
deleted file mode 100644
index 7c14cc4..0000000
--- a/po/fr/CyborgHood.po
+++ /dev/null
@@ -1,53 +0,0 @@
-# CyborgHood
-# Copyright (C) 2009 DuckCorp
-# This file is distributed under the same license as the CyborgHood package.
-# Marc Dequènes (Duck) <Duck@DuckCorp.org>, 2009.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: CyborgHood 0.2.0~dev\n"
-"POT-Creation-Date: 2009-03-07 21:55+0100\n"
-"PO-Revision-Date: 2009-03-07 20:59+0100\n"
-"Last-Translator: Marc Dequènes (Duck) <Duck@DuckCorp.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=(n != 1);\n"
-
-#: lib/cyborghood/mail.rb:177
-msgid "Mail does not contain a proper text part for commands."
-msgstr ""
-"Le mail ne contient pas de partie textuelle correcte pour les commandes."
-
-#: lib/cyborghood/mail.rb:205
-msgid "Mail not formatted correctly (signed part)."
-msgstr "Le mail n'est pas formatté correctement (partie signée)."
-
-#: lib/cyborghood/mail.rb:208
-msgid "Mail content tampered or badly signed: "
-msgstr "Le contenu du mail a été altéré ou n'a pas été signé correctement."
-
-#: lib/cyborghood/mail.rb:213
-msgid "Mail is from an unknown person."
-msgstr "Le mail provient d'une personne inconnue."
-
-#: lib/cyborghood/mail.rb:225
-msgid ""
-"The signature was made too long ago (check your system clock). Rejected "
-"message to avoid replay attacks."
-msgstr ""
-"La signature a été faite depuis trop longtemps (vérifiez votre horloge "
-"système.Message rejeté pour éviter les attaques par rejeux."
-
-#: lib/cyborghood/mail.rb:230
-msgid ""
-"The signature was made in the future (check your system clock). Rejected "
-"message to avoid replay attacks."
-msgstr ""
-"La signature a été faite dans le futur (vérifiez votre horloge système."
-"Message rejeté pour éviter les attaques par rejeux."
-
-#: lib/cyborghood/mail.rb:272
-msgid "Mail not formatted correctly (encrypted part)."
-msgstr "Le mail n'est pas formatté correctement (partie chiffrée)."
diff --git a/po/fr/CyborgHood_Postman.po b/po/fr/CyborgHood_Postman.po
deleted file mode 100644
index 024f4fd..0000000
--- a/po/fr/CyborgHood_Postman.po
+++ /dev/null
@@ -1,68 +0,0 @@
-# CyborgHood
-# Copyright (C) 2009 DuckCorp
-# This file is distributed under the same license as the CyborgHood package.
-# Marc Dequènes (Duck) <Duck@DuckCorp.org>, 2009.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: CyborgHood 0.2.0~dev\n"
-"POT-Creation-Date: 2009-03-07 21:55+0100\n"
-"PO-Revision-Date: 2009-03-07 21:27+0100\n"
-"Last-Translator: Marc Dequènes (Duck) <Duck@DuckCorp.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=(n != 1);\n"
-
-#: postman:49
-msgid "Command not recognized."
-msgstr "Commande non reconnue"
-
-#: postman:63 postman:181
-msgid "Internal error. Administrator is warned."
-msgstr "Erreur interne. L'administrateur a été prévenu."
-
-#: postman:93
-msgid "You are manager of the following zones: %s."
-msgstr "Vous gérez les zones suivantes : %s."
-
-#: postman:107 postman:129
-msgid "You are not allowed to manage this zone."
-msgstr "Vous n'êtes pas autorisé à gérer cette zone."
-
-#: postman:113
-msgid "Requested zone content attached."
-msgstr "Le contenu de la zone demandée est en pièce jointe."
-
-#: postman:125
-msgid "This zone is not hosted here."
-msgstr "Cette zone n'est pas hébergée ici."
-
-#: postman:139
-msgid "Attachment number not found."
-msgstr "Numéro de pièce jointe non trouvé."
-
-#: postman:144
-msgid "Attachment has wrong content-type."
-msgstr "La pièce jointe a un mauvais type de contenu (content-type)."
-
-#: postman:159
-msgid "Invalid zone data."
-msgstr "Données pour la zone invalides."
-
-#: postman:166
-msgid "Zone serial is not superior to current serial."
-msgstr "Le numéro de série de la zone n'est pas supèrieur à celui actuel."
-
-#: postman:177
-msgid "Zone updated."
-msgstr "Zone mise à jour."
-
-#: postman:306
-msgid "Hello %s,"
-msgstr "Bonjour %s,"
-
-#: postman:308
-msgid "Follows the transcript of your commands:"
-msgstr "La retranscription des commandes suit :"
diff --git a/po/fr/cyborghood.po b/po/fr/cyborghood.po
new file mode 100644
index 0000000..56d4d75
--- /dev/null
+++ b/po/fr/cyborghood.po
@@ -0,0 +1,53 @@
+# CyborgHood
+# Copyright (C) 2009 DuckCorp
+# This file is distributed under the same license as the CyborgHood package.
+# Marc Dequènes (Duck) <Duck@DuckCorp.org>, 2009.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: CyborgHood 0.2.0~dev\n"
+"POT-Creation-Date: 2009-03-08 12:17+0100\n"
+"PO-Revision-Date: 2009-03-07 20:59+0100\n"
+"Last-Translator: Marc Dequènes (Duck) <Duck@DuckCorp.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=(n != 1);\n"
+
+#: lib/cyborghood/mail.rb:181
+msgid "Mail does not contain a proper text part for commands."
+msgstr ""
+"Le mail ne contient pas de partie textuelle correcte pour les commandes."
+
+#: lib/cyborghood/mail.rb:210
+msgid "Mail not formatted correctly (signed part)."
+msgstr "Le mail n'est pas formatté correctement (partie signée)."
+
+#: lib/cyborghood/mail.rb:213
+msgid "Mail content tampered or badly signed: "
+msgstr "Le contenu du mail a été altéré ou n'a pas été signé correctement."
+
+#: lib/cyborghood/mail.rb:218
+msgid "Mail is from an unknown person."
+msgstr "Le mail provient d'une personne inconnue."
+
+#: lib/cyborghood/mail.rb:230
+msgid ""
+"The signature was made too long ago (check your system clock). Rejected "
+"message to avoid replay attacks."
+msgstr ""
+"La signature a été faite depuis trop longtemps (vérifiez votre horloge "
+"système. Message rejeté pour éviter les attaques par rejeux."
+
+#: lib/cyborghood/mail.rb:235
+msgid ""
+"The signature was made in the future (check your system clock). Rejected "
+"message to avoid replay attacks."
+msgstr ""
+"La signature a été faite dans le futur (vérifiez votre horloge système. "
+"Message rejeté pour éviter les attaques par rejeux."
+
+#: lib/cyborghood/mail.rb:278
+msgid "Mail not formatted correctly (encrypted part)."
+msgstr "Le mail n'est pas formatté correctement (partie chiffrée)."
diff --git a/po/fr/cyborghood_postman.po b/po/fr/cyborghood_postman.po
new file mode 100644
index 0000000..af30871
--- /dev/null
+++ b/po/fr/cyborghood_postman.po
@@ -0,0 +1,76 @@
+# CyborgHood
+# Copyright (C) 2009 DuckCorp
+# This file is distributed under the same license as the CyborgHood package.
+# Marc Dequènes (Duck) <Duck@DuckCorp.org>, 2009.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: CyborgHood 0.2.0~dev\n"
+"POT-Creation-Date: 2009-03-08 12:17+0100\n"
+"PO-Revision-Date: 2009-03-07 21:27+0100\n"
+"Last-Translator: Marc Dequènes (Duck) <Duck@DuckCorp.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=(n != 1);\n"
+
+#: postman:144
+msgid ""
+"A message (ID: %s), apparently from you, was rejected for the following "
+"reason:"
+msgstr ""
+"Un message (ID: %s), provenant apparemment de vous, a été rejeté pour la"
+" raison suivante :"
+
+#: postman:157
+msgid "Hello %s,"
+msgstr "Bonjour %s,"
+
+#: postman:159
+msgid "Follows the transcript of your commands:"
+msgstr "La retranscription des commandes suit :"
+
+#: postman:224
+msgid "Command not recognized."
+msgstr "Commande non reconnue"
+
+#: postman:238 postman:356
+msgid "Internal error. Administrator is warned."
+msgstr "Erreur interne. L'administrateur a été prévenu."
+
+#: postman:268
+msgid "You are manager of the following zones: %s."
+msgstr "Vous gérez les zones suivantes : %s."
+
+#: postman:282 postman:304
+msgid "You are not allowed to manage this zone."
+msgstr "Vous n'êtes pas autorisé à gérer cette zone."
+
+#: postman:288
+msgid "Requested zone content attached."
+msgstr "Le contenu de la zone demandée est en pièce jointe."
+
+#: postman:300
+msgid "This zone is not hosted here."
+msgstr "Cette zone n'est pas hébergée ici."
+
+#: postman:314
+msgid "Attachment number not found."
+msgstr "Numéro de pièce jointe non trouvé."
+
+#: postman:319
+msgid "Attachment has wrong content-type."
+msgstr "La pièce jointe a un mauvais type de contenu (content-type)."
+
+#: postman:334
+msgid "Invalid zone data."
+msgstr "Données pour la zone invalides."
+
+#: postman:341
+msgid "Zone serial is not superior to current serial."
+msgstr "Le numéro de série de la zone n'est pas supèrieur à celui actuel."
+
+#: postman:352
+msgid "Zone updated."
+msgstr "Zone mise à jour."
diff --git a/postman b/postman
index 5ab9b36..255f745 100755
--- a/postman
+++ b/postman
@@ -37,343 +37,346 @@ require 'fileutils'
 
 
 module CyborgHood
-  # not yet ready to be a real Cyborg
-  class Postman #< Cyborg
+  module PostmanHome
     include GetText
-    bindtextdomain(PRODUCT + "_" + self.human_name, {:path => File.join(APP_ROOT, "locale"), :charset => "UTF-8"})
-    textdomain(PRODUCT + "_" + self.human_name)
-
-    def initialize
-      # load config
-      Config.load(self.human_name.downcase)
-      @config = Config.instance
-
-      ldap_config = @config.ldap
-      ldap_config.logger = logger
-      ActiveLdap::Base.establish_connection(ldap_config.marshal_dump)
-
-      # setup logs
-      unless @config.log.nil?
-        logger.output_level(@config.log.console_level) unless @config.log.console_level.nil?
-        logger.log_to_file(@config.log.file) unless @config.log.file.nil?
-      end
+    bindtextdomain("cyborghood_postman", {:path => File.join(APP_ROOT, "locale"), :charset => "UTF-8"})
 
-      @current_thread = Thread.current
-      @stop_asap = false
-      @waiting = false
+    # not yet ready to be a real Cyborg
+    class Postman #< Cyborg
+      include GetText
 
-      logger.info "Bot '#{self.human_name}' loaded"
-    end
+      def initialize
+        # load config
+        Config.load(self.human_name.downcase)
+        @config = Config.instance
 
-    def run
-      imap = IMAP.new(@config.imap)
-      until @stop_asap
-        t = Time.now.to_i
-        logger.debug "Starting mail check"
-        check_mails(imap)
-        logger.debug "Mail check finished"
-        t2 = Time.now.to_i
-        sleep_time = @config.imap.min_check_interval - (t2 - t)
-        if sleep_time > 0
-          logger.debug "Having a break before new check..."
-          @waiting = true
-          begin
-            sleep(sleep_time)
-          rescue
-          end
-          @waiting = false
+        ldap_config = @config.ldap
+        ldap_config.logger = logger
+        ActiveLdap::Base.establish_connection(ldap_config.marshal_dump)
+
+        # setup logs
+        unless @config.log.nil?
+          logger.output_level(@config.log.console_level) unless @config.log.console_level.nil?
+          logger.log_to_file(@config.log.file) unless @config.log.file.nil?
         end
+
+        @current_thread = Thread.current
+        @stop_asap = false
+        @waiting = false
+
+        logger.info "Bot '#{self.human_name}' loaded"
       end
-      logger.info "Bot was asked to stop..." if @stop_asap
-      logger.info "Bot terminating"
-    end
 
-    def check_mails(imap)
-      imap.check_mail do |msg|
-        if @stop_asap
-          logger.info "Bot was asked to stop..."
-          break
+      def run
+        imap = IMAP.new(@config.imap)
+        until @stop_asap
+          t = Time.now.to_i
+          logger.debug "Starting mail check"
+          check_mails(imap)
+          logger.debug "Mail check finished"
+          t2 = Time.now.to_i
+          sleep_time = @config.imap.min_check_interval - (t2 - t)
+          if sleep_time > 0
+            logger.debug "Having a break before new check..."
+            @waiting = true
+            begin
+              sleep(sleep_time)
+            rescue
+            end
+            @waiting = false
+          end
         end
+        logger.info "Bot was asked to stop..." if @stop_asap
+        logger.info "Bot terminating"
+      end
 
-        mail = Mail.new(msg.content)
-        logger.info "Received mail with ID '#{mail.message_id}': #{mail.from_addrs} -> #{mail.to_addrs} (#{mail.subject})"
+      def check_mails(imap)
+        imap.check_mail do |msg|
+          if @stop_asap
+            logger.info "Bot was asked to stop..."
+            break
+          end
 
-        # ignore mails not signed or encrypted
-        unless mail.is_pgp_signed? or mail.is_pgp_encrypted?
-          logger.info "Mail not signed/encrypted or not RFC3156 compliant, ignoring..."
-          msg.delete
-          next
-        end
+          mail = Mail.new(msg.content)
+          logger.info "Received mail with ID '#{mail.message_id}': #{mail.from_addrs} -> #{mail.to_addrs} (#{mail.subject})"
 
-        logger.debug "RFC3156 content detected"
-        begin
-          order = mail.parse
-        rescue CyberError => e
-          case e.severity
-          when :dangerous
-            logger.fatal " (#{e.message})"
-            exit 2
-          when :unrecoverable
-            logger.error "Internal processing error, skipping mail (#{e.message})"
+          # ignore mails not signed or encrypted
+          unless mail.is_pgp_signed? or mail.is_pgp_encrypted?
+            logger.info "Mail not signed/encrypted or not RFC3156 compliant, ignoring..."
+            msg.delete
             next
-          when :ignorable
           end
-        end
-        result_tag = order.ok ? "SUCCESS" : "FAILURE"
-        logger.info "Processing result: #{result_tag} (#{order.message})"
-        logger.info "Extra processing information: " + order.system_message if order.system_message
-
-        if order.user
-          if order.user.preferredLanguage
-            logger.debug "User preference for langage: " + order.user.preferredLanguage
-            set_locale(order.user.preferredLanguage)
+
+          logger.debug "RFC3156 content detected"
+          begin
+            order = mail.parse
+          rescue CyberError => e
+            case e.severity
+            when :dangerous
+              logger.fatal " (#{e.message})"
+              exit 2
+            when :unrecoverable
+              logger.error "Internal processing error, skipping mail (#{e.message})"
+              next
+            when :ignorable
+            end
+          end
+          result_tag = order.ok ? "SUCCESS" : "FAILURE"
+          logger.info "Processing result: #{result_tag} (#{order.message})"
+          logger.info "Extra processing information: " + order.system_message if order.system_message
+
+          if order.user
+            if order.user.preferredLanguage
+              logger.debug "User preference for langage: " + order.user.preferredLanguage
+              set_locale(order.user.preferredLanguage)
+            else
+              logger.debug "No user preference for langage, using english"
+              set_locale("en")
+            end
           else
-            logger.debug "No user preference for langage, using english"
             set_locale("en")
           end
-        else
-          set_locale("en")
-        end
 
-        unless order.ok
-          if order.warn_sender
-            logger.info "Sending reply for rejected message"
-            mail_reply = mail.create_simple_reject_reply("A message (ID: #{mail.message_id}), apparently from you," +
-                                                         " was rejected for the following reason:\n  #{_(order.message)}")
-            mail_reply.deliver
+          unless order.ok
+            if order.warn_sender
+              logger.info "Sending reply for rejected message"
+              mail_reply = mail.create_simple_reject_reply(sprintf(
+                           _("A message (ID: %s), apparently from you, was rejected for the following reason:"),
+                           mail.message_id) + "\n  " + _(order.message))
+              mail_reply.deliver
+            end
+            msg.delete
+            next
           end
-          msg.delete
-          next
-        end
-
-        logger.debug "Message accepted, processing orders..."
-        result_list = CommandParser.run(order)
-
-        # create transcript
-        logger.debug "Preparing reply"
-        reply_txt = sprintf(_("Hello %s,"), order.user.cn) + "\n\n"
-        reply_txt += _(order.message) + "\n\n" if order.message
-        reply_txt += _("Follows the transcript of your commands:") + "\n"
-        reply_attachments = []
-        result_list.each do |result|
-          reply_txt << "> #{result.cmd}\n"
-          reply_txt << "#{result.message}\n"
-          reply_attachments += result.refs unless result.refs.nil?
-        end
 
-        # create mail
-        logger.debug "Preparing mail"
-        mail_reply = mail.create_reply
-        if reply_attachments.empty?
-          transcript_part = mail_reply
-        else
-          mail_reply.set_content_type("multipart", "mixed", {'boundary' => TMail.new_boundary})
-          parts = []
+          logger.debug "Message accepted, processing orders..."
+          result_list = CommandParser.run(order)
+
+          # create transcript
+          logger.debug "Preparing reply"
+          reply_txt = sprintf(_("Hello %s,"), order.user.cn) + "\n\n"
+          reply_txt += _(order.message) + "\n\n" if order.message
+          reply_txt += _("Follows the transcript of your commands:") + "\n"
+          reply_attachments = []
+          result_list.each do |result|
+            reply_txt << "> #{result.cmd}\n"
+            reply_txt << "#{result.message}\n"
+            reply_attachments += result.refs unless result.refs.nil?
+          end
 
-          p = CyborgHood::Mail.new
-          transcript_part = p
-          mail_reply.parts << p
+          # create mail
+          logger.debug "Preparing mail"
+          mail_reply = mail.create_reply
+          if reply_attachments.empty?
+            transcript_part = mail_reply
+          else
+            mail_reply.set_content_type("multipart", "mixed", {'boundary' => TMail.new_boundary})
+            parts = []
 
-          reply_attachments.each do |attachment|
             p = CyborgHood::Mail.new
-            p.set_content_type("text", "plain", {'charset' => "utf-8"})
-            p.set_disposition("attachment", {'filename' => attachment.filename})
-            p.quoted_printable_body = attachment.content
+            transcript_part = p
             mail_reply.parts << p
+
+            reply_attachments.each do |attachment|
+              p = CyborgHood::Mail.new
+              p.set_content_type("text", "plain", {'charset' => "utf-8"})
+              p.set_disposition("attachment", {'filename' => attachment.filename})
+              p.quoted_printable_body = attachment.content
+              mail_reply.parts << p
+            end
           end
+          # insert transcript
+          transcript_part.set_content_type("text", "plain", {'charset' => 'utf-8', 'format' => 'flowed'})
+          transcript_part.set_disposition("inline")
+          transcript_part.quoted_printable_body = reply_txt
+
+          # send reply
+          logger.debug "Sending mail"
+          mail_reply.sign_and_crypt(order.user.keyFingerPrint)
+          mail_reply.deliver
+
+          logger.info "Message processed completely, deleting"
+          msg.delete
         end
-        # insert transcript
-        transcript_part.set_content_type("text", "plain", {'charset' => 'utf-8', 'format' => 'flowed'})
-        transcript_part.set_disposition("inline")
-        transcript_part.quoted_printable_body = reply_txt
-
-        # send reply
-        logger.debug "Sending mail"
-        mail_reply.sign_and_crypt(order.user.keyFingerPrint)
-        mail_reply.deliver
-
-        logger.info "Message processed completely, deleting"
-        msg.delete
       end
-    end
 
-    def ask_to_stop
-      @stop_asap = true
-      Thread.critical = true
-      @current_thread.raise if @waiting
-      Thread.critical = false
+      def ask_to_stop
+        @stop_asap = true
+        Thread.critical = true
+        @current_thread.raise if @waiting
+        Thread.critical = false
+      end
     end
-  end
 
-  class CommandParser
-    include GetText
-    textdomain(PRODUCT + "_Postman")
-
-    def self.run(order)
-      result_list = []
-      order.commands.each do |cmdstr|
-        logger.info "Executing command: #{cmdstr}"
-        begin
-          result = execute_cmd(order.user, cmdstr, order.references)
-          if result.nil?
+    class CommandParser
+      include GetText
+
+      def self.run(order)
+        result_list = []
+        order.commands.each do |cmdstr|
+          logger.info "Executing command: #{cmdstr}"
+          begin
+            result = execute_cmd(order.user, cmdstr, order.references)
+            if result.nil?
+              result = OpenStruct.new
+              result.cmd = cmdstr
+              result.ok = false
+              result.message = _("Command not recognized.")
+              result.refs = nil
+            end
+          rescue CyberError => e
             result = OpenStruct.new
             result.cmd = cmdstr
             result.ok = false
-            result.message = _("Command not recognized.")
+            result.message = e.message.capitalize + "."
+            result.refs = nil
+          rescue
+            logger.warn "Command crashed: " + $!
+            result = OpenStruct.new
+            result.cmd = cmdstr
+            result.ok = false
+            result.message = _("Internal error. Administrator is warned.")
             result.refs = nil
           end
-        rescue CyberError => e
-          result = OpenStruct.new
-          result.cmd = cmdstr
-          result.ok = false
-          result.message = e.message.capitalize + "."
-          result.refs = nil
-        rescue
-          logger.warn "Command crashed: " + $!
-          result = OpenStruct.new
-          result.cmd = cmdstr
-          result.ok = false
-          result.message = _("Internal error. Administrator is warned.")
-          result.refs = nil
-        end
 
-        tag = result.ok ? "SUCCESS" :"FAILURE"
-        logger.debug "Command result: [#{tag}] #{result.message}"
-        result_list << result
+          tag = result.ok ? "SUCCESS" :"FAILURE"
+          logger.debug "Command result: [#{tag}] #{result.message}"
+          result_list << result
+        end
+        result_list
       end
-      result_list
-    end
 
-    private
-
-    def self.execute_cmd(user, cmdstr, refs)
-      cmdline = Shellwords.shellwords(cmdstr)
-      subsys = cmdline.shift
-
-      result = OpenStruct.new
-      result.cmd = cmdstr
-      result.ok = false
-      ok = true
-      case subsys.upcase
-      when "DNS"
-        return if cmdline.empty?
-        case cmdline.shift.upcase
-        when "INFO"
-          return unless cmdline.empty?
-          list = CyborgHood::DnsDomain.find_by_manager(user)
-          txt_list = list.collect{|z| z.cn }.sort.join(", ")
-          result.ok = true
-          result.message = sprintf(_("You are manager of the following zones: %s."), txt_list)
-        when "GET"
-          return if cmdline.empty?
-          case cmdline.shift.upcase
-          when "ZONE"
-            return if cmdline.empty?
-            zone = cmdline.shift.downcase
+      private
 
-            dom = CyborgHood::DnsDomain.new(zone)
-            unless dom.hosted?
-              result.message = ("This zone is not hosted here.")
-              return result
-            end
-            unless dom.managed_by? user
-              result.message = _("You are not allowed to manage this zone.")
-              return result
-            end
+      def self.execute_cmd(user, cmdstr, refs)
+        cmdline = Shellwords.shellwords(cmdstr)
+        subsys = cmdline.shift
 
-            srv_dns = CyborgHood::Services::DNS.new(zone)
-            result.ok = true
-            result.message = _("Requested zone content attached.")
-            zone_ref = {:content => srv_dns.read_zone, :filename => "dnszone_#{zone}.txt"}.to_ostruct
-            result.refs = [zone_ref]
-          end
-        when "SET"
+        result = OpenStruct.new
+        result.cmd = cmdstr
+        result.ok = false
+        ok = true
+        case subsys.upcase
+        when "DNS"
           return if cmdline.empty?
           case cmdline.shift.upcase
-          when "ZONE"
-          return if cmdline.empty?
-            zone = cmdline.shift.downcase
-            dom = CyborgHood::DnsDomain.new(zone)
-            unless dom.hosted?
-              result.message = _("This zone is not hosted here.")
-              return result
-            end
-            unless dom.managed_by? user
-              result.message = _("You are not allowed to manage this zone.")
-              return result
-            end
-            srv_dns = CyborgHood::Services::DNS.new(zone)
-
+          when "INFO"
+            return unless cmdline.empty?
+            list = CyborgHood::DnsDomain.find_by_manager(user)
+            txt_list = list.collect{|z| z.cn }.sort.join(", ")
+            result.ok = true
+            result.message = sprintf(_("You are manager of the following zones: %s."), txt_list)
+          when "GET"
             return if cmdline.empty?
-            content_ref = cmdline.shift.downcase
-            return unless content_ref =~ /^@(\d+)$/
-            part_ref = $1.to_i
-            unless (1..refs.size).include? part_ref
-              result.message = _("Attachment number not found.")
-              return result
-            end
-            part = refs[part_ref]
-            unless part.content_type == "text/plain"
-              result.message = _("Attachment has wrong content-type.")
-              return result
+            case cmdline.shift.upcase
+            when "ZONE"
+              return if cmdline.empty?
+              zone = cmdline.shift.downcase
+
+              dom = CyborgHood::DnsDomain.new(zone)
+              unless dom.hosted?
+                result.message = ("This zone is not hosted here.")
+                return result
+              end
+              unless dom.managed_by? user
+                result.message = _("You are not allowed to manage this zone.")
+                return result
+              end
+
+              srv_dns = CyborgHood::Services::DNS.new(zone)
+              result.ok = true
+              result.message = _("Requested zone content attached.")
+              zone_ref = {:content => srv_dns.read_zone, :filename => "dnszone_#{zone}.txt"}.to_ostruct
+              result.refs = [zone_ref]
             end
+          when "SET"
+            return if cmdline.empty?
+            case cmdline.shift.upcase
+            when "ZONE"
+            return if cmdline.empty?
+              zone = cmdline.shift.downcase
+              dom = CyborgHood::DnsDomain.new(zone)
+              unless dom.hosted?
+                result.message = _("This zone is not hosted here.")
+                return result
+              end
+              unless dom.managed_by? user
+                result.message = _("You are not allowed to manage this zone.")
+                return result
+              end
+              srv_dns = CyborgHood::Services::DNS.new(zone)
+
+              return if cmdline.empty?
+              content_ref = cmdline.shift.downcase
+              return unless content_ref =~ /^@(\d+)$/
+              part_ref = $1.to_i
+              unless (1..refs.size).include? part_ref
+                result.message = _("Attachment number not found.")
+                return result
+              end
+              part = refs[part_ref]
+              unless part.content_type == "text/plain"
+                result.message = _("Attachment has wrong content-type.")
+                return result
+              end
 
-            f = Tempfile.new(zone)
-            f.write(part.body)
-            f.close
-            logger.debug "Created temporary zone file '#{f.path}'"
+              f = Tempfile.new(zone)
+              f.write(part.body)
+              f.close
+              logger.debug "Created temporary zone file '#{f.path}'"
 
-            srv_dns = CyborgHood::Services::DNS.new(zone)
-            current_serial = srv_dns.serial
-            logger.debug "Current serial: #{current_serial}"
+              srv_dns = CyborgHood::Services::DNS.new(zone)
+              current_serial = srv_dns.serial
+              logger.debug "Current serial: #{current_serial}"
 
-            dns_result = srv_dns.check_zone_file(f.path)
-            unless dns_result.ok
-              result.message = _("Invalid zone data.")
-              f.close!
-              return result
-            end
-            logger.debug "New serial: #{dns_result.serial}"
-            # allow new serial or missing serial (to allow creating a new zone or replacing a broken zone)
-            unless current_serial.nil? or dns_result.serial > current_serial
-              result.message = _("Zone serial is not superior to current serial.")
-              f.close!
-              return result
-            end
+              dns_result = srv_dns.check_zone_file(f.path)
+              unless dns_result.ok
+                result.message = _("Invalid zone data.")
+                f.close!
+                return result
+              end
+              logger.debug "New serial: #{dns_result.serial}"
+              # allow new serial or missing serial (to allow creating a new zone or replacing a broken zone)
+              unless current_serial.nil? or dns_result.serial > current_serial
+                result.message = _("Zone serial is not superior to current serial.")
+                f.close!
+                return result
+              end
 
-            begin
-              srv_dns.write_zone_from_file(f.path)
-              logger.debug "zone changed"
-              if srv_dns.reload_zone
-                logger.debug "zone reloaded"
-                result.ok = true
-                result.message = _("Zone updated.")
-              else
-                logger.warn "zone reload failed, replacing old content"
-                srv_dns.replace_zone_with_backup
-                result.message = _("Internal error. Administrator is warned.")
+              begin
+                srv_dns.write_zone_from_file(f.path)
+                logger.debug "zone changed"
+                if srv_dns.reload_zone
+                  logger.debug "zone reloaded"
+                  result.ok = true
+                  result.message = _("Zone updated.")
+                else
+                  logger.warn "zone reload failed, replacing old content"
+                  srv_dns.replace_zone_with_backup
+                  result.message = _("Internal error. Administrator is warned.")
+                end
+              rescue
+                logger.warn "Writing zone file failed"
+                raise
+              ensure
+                f.close!
               end
-            rescue
-              logger.warn "Writing zone file failed"
-              raise
-            ensure
-              f.close!
             end
           end
         end
-      end
 
-      if result.message.nil?
-        # here fall lost souls
-        nil
-      else
-        result
+        if result.message.nil?
+          # here fall lost souls
+          nil
+        else
+          result
+        end
       end
     end
   end
 end
 
-bot = CyborgHood::Postman.new
+bot = CyborgHood::PostmanHome::Postman.new
 
 trap('INT') do
   bot.ask_to_stop
