blob: 8920a5bd338b046f9b9822a874df7c624da2f237 [file] [log] [blame]
#!/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