#!/usr/bin/env bash #============================================================================= # Copyright 2010-2012 Kitware, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. #============================================================================= # Run this script to set up ssh push access to the repository host. # Project configuration instructions: # # - Populate adjacent "config" file with: # ssh.host = Repository host name # ssh.user = Username on host, if not "git" # ssh.key = Local ssh key name # ssh.request-url = Web page URL to request ssh access egrep-q() { egrep "$@" >/dev/null 2>/dev/null } die() { echo 1>&2 "$@" ; exit 1 } # Make sure we are inside the repository. cd "${BASH_SOURCE%/*}" && # Load the project configuration. host=$(git config -f config --get ssh.host) && user=$(git config -f config --get ssh.user || echo git) && key=$(git config -f config --get ssh.key) && request_url=$(git config -f config --get ssh.request-url) || die 'This project is not configured for ssh push access.' # Check for existing configuration. if test -r ~/.ssh/config && egrep-q 'Host[= ]'"${host//\./\\.}" ~/.ssh/config; then echo 'Host "'"$host"'" is already in ~/.ssh/config' && setup= && question='Test' else echo 'Host "'"$host"'" not found in ~/.ssh/config' && setup=1 && question='Setup and test' fi && # Ask the user whether to make changes. echo '' && read -ep "${question} push access by ssh to $user@$host? [y/N]: " access && if test "$access" != "y" -a "$access" != "Y"; then exit 0 fi && # Setup host configuration if necessary. if test -n "$setup"; then if ! test -d ~/.ssh; then mkdir -p ~/.ssh && chmod 700 ~/.ssh fi && if ! test -f ~/.ssh/config; then touch ~/.ssh/config && chmod 600 ~/.ssh/config fi && ssh_config='Host='"$host"' IdentityFile ~/.ssh/'"$key" && echo "Adding to ~/.ssh/config: $ssh_config " && echo "$ssh_config" >> ~/.ssh/config && if ! test -e ~/.ssh/"$key"; then if test -f ~/.ssh/id_rsa; then # Take care of the common case. ln -s id_rsa ~/.ssh/"$key" echo ' Assuming ~/.ssh/id_rsa is the private key corresponding to the public key for '"$user@$host"' If this is incorrect place private key at "~/.ssh/'"$key"'".' else echo ' Place the private key corresponding to the public key registered for '"$user@$host"' at "~/.ssh/'"$key"'".' fi read -e -n 1 -p 'Press any key to continue...' fi fi || exit 1 # Test access configuration. echo 'Testing ssh push access to "'"$user@$host"'"...' && if ! ssh "$user@$host" info; then die 'No ssh push access to "'"$user@$host"'". You may need to request access at '"$request_url"' ' fi