// main.cpp // // Copyright (C) 2012, ARM Research Labs, LLC. // See www.armresearch.com for the copyright terms. // // Create and maintain the sniffer configuration file for SNFMilter. // // The configuration file and instructions are specified on the // command line, and are used to create/modify the configuration file, // and integrate or unintegrate with the specified MTA. // // // $Id$ // /////////////////////////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include "SNFMulti.hpp" #include "SNFMilterConfig.hpp" using namespace std; ////////////////////////////////////////////////////////////////////////////////////////////////////////// // Configuration. //////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Version string. const char* SNF_MILTERCONFIG_VERSION = "SNFMilterConfig 0.0.1 Build: " __DATE__ " " __TIME__; ////////////////////////////////////////////////////////////////////////////////////////////////////////// // End of configuration. ///////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// void RestoreFiles(SNFMilterConfig *Config) { try { cerr << "Restoring all configuration files..."; Config->SaveFile.RestoreAllFilesFromBackup(); cerr << "done.\n"; } catch(exception& e) { cerr << "SNFMilterConfig::SaveFile Exception: " << e.what() << endl; } } int main(int argc, char* argv[]) { SNFMilterConfig SnfMilterConfig; if (!SnfMilterConfig.GetCommandLineInput(argc, argv) || // If our command line arguments SnfMilterConfig.Help()) { // don't look right, or if help is // requested then display our help SnfMilterConfig.DisplayHelp(SNF_MILTERCONFIG_VERSION); // screen. return 0; } bool DebugMode = false; // This will be our debug mode. string argv0(argv[0]); // Capture how we were called. if( string::npos != argv0.find("Debug") || // If we find "Debug" or string::npos != argv0.find("debug") // "debug" in our command path ) { // then we are in DebugMode. DebugMode = true; // Set the flag and tell the cout << SNF_MILTERCONFIG_VERSION << endl; // watchers. cout << "Debug Mode" << endl; } try { // Catch anything that breaks loose. #if 0 SnifferRunningStatue RunningStatus; #endif SnfMilterConfig.CreateLoadConfig(); // Save config file state and load config. // Load the default if necessary. SnfMilterConfig.SaveFileState(); // Save state of all other files. #if 0 RunningStatus = SnfMilterConfig.GetSnifferRunningStatus(); // Get state before changing anything. #endif SnfMilterConfig.UpdateConfigFiles(); // Create/update config files SnfMilterConfig.CreateUpdateRulebaseScript(); // Create/update GetRulebase. SnfMilterConfig.DownloadRulebase(); // Download rulebase. SnfMilterConfig.UpdateIdentityFile(); // Update Identity file with credentials, // if credentials were specified. SnfMilterConfig.DoIntegrationCommand(); // Integrate/unintegrate. #if 0 if (SnifferIsStopped == RunningStatus) { SnfMilterConfig.StartSniffer(); } else if (SnifferRunningStatusIsUknown == RunningStatus) { std::cout << "SNFMilterConfig: Unable to determine whether SNFMilter is running.\n" << "Please start SNFMilter if it isn't running.\n"; } #else SnfMilterConfig.StartSniffer("snf-milter"); #endif } // That's all folks. catch(exception& e) { // Report any normal exceptions. cerr << "\n\nSNFMilterConfig Exception: " << e.what() << endl << endl; RestoreFiles(&SnfMilterConfig); } catch (snfCFGmgr::LoadFailure) { // Error loading configuration file. cerr << "\n\nsnfCFGmgr Exception: Unable to load the configuration file " << SnfMilterConfig.GetConfigFileName() << endl << endl; RestoreFiles(&SnfMilterConfig); } catch(...) { // Report any unexpected exceptions. cerr << "\n\nSNFMilterConfig Panic! Unknown Exception!" << endl << endl; RestoreFiles(&SnfMilterConfig); } return 0; // Normally we return zero. }