summaryrefslogtreecommitdiff
path: root/usr/local/sbin/rmrepo
blob: 3905412450f3af0384b4444941c05c7809e5f54e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/perl

use strict;
use warnings;

my( $reponame, $uid, $gitowner, $wikilisttempfile, $cgitrctempfile);

if ( ( ! scalar $ARGV[0] ) or ( scalar $ARGV[1] ) or ( $ARGV[0] !~ /^[a-z0-9][a-z0-9+.-]+$/ ) ) {
  print( "Usage: rmrepo REPONAME\n" );
  exit( 1 );
} else {
  $reponame = $ARGV[0];
};

open (PASSWD, '/etc/passwd');
while(<PASSWD>) {
  if( $_ =~ /^$ENV{SUDO_USER}:.+?:(.+?):/ ) { $uid = $1; }; # grabbing uid.
};
close(PASSWD);

unless( -d "/srv/git/$reponame.git" ) {
  print( "/srv/git/$reponame.git doesn't exist!\n" );
  exit( 2 );
};

$gitowner = (stat "/srv/git/$reponame.git")[4];

if( ( $gitowner != $uid ) and ( $gitowner != 65534 ) ) {
  print( "$reponame is not owned by you!\n" );
  exit( 3 );
};

# We have to be careful about how we delete things; we don't want have post-update or ikiwiki.cgi thrashing, and we REALLY don't want to leave remappable owner UIDs around, but we're also keying security on /srv/git/$reponame
system( "/bin/chown -R nobody.nogroup /srv/git/$reponame.git" );

unlink( "/etc/ikiwiki/wikilist.d/$reponame" );
$wikilisttempfile = `/bin/mktemp`;
chomp ( $wikilisttempfile );
system( "/bin/cat /etc/ikiwiki/wikilist.d/* > $wikilisttempfile" );
chmod ( 0644, $wikilisttempfile );
system( "/bin/mv $wikilisttempfile /etc/ikiwiki/wikilist" ); # This is marginally racy, but the consequences are probably ignorable.

unlink( "/etc/cgitrc.d/$reponame" );
$cgitrctempfile = `/bin/mktemp`;
chomp ( $cgitrctempfile );
system( "/bin/cat /etc/cgitrc.d/* > $cgitrctempfile" );
chmod ( 0644, $cgitrctempfile );
system( "/bin/mv $cgitrctempfile /etc/cgitrepos" ); # This is marginally racy, but the consequences are probably ignorable.

system( "/bin/rm -r /srv/www/piny.svcs.cs.pdx.edu/$reponame" );
system( "/bin/rm -r /srv/www/cgi.piny.svcs.cs.pdx.edu/repos/$reponame" );

unlink( "/etc/ikiwiki/piny/$reponame.setup" );
system( "/bin/rm -r /srv/ikiwiki/$reponame" );

unlink( "/etc/apache2/piny-available/$reponame" );
unlink( "/etc/apache2/piny-enabled/$reponame" );
system( '/etc/init.d/apache2 reload | grep -v "Reloading web server config: apache2."' );

system( "/usr/sbin/delgroup --quiet git-$reponame" );
system( "/usr/sbin/deluser --quiet --remove-home ikiwiki-$reponame" );
system( "/usr/sbin/delgroup --quiet ikiwiki-$reponame" );

system( "/bin/rm -rf /srv/git/$reponame.git" );