Git Repositories

Use a real configure and Makefile
authorCyrille Pontvieux <jrd@enialis.net>
Tue, 25 Nov 2014 19:36:13 +0000 (20:36 +0100)
committerCyrille Pontvieux <jrd@enialis.net>
Wed, 26 Nov 2014 01:05:23 +0000 (02:05 +0100)
.gitignore
Makefile [new file with mode: 0644]
configure [new file with mode: 0755]
install.sh [deleted file]
tpl/apache.conf [new file with mode: 0644]
tpl/nginx.conf [new file with mode: 0644]

index ece41d5..6920d3f 100644 (file)
@@ -1,4 +1,3 @@
+config.mk
 git-master
-nginx.conf
-apache2.conf
-git-daemon.example
+gen
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..84cb012
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,90 @@
+include config.mk
+
+all: _options gen/.website
+
+_options:
+       @echo Build options:
+       @echo "  PREFIX = ${PREFIX}"
+       @echo "  LOGS = ${LOGS}"
+       @echo "  WEB_BASE_DIR = ${WEB_BASE_DIR}"
+       @echo "  GITWEB_DIR = ${GITWEB_DIR}"
+       @echo "  GIT_HOSTNAME = ${GIT_HOSTNAME}"
+       @echo "  GIT_HOSTPORT = ${GIT_HOSTPORT}"
+       @echo "  GIT_USER = ${GIT_USER}"
+       @echo "  GIT_HOME = ${GIT_HOME}"
+       @echo "  WEB_USER = ${WEB_USER}"
+       @echo "  WEB_TYPE = ${WEB_TYPE}"
+       @echo "  WEB_TITLE = ${WEB_TITLE}"
+       @echo ""
+
+gen/home:
+       @mkdir -p $@
+
+gen/www/$(WEB_BASE_DIR):
+       @mkdir -p $@
+
+gen/sudoers.d:
+       @mkdir -p $@
+
+gen/sudoers.d/git:
+       @sed "s,WEB_USER,${WEB_USER},; s,GIT_USER,${GIT_USER},; s,GIT_DIR,${GIT_DIR},;" sudoers.d/git > $@
+
+gen/www/$(WEB_BASE_DIR)config.inc.php:
+       @echo '<?php' > $@
+       @echo '$$title = "${WEB_TITLE}";' >> $@
+       @echo '$$githost = "${GIT_HOSTNAME}";' >> $@
+       @echo '$$gitwebroot = "${WEB_BASE_DIR}";' >> $@
+       @echo '$$gituser = "${GIT_USER}";' >> $@
+       @echo '$$gitdir = "${GIT_HOME}";' >> $@
+       @echo '$$gitwebpath = "${GITWEB_DIR}";' >> $@
+       @echo '?>' >> $@
+
+gen/git-daemon.example:
+       @echo "# If you want to enable anonymous read-only git protocol on the repositories, run this:" > $@
+       @echo "git daemon --listen=0.0.0.0 --reuseaddr --base-path=${GIT_HOME} --user=${WEB_USER} --detach ${GIT_HOME}" >> $@
+
+gen/nginx.conf:
+       @sed -r 's,__PREFIX__,${PREFIX},g; s,__LOGS__,${LOGS},g; s,__WEB_BASE_DIR__,${WEB_BASE_DIR},g; s,__GITWEB_DIR__,${GITWEB_DIR},g; s,__GIT_HOSTNAME__,${GIT_HOSTNAME},g; s,__GIT_HOSTPORT__,${GIT_HOSTPORT},g; s,__GIT_USER__,${GIT_USER},g; s,__GIT_HOME__,${GIT_HOME},g;' tpl/nginx.conf > $@
+
+gen/apache.conf:
+       @sed -r 's,__PREFIX__,${PREFIX},g; s,__LOGS__,${LOGS},g; s,__WEB_BASE_DIR__,${WEB_BASE_DIR},g; s,__GITWEB_DIR__,${GITWEB_DIR},g; s,__GIT_HOSTNAME__,${GIT_HOSTNAME},g; s,__GIT_HOSTPORT__,${GIT_HOSTPORT},g; s,__GIT_USER__,${GIT_USER},g; s,__GIT_HOME__,${GIT_HOME},g;' tpl/apache.conf > $@
+
+gen/none.conf:
+       touch $@
+
+gen/.website: gen/home gen/www/$(WEB_BASE_DIR) gen/sudoers.d gen/sudoers.d/git gen/www/$(WEB_BASE_DIR)config.inc.php gen/git-daemon.example gen/$(WEB_TYPE).conf
+       @cp -r homegit/* gen/home/
+       @cp -r src/* src/.??* gen/www/${WEB_BASE_DIR}
+       (cd git-master/gitweb && make prefix=/usr GITWEB_PROJECTROOT=${GIT_HOME} GITWEB_PROJECT_MAXDEPTH=50 GITWEB_EXPORT_OK=git-daemon-export-ok GITWEB_HOME_LINK_STR=/${WEB_BASE_DIR} GITWEB_SITENAME="${WEB_TITLE}" gitwebdir=${PREFIX}/${WEB_BASE_DIR}${GITWEB_DIR} all)
+       @touch $@
+
+clean:
+       @rm -rf gen
+       (cd git-master/gitweb && make clean)
+
+install: _root gen/.website _githome _webhome _sudo
+       (cd git-master/gitweb && make prefix=/usr GITWEB_PROJECTROOT=${GIT_HOME} GITWEB_PROJECT_MAXDEPTH=50 GITWEB_EXPORT_OK=git-daemon-export-ok GITWEB_HOME_LINK_STR=/${WEB_BASE_DIR} GITWEB_SITENAME="${WEB_TITLE}" gitwebdir=${PREFIX}/${WEB_BASE_DIR}${GITWEB_DIR} install)
+
+_root:
+       @[ $$(id -u) -ne 0 ] && "You need to be root." && exit 1
+
+_githome:
+       @if grep -q "^${GIT_USER}:" /etc/passwd; then
+               @usermod -s /usr/bin/git-shell -L ${GIT_USER}
+               @usermod -a -G $$(groups ${GIT_USER}|cut -d: -f2-|awk '{print $$1}') ${WEB_USER}
+       @else
+               @useradd -d ${GIT_HOME} -m -r -s /usr/bin/git-shell -U ${GIT_USER}
+               @usermod -a -G ${GIT_USER} ${WEB_USER}
+       @fi
+       @cp -rv gen/home/* ${GIT_HOME}/
+       
+_webhome:
+       @mkdir -p ${PREFIX}
+       @cp -rv gen/www/ ${PREFIX}/
+       @chown -R ${WEB_USER}: ${PREFIX}/${WEB_BASE_DIR}
+
+_sudo:
+       @cp gen/sudoers.d/git /etc/sudoers.d/git
+       @chmod ug=r,o= /etc/sudoers.d/git
+
+.PHONY: all _options clean install _root _githome _webhome _sudo
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..e858c17
--- /dev/null
+++ b/configure
@@ -0,0 +1,132 @@
+#!/bin/sh
+PREFIX=/var/www/git/pages
+LOGS=/var/www/git/logs
+WEB_BASE_DIR=
+GITWEB_DIR=gitweb
+GIT_HOSTNAME=localhost
+GIT_HOSTPORT=80
+GIT_USER=git
+GIT_HOME=/home/$GIT_USER
+WEB_USER=nobody
+WEB_TYPE=nginx
+WEB_TITLE="Git Repositories"
+
+usage() {
+  cat <<EOF
+configure [OPTIONS]
+
+OPTIONS:
+  --help                      print this message
+
+  --prefix=PREFIX             install web files into PREFIX [$PREFIX]
+  --logsdir=DIR               logs location of the web site [$LOGS]
+  --webbasedir=NAME           NAME of the web base dir, empty for virtual host [$WEB_BASE_DIR]
+  --gitwebdir=NAME            NAME of the gitweb directory [$GITWEB_DIR]
+  --githostname=HOSTNAME      HOSTNAME of the git service [$GIT_HOSTNAME]
+  --githostport=PORT          PORT of the git service [$GIT_HOSTPORT]
+  --githome=DIR               location where to store the repositories [$GIT_HOME]
+                              This directory will be created if not exists.
+  --gituser=USER              system USER to handle the repositories [$GIT_USER]
+                              This user will be created if not exists.
+  --webuser=USER              system USER to run the webserver [$WEB_USER]
+                              This user should exist.
+  --webtype=TYPE              TYPE of webserver. Could be nginx, apache or none.
+                              Will generate the corresponding template here.
+                              Default to [$WEB_TYPE]
+  --webtitle=TITLE            TITLE of the web site [$WEB_TITLE]
+EOF
+}
+
+while [ -n "$1" ] && [ "$1" != "--" ]; do
+  ARG="$1"
+  shift
+  case "$ARG" in
+    --help|-h)
+      usage
+      exit 0
+      ;;
+    --prefix=*)
+      PREFIX=$(echo "$ARG"|cut -d= -f2-)
+      ;;
+    --logsdir=*)
+      LOGS=$(echo "$ARG"|cut -d= -f2-)
+      ;;
+    --webbasedir=*)
+      WEB_BASE_DIR=$(echo "$ARG"|cut -d= -f2-)
+      ;;
+    --gitwebdir=*)
+      GITWEB_DIR=$(echo "$ARG"|cut -d= -f2-)
+      ;;
+    --githostname=*)
+      GIT_HOSTNAME=$(echo "$ARG"|cut -d= -f2-)
+      ;;
+    --githostport=*)
+      GIT_HOSTPORT=$(echo "$ARG"|cut -d= -f2-)
+      ;;
+    --githome=*)
+      GIT_HOME=$(echo "$ARG"|cut -d= -f2-)
+      ;;
+    --gituser=*)
+      GIT_USER=$(echo "$ARG"|cut -d= -f2-)
+      ;;
+    --webuser=*)
+      WEB_USER=$(echo "$ARG"|cut -d= -f2-)
+      ;;
+    --webtype=*)
+      val=$(echo "$ARG"|cut -d= -f2-)
+      if [ "$val" = "nginx" ] || [ "$val" = "apache" ] || [ "$val" = "none" ]; then
+        WEB_TYPE=$val
+      else
+        echo "Unrecognized web type: $val" >&2
+        exit 1
+      fi
+      ;;
+    --webtitle=*)
+      WEB_TITLE=$(echo "$ARG"|cut -d= -f2-)
+      ;;
+    *)
+      echo "Unrecognized parameter: $ARG" >&2
+      exit 1
+  esac
+done
+
+if [ ! -d "$PREFIX" ]; then
+  echo "Prefix $PREFIX does not exist." >&2
+  exit 2
+fi
+PREFIX=$(readlink -f "$PREFIX")
+if [ ! -d "$LOGS" ]; then
+  echo "Logs directory $LOGS does not exist." >&2
+  exit 2
+fi
+LOGS=$(readlink -f "$LOGS")
+if echo "$GIT_HOSTPORT"|grep -vq '^[0-9]\+$'; then
+  echo "Git host port $GIT_HOSTPORT does not seems to be valid." >&2
+  exit 2
+fi
+GIT_HOME=$(readlink -f "$GIT_HOME")
+if [ -n "$WEB_BASE_DIR" ] && echo "$WEB_BASE_DIR"|grep -vq '/$'; then
+  WEB_BASE_DIR="$WEB_BASE_DIR/"
+fi
+GITWEB_DIR=$(echo "$GITWEB_DIR"|sed 's,/$,,')
+if grep -vq "^$WEB_USER:" /etc/passwd; then
+  echo "Web user '$WEB_USER' does not exist" >&2
+  exit 2
+fi
+
+cd $(dirname "$0")
+cat <<EOF > config.mk
+PREFIX = $PREFIX
+LOGS = $LOGS
+WEB_BASE_DIR = $WEB_BASE_DIR
+GITWEB_DIR = $GITWEB_DIR
+GIT_HOSTNAME = $GIT_HOSTNAME
+GIT_HOSTPORT = $GIT_HOSTPORT
+GIT_USER = $GIT_USER
+GIT_HOME = $GIT_HOME
+WEB_USER = $WEB_USER
+WEB_TYPE = $WEB_TYPE
+WEB_TITLE = $WEB_TITLE
+EOF
+
+[ -d git-master ] || wget https://github.com/git/git/archive/master.tar.gz -O - | tar xzf -
diff --git a/install.sh b/install.sh
deleted file mode 100755 (executable)
index 0fa4724..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-#!/bin/sh
-# vim: set et ai sw=2 ts=2 tw=0:
-cd "$(dirname "$0")"
-
-usage() {
-  cat <<EOF
-install.sh -h git_host -r git_web_root -u git_user -d git_home_dir -t web_title -w web_user -g gitweb_path -s [nginx|apache2]
-  git_host: hostname to connect to in ssh for git access
-  git_web_root: root path relative to git_host to access the webapp. Empty for virtual host.
-                if not empty, the root should end with a slash.
-  git_user: user to connect to in ssh for git access
-  git_home_dir: where is the home dir of the git user
-  web_title: title of the web site
-  web_user: user running web site, usually apache or www or nobody
-  web_path: unix absolute path where to install the web site
-  gitweb_path: if specified, indicate the path (relative to this git_web_root) to the git web cgi files
-  server_type: nginx or apache2
-EOF
-}
-GIT_HOST=''
-GIT_WEB_ROOT=''
-GIT_USER=''
-GIT_HOME_DIR=''
-WEB_TITLE=''
-WEB_USER=''
-WEB_PATH=''
-GITWEB_PATH=''
-SERVER_TYPE=''
-opts=$(getopt -n install.sh -o 'h:r:u:d:t:w:p:g:s:' -- "$@")
-if [ $? -ne 0 ]; then
-  usage
-  exit 1
-fi
-eval set -- "$opts"
-while [ -n "$1" ] && [ "$1" != "--" ]; do
-  case "$1" in
-    -h)
-      GIT_HOST="$2"
-      shift 2
-      ;;
-    -r)
-      GIT_WEB_ROOT="$2"
-      shift 2
-      ;;
-    -u)
-      GIT_USER="$2"
-      shift 2
-      ;;
-    -d)
-      GIT_DIR="$2"
-      shift 2
-      ;;
-    -t)
-      WEB_TITLE="$2"
-      shift 2
-      ;;
-    -w)
-      WEB_USER="$2"
-      shift 2
-      ;;
-    -p)
-      WEB_PATH=$(readlink -f "$2")
-      shift 2
-      ;;
-    -g)
-      GITWEB_PATH="$2"
-      shift 2
-      ;;
-    -s)
-      SERVER_TYPE="$2"
-      shift 2
-      ;;
-    *)
-      echo "Error, unrecognized argument: $1" >&2
-      shift
-      exit 1
-  esac
-done
-if [ -z "$GIT_HOST" ] || [ -z "$GIT_USER" ] || [ -z "$GIT_DIR" ] || [ -z "$WEB_TITLE" ] || [ -z "$WEB_USER" ] || (echo "$WEB_PATH"|grep -qv '^/') || ([ "$SERVER_TYPE" != "nginx" ] && [ "$SERVER_TYPE" != "apache2" ]); then
-  usage
-  exit 1
-fi
-
-if [ $(id -u) -ne 0 ]; then
-  echo "You need to be root." >&2
-  exit 1
-fi
-
-if ! grep -q "^$GIT_USER:" /etc/passwd; then
-  echo "Git user '$GIT_USER' does not exist" >&2
-  exit 2
-fi
-if [ ! -d "$GIT_DIR" ]; then
-  echo "Git directory '$GIT_DIR' does not exist" >&2
-  exit 2
-fi
-if ! grep -q "^$WEB_USER:" /etc/passwd; then
-  echo "Web user '$WEB_USER' does not exist" >&2
-  exit 2
-fi
-
-usermod -s /usr/bin/git-shell $GIT_USER
-sed -i "s,^$GIT_USER:.*:\(.*\),$GIT_USER:*:\1," /etc/shadow
-GIT_GROUP=$(sed -n "/^$GIT_USER:/ s/^$GIT_USER:[^:]*:[^:]*:\([^:]*\):.*/\1/ p" /etc/passwd)
-usermod -a -G $GIT_GROUP $WEB_USER
-
-mkdir -p /etc/sudoers.d
-sed "s,WEB_USER,$WEB_USER,; s,GIT_USER,$GIT_USER,; s,GIT_DIR,$GIT_DIR,;" sudoers.d/git > /etc/sudoers.d/git
-chmod ug=r,o= /etc/sudoers.d/git
-
-cp -r homegit/* $GIT_DIR/
-mkdir -p $WEB_PATH/${GIT_WEB_ROOT}
-cp -r src/* src/.??* $WEB_PATH/${GIT_WEB_ROOT}
-cat <<EOF > $WEB_PATH/${GIT_WEB_ROOT}config.inc.php
-<?php
-\$title = '$WEB_TITLE';
-\$githost = '$GIT_HOST';
-\$gitwebroot = '$GIT_WEB_ROOT';
-\$gituser = '$GIT_USER';
-\$gitdir = '$GIT_DIR';
-\$gitwebpath = '$GITWEB_PATH';
-EOF
-
-if [ -n "$GITWEB_PATH" ]; then
-  wget https://github.com/git/git/archive/master.tar.gz -O - | tar xzf -
-  cd git-master/gitweb
-  make prefix=/usr GITWEB_PROJECTROOT=$GIT_DIR GITWEB_PROJECT_MAXDEPTH=50 GITWEB_EXPORT_OK=git-daemon-export-ok GITWEB_HOME_LINK_STR=/$GIT_WEB_ROOT GITWEB_SITENAME="$WEB_TITLE" gitwebdir=$WEB_PATH/${GIT_WEB_ROOT}${GITWEB_PATH} install
-fi
-
-chown -R $WEB_USER: $WEB_PATH/${GIT_WEB_ROOT}
-
-cat <<EOF > git-daemon.example
-# If you want to enable anonymous read-only git protocol on the repositories, run this:
-git daemon --listen=0.0.0.0 --reuseaddr --base-path=$GIT_DIR --user=$WEB_USER --detach $GIT_DIR
-EOF
-
-if [ "$SERVER_TYPE" = "nginx" ]; then
-  cat <<EOF > ${SERVER_TYPE}.conf
-server {
-  listen       localhost:80;
-  server_name  $GIT_HOST;
-  root   $WEB_PATH/$GIT_WEB_ROOT;
-  access_log  $WEB_PATH/../logs/access.log combined;
-  error_log $WEB_PATH/../logs/error.log;
-  location /$GIT_WEB_ROOT {
-    index controller.php;
-    try_files \$uri \$uri/ /controller.php?\$args;
-  }
-  location ~ \.php$ {
-    gzip off
-    fastcgi_pass   unix:/var/run/php-fpm.sock;
-    include        fastcgi_params;
-    fastcgi_param  SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
-  }
-  location ~ ${GIT_WEB_ROOT}/readonly(/.*) {
-    gzip off;
-    # Set chunks to unlimited, as the body's can be huge
-    client_max_body_size 0;
-    fastcgi_pass unix:/var/run/fcgiwrap.sock;
-    include fastcgi_params;
-    fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend;
-    fastcgi_param GIT_HTTP_EXPORT_ALL "";
-    fastcgi_param GIT_PROJECT_ROOT $GIT_DIR;
-    fastcgi_param HOME $GIT_DIR;
-    fastcgi_param PATH_INFO \$1;
-  }
-EOF
-  if [ -n "$GITWEB_PATH" ]; then
-    cat <<EOF >> ${SERVER_TYPE}.conf
-  location /${GIT_WEB_ROOT}${GITWEB_PATH}/ {
-    gzip off;
-    index          gitweb.cgi;
-    include        fastcgi_params;
-    fastcgi_param  SCRIPT_NAME gitweb.cgi; 
-    fastcgi_param  SCRIPT_FILENAME $WEB_PATH/${GIT_WEB_ROOT}${GITWEB_PATH}/gitweb.cgi;
-    fastcgi_param  GITWEB_CONFIG /etc/gitweb.conf;
-    if (\$uri ~ "/${GIT_WEB_ROOT}${GITWEB_PATH}/gitweb.cgi") {
-      fastcgi_pass   unix:/var/run/fcgiwrap.sock;
-    }
-  }
-EOF
-  fi
-  cat <<EOF >> ${SERVER_TYPE}.conf
-}
-EOF
-else
-  cat <<EOF > ${SERVER_TYPE}.conf
-<!-- Incomplete config sorry -->
-<Directory "$WEB_PATH/${GIT_WEB_ROOT}${GITWEB_PATH}">
-  Options ExecCGI +FollowSymlinks +SymLinksIfOwnerMatch
-  AllowOverride All
-  Order allow,deny
-  Allow from all
-  AddHandler cgi-script cgi
-  DirectoryIndex gitweb.cgi
-</Directory>
-EOF
-fi
-cat <<EOF
-
-** Installation complete in $WEB_PATH **"
-
-A configuration file (${SERVER_TYPE}.conf) has been created for you.
-A git-daemon example is also available in git-daemon.example file.
-
-EOF
diff --git a/tpl/apache.conf b/tpl/apache.conf
new file mode 100644 (file)
index 0000000..54d6f1e
--- /dev/null
@@ -0,0 +1,10 @@
+<!-- Incomplete config sorry -->
+<Directory "__PREFIX__/__WEB_BASE_DIR____GITWEB_DIR__">
+  Options ExecCGI +FollowSymlinks +SymLinksIfOwnerMatch
+  AllowOverride All
+  Order allow,deny
+  Allow from all
+  AddHandler cgi-script cgi
+  DirectoryIndex gitweb.cgi
+</Directory>
+
diff --git a/tpl/nginx.conf b/tpl/nginx.conf
new file mode 100644 (file)
index 0000000..a903494
--- /dev/null
@@ -0,0 +1,40 @@
+server {
+  listen       __GIT_HOSTPORT__;
+  server_name  __GIT_HOSTNAME__;
+  root   __PREFIX__;
+  access_log  __LOGS__/access.log combined;
+  error_log __LOGS__/error.log;
+  location /__WEB_BASE_DIR__ {
+    index controller.php;
+    try_files \$uri \$uri/ /controller.php?\$args;
+  }
+  location ~ \.php$ {
+    gzip off
+    fastcgi_pass   unix:/var/run/php-fpm.sock;
+    include        fastcgi_params;
+    fastcgi_param  SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
+  }
+  location ~ /__WEB_BASE_DIR__readonly(/.*) {
+    gzip off;
+    # Set chunks to unlimited, as the body's can be huge
+    client_max_body_size 0;
+    fastcgi_pass unix:/var/run/fcgiwrap.sock;
+    include fastcgi_params;
+    fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend;
+    fastcgi_param GIT_HTTP_EXPORT_ALL "";
+    fastcgi_param GIT_PROJECT_ROOT __GIT_HOME__;
+    fastcgi_param HOME __GIT_HOME__;
+    fastcgi_param PATH_INFO \$1;
+  }
+  location /__WEB_BASE_DIR____GITWEB_DIR__/ {
+    gzip off;
+    index          gitweb.cgi;
+    include        fastcgi_params;
+    fastcgi_param  SCRIPT_NAME gitweb.cgi; 
+    fastcgi_param  SCRIPT_FILENAME __PREFIX__/__WEB_BASE_DIR____GITWEB_DIR__/gitweb.cgi;
+    fastcgi_param  GITWEB_CONFIG /etc/gitweb.conf;
+    if (\$uri ~ "/__WEB_BASE_DIR____GITWEB_DIR__/gitweb.cgi") {
+      fastcgi_pass   unix:/var/run/fcgiwrap.sock;
+    }
+  }
+}