#!/usr/bin/perl use strict; use warnings; my $config={ remoteHost=>'got.ircnow.org', remoteUser=>'gitgot', remoteStage=>'/var/gitgot', repoDir=>'public/gitgot', createRepoDir=>1, stageDir=>'/var/gitgot', gitgotUser=>'gitgot', key_path=>'/home/gitgot/.ssh/id_ed25519', rsync_cmd=>'openrsync', }; # verify we have a local staging area if (not -d $config->{stageDir}) { my (undef,undef,$uid,$gid) = getpwnam($config->{gitgotUser}) or die "User " . $config->{gitgotUser} . " doesn't exist"; mkdir $config->{stageDir}, 0750; chown $uid,$gid,$config->{stageDir}; } opendir (my $DH, '/home/') || die "Can't opendir /home : $!"; while (my $user = readdir($DH)) { if (-d "/home/$user/" . $config->{repoDir}) { # Skip if no repos opendir (my $RDH, "/home/$user/" . $config->{repoDir}) or die "Can't opendir /home/$user/ : $!"; my @repos = readdir($RDH); next unless (scalar @repos > 2); # Make sure user has a staging directory if(not -d $config->{stageDir} . "/$user") { mkdir ($config->{stageDir} . "/$user"); } # rsync files to local staging area my $src=qq(/home/$user/$config->{repoDir}/*); my $dst=qq($config->{stageDir}/$user/); my $rv=system(qq{ openrsync --rsync-path=openrsync -a --delete $src $dst }); warn "rsync failed $user\n$!\n" if ($rv != 0); } elsif ($config->{createRepoDir}) { # create missing repo dirs # skip dirs without users. my (undef,undef,$uid,$gid) = getpwnam($user) or next; my $repoPath="/home/$user"; for my $dir (split('/', $config->{repoDir})) { $repoPath.="/$dir"; unless (-e $repoPath) { mkdir $repoPath, 0755; chown $uid,$gid,$repoPath; } } } } # rsync to remote staging area if we have a remote host if (defined $config->{remoteHost}) { # Only sync if we have repos to deploy opendir (my $SDH, $config->{stageDir}) or die "Can't opendir ". $config->{stageDir} . " : $!"; my @repos = readdir($SDH); if(scalar @repos > 2) { my $src=$config->{stageDir} . "/*"; my $dst=$config->{gitgotUser}. "@" . $config->{remoteHost} . ":" . $config->{remoteStage} . "/"; my $rv=system("openrsync --rsync-path=openrsync -ae " . '"ssh -i ' . $config->{key_path}. '" --delete' . " $src $dst " ); } }