From e7e83723e62d811fe4a40c91fbf03b02a5726308 Mon Sep 17 00:00:00 2001 From: Peter Fischer Date: Sat, 16 Aug 2025 13:46:50 +0200 Subject: [PATCH] Program-Options --- CMakeLists.txt | 2 +- main.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb1e429..7c1c79a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,5 +4,5 @@ project(zfsbackupcleaner VERSION 0.1.0 LANGUAGES C CXX) find_package(Boost COMPONENTS filesystem system date_time program_options process REQUIRED) add_executable(zfsbackupcleaner main.cpp) -target_link_libraries(zfsbackupcleaner boost_process boost_filesystem) +target_link_libraries(zfsbackupcleaner boost_process boost_filesystem boost_program_options) diff --git a/main.cpp b/main.cpp index fb92db9..d6e6d02 100644 --- a/main.cpp +++ b/main.cpp @@ -2,6 +2,10 @@ #include #include #include +#include +#include +#include +#include #include #include @@ -12,10 +16,15 @@ #include #include +#include +#include + namespace bp = boost::process; namespace asio = boost::asio; +namespace po = boost::program_options; +namespace fs = boost::filesystem; -bool dry_run = true; +bool dry_run = false; templatestd::set::reverse_iterator handle_backups_after(std::string & snapshotbase, std::set & times, std::set::reverse_iterator ct, boost::posix_time::ptime now) { @@ -118,13 +127,51 @@ std::set::reverse_iterator handle_backups_after_365_da } -int main(int, char**){ +int main(int argc, char** argv){ std::cout << "Hello, from zfsbackupcleaner!\n"; + po::options_description options("Argumente"); + options.add_options() + ("help", "Hilfe anzeigen") + ("dry-run,n", "Test-Modus; keine Backups entfernen") + ("backupsystem", po::value(), "Computer, dessen Backups bereinigt werden sollen") + ; + + po::positional_options_description p; + p.add("backupsystem", 1); + + po::variables_map vm; + try { + po::store(po::command_line_parser(argc,argv).options(options).positional(p).run(), vm); + po::notify(vm); + } catch (const boost::program_options::invalid_command_line_syntax & error) { + std::cout << "Error parsing commandline-arguments:" << std::endl; + std::cout << error.what() << std::endl; + return -1; + } + + if(vm.count("help") || !vm.count("backupsystem")) + { + std::cout << "Benutzung: zfsbackupcleaner [Optionen] " << std::endl << std::endl; + std::cout << options << std::endl; + return 0; + } + + if(vm.count("dry-run")) + dry_run = true; + + std::string backupsystem = vm["backupsystem"].as(); + + if(backupsystem != "workstation" && ! fs::exists("/backup/"+backupsystem)) + { + std::cout << "Für das System >" << backupsystem << "< gibt es keine Backups." << std::endl; + return -1; + } + asio::io_context ctx; asio::readable_pipe out(ctx); - bp::process proc(ctx, bp::environment::find_executable("zfs"), {"list", "-t", "snapshot", "/backup/workstation"}, bp::process_stdio{{/* in to default*/}, out, {/* err to default */}}); + bp::process proc(ctx, bp::environment::find_executable("zfs"), {"list", "-t", "snapshot", "/backup/"+backupsystem}, bp::process_stdio{{/* in to default*/}, out, {/* err to default */}}); std::string output; @@ -139,7 +186,6 @@ int main(int, char**){ std::set times; - std::string snapshotbase; for(std::string line; std::getline(lines, line);) @@ -174,7 +220,7 @@ int main(int, char**){ boost::posix_time::ptime now = boost::posix_time::second_clock::local_time(); - std::cout << "NOW " << now << std::endl; + std::cout << "Gehe aus von aktueller Zeit: " << now << std::endl << std::endl; boost::posix_time::time_duration dur;