Commit Diff


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;