aboutsummaryrefslogblamecommitdiff
path: root/scripts/hostclass/git_server
blob: b0280bde7a24bb566490a82740e406938926262a (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                                                                
                                   



















                                                             
               



































































































































                                                                                                                                 
#!/bin/sh

: ${git_public_fqdn:="$fqdn"}
: ${git_basic_auth:='on'}
: ${gitolite_username:='s-gitolite'}
: ${gitolite_access_role:='gitolite-access'}
: ${gitolite_admin_role:='gitolite-admin'}
: ${cgit_clone_urls:="https://${fqdn} ssh://git@${fqdn}"}
: ${cgit_root_title:="${site} Git Repo"}
: ${cgit_root_desc:="Source code for various ${site} projects."}
: ${cgit_pygments_style:='default'}
: ${cgit_cache_size:='16000'}

gitolite_dn="uid=${gitolite_username},${robots_basedn}"
git_keytab="${keytab_dir}/nginx.keytab"
git_https_cert="${nginx_conf_dir}/git.crt"
git_https_key="${nginx_conf_dir}/git.key"
gitolite_home=/usr/local/git
gitolite_client_keytab="${keytab_dir}/gitolite.client.keytab"
gitolite_fcgiwrap_socket=/var/run/fcgiwrap/gitolite.sock
cgit_cache_dir=/var/cache/cgit
cgit_fcgiwrap_socket=/var/run/fcgiwrap/cgit.sock
cgit_webroot=/usr/local/www/cgit

# Install packages.
pkg install -y \
  python \
  nginx \
  cgit \
  gitolite \
  fcgiwrap \
  ca_root_nss \
  py${python_version}-pygments \
  py${python_version}-docutils \
  py${python_version}-markdown

# Create ZFS dataset for gitolite repositories.
create_dataset -o "mountpoint=${gitolite_home}" "${state_dataset}/git"
zfs set \
  com.sun:auto-snapshot:hourly=true \
  com.sun:auto-snapshot:daily=true \
  com.sun:auto-snapshot:weekly=true \
  com.sun:auto-snapshot:monthly=true \
  "${state_dataset}/git"

# Set ownership on gitolite dataset.
install_directory -o "$gitolite_local_user" -g "$gitolite_local_user" -m 0700 "$gitolite_home"

# Add www user to git group, so it can read git repositories.
pw groupmod "$gitolite_local_user" -m "$nginx_user"

# Create gitolite principal and keytab.
ldap_add "$gitolite_dn" <<EOF
objectClass: account
uid: ${gitolite_username}
EOF
add_principal -nokey -x "dn=${gitolite_dn}" "$gitolite_username"

ktadd -k "$gitolite_client_keytab" "$gitolite_username"
chgrp "$gitolite_local_user" "$gitolite_client_keytab"
chmod 640 "$gitolite_client_keytab"

gitolite_uid=$(id -u "$gitolite_local_user")
install_directory -o "$gitolite_local_user" -m 0700 "/var/krb5/user/${gitolite_uid}"
ln -snfv "$gitolite_client_keytab" "/var/krb5/user/${gitolite_uid}/client.keytab"

# Generate gitolite configuration.
install_directory -o "$gitolite_local_user" -g "$gitolite_local_user" -m 0750 \
  "$gitolite_home" \
  "${gitolite_home}/.gitolite" \
  "${gitolite_home}/.gitolite/conf" \
  "${gitolite_home}/.gitolite/logs"
install_file -o "$gitolite_local_user" -g "$gitolite_local_user" -m 0600 "${gitolite_home}/.gitolite.rc"

[ -f "${gitolite_home}/.gitolite/conf/gitolite.conf" ] \
  || install_template -o "$gitolite_local_user" -g "$gitolite_local_user" -m 0640 "${gitolite_home}/.gitolite/conf/gitolite.conf"

[ -f "${gitolite_home}/.gitolite/conf/gitolite.conf-compiled.pm" ] \
  || su "$gitolite_local_user" -c 'gitolite setup'

install_file -m 0555 \
  /usr/local/libexec/gitolite-grouplist \
  /usr/local/libexec/gitolite-authorizedkeys

# Generate cgit configuration.
install_template -m 0644 /usr/local/etc/cgitrc
install_template -m 0555 /usr/local/lib/cgit/filters/syntax-highlighting-custom.py

# Create cgit cache directory.
install_directory -o root -g "$nginx_user" -m 0770 "$cgit_cache_dir"

# Copy custom assets.
install_file -m 0644 \
  "${cgit_webroot}/custom-style.css" \
  "${cgit_webroot}/custom-favicon.ico" \
  "${cgit_webroot}/custom-logo.png" \
  "${cgit_webroot}/custom-robots.txt" \
  "${cgit_webroot}/custom-head-include.html" \
  "${cgit_webroot}/custom-header.html"

# Generate nginx configuration.
install_file     -m 0644 /usr/local/etc/nginx/fastcgi_params
install_template -m 0644 /usr/local/etc/nginx/nginx.conf
[ -f "${nginx_conf_dir}/vhosts.conf" ] || install -Cv -m 0644 /dev/null "${nginx_conf_dir}/vhosts.conf"
sysrc -v nginx_enable=YES
service nginx restart

if [ "$git_public_fqdn" != "$fqdn" ]; then
  # Acquire public TLS certificate.
  install_template -m 0600 /usr/local/etc/sudoers.d/acme
  acme_install_certificate \
    -g "$nginx_user" \
    -r 'sudo service nginx reload' \
    nginx \
    "$git_public_fqdn"
else
  # Copy local TLS certificate for nginx.
  install_certificate     -m 0644 nginx "$git_https_cert"
  install_certificate_key -m 0600 nginx "$git_https_key"
fi

# Generate nginx vhosts (once certificate is acquired).
install_template -m 0644 /usr/local/etc/nginx/vhosts.conf
service nginx restart

# Create HTTP principal and keytab.
nginx_uid=$(id -u "$nginx_user")
add_principal -nokey -x "containerdn=${services_basedn}" "HTTP/${fqdn}"
ktadd -k "$git_keytab" "HTTP/${fqdn}"
chgrp "$nginx_user" "$git_keytab"
chmod 640 "$git_keytab"
install_directory -o "$nginx_user" -m 0700 "/var/krb5/user/${nginx_uid}"
ln -snfv "$git_keytab" "/var/krb5/user/${nginx_uid}/keytab"

# Generate sshd configuration.
install_template -m 0600 /usr/local/etc/ssh/sshd_config.d/gitolite.conf

# Enable and start daemons.
sysrc -v \
  fcgiwrap_enable=YES \
  fcgiwrap_profiles+='cgit gitolite' \
  fcgiwrap_cgit_flags='-f' \
  fcgiwrap_cgit_user="$nginx_user" \
  fcgiwrap_cgit_group="$nginx_user" \
  fcgiwrap_cgit_socket_owner="$nginx_user" \
  fcgiwrap_cgit_socket_group="$nginx_user" \
  fcgiwrap_cgit_socket="unix:${cgit_fcgiwrap_socket}" \
  fcgiwrap_gitolite_flags='-f' \
  fcgiwrap_gitolite_user="$gitolite_local_user" \
  fcgiwrap_gitolite_group="$gitolite_local_user" \
  fcgiwrap_gitolite_socket_owner="$nginx_user" \
  fcgiwrap_gitolite_socket_group="$nginx_user" \
  fcgiwrap_gitolite_socket="unix:${gitolite_fcgiwrap_socket}"

service fcgiwrap restart
service openssh restart

# Create access role.
for role in "$gitolite_access_role" "$gitolite_admin_role"; do
  ldap_add "cn=${role},${roles_basedn}" <<EOF
objectClass: groupOfMembers
cn: ${role}
EOF
done