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_aptenable_version=0.1
16 nd_config_file=/etc/neurodebian/neurodebian.cfg
17 nd_mirror_origin=http://neuro.debian.net/debian
18 nd_mirror_default=$nd_mirror_origin # or may be AWS?
20 # To be set by cmdline args
22 ae_components=software,data
35 # - apt priority! (so we could avoid automagic upgrades etc)
38 ae_tempdir=$(mktemp -d)
39 trap "rm -rf \"$ae_tempdir\"" TERM INT EXIT
45 if [ "$ae_verbose" -ge $level ]; then
46 # use stderr for printing within functions stdout of which might be used
61 nd-aptenable $nd_aptenable_version
63 Copyright (C) 2014 Yaroslav Halchenko <debian@onerussian.com>
65 Licensed under GNU Public License version 3 or later.
66 This is free software; see the source for copying conditions. There is NO
67 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
69 Written by Yaroslav Halchenko for the NeuroDebian project.
76 if [ -z "$ae_dry_run" ]; then
87 Usage: nd-aptenable [options]
89 Enables NeuroDebian repository for the current Debian or Ubuntu release.
94 Name of the Debian/Ubuntu release to be used. If not specified,
95 it is deduced from the apt-cache policy output, by taking repository
96 of Debian or Ubuntu origin with highest priority.
98 -f, --flavor=full|libre
99 Which flavor of the repository should be enabled:
100 libre -- Only main component, containing only DFSG-compliant content.
101 full -- Includes main, contrib, and non-free.
102 If not specified -- deduced from the output of apt-cache policy
104 -c, --components=c1,c2,c3
105 Comma separated list of components to enable among:
106 software -- primary software repository
107 data -- data packages
108 devel -- "overlay" of development versions (like Debian "experimental").
109 Not sufficient on its own and available only from the main site
110 If not specified -- "software,data"
112 -m, --mirror=NAME|URL
113 Which mirror to use. Could be a mirror code-name (as specified in
114 /etc/neurodebian/neurodebian.cfg), or a URL (TODO).
117 If apt file already present, it would not be overriden (by default).
118 Use this option to overwrite.
121 Which suffix to add to the apt file, in case you are trying to enable
122 multiple repositories
124 --sources, --no-sources
125 Either to enable deb-src lines. If not specified -- deduced based on ??? TODO
128 Do not perform any changes -- generated configurations and commands will
129 simply be printed to stdout
132 Enable additional progress messages. Could be used multiple times
135 Make operation quiet -- only error messages would be output
138 Print short description, usage summary and option list.
141 Print version information and exit.
145 non-0 exit status in case of error. Error exit code would depend
146 on which command has failed
150 - Enable software and data components from the optimal (according to
151 netselect) mirror. Some information about progress will be printed
155 - Quietly enable -devel repository for the current release, and place apt
156 configuration into /etc/apt/sources.list.d/neurodebian.sources-devel.list
158 nd-aptenable -q --suffix=-devel -c devel
160 - Force sid distribution, all the components, from the Japan mirror:
162 nd-aptenable -q --suffix=-de-sid-full -c software,data,devel -m jp
167 get_neurodebian_cfg()
169 # First we try to fetch the most recent version from the github
170 print_verbose 3 "Fetching config file from the github repository"
171 cfgfile_temp="$ae_tempdir/neurodebian.cfg"
172 wget -c -q -O$cfgfile_temp https://raw.githubusercontent.com/neurodebian/neurodebian/master/neurodebian.cfg \
173 && { echo $cfgfile_temp; } \
174 || { [ -e "$nd_config_file" ] && return "$nd_config_file"; }
175 # if not -- should blow up
180 # echo "TODO: fetch uptodate neurodebian.cfg"
181 nd_config=`get_neurodebian_cfg`
182 $exe_dir/nd_querycfg --config-file="$nd_config" "mirrors" \
184 | while read mirror_name mirror_url; do
185 # verify that url is just a url
186 if echo "$mirror_url" | grep -v -e '^[a-z0-9:+]*://[-+_%.a-z0-9/]*$'; then
187 print_verbose 1 "Mirror $mirror_name has 'illegit' URL: $mirror_url. Skipping"
189 echo "$mirror_name $mirror_url"
194 # select "closest" mirror according to netselect.
195 print_verbose 2 "Selecting the 'best' mirror using netselect"
196 if ! which netselect >/dev/null; then
197 print_verbose 1 "netselect (apt-get install netselect) needed to select the 'best' mirror was not found"
198 print_verbose 1 "Selecting the default repository: $nd_mirror_default"
199 echo $nd_mirror_default
201 get_mirrors | awk '{print $2;}' | $ae_sudo xargs netselect -D -s 1 | awk '{print $2;}'
205 # given mirror alias -- find its url
206 url=$(get_mirrors | awk "/^$1 /{print \$2;}")
207 if [ -z "$url" ]; then
208 error 9 "Cannot resolve mirror $1 to the URL"
215 # Get apt-cache policy output in a single list for matching suites
216 # (could be a separated with \| or , for multiple choices, e.g.
218 # get_apt_policy Debian,Ubuntu
220 # get_apt_policy NeuroDebian
222 apt-cache policy | grep -B1 -e "o=\(${suites//,/\\|}\)" | tr '\n' ' ' | sed -e 's, -- ,\n,g' | grep -v -e '-\(updates\|security\)' | sort -nr
227 echo "$ae_components" | tr ',' '\n' | grep -q "^$1\$"
232 # Commandline options handling
235 # Parse commandline options (taken from the getopt examples from the Debian util-linux package)
236 # Note that we use `"$@"' to let each command-line parameter expand to a
237 # separate word. The quotes around `$@' are essential!
238 # We need CLOPTS as the `eval set --' would nuke the return value of getopt.
239 CLOPTS=`getopt -o h,r:,m:,f:,c:,q,v,n --long help,version,quiet,verbose,mirror:,release:,flavor:,components:,suffix:,overwrite,sources,no-sources,dry-run,print-mirrors,print-best-mirror -n 'nd-aptenable' -- "$@"`
241 if [ $? != 0 ] ; then
242 error 2 "Problem with parsing cmdline. Terminating..."
245 # Note the quotes around `$CLOPTS': they are essential!
246 eval set -- "$CLOPTS"
248 if [ `whoami` != "root" ]; then
254 -r|--release) shift; ae_release="$1"; shift;;
255 -f|--flavor) shift; ae_flavor="$1"; shift;;
256 -c|--components) shift; ae_components="$1"; shift;;
258 -m|--mirror) shift; ae_mirror="$1"; shift;;
260 --print-mirrors) get_mirrors; exit 0;;
261 --print-best-mirror) netselect_mirror; exit 0;;
262 -n|--dry-run) ae_dry_run=1; shift;;
263 --suffix) shift; ae_suffix="$1"; shift;;
264 --overwrite) ae_overwrite="$1"; shift;;
265 --sources) ae_sources=1; shift;;
266 --no-sources) ae_sources=0; shift;;
267 -q|--quiet) ae_verbose=0; shift;;
268 -v|--verbose) ae_verbose=$(($ae_verbose+1)); shift;;
269 -h|--help) print_help; exit 0;;
270 --version) print_version; exit 0;;
272 *) error 1 "Internal error! ($1)";;
277 if [ $# -gt 0 ] ; then
283 [ -z "$ae_sudo" ] || print_verbose 1 "This script requires root access. Since current user is not root, sudo will be used"
286 # Basic system/environment knowledge
289 ae_output_file=/etc/apt/sources.list.d/neurodebian.sources${ae_suffix}.list
291 apt_policy=$(get_apt_policy "Debian,Ubuntu" )
293 if [ -z "$ae_release" ]; then
294 ae_release=$(echo "$apt_policy" | head -1 | sed -e 's/.*,n=\([^,]*\),.*/\1/g')
297 if [ -z "$ae_flavor" ]; then
298 ae_flavor=$(echo "$apt_policy" | grep -e ",n=$ae_release," | grep -qe 'c=\(non-free\|restricted\)' && echo "full" || echo "libre")
302 # Determine which mirror to use
305 # TODO -- determine mirror URL
306 # Not necessary for -devel available only from the main site
307 if include_component software || include_component data; then
308 # for now just use default
309 if [ -z "$ae_mirror" ]; then # none specified
310 ae_mirror_url=$nd_mirror_origin
312 if ! [[ "$ae_mirror" =~ ".*://.*" ]]; then
313 # TODO -- determine from the abbreviation
315 best) ae_mirror_url=$(netselect_mirror);;
316 default) ae_mirror_url=$nd_mirror_default;;
317 origin) ae_mirror_url=$nd_mirror_origin;;
318 *) ae_mirror_url=$(get_mirror_url "$ae_mirror");;
321 ae_mirror_url="$ae_mirror" # it was some kind of a URL already
331 full) apt_flavor="contrib non-free";;
332 libre) apt_flavor="";;
333 *) error 5 "Unknown value of flavor $apt_flavor. Must be full or libre"
336 if [ -z "$ae_sources" ] || [ $ae_sources -eq 0 ]; then
344 if include_component software; then
346 # NeuroDebian software repository
347 deb $ae_mirror_url $ae_release main $apt_flavor
348 ${sources_comment}deb-src $ae_mirror_url $ae_release main $apt_flavor
352 if include_component data; then
354 # NeuroDebian data repository
355 deb $ae_mirror_url data main $apt_flavor
356 ${sources_comment}deb-src $ae_mirror_url data main $apt_flavor
360 if include_component devel; then
362 # NeuroDebian -devel repository
363 deb http://neuro.debian.net/debian-devel $ae_release main $apt_flavor
364 ${sources_comment}deb-src http://neuro.debian.net/debian-devel $ae_release main $apt_flavor
368 if [ -e "$ae_output_file" ] && [ -z "$ae_overwrite" ]; then
370 print_verbose 1 "File $ae_output_file already exists, containing:\n\n`cat \"$ae_output_file\"`\n\nI: Use --overwrite option to regenerate with:\n\n$apt_list"
371 if get_apt_policy NeuroDebian >/dev/null; then
372 print_verbose 1 "NeuroDebian repositories are already available, thus skipping the rest."
373 print_verbose 1 "Rerun with --overwrite if you would like to reconfigure."
377 print_verbose 1 "Generating $ae_output_file"
378 if [ -z "$ae_dry_run" ]; then
379 echo "$apt_list" >| "$ae_output_file"
388 # Assure present archive GPG key for APT system
391 # Figure out if key needs to be imported (if ran within package,
392 # should already be there due to neurodebian-keyring package)
393 if LANG=C eval $ae_sudo apt-key export $nd_key_id 2>&1 1>/dev/null | grep -qe "nothing exported"; then
394 print_verbose 1 "Fetching the key from the server"
395 eval_dry apt-key adv --recv-keys --keyserver pgp.mit.edu $nd_key_id
399 # Finalizing (apt-get update etc)
402 print_verbose 1 "Updating APT listings, might take a few minutes"
403 if [ -z "$ae_dry_run" ]; then
404 apt_logfile=$(ae_tempdir)/apt.log
405 $ae_sudo apt-get update 1>"$apt_logfile" 2>&1 \
406 && rm -f "$apt_logfile" \
409 error 5 "E: Update failed with exit code $? (above output logged into $apt_logfile)."
412 eval_dry apt-get update
415 if [ "$ae_verbose" -ge 2 ]; then
416 print_verbose 2 "Currently enabled NeuroDebian suites/mirrors:"
417 get_apt_policy NeuroDebian