~ubuntu-branches/ubuntu/quantal/lxc/quantal-201206191543

« back to all changes in this revision

Viewing changes to debian/local/lxc-start-ephemeral

  • Committer: Package Import Robot
  • Author(s): Stéphane Graber
  • Date: 2012-05-18 19:05:44 UTC
  • Revision ID: package-import@ubuntu.com-20120518190544-d2ejphrownapveg1
Tags: 0.8.0~rc1-4ubuntu8
* Update lxc-ubuntu:
  - Update list of extra packages for debootstrap to only include vim
    and ssh. The others were only relevant when we were still using the
    minbase variant. (LP: #996839)
  - Drop any hardcoded Ubuntu version check and replace by feature
    checks instead.
  - Format lxc-ubuntu to consistently use 4-spaces indent instead of
    mixed spaces/tabs.
  - Update default /etc/network/interfaces to include the header.
  - Update default /etc/hosts to match that of a regular Ubuntu system.
  - Drop support for end-of-life releases (gutsy on sparc).
  - Make sure /etc/resolv.conf is valid before running any apt command.
  - Update template help message for release and arch parameters.
  - Switch default Ubuntu version from lucid to precise.
* Update lxc-start-ephemeral:
  - Remove lxc-ip and replace it by a call to "ip netns" until we have
    an extended lxc-attach we can use for that.
  - Fix a race in lxc-start-ephemeral where the container isn't yet
    running when trying to get its IPs.
  - Update a few calls so that lxc-start-ephemeral can be called as a
    user (ensure consistent usage of sudo across the script).
* Add new lxc-default-with-nesting apparmor profile, allowing nested
  containers.

Show diffs side-by-side

added added

removed removed

Lines of Context:
183
183
                echo "$line";
184
184
            fi
185
185
        fi
186
 
    done < $LXC_DIR/fstab.old > $LXC_DIR/fstab
 
186
    done < $LXC_DIR/fstab.old | sudo tee $LXC_DIR/fstab >/dev/null
187
187
 
188
188
    # If LXC_BIND is defined, add it to fstab.
189
189
    if [ -n "$LXC_BIND" ]; then
190
190
        sudo mkdir -p $LXC_DIR/rootfs$LXC_BIND
191
 
        echo "$LXC_BIND $LXC_DIR/rootfs$LXC_BIND        none bind 0 0" >> $LXC_DIR/fstab
 
191
        echo "$LXC_BIND $LXC_DIR/rootfs$LXC_BIND        none bind 0 0" | sudo tee -a $LXC_DIR/fstab >/dev/null
192
192
    fi
193
193
 
194
194
    # update the ephemeral container's MAC address (lifted from lxc-clone)
195
195
    c=$LXC_DIR/config
196
196
    # change hwaddrs
197
 
    mv ${c} ${c}.old
 
197
    sudo mv ${c} ${c}.old
198
198
    (
199
199
    while read line; do
200
200
        if [ "${line:0:18}" = "lxc.network.hwaddr" ]; then
203
203
                echo "$line"
204
204
        fi
205
205
    done
206
 
    ) < ${c}.old > ${c}
207
 
    rm -f ${c}.old
 
206
    ) < ${c}.old | sudo tee ${c} >/dev/null
 
207
    sudo rm -f ${c}.old
 
208
}
 
209
 
 
210
get_ip()
 
211
{
 
212
    # Get init's PID
 
213
    PID=$(sudo lxc-info -n $1 -p | awk '{print $2}')
 
214
    [ "$PID" = "-1" ] && return 1
 
215
 
 
216
    # Get some unique path
 
217
    DST=$(sudo mktemp -u --tmpdir=/run/netns/)
 
218
    NAME=$(basename $DST)
 
219
 
 
220
    # Prepare the /run/netns entry for "ip netns"
 
221
    sudo mkdir -p /run/netns
 
222
    sudo ln -s /proc/$PID/ns/net $DST
 
223
 
 
224
    # Grab all the public globally routed IPv4 and IPv6 addresses
 
225
    (sudo ip netns exec $NAME ip -4 addr show scope global && \
 
226
     sudo ip netns exec $NAME ip -6 addr show scope global) | grep inet | while read line; do
 
227
        ip=$(echo $line | awk '{print $2}' | cut -d '/' -f1)
 
228
        echo "$ip"
 
229
    done
 
230
 
 
231
    sudo rm $DST
208
232
}
209
233
 
