X-Git-Url: http://gitweb.michael.orlitzky.com/?p=mailshears.git;a=blobdiff_plain;f=bin%2Fmailshears;h=d2894cd13db31ae86fb72758096f4a9cd1762533;hp=d34ce54f719749df9ceb78e5625123589b5ad2e4;hb=6732f04111887cf7d940349719481dc4b00d5c36;hpb=6327411ce5538751bd5b3ae07f13da4267d6aa11 diff --git a/bin/mailshears b/bin/mailshears index d34ce54..d2894cd 100755 --- a/bin/mailshears +++ b/bin/mailshears @@ -15,7 +15,7 @@ # We need Pathname to get the real filesystem path # of this script (and not, for example, the path of -# a symlink which points to it. +# a symlink which points to it). require 'pathname' # This bit of magic adds the parent directory (the @@ -25,6 +25,9 @@ require 'pathname' executable = Pathname.new(__FILE__).realpath.to_s $: << File.dirname(executable) + '/../' +# Needed for rm_rf. +require 'fileutils' + # Load our config file. require 'bin/configuration' @@ -44,9 +47,32 @@ pgadb = PostfixadminDb.new(Configuration::DBHOST, Configuration::DBUSER, Configuration::DBPASS) + +# First, we find out if any domains have been removed from the +# database but not from the filesystem. +begin + # Get the list of domains according to the filesystem. + fs_domains = dms.get_domains_from_filesystem() +rescue StandardError => e + puts "There was an error retrieving domains from the filesystem: #{e.to_s}" + Kernel.exit(ExitCodes::FILESYSTEM_ERROR) +end + +begin + # ...and according to the Postfixadmin database. + db_domains = pgadb.get_domains_from_db() +rescue DatabaseError => e + puts "There was an error connecting to the database: #{e.to_s}" + Kernel.exit(ExitCodes::DATABASE_ERROR) +end + + +# Then, we get the list of accounts that have been removed. We did +# the domains first so that, if a domain was removed, we can avoid +# reporting each of its accounts individually. begin # Get the list of accounts according to the filesystem. - fs_accts = dms.get_accounts_from_filesystem() + fs_accts = dms.get_accounts_from_filesystem(db_domains) rescue StandardError => e puts "There was an error retrieving accounts from the filesystem: #{e.to_s}" Kernel.exit(ExitCodes::FILESYSTEM_ERROR) @@ -61,17 +87,19 @@ rescue DatabaseError => e end -# Figure out which addresses are in the filesystem, but not in the -# database. -difference = fs_accts - db_accts +# The list of domains on the filesystem that aren't in the DB. +dom_difference = fs_domains - db_domains -# Don't output any unnecessary junk. Cron might mail it to someone. -if difference.size > 0 +# And accounts on the filesystem that aren't in the DB and don't +# belong to a domain that was removed. +acct_difference = fs_accts - db_accts +# Don't output any unnecessary junk. Cron might mail it to someone. +if dom_difference.size > 0 or acct_difference.size > 0 # The header that we output before the list of accounts. # Just the path of this script, and the current time. header = "#{$0}, " - + current_time = Time.now() if current_time.respond_to?(:iso8601) # Somehow this method is missing on some machines. @@ -80,9 +108,31 @@ if difference.size > 0 # Fall back to whatever this looks like. header += current_time.to_s end - + puts header puts '-' * header.size # Underline the header. - puts difference + + dom_difference.each do |domain| + puts "Found: #{domain} (#{dms.get_domain_path(domain)})" + end + + acct_difference.each do |account| + puts "Found: #{account} (#{dms.get_account_path(account)})" + end + + if Configuration::I_MEAN_BUSINESS + dom_difference.each do |domain| + domain_path = dms.get_domain_path(domain) + FileUtils.rm_rf(domain_path) + puts "Removed: #{domain_path}" + end + + acct_difference.each do |account| + account_path = dms.get_account_path(account) + FileUtils.rm_rf(account_path) + puts "Removed: #{account_path}" + end + end + puts "" end