Blob


1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 my $config={
5 remoteHost=>'got.ircnow.org',
6 remoteUser=>'gitgot',
7 remoteStage=>'/var/gitgot',
8 repoDir=>'public/gitgot',
9 createRepoDir=>1,
10 stageDir=>'/var/gitgot',
11 gitgotUser=>'gitgot',
12 key_path=>'/home/gitgot/.ssh/id_ed25519',
13 rsync_cmd=>'openrsync',
14 };
15 # verify we have a local staging area
16 if (not -d $config->{stageDir}) {
17 my (undef,undef,$uid,$gid) = getpwnam($config->{gitgotUser})
18 or die "User " . $config->{gitgotUser} . " doesn't exist";
19 mkdir $config->{stageDir}, 0750;
20 chown $uid,$gid,$config->{stageDir};
21 }
22 opendir (my $DH, '/home/') || die "Can't opendir /home : $!";
23 while (my $user = readdir($DH)) {
24 if (-d "/home/$user/" . $config->{repoDir}) {
25 # Skip if no repos
26 opendir (my $RDH, "/home/$user/" . $config->{repoDir})
27 or die "Can't opendir /home/$user/ : $!";
28 my @repos = readdir($RDH);
29 next unless (scalar @repos > 2);
31 # Make sure user has a staging directory
32 if(not -d $config->{stageDir} . "/$user") {
33 mkdir ($config->{stageDir} . "/$user");
34 }
35 # rsync files to local staging area
36 my $src=qq(/home/$user/$config->{repoDir}/*);
37 my $dst=qq($config->{stageDir}/$user/);
38 my $rv=system(qq{
39 openrsync --rsync-path=openrsync -a --delete $src $dst
40 });
41 warn "rsync failed $user\n$!\n" if ($rv != 0);
42 } elsif ($config->{createRepoDir}) { # create missing repo dirs
43 # skip dirs without users.
44 my (undef,undef,$uid,$gid) = getpwnam($user) or next;
45 my $repoPath="/home/$user";
46 for my $dir (split('/', $config->{repoDir})) {
47 $repoPath.="/$dir";
48 unless (-e $repoPath) {
49 mkdir $repoPath, 0755;
50 chown $uid,$gid,$repoPath;
51 }
52 }
53 }
54 }
56 # rsync to remote staging area if we have a remote host
57 if (defined $config->{remoteHost}) {
58 # Only sync if we have repos to deploy
59 opendir (my $SDH, $config->{stageDir})
60 or die "Can't opendir ". $config->{stageDir} . " : $!";
61 my @repos = readdir($SDH);
63 if(scalar @repos > 2) {
64 my $src=$config->{stageDir} . "/*";
65 my $dst=$config->{gitgotUser}. "@" . $config->{remoteHost}
66 . ":" . $config->{remoteStage} . "/";
67 my $rv=system("openrsync --rsync-path=openrsync -ae "
68 . '"ssh -i ' . $config->{key_path}. '" --delete'
69 . " $src $dst "
70 );
71 }
72 }