chiark / gitweb /
19b632713d43aecab250fe2b5b25bf8d824066fc
[userv-utils.git] / git-daemon / git-daemon-service.pl
1 #!/usr/bin/perl
2 #
3 # userv-git-daemon service script
4 #
5 # This was written by Tony Finch <dot@dotat.at>
6 # You may do anything with it, at your own risk.
7 # http://creativecommons.org/publicdomain/zero/1.0/
8
9 use strict;
10 use warnings;
11
12 use Sys::Syslog;
13
14 our $check_repo = 1;
15 our $check_export = 0;
16 our ($service,$client,$dir,$repo);
17
18 ${$main::{$_}} = $ENV{"USERV_U_$_"}
19     for grep s/^USERV_U_//, keys %ENV;
20
21 openlog "userv-$service", 'pid', 'daemon';
22 sub fail { syslog 'err', "$client @_"; exit }
23
24 $_ = our $uri;
25 for my $cf (@ARGV) { do $cf }
26
27 fail "no repository configured for $uri" unless defined $repo;
28 fail "no directory configured for $uri"  unless defined $dir;
29
30 my $home = (getpwuid $<)[7];
31 $dir = "$home/$dir" if $dir =~ m|^[^/]|
32                     or $dir =~ s|^~/||;
33 $dir = "$dir/$repo";
34
35 fail "bad repository in $uri"
36     if $check_repo and $repo !~ /^[0-9A-Za-z._-]+[.]git$/;
37 fail "repository not exported for $uri"
38     if $check_export and not -e "$dir/git-daemon-export-ok";
39 syslog 'info', "$client $dir";
40
41 my @cmd = ($service, '--strict', '--timeout=30', $dir);
42 no warnings; # suppress errors to stderr
43 exec @cmd or fail "exec @cmd: $!";
44
45 # end