From patchwork Mon Aug 8 09:02:23 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: loic.minier@linaro.org X-Patchwork-Id: 3295 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 47632241D4 for ; Mon, 8 Aug 2011 09:02:26 +0000 (UTC) Received: from mail-qy0-f180.google.com (mail-qy0-f180.google.com [209.85.216.180]) by fiordland.canonical.com (Postfix) with ESMTP id ECB54A18019 for ; Mon, 8 Aug 2011 09:02:25 +0000 (UTC) Received: by qyk31 with SMTP id 31so2467327qyk.11 for ; Mon, 08 Aug 2011 02:02:25 -0700 (PDT) Received: by 10.229.183.84 with SMTP id cf20mr3956611qcb.121.1312794145412; Mon, 08 Aug 2011 02:02:25 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.229.190.71 with SMTP id dh7cs7255qcb; Mon, 8 Aug 2011 02:02:24 -0700 (PDT) Received: from mr.google.com ([10.216.54.136]) by 10.216.54.136 with SMTP id i8mr5942722wec.49.1312794144570 (num_hops = 1); Mon, 08 Aug 2011 02:02:24 -0700 (PDT) Received: by 10.216.54.136 with SMTP id i8mr4257359wec.49.1312794143672; Mon, 08 Aug 2011 02:02:23 -0700 (PDT) Received: from adelie.canonical.com (adelie.canonical.com [91.189.90.139]) by mx.google.com with ESMTP id l1si11351090wed.99.2011.08.08.02.02.23; Mon, 08 Aug 2011 02:02:23 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of bounces@canonical.com designates 91.189.90.139 as permitted sender) client-ip=91.189.90.139; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of bounces@canonical.com designates 91.189.90.139 as permitted sender) smtp.mail=bounces@canonical.com Received: from loganberry.canonical.com ([91.189.90.37]) by adelie.canonical.com with esmtp (Exim 4.71 #1 (Debian)) id 1QqLj5-0004GL-27 for ; Mon, 08 Aug 2011 09:02:23 +0000 Received: from loganberry.canonical.com (localhost [127.0.0.1]) by loganberry.canonical.com (Postfix) with ESMTP id 0A8272E80EF for ; Mon, 8 Aug 2011 09:02:23 +0000 (UTC) MIME-Version: 1.0 X-Launchpad-Project: linaro-image-tools X-Launchpad-Branch: ~linaro-image-tools/linaro-image-tools/trunk X-Launchpad-Message-Rationale: Subscriber X-Launchpad-Branch-Revision-Number: 401 X-Launchpad-Notification-Type: branch-revision To: Linaro Patch Tracker From: noreply@launchpad.net Subject: [Branch ~linaro-image-tools/linaro-image-tools/trunk] Rev 401: Merge lp:~lool/linaro-image-tools/initrd-do; adds a script to edit an initrd Message-Id: <20110808090223.1010.85928.launchpad@loganberry.canonical.com> Date: Mon, 08 Aug 2011 09:02:23 -0000 Reply-To: noreply@launchpad.net Sender: bounces@canonical.com Errors-To: bounces@canonical.com Precedence: bulk X-Generated-By: Launchpad (canonical.com); Revision="13622"; Instance="initZopeless config overlay" X-Launchpad-Hash: f321ec03777346e3ec2110346cc7b3af008458e6 Merge authors: Loïc Minier (lool) Related merge proposals: https://code.launchpad.net/~lool/linaro-image-tools/initrd-do/+merge/70336 proposed by: Loïc Minier (lool) ------------------------------------------------------------ revno: 401 [merge] committer: Loïc Minier branch nick: linaro-image-tools timestamp: Mon 2011-08-08 10:00:43 +0100 message: Merge lp:~lool/linaro-image-tools/initrd-do; adds a script to edit an initrd interactively or automatically. added: initrd-do modified: setup.py --- lp:linaro-image-tools https://code.launchpad.net/~linaro-image-tools/linaro-image-tools/trunk You are subscribed to branch lp:linaro-image-tools. To unsubscribe from this branch go to https://code.launchpad.net/~linaro-image-tools/linaro-image-tools/trunk/+edit-subscription === added file 'initrd-do' --- initrd-do 1970-01-01 00:00:00 +0000 +++ initrd-do 2011-08-03 16:36:20 +0000 @@ -0,0 +1,172 @@ +#!/bin/sh +# initrd-do - run a command within an initrd +# Copyright (C) 2008 Loïc Minier +# Copyright (C) 2011 Linaro Limited +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# SOFTWARE IN THE PUBLIC INTEREST, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the author shall not be used +# in advertising or otherwise to promote the sale, use or other dealings in +# this Software without prior written authorization from the author. +# +# depends: sudo + +set -e + +self="$(basename "$0")" +work_dir="" +new_initrd="" + +log() { + echo "$*" >&2 +} + +log_i() { + log "I:" "$@" +} + +log_w() { + log "W:" "$@" +} + +die() { + log "E:" "$@" + exit 1 +} + +usage() { + log "Usage: $self --initrd [-c [ ...]]" +} + +getshell() { + if [ -n "$SHELL" ]; then + echo "$SHELL" + return + fi + PASSWD="$(getent passwd $(id -u) | sed -n 's/.*://p')" + if [ -n "$PASSWD" ]; then + echo "$PASSWD" + return + fi + echo "/bin/sh" +} + +escape() { + echo "$*" | sed "s/'/'\"'\"'/g; s/.*/'&'/" +} + +# unused; use eval +unescape () { + eval "echo" "$*" +} + +cleanup() { + if [ -n "$new_initrd" ]; then + rm -f "$new_initrd" + fi + if [ -n "$work_dir" ]; then + rm -rf "$work_dir" + fi +} + +trap "cleanup" 0 1 2 3 9 11 13 15 + +initrd="" +command="$(escape "$(getshell)")" + +while [ $# -gt 0 ]; do + case $1 in + --help) + usage + exit 0 + ;; + -i|--initrd) + shift + initrd="$1" + if ! shift; then + die "Need an initrd file after --initrd" + fi + ;; + -c) + shift + if [ $# -le 0 ]; then + die "Need a command after -c" + fi + command="" + while :; do + command="$command $(escape "$1")" + shift + if [ $# -eq 0 ]; then + break + fi + done + break + ;; + *) + # clever handling of args: set initrd first if unset, otherwise set + # command + if [ -z "$initrd" ]; then + initrd="$1" + shift + else + command="" + while :; do + command="$command $(escape "$1")" + shift + if [ $# -eq 0 ]; then + break + fi + done + fi + ;; + esac +done + +if [ -z "$initrd" ]; then + usage + exit 1 +fi + +work_dir="$(mktemp -dt "$self.XXXXXXXXXX")" + +# subshell to not touch cwd as we will nuke it +( cd "$work_dir" + log_i "Unpacking initrd $initrd" + gunzip -c <"$initrd" | cpio -i --quiet + log_i "Running command:" $command + eval $command +) + +err=$? + +if [ 0 != $err ]; then + log_w "Command exited with $err; aborting" + exit 1 +fi + +log_i "Generating new initrd" +new_initrd="$(mktemp -t "$self.XXXXXXXXXX")" +# subshell to not touch cwd as we will nuke it +( cd "$work_dir" + find . | cpio -o -H newc -R 0:0 --quiet | gzip -c >"$new_initrd" +) + +log_i "Moving new initrd to $initrd" +mv -f "$new_initrd" "$initrd" + === modified file 'setup.py' --- setup.py 2011-07-26 15:50:29 +0000 +++ setup.py 2011-08-03 16:37:03 +0000 @@ -13,6 +13,7 @@ author_email="linaro-dev@lists.linaro.org", scripts=[ + "initrd-do", "linaro-hwpack-create", "linaro-hwpack-install", "linaro-media-create", "linaro-android-media-create", "linaro-hwpack-replace", "linaro-fetch-image",