App-Yabsm

 view release on metacpan or  search on metacpan

lib/App/Yabsm/Command/Config.pm  view on Meta::CPAN

#  Author:  Nicholas Hubbard
#  WWW:     https://github.com/NicholasBHubbard/yabsm
#  License: MIT

#  Provides functionality for querying information about the users config.

use strict;
use warnings;
use v5.16.3;

package App::Yabsm::Command::Config;

use App::Yabsm::Tools qw( :ALL );
use App::Yabsm::Config::Query qw( :ALL );
use App::Yabsm::Config::Parser qw(parse_config_or_die);
use App::Yabsm::Backup::SSH;
use App::Yabsm::Command::Daemon;

sub usage {
    arg_count_or_die(0, 0, @_);
    return <<'END_USAGE';
usage: yabsm <config|c> [--help] [check ?file] [ssh-check <SSH_BACKUP>] [ssh-key]
                        [yabsm-user-home] [yabsm_dir] [subvols] [snaps]
                        [ssh_backups] [local_backups] [backups]
END_USAGE
}

sub help {
    @_ == 0 or die usage();
    my $usage = usage();
    $usage =~ s/\s+$//;
    print <<"END_HELP";
$usage

--help                 Print this help message.

check ?file            Check ?file for errors and print their messages. If ?file
                       is omitted it defaults to /etc/yabsm.conf.

ssh-check <SSH_BACKUP> Check that backups for <SSH_BACKUP> are able to be
                       performed and if not print useful error messages.

ssh-key                Print the 'yabsm' users public SSH key.

yabsm-user-home        Print the 'yabsm' users home directory.

yabsm_dir              Print the value of yabsm_dir in /etc/yabsm.conf.

subvols                Print names of all subvols defined in /etc/yabsm.conf.

snaps                  Print names of all snaps defined in /etc/yabsm.conf.

ssh_backups            Print names of all ssh_backups defined in /etc/yabsm.conf.

local_backups          Print the of all local_backups defined in /etc/yabsm.conf.

backups                Print names of all ssh_backups and local_backups defined
                       in /etc/yabsm.conf.
END_HELP
}

                 ####################################
                 #               MAIN               #
                 ####################################

sub main {

    my $cmd = shift or die usage();

    if    ($cmd =~ /^(-h|--help)$/  ) { help(@_)                     }
    elsif ($cmd eq 'check'          ) { check_config(@_)             }
    elsif ($cmd eq 'ssh-check'      ) { check_ssh_backup(@_)         }
    elsif ($cmd eq 'ssh-key'        ) { print_yabsm_user_ssh_key(@_) }
    elsif ($cmd eq 'yabsm_user_home') { print_yabsm_user_home(@_)    }
    elsif ($cmd eq 'yabsm_dir'      ) { print_yabsm_dir(@_)          }
    elsif ($cmd eq 'subvols'        ) { print_subvols(@_)            }
    elsif ($cmd eq 'snaps'          ) { print_snaps(@_)              }
    elsif ($cmd eq 'ssh_backups'    ) { print_ssh_backups(@_)        }
    elsif ($cmd eq 'local_backups'  ) { print_local_backups(@_)      }
    elsif ($cmd eq 'backups'        ) { print_backups(@_)            }
    else {
        die usage();
    }
}

                 ####################################
                 #            SUBCOMMANDS           #
                 ####################################

sub check_config {
    @_ <= 1 or die usage();
    my $file = shift // '/etc/yabsm.conf';
    parse_config_or_die($file);
    say 'all good';
}

sub print_subvols {
    @_ == 0 or die usage();
    my $config_ref = parse_config_or_die();
    say for all_subvols($config_ref);
}

sub print_snaps {
    @_ == 0 or die usage();
    my $config_ref = parse_config_or_die();
    say for all_snaps($config_ref);
}

sub print_ssh_backups {
    @_ == 0 or die usage();
    my $config_ref = parse_config_or_die();
    say for all_ssh_backups($config_ref);
}

sub print_local_backups {
    @_ == 0 or die usage();
    my $config_ref = parse_config_or_die();
    say for all_local_backups($config_ref);
}

sub print_backups {
    @_ == 0 or die usage();
    my $config_ref = parse_config_or_die();
    my @ssh_backups = all_ssh_backups($config_ref);
    my @local_backups = all_local_backups($config_ref);
    say for sort @ssh_backups, @local_backups;
}

sub print_yabsm_dir {
    @_ == 0 or die usage();
    my $config_ref = parse_config_or_die();
    my $yabsm_dir = yabsm_dir($config_ref);
    say $yabsm_dir;
}

sub print_yabsm_user_home {
    @_ == 0 or die usage();
    my $config_ref = parse_config_or_die();
    my $yabsm_user_home = yabsm_user_home($config_ref);
    say $yabsm_user_home;
}

sub check_ssh_backup {

    # This is mostly just a wrapper around
    # &App::Yabsm::Backup::SSH::check_ssh_backup_config_or_die.

    @_ == 1 or die usage();

    die 'yabsm: error: permission denied'."\n" unless i_am_root();

    my $ssh_backup = shift;

    my $config_ref = parse_config_or_die();

    unless (ssh_backup_exists($ssh_backup, $config_ref)) {
        die "yabsm: error: no such ssh_backup named '$ssh_backup'\n";
    }

    unless (App::Yabsm::Command::Daemon::yabsm_user_exists()) {
        die q(yabsm: error: cannot find user named 'yabsm')."\n";
    }

    unless (App::Yabsm::Command::Daemon::yabsm_group_exists()) {
        die q(yabsm: error: cannot find group named 'yabsm')."\n";
    }

    POSIX::setgid(scalar(getgrnam 'yabsm'));
    POSIX::setuid(scalar(getpwnam 'yabsm'));

    App::Yabsm::Backup::SSH::check_ssh_backup_config_or_die(undef, $ssh_backup, $config_ref);

    say 'all good';
}

sub print_yabsm_user_ssh_key {

    # Print the yabsm users public key to STDOUT.

    @_ == 0 or die usage();

    die 'yabsm: error: permission denied'."\n" unless i_am_root();

    my $config_ref = parse_config_or_die();

    my $yabsm_user_ssh_dir = yabsm_user_home($config_ref) . '/.ssh';

    my $priv_key = "$yabsm_user_ssh_dir/id_ed25519";
    my $pub_key  = "$yabsm_user_ssh_dir/id_ed25519.pub";

    unless (-f $priv_key) {
        die "yabsm: error: could not find user 'yabsm' users SSH private key '$priv_key'\n";
    }

    unless (-f $pub_key) {
        die "yabsm: error: could not find user 'yabsm' users SSH public key '$pub_key'\n";
    }

    open my $fh, '<', $pub_key
      or die "yabsm: internal error: could not open '$pub_key' for reading\n";

    print <$fh>;

    close $fh
}

1;



( run in 1.019 second using v1.01-cache-2.11-cpan-ceb78f64989 )