210
234
start_container()
211
235
{
212
236
    echo "Starting up the container..."
213
237
    sudo lxc-start -n $LXC_NAME -d
 
238
    sudo lxc-wait -s RUNNING -n $LXC_NAME
214
239
    LXC_RUNNING=1
215
240
 
216
241
    if [ $COMMAND_LENGTH -gt 0 ]; then
217
242
        # When lxc-attach support arrives in the kernel, we can switch to
218
243
        # that.
219
 
        # Meanwhile, we use lxc-ip to wait for container's network to be up
 
244
        # Meanwhile, we use get_ip to wait for container's network to be up
220
245
        # and to obtain the ip address, then we can ssh to the lxc.
221
246
        TRIES=60
222
 
        LXCIP='/usr/bin/lxc-ip'
223
 
        LXC_INTERFACE=''
 
247
        FAILED=1
224
248
 
225
 
        # Try to obtain the container's interfaces and ip addresses.
226
 
        # The name of the first interface found will be used later to
227
 
        # retrieve the container's ip address.
 
249
        # Repeatedly try to connect over SSH until we either succeed
 
250
        # or time out.
228
251
        for i in $(seq 1 $TRIES); do
229
 
            LXCIP_OUTPUT=`sudo $LXCIP -n $LXC_NAME 2> /dev/null`
230
 
            if [ $? = 0 ]; then
231
 
                LXC_INTERFACE=`echo $LXCIP_OUTPUT | head -1 | cut -d ":" -f 1`
232
 
                break
233
 
            else
 
252
            # We call get_ip inside the loop to ensure the correct ip
 
253
            # is retrieved even in the case the DHCP ip assignment
 
254
            # changes during the process.
 
255
            IP_ADDRESS=$(get_ip $LXC_NAME)
 
256
            if [ -z "$IP_ADDRESS" ]; then
234
257
                sleep 1
 
258
                continue
235
259
            fi
236
 
        done
237
260
 
238
 
        if [ -n "$LXC_INTERFACE" ]; then
239
 
            # Repeatedly try to connect over SSH until we either succeed
240
 
            # or time out.
241
 
            for i in $(seq 1 $TRIES); do
242
 
                # We call lxc-ip inside the loop to ensure the correct ip
243
 
                # is retrieved even in the case the DHCP ip assignment
244
 
                # changes during the process.
245
 
                IP_ADDRESS=`sudo $LXCIP -n $LXC_NAME -i $LXC_INTERFACE`
 
261
            # Iterate through all the addresses (if multiple)
 
262
            for ip in $IP_ADDRESS; do
246
263
                ssh -n -o StrictHostKeyChecking=no \
247
264
                    -o UserKnownHostsFile=/dev/null \
248
265
                    $LXC_KEY $LXC_USER@$IP_ADDRESS -- "$COMMAND"
251
268
                    # Anything else is either success (status 0) or a
252
269
                    # failure from whatever we ran over the SSH connection.
253
270
                    # In those cases we want to stop looping, so we break
254
 
                    # here.
 
271
                    # here
 
272
 
 
273
                    FAILED=0
255
274
                    break;
256
275
                fi
257
 
                sleep 1
258
276
            done
259
 
        else
 
277
 
 
278
            if [ "$FAILED" = "0" ]; then
 
279
                break
 
280
            fi
 
281
            sleep 1
 
282
        done
 
283
 
 
284
        if [ "$FAILED" = "1" ]; then
260
285
            echo "could not get IP address - aborting." >&2
261
286
        fi
262
287
    else