File: schroot-uri

package info (click to toggle)
cdist 7.0.0-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,992 kB
  • sloc: sh: 16,815; python: 9,199; makefile: 344; awk: 261
file content (141 lines) | stat: -rwxr-xr-x 3,787 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/bin/sh -e
#
# 2012 Steven Armstrong (steven-cdist at armstrong.cc)
#
# This file is part of cdist.
#
# cdist is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# cdist is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
#
#
# __remote_{exec,copy} script to run cdist against a schroot target uri
#
# Usage:
#  cdist config \
#     --remote-exec "/path/to/this/script exec" \
#     --remote-copy "/path/to/this/script copy" \
#     target_uri
#
# # target_uri examples:
# schroot:///chroot-name
# schroot://foo.ethz.ch/chroot-name
# schroot://user-name@foo.ethz.ch/chroot-name
#
# # and how to match them in .../manifest/init
# case "$target_host" in
#    schroot://*)
#       # any schroot
#    ;;
#    schroot://foo.ethz.ch/*)
#       # any schroot on specific host
#    ;;
#    schroot://foo.ethz.ch/chroot-name)
#       # specific schroot on specific host
#    ;;
#    schroot:///chroot-name)
#       # specific schroot on localhost
#    ;;
# esac

my_name="${0##*/}"
mode="$1"; shift

log() {
   # uncomment me for debugging
   #echo "$@" | logger -t "cdist-$my_name-$mode"
   :
}

die() {
   echo "$@" >&2
   exit 1
}


uri="$__target_host"

scheme="${uri%%:*}"; rest="${uri#$scheme:}"; rest="${rest#//}"
authority="${rest%%/*}"; rest="${rest#$authority}"
path="${rest%\?*}"; rest="${rest#$path}"
schroot_name="${path#/}"

[ "$scheme" = "schroot" ] || die "Failed to parse scheme from __target_host ($__target_host). Expected 'schroot', got '$scheme'"
[ -n "$schroot_name" ] || die "Failed to parse schroot name from __target_host: $__target_host"

case "$authority" in
   '')
      # authority is empty, neither user nor host given
      user=""
      host=""
   ;; 
   *@*)
      # authority contains @, take user from authority
      user="${authority%@*}"
      host="${authority#*@}"
   ;; 
   *) 
      # no user in authority, default to root
      user="root"
      host="$authority"
   ;;
esac

log "mode: $mode"
log "@: $@"
log "uri: $uri"
log "scheme: $scheme"
log "authority: $authority"
log "user: $user"
log "host: $host"
log "path: $path"
log "schroot_name: $schroot_name"

exec_prefix=""
copy_prefix=""
if [ -n "$host" ]; then
   # we are working on a remote host
   exec_prefix="ssh -o User=$user -q $host"
   copy_prefix="scp -o User=$user -q"
   copy_destination_prefix="$host:"
else
   # working on local machine
   copy_prefix="cp"
   copy_destination_prefix=""
fi
log "exec_prefix: $exec_prefix"
log "copy_prefix: $copy_prefix"
log "copy_destination_prefix: $copy_destination_prefix"

case "$mode" in
   exec)
      # In exec mode the first argument is the __target_host which we already got from env. Get rid of it.
      shift
      code="$exec_prefix schroot -c $schroot_name -- sh -c '$@'"
   ;;
   copy)
      # get directory for given chroot_name
      schroot_directory="$($exec_prefix schroot -c $schroot_name --config | awk -F = '/directory=/ {print $2}')"
      [ -n "$schroot_directory" ] || die "Failed to retreive schroot directory for schroot: $schroot_name"
      log "schroot_directory: $schroot_directory"
      # prefix destination with chroot
      code="$copy_prefix $(echo "$@" | sed "s|$uri:|${copy_destination_prefix}${schroot_directory}|g")"
   ;;
   *) die "Unknown mode: $mode";;
esac

log "code: $code"

# Run the code
$code

log "-----"