X-Git-Url: http://gitweb.michael.orlitzky.com/?p=mailshears.git;a=blobdiff_plain;f=bin%2Fmailshears;h=d2894cd13db31ae86fb72758096f4a9cd1762533;hp=fc20dd3b4b7302ce536e90210d87cad474ad1e34;hb=6732f04111887cf7d940349719481dc4b00d5c36;hpb=da71911046617ccffbb899b57162c5e6bdbb37ee diff --git a/bin/mailshears b/bin/mailshears index fc20dd3..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,11 +87,52 @@ 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 + +# 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 difference.size > 0 - puts difference +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. + header += current_time.iso8601.to_s + else + # Fall back to whatever this looks like. + header += current_time.to_s + end + + puts header + puts '-' * header.size # Underline the header. + + 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