| 1 | #!/usr/bin/perl |
| 2 | # |
| 3 | # userv-git-daemon service script |
| 4 | # |
| 5 | # This was written by Tony Finch <dot@dotat.at> and subsequently |
| 6 | # heavily modified by Ian Jackson <ijackson@chiark.greenend.org.uk> |
| 7 | # http://creativecommons.org/publicdomain/zero/1.0/ |
| 8 | |
| 9 | use strict; |
| 10 | use warnings; |
| 11 | |
| 12 | use POSIX; |
| 13 | use Sys::Syslog; |
| 14 | |
| 15 | our ($client,$service,$specpath,$spechost,@opts); |
| 16 | |
| 17 | ${$::{$_}} = $ENV{"USERV_U_$_"} |
| 18 | for qw(service specpath spechost client); |
| 19 | |
| 20 | openlog "userv-$service:$ENV{USER}", 'pid', 'daemon'; |
| 21 | sub fail { syslog 'err', "$client @_"; exit } |
| 22 | |
| 23 | @@READ_URLMAP@@ |
| 24 | |
| 25 | fail "No user $ENV{USER} mapping for $uri" unless defined $serve_user; |
| 26 | |
| 27 | $serve_dir = "$ENV{HOME}/$serve_dir" unless $serve_dir =~ m|^/|; |
| 28 | |
| 29 | if (length $serve_repo) { |
| 30 | my $inspect= $serve_repo; |
| 31 | $inspect =~ s,^/,,; |
| 32 | fail "Bad subdirectory $serve_repo" unless $inspect =~ m/$repo_regexp/o; |
| 33 | fail "bad config - repo-regexp does not capture" unless defined $1; |
| 34 | $serve_repo= "/$1"; |
| 35 | } |
| 36 | |
| 37 | my $dir = $serve_dir.$serve_repo; |
| 38 | |
| 39 | my $path = $check_export ? "$dir/git-daemon-export-ok" : $dir; |
| 40 | fail "$! $path" unless -e $path; |
| 41 | |
| 42 | syslog 'notice', "$client $uri $dir"; |
| 43 | |
| 44 | @opts = qw( --strict ) |
| 45 | if @opts == 0 and $service eq 'git-upload-pack'; |
| 46 | |
| 47 | my @cmd = ($service =~ m|^(git)-(.*)$|, @opts, $dir); |
| 48 | no warnings; # suppress errors to stderr |
| 49 | exec @cmd or fail "exec $service: $!"; |
| 50 | |
| 51 | # end |