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
24 [ -z "$ai_verbose" ] || echo "I: $*"
30 nd-autoinstall $nd_autoinstall_version
32 Copyright (C) 2010 Yaroslav Halchenko <debian@onerussian.com>
34 Licensed under GNU Public License version 3 or later.
35 This is free software; see the source for copying conditions. There is NO
36 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
38 Written by Yaroslav Halchenko for the NeuroDebian project.
48 Usage: nd-autoinstall [options] COMMAND [command_options]
50 Runs the COMMAND if it is available, otherwise installs PACKAGE first,
51 and then runs the command. If an environment file is specified, it
52 gets sourced first (PACKAGE gets installed if environment file is not
58 Name of the package to be installed if named differently than
61 -e, --environment-file=FILE
62 File to be sourced before invocation of the COMMAND. If not found,
63 PACKAGE gets installed first.
66 Skip all checks and install package(s) provided via --package.
69 Enable additional progress messages.
72 Optinal title of the installation dialog.
75 Print short description, usage summary and option list.
78 Print version information and exit.
82 exit status of the COMMAND -
83 if COMMAND is available (or got sucesfully installed)
84 2 - incorrect invocation of nd-autoinstall
85 3 - PACKAGE installation failure
89 ################################
90 # Commandline options handling #
91 ################################
93 # Parse commandline options (taken from the getopt examples from the Debian util-linux package)
94 # Note that we use `"$@"' to let each command-line parameter expand to a
95 # separate word. The quotes around `$@' are essential!
96 # We need CLOPTS as the `eval set --' would nuke the return value of getopt.
97 CLOPTS=`getopt -o h,e:,p:,t:,f,v --long help,version,environment-file:,package:,title:,verbose,force -n 'nd-autoinstall' -- "$@"`
100 echo "Terminating..." >&2
104 # Note the quotes around `$CLOPTS': they are essential!
105 eval set -- "$CLOPTS"
109 -e|--environment-file) shift; ai_envfile=$1; shift;;
110 -f|--force) ai_force=1; shift;;
111 -p|--package) shift; ai_package=$1; shift;;
112 -t|--title) shift; ai_dialog_title=$1; shift;;
113 -v|--verbose) ai_verbose=1; shift;;
114 -h|--help) print_help; exit 0;;
115 --version) print_version; exit 0;;
117 *) echo "Internal error! ($1)"; exit 1;;
122 if [ $# -lt 1 ] ; then
128 [ -z "$ai_package" ] && ai_package=$ai_command
130 [ -z "$ai_dialog_title" ] && ai_dialog_title="Package installation"
133 if [ ! -z "$ai_envfile" ]; then
134 source "$ai_envfile" || ai_envfile_failed=1
138 if [ ! -z "$ai_envfile_failed" ]; then
141 if which $ai_command > /dev/null || [ -e $ai_command ]; then
146 if [ $ai_force -eq 1 ]; then
150 if [ $do_install -eq 1 ]; then
151 # Figure out amount of space to download/occupy
152 space_info="$(LC_ALL=C apt-get --print-uris install $ai_package 2>/dev/null \
153 | grep -e '^\(Need to get \|After this\)' || : )"
154 if [ $ai_force -eq 0 ]; then
155 if ! zenity --question \
156 --text="To run '$ai_command', $ai_package package needs to be installed.
160 Do you want to proceed?"; then
165 print_verbose "Need to install $ai_package to run $ai_command"
167 logfile=$(mktemp -u /tmp/nd-autoinstall-XXXXXX.log)
169 { SUDO_ASKPASS="/usr/bin/ssh-askpass" /usr/bin/sudo -A \
170 DEBIAN_FRONTEND=gnome /usr/bin/apt-get install -y $ai_package 2>&1 \
171 && rm -f $logfile; } \
173 | zenity --title="$ai_dialog_title" \
174 --text="Installing $ai_package
176 --progress --pulsate --auto-close --auto-kill
177 if [ -e $logfile ] ; then
178 zenity --title="Installation of $ai_package has failed: see $logfile" \
179 --window-icon=error \
180 --width=800 --height=600 \
181 --text-info --filename=$logfile
184 [ -z "$ai_envfile_failed" ] || source "$ai_envfile" || {
185 zenity --text="Failed to source $ai_envfile even after installing $ai_package" \
186 --window-icon=error --error
191 if which $ai_command > /dev/null 2>&1; then
192 # only run if executable
193 print_verbose "Running $ai_command"