easy install: add "-q" option for experts; see usage message

This commit is contained in:
Sitaram Chamarty 2009-10-25 14:02:04 +05:30
parent 2f6ed42fcd
commit aef540c659

View file

@ -17,6 +17,14 @@ set -e
die() { echo "$@"; echo; echo "run $0 again without any arguments for help and tips"; exit 1; } die() { echo "$@"; echo; echo "run $0 again without any arguments for help and tips"; exit 1; }
prompt() { prompt() {
# receives two arguments. A short piece of text to be displayed, without
# pausing, in "quiet" mode, and a much longer one to be displayed, *with*
# a pause, in normal (verbose) mode
[[ $quiet == -q ]] && [[ -n $1 ]] && {
echo "$1"
return
}
shift
echo echo
echo echo
echo ------------------------------------------------------------------------ echo ------------------------------------------------------------------------
@ -26,7 +34,10 @@ prompt() {
} }
usage() { usage() {
cat <<EOFU cat <<EOFU
Usage: $0 user host port admin_name Usage: $0 [-q] user host port admin_name
- (optional) "-q" as first arg sets "quiet" mode: no verbose descriptions of
what is going on, no pauses unless absolutely necessary
- "user" is the username on the server where you will be installing gitolite - "user" is the username on the server where you will be installing gitolite
- "host" is that server's hostname (or IP address is also fine) - "host" is that server's hostname (or IP address is also fine)
- "port" is optional - "port" is optional
@ -35,9 +46,6 @@ Usage: $0 user host port admin_name
Example usage: $0 git my.git.server sitaram Example usage: $0 git my.git.server sitaram
Output:
- a proper gitolite admin repo in $HOME/gitolite-admin
Notes: Notes:
- "user" and "admin_name" must be simple names -- no special characters etc - "user" and "admin_name" must be simple names -- no special characters etc
please (only alphanumerics, dot, hyphen, underscore) please (only alphanumerics, dot, hyphen, underscore)
@ -55,11 +63,6 @@ Pre-requisites:
**DO NOT RUN THIS PROGRAM UNTIL THAT WORKS** **DO NOT RUN THIS PROGRAM UNTIL THAT WORKS**
Errors:
- if you get a "pubkey [...filename...] exists" error, it is either leftover
from a previous, failed, run, or a genuine file you need. Decide which it
is, and remove it and retry, or use a different "admin_name", respectively.
EOFU EOFU
exit 1; exit 1;
} }
@ -78,6 +81,13 @@ EOFU
exit 1; exit 1;
} }
# are we in quiet mode?
quiet=
[[ "$1" == "-q" ]] && {
quiet=-q
shift
}
# MANUAL: (info) we'll use "git" as the user, "server" as the host, and # MANUAL: (info) we'll use "git" as the user, "server" as the host, and
# "sitaram" as the admin_name in example commands shown below, if any # "sitaram" as the admin_name in example commands shown below, if any
@ -120,7 +130,8 @@ ssh -p $port -o PasswordAuthentication=no $user@$host true ||
# line). For example, "ssh-keygen -t rsa ~/.ssh/sitaram"; this would create # line). For example, "ssh-keygen -t rsa ~/.ssh/sitaram"; this would create
# two files in ~/.ssh (sitaram and sitaram.pub) # two files in ~/.ssh (sitaram and sitaram.pub)
prompt "the next command will create a new keypair for your gitolite access prompt "setting up keypair..." \
"the next command will create a new keypair for your gitolite access
The pubkey will be $HOME/.ssh/$admin_name.pub. You will have to choose a The pubkey will be $HOME/.ssh/$admin_name.pub. You will have to choose a
passphrase or hit enter for none. I recommend not having a passphrase for passphrase or hit enter for none. I recommend not having a passphrase for
@ -138,7 +149,8 @@ prompt "the next command will create a new keypair for your gitolite access
if [[ -f $HOME/.ssh/$admin_name.pub ]] if [[ -f $HOME/.ssh/$admin_name.pub ]]
then then
prompt "Hmmm... pubkey $HOME/.ssh/$admin_name.pub exists; should I just re-use it? prompt " ...reusing $HOME/.ssh/$admin_name.pub..." \
"Hmmm... pubkey $HOME/.ssh/$admin_name.pub exists; should I just re-use it?
Be sure you remember the passphrase, if you gave one when you created it!" Be sure you remember the passphrase, if you gave one when you created it!"
else else
ssh-keygen -t rsa -f $HOME/.ssh/$admin_name || die "ssh-keygen failed for some reason..." ssh-keygen -t rsa -f $HOME/.ssh/$admin_name || die "ssh-keygen failed for some reason..."
@ -155,7 +167,8 @@ fi
if ssh-add -l &>/dev/null if ssh-add -l &>/dev/null
then then
prompt "you're running ssh-agent. We'll try and do an ssh-add of the prompt " ...adding key to agent..." \
"you're running ssh-agent. We'll try and do an ssh-add of the
private key we just created, otherwise this key won't get picked up. If private key we just created, otherwise this key won't get picked up. If
you specified a passphrase in the previous step, you'll get asked for one you specified a passphrase in the previous step, you'll get asked for one
now -- type in the same one." now -- type in the same one."
@ -184,7 +197,8 @@ host gitolite
if grep 'host *gitolite' $HOME/.ssh/config &>/dev/null if grep 'host *gitolite' $HOME/.ssh/config &>/dev/null
then then
prompt "your \$HOME/.ssh/config already has settings for gitolite. I will prompt "found gitolite para in ~/.ssh/config; assuming it is correct..." \
"your \$HOME/.ssh/config already has settings for gitolite. I will
assume they're correct, but if they're not, please edit that file, delete assume they're correct, but if they're not, please edit that file, delete
that paragraph (that line and the following few lines), Ctrl-C, and rerun. that paragraph (that line and the following few lines), Ctrl-C, and rerun.
@ -193,7 +207,8 @@ then
$(cat ~/.ssh/.gl-stanza)" $(cat ~/.ssh/.gl-stanza)"
else else
prompt "creating settings for your gitolite access in $HOME/.ssh/config; prompt "creating gitolite para in ~/.ssh/config..." \
"creating settings for your gitolite access in $HOME/.ssh/config;
these are the lines that will be appended to your ~/.ssh/config: these are the lines that will be appended to your ~/.ssh/config:
$(cat ~/.ssh/.gl-stanza)" $(cat ~/.ssh/.gl-stanza)"
@ -212,7 +227,7 @@ rm $HOME/.ssh/.gl-stanza
# have to create the directory first. # have to create the directory first.
ssh -p $port $user@$host mkdir -p gitolite-install ssh -p $port $user@$host mkdir -p gitolite-install
rsync -e "ssh -p $port" -a src conf doc $user@$host:gitolite-install/ rsync $quiet -e "ssh -p $port" -a src conf doc $user@$host:gitolite-install/
# MANUAL: now log on to the server (ssh git@server) and get a command line. # MANUAL: now log on to the server (ssh git@server) and get a command line.
# This step is for your convenience; the script does it all from the client # This step is for your convenience; the script does it all from the client
@ -223,7 +238,8 @@ rsync -e "ssh -p $port" -a src conf doc $user@$host:gitolite-install/
# change any paths. Make a note of the GL_ADMINDIR and REPO_BASE paths; you # change any paths. Make a note of the GL_ADMINDIR and REPO_BASE paths; you
# will need them later # will need them later
prompt "the gitolite rc file needs to be edited by hand. The defaults prompt "finding/creating gitolite rc..." \
"the gitolite rc file needs to be edited by hand. The defaults
are sensible, so if you wish, you can just exit the editor. are sensible, so if you wish, you can just exit the editor.
Otherwise, make any changes you wish and save it. Read the comments to Otherwise, make any changes you wish and save it. Read the comments to
@ -233,19 +249,20 @@ prompt "the gitolite rc file needs to be edited by hand. The defaults
all the paths etc. represent paths on the server!" all the paths etc. represent paths on the server!"
# lets try and get the file from there first # lets try and get the file from there first
if scp -P $port $user@$host:.gitolite.rc . if scp -P $port $user@$host:.gitolite.rc . &>/dev/null
then then
prompt "Oh hey... you already had a '.gitolite.rc' file on the server. prompt " ...trying to reuse existing rc" \
"Oh hey... you already had a '.gitolite.rc' file on the server.
Let's see if we can use that instead of the default one..." Let's see if we can use that instead of the default one..."
sort < .gitolite.rc | perl -ne 'print "$1\n" if /^\s*(\$\w+) *=/' > glrc.old sort < .gitolite.rc | perl -ne 'print "$1\n" if /^\s*(\$\w+) *=/' > glrc.old
sort < conf/example.gitolite.rc | perl -ne 'print "$1\n" if /^\s*(\$\w+) *=/' > glrc.new sort < conf/example.gitolite.rc | perl -ne 'print "$1\n" if /^\s*(\$\w+) *=/' > glrc.new
if diff -u glrc.old glrc.new if diff -u glrc.old glrc.new
then then
${VISUAL:-${EDITOR:-vi}} .gitolite.rc [[ $quiet == -q ]] || ${VISUAL:-${EDITOR:-vi}} .gitolite.rc
else else
prompt " looks like you're upgrading, and there are some new rc prompt "" \
variables that this version is expecting that your old rc file doesn't " looks like you're upgrading, and there are some new rc variables
have. that this version is expecting that your old rc file doesn't have.
I'm going to run your editor with two filenames. The first is the I'm going to run your editor with two filenames. The first is the
example file from this gitolite version. It will have a block (code example file from this gitolite version. It will have a block (code
@ -264,13 +281,14 @@ then
fi fi
else else
cp conf/example.gitolite.rc .gitolite.rc cp conf/example.gitolite.rc .gitolite.rc
${VISUAL:-${EDITOR:-vi}} .gitolite.rc [[ $quiet == -q ]] || ${VISUAL:-${EDITOR:-vi}} .gitolite.rc
fi fi
# copy the rc across # copy the rc across
scp -P $port .gitolite.rc $user@$host: scp $quiet -P $port .gitolite.rc $user@$host:
prompt "ignore any 'please edit this file' or 'run this command' type prompt "installing/upgrading..." \
"ignore any 'please edit this file' or 'run this command' type
lines in the next set of command outputs coming up. They're only relevant lines in the next set of command outputs coming up. They're only relevant
for a manual install, not this one..." for a manual install, not this one..."
@ -281,7 +299,7 @@ REPO_BASE=$( ssh -p $port $user@$host "perl -e 'do \".gitolite.rc\"; print \$RE
# MANUAL: still in the "gitolite-install" directory? Good. Run # MANUAL: still in the "gitolite-install" directory? Good. Run
# "src/install.pl" # "src/install.pl"
ssh -p $port $user@$host "cd gitolite-install; src/install.pl" ssh -p $port $user@$host "cd gitolite-install; src/install.pl $quiet"
# MANUAL: if you're upgrading, just go to your clone of the admin repo, make a # MANUAL: if you're upgrading, just go to your clone of the admin repo, make a
# dummy change, and push. (This assumes that you didn't change the # dummy change, and push. (This assumes that you didn't change the
@ -294,7 +312,8 @@ ssh -p $port $user@$host "cd gitolite-install; src/install.pl"
upgrade=0 upgrade=0
if ssh -p $port $user@$host cat $GL_ADMINDIR/keydir/$admin_name.pub &> /dev/null if ssh -p $port $user@$host cat $GL_ADMINDIR/keydir/$admin_name.pub &> /dev/null
then then
prompt "this looks like an upgrade, based on the fact that a file called prompt "upgrade done!" \
"this looks like an upgrade, based on the fact that a file called
$admin_name.pub already exists in $GL_ADMINDIR/keydir on the server. $admin_name.pub already exists in $GL_ADMINDIR/keydir on the server.
Please go to your clone of the admin repo, make a dummy change (like maybe Please go to your clone of the admin repo, make a dummy change (like maybe
@ -326,11 +345,11 @@ repo testing
" > gitolite.conf " > gitolite.conf
# send the config and the key to the remote # send the config and the key to the remote
scp -P $port gitolite.conf $user@$host:$GL_ADMINDIR/conf/ scp $quiet -P $port gitolite.conf $user@$host:$GL_ADMINDIR/conf/
scp -P $port $HOME/.ssh/$admin_name.pub $user@$host:$GL_ADMINDIR/keydir scp $quiet -P $port $HOME/.ssh/$admin_name.pub $user@$host:$GL_ADMINDIR/keydir
# MANUAL: cd to $GL_ADMINDIR and run "src/gl-compile-conf" # MANUAL: cd to $GL_ADMINDIR and run "src/gl-compile-conf"
ssh -p $port $user@$host "cd $GL_ADMINDIR; src/gl-compile-conf" ssh -p $port $user@$host "cd $GL_ADMINDIR; src/gl-compile-conf $quiet"
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# hey lets go the whole hog on this; setup push-to-admin! # hey lets go the whole hog on this; setup push-to-admin!
@ -356,15 +375,16 @@ GIT_WORK_TREE=$GL_ADMINDIR git commit -am start --allow-empty
# properly. The install program does this. So cd back to the # properly. The install program does this. So cd back to the
# "gitolite-install" directory and run "src/install.pl" # "gitolite-install" directory and run "src/install.pl"
ssh -p $port $user@$host "cd gitolite-install; src/install.pl" ssh -p $port $user@$host "cd gitolite-install; src/install.pl $quiet"
# MANUAL: you're done! Log out of the server, come back to your workstation, # MANUAL: you're done! Log out of the server, come back to your workstation,
# and clone the admin repo using "git clone gitolite:gitolite-admin.git", or # and clone the admin repo using "git clone gitolite:gitolite-admin.git", or
# pull once again if you already have a clone # pull once again if you already have a clone
prompt "now we will clone the gitolite-admin repo to your workstation prompt "cloning gitolite-admin repo..." \
and see if it all hangs together. We'll do this in your \$HOME for now, "now we will clone the gitolite-admin repo to your workstation
and you can move it elsewhere later if you wish to." and see if it all hangs together. We'll do this in your \$HOME for now,
and you can move it elsewhere later if you wish to."
cd $HOME cd $HOME
git clone gitolite:gitolite-admin.git git clone gitolite:gitolite-admin.git