commit 5413554083a9dca6bbfb3e043e73e6325c3d53f6 from: Izzy Blacklock date: Thu Sep 28 17:40:29 2023 UTC Initial support for staging git renamed shellname to account. adding of configNow repos to the stageNow repo as submodules. commit - fc937c40bfe1e133f4cbe986ee5573b0625c9856 commit + 5413554083a9dca6bbfb3e043e73e6325c3d53f6 blob - b6ef931db04dd3f3d8b46f37afcd1280d6edaa1a blob + af3e377b932594e963ec7aec92c47e3902eded4d --- bin/configNow.pl +++ bin/configNow.pl @@ -7,22 +7,27 @@ use IRCNOW::ConfigNow; use File::Basename; use File::Path qw(make_path); -my $shellname = shift || 'blacklock'; +my $account = shift || 'blacklock'; my @users = qw( izzyb nathan ashley ); my $domain = 'user.planetofnix.com'; my $custDomain = 'bnsnet.ca'; my %config=( type=>'shell', - shellname => $shellname, + account => $account, users => \@users, - gitAuthor => $shellname, - gitEmail => $shellname . "@" . $domain, + gitAuthor => $account, + gitEmail => $account . "@" . $domain, gitWorkDir => './configNow', ipv4 => '38.87.162.191', ipv6 => '2602:fccf:1:1191::', domain => $domain, custDomain => $custDomain, + StageDir => './stageNow', + DeployDir => './deployNow/', + Accounts => [ $account ], # List of accounts to deploy + ); + my $shellConfig = new IRCNOW::ConfigNow( %config ); #use Data::Dumper; #die Dumper($shellConfig->{lists}); @@ -38,6 +43,17 @@ if ($shellConfig->repo_ready()) { print "\n" . $shellConfig->repo_log(); + +if ($shellConfig->stage_ready()) { # Verify stage repo is ready + print "Deploying config Change.\n"; + $shellConfig->stage_pull($account => '../configNow'); + $shellConfig->stage_merge(); + $shellConfig->stage_commit(); + $shellConfig->deploy_system(); +} + + + # Get list of files changed in a diff #$r->run(qw(git diff 0cd562e --name-only)); blob - 353311442c58b050666e1e4c40df60192da1100e blob + 24bbf0e41fc3399031147fe4cc8181b054977ba4 --- lib/IRCNOW/ConfigNow/Module/AcmeClient.pm +++ lib/IRCNOW/ConfigNow/Module/AcmeClient.pm @@ -11,14 +11,14 @@ sub new { return $class->SUPER::new( vars => $options->{vars}, files=>{ acme_client => { filename => "/etc/acme-config.conf", - varlist => [qw(shellname domain)], + varlist => [qw(account domain)], type => 'shell', template => sub { - my ($shellname, $domain) = @_; + my ($account, $domain) = @_; return qq{ -domain $shellname.$domain { - domain key "/etc/ssl/private/$shellname.$domain.key" - domain full chain certificate "/etc/ssl/$shellname.$domain.fullchain.pem" +domain $account.$domain { + domain key "/etc/ssl/private/$account.$domain.key" + domain full chain certificate "/etc/ssl/$account.$domain.fullchain.pem" sign with letsencrypt } }; @@ -26,7 +26,7 @@ domain $shellname.$domain { }, dns => { filename => "/var/nsd/zones/master/$domain", - varlist => [qw(shellname ipv4 ipv6)], + varlist => [qw(account ipv4 ipv6)], type => 'shell', template => qq{ %s 3600 IN A %s blob - f70c6c921f3dfa9eb0326de299e1b0085ef0aff6 blob + 4e428428dd2fa0d2e4e857ea09bd91b6736d8fa3 --- lib/IRCNOW/ConfigNow/Module/Prosody.pm +++ lib/IRCNOW/ConfigNow/Module/Prosody.pm @@ -11,23 +11,23 @@ sub new { return $class->SUPER::new( vars => $options->{vars}, files=>{ prosody => { filename => "/etc/prosody/prosody.cfg.lua", - varlist => [qw{shellname domain}], + varlist => [qw{account domain}], type => 'shell', template => sub { - my $shellname = shift; + my $account = shift; my $domain = shift; return qq{ -VirtualHost "$shellname.$domain" +VirtualHost "$account.$domain" ssl = { - certificate = "/etc/prosody/certs/$shellname.$domain.fullchain.pem"; - key = "/etc/prosody/certs/$shellname.$domain.key"; + certificate = "/etc/prosody/certs/$account.$domain.fullchain.pem"; + key = "/etc/prosody/certs/$account.$domain.key"; } }; }, }, dns => { filename => "/var/nsd/zones/master/$domain", - varlist => [qw(shellname shellname)], + varlist => [qw(account account)], type => 'shell', template => qq{ _xmpp-client._tcp.%s 3600 IN SRV 0 5 5222 xmpp blob - ae759ba2a3e862a95f975afa61fea0a891b938c4 blob + 3a8909069d0fe11990c1ef90197af0158f634824 --- lib/IRCNOW/ConfigNow/Module/SmtpDove.pm +++ lib/IRCNOW/ConfigNow/Module/SmtpDove.pm @@ -11,47 +11,47 @@ sub new { return $class->SUPER::new( vars => $options->{vars}, files=>{ dns => { filename => qq{/var/nsd/zones/master/$domain}, - varlist => ['shellname'], + varlist => ['account'], type => 'shell', template => sub { - my $shellname = shift; + my $account = shift; return qq{ -$shellname 3600 IN MX 10 mail -imap.$shellname 3600 IN CNAME imap -pop.$shellname 3600 IN CNAME pop -pop3.$shellname 3600 IN CNAME pop3 -smtp.$shellname 3600 IN CNAME smtp -mail.$shellname 3600 IN CNAME mail +$account 3600 IN MX 10 mail +imap.$account 3600 IN CNAME imap +pop.$account 3600 IN CNAME pop +pop3.$account 3600 IN CNAME pop3 +smtp.$account 3600 IN CNAME smtp +mail.$account 3600 IN CNAME mail }; }, }, mail_domains => { filename => qq{/etc/mail/domains}, - varlist => [qw{shellname domain}], + varlist => [qw{account domain}], type => 'shell', template => qq{%s.%s\n}, }, mail_mailname => { filename => qq{/etc/mail/mailname}, - varlist => [qw{shellname domain}], + varlist => [qw{account domain}], type => 'shell', template => qq{%s.%s\n}, }, mail_Virtual => { filename => qq{/etc/mail/virtuals}, - varlist => [qw{username shellname domain}], + varlist => [qw{username account domain}], type => 'shelluser', template => qq{%s@%s.%s vmail\n}, }, mail_user => { filename => qq{/etc/mail/users}, - varlist => [qw{username shellname domain username shellname domain}], + varlist => [qw{username account domain username account domain}], type => 'shelluser', template => qq{%s@%s.%s: %s@%s.%s\n}, }, mail_passwd => { filename => qq{/etc/mail/passwd}, - varlist => [qw{username shellname domain password}], + varlist => [qw{username account domain password}], type => 'shelluser', template => qq{%s@%s.%s:%s::::::userdb_quota_rule=*:storage=1G\n}, }, blob - 7b0e6b8c69c6a167232339aa6f1569d7357224b8 blob + 2deb07066ae0be4666ae274b8a37d42ec46dad7b --- lib/IRCNOW/ConfigNow.pm +++ lib/IRCNOW/ConfigNow.pm @@ -140,7 +140,7 @@ sub write_config { # Output for $type . "users" if we have a user list if (exists $self->{vars}->{users}) { for my $user (@{$self->{vars}->{users}}) { - # set the username var to this user. + # set the username var to this user. $self->{vars}->{username} = $user; # generate output for $type . 'user' my $out = $obj->output($filename,$type . "user"); @@ -176,6 +176,7 @@ sub repo_ready { } $r = $self->repo_connect(); return 0 unless defined $r; + $self->{repo} = $r; } # Have a repo created make sure its clean my @status = $r->run(qw(status -su)); @@ -216,10 +217,12 @@ sub repo_log { sub repo_connect { my $self = shift; + my $repo = shift || 'repo'; my $config=$self->{vars}; - return $self->{repo} if defined $self->{repo}; - $self->{repo} = Git::Repository->new( - work_tree => $config->{gitWorkDir}, + my $dir = shift || $config->{gitWorkDir}; + return $self->{$repo} if defined $self->{$repo}; + $self->{$repo} = Git::Repository->new( + work_tree => $dir, { env => { GIT_COMMITTER_EMAIL => $config->{gitEmail}, @@ -228,7 +231,7 @@ sub repo_connect { }, ); # Ready for changes. - return $self->{repo}; + return $self->{$repo}; } sub repo_commit { @@ -257,6 +260,56 @@ sub repo_commit { } } +#################################### Staging Subs #################################### +sub stage_ready { + my $self=shift; + my $r = $self->{stage_repo}; + my $workDir=$self->{vars}->{StageDir}; + if( not defined $r ) { + if (not -d $workDir or not -d "$workDir/.git") { + # Initialize the config repo if it hasn't been created yet. + make_path($workDir); + make_path("$workDir/Accounts"); + make_path("$workDir/Stage"); + Git::Repository->run(init => $workDir); + } + $r = $self->repo_connect('stage_repo', $workDir); + # Enable using file protocal for submodules + $r->run(qw{ config --global protocol.file.allow always }); + return 0 unless defined $r; + $self->{stage_repo} = $r; + } + # Have a repo created make sure its clean + my @status = $r->run(qw(status -su)); + # Not ready if uncommited changes + return 0 if (scalar @status >0); + # Repo ready + return 1; +} + + +sub stage_pull { + my $self=shift; + my ($account, $upstream) = @_; + my $r = $self->{stage_repo}; + my $account_repo="Accounts/$account"; + if (not -d $account_repo) { + # Don't have this account so clone it + my @status = $r->run("submodule","add", $upstream,$account_repo); + use Data::Dumper; + print Dumper(@status); + return 1; + } +} + + +sub stage_merge { +} +sub stage_commit { +} +sub deploy_system { +} + 1;