2 #emacs: -*- mode: shell-script; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil -*-
3 #ex: set sts=4 ts=4 sw=4 et:
13 nd_autoinstall_version=0.1
15 # To be set by cmdline args
23 [ -z "$ai_verbose" ] || echo "I: $*"
29 nd-autoinstall $nd_autoinstall_version
31 Copyright (C) 2010 Yaroslav Halchenko <debian@onerussian.com>
33 Licensed under GNU Public License version 3 or later.
34 This is free software; see the source for copying conditions. There is NO
35 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
37 Written by Yaroslav Halchenko for the NeuroDebian project.
47 Usage: nd-autoinstall [options] COMMAND [command_options]
49 Runs the COMMAND if it is available, otherwise installs PACKAGE first,
50 and then runs the command. If an environment file is specified, it
51 gets sourced first (PACKAGE gets installed if environment file is not
57 Name of the package to be installed if named differently than
60 -e, --environment-file=FILE
61 File to be sourced before invocation of the COMMAND. If not found,
62 PACKAGE gets installed first.
65 Skip all checks and install package(s) provided via --package.
68 Enable additional progress messages.
71 Print short description, usage summary and option list.
74 Print version information and exit.
78 exit status of the COMMAND -
79 if COMMAND is available (or got sucesfully installed)
80 2 - incorrect invocation of nd-autoinstall
81 3 - PACKAGE installation failure
85 ################################
86 # Commandline options handling #
87 ################################
89 # Parse commandline options (taken from the getopt examples from the Debian util-linux package)
90 # Note that we use `"$@"' to let each command-line parameter expand to a
91 # separate word. The quotes around `$@' are essential!
92 # We need CLOPTS as the `eval set --' would nuke the return value of getopt.
93 CLOPTS=`getopt -o h,e:,p:,f,v --long help,version,environment-file:,package:,verbose,force -n 'nd-autoinstall' -- "$@"`
96 echo "Terminating..." >&2
100 # Note the quotes around `$CLOPTS': they are essential!
101 eval set -- "$CLOPTS"
105 -e|--environment-file) shift; ai_envfile=$1; shift;;
106 -f|--force) ai_force=1; shift;;
107 -p|--package) shift; ai_package=$1; shift;;
108 -v|--verbose) ai_verbose=1; shift;;
109 -h|--help) print_help; exit 0;;
110 --version) print_version; exit 0;;
112 *) echo "Internal error! ($1)"; exit 1;;
117 if [ $# -lt 1 ] ; then
123 [ -z "$ai_package" ] && ai_package=$ai_command
126 if [ ! -z "$ai_envfile" ]; then
127 source "$ai_envfile" || ai_envfile_failed=1
131 if [ ! -z "$ai_envfile_failed" ]; then
134 if which $ai_command > /dev/null || [ -e $ai_command ]; then
139 if [ $ai_force -eq 1 ]; then
143 if [ $do_install -eq 1 ]; then
144 if [ $ai_force -eq 0 ]; then
145 if ! zenity --question \
146 --text="To run '$ai_command', $ai_package package needs to be installed. Do you want to proceed?"; then
151 print_verbose "Need to install $ai_package to run $ai_command"
153 logfile=$(mktemp -u /tmp/nd-autoinstall-XXXXXX.log)
155 { SUDO_ASKPASS="/usr/bin/ssh-askpass" /usr/bin/sudo -A \
156 DEBIAN_FRONTEND=gnome /usr/bin/apt-get install -y $ai_package 2>&1 \
157 && rm -f $logfile; } \
159 | zenity --title="Package installation" \
160 --text="Installing $ai_package" \
161 --progress --pulsate --auto-close --auto-kill
162 if [ -e $logfile ] ; then
163 zenity --title="Installation of $ai_package has failed: see $logfile" \
164 --window-icon=error \
165 --width=800 --height=600 \
166 --text-info --filename=$logfile
169 [ -z "$ai_envfile_failed" ] || source "$ai_envfile" || {
170 zenity --text="Failed to source $ai_envfile even after installing $ai_package" \
171 --window-icon=error --error
176 if [ -x $ai_command ]; then
177 # only run if executable
178 print_verbose "Running $ai_command"