Drop grml-postfix
[grml-scripts.git] / usr_sbin / grml-chroot
1 #!/bin/bash
2 # Filename:      grml-chroot
3 # Purpose:       Program to chroot into another system
4 # Authors:       grml-team (grml.org), (c) Michael Gebetsroither <gebi@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 ################################################################################
8
9 PROG_NAME_=$(basename $0)
10 DEST_=""
11 MOUNTED_=""     # all mounted destinations
12
13
14 function die
15 {
16     echo "Error: $@" >&2
17     exit 1
18 }
19
20 function printUsage
21 {
22     cat <<EOT
23 Usage: "$PROG_NAME_" NEWROOT [COMMAND....]
24
25 $PROG_NAME_ is a chroot wrapper with proc/sys/pts/dev filesystem handling
26
27 EOT
28 }
29
30 function storeMounts
31 {
32     local to_append_="$1"
33     if [[ $MOUNTED_ == "" ]]; then
34         MOUNTED_="$to_append_"
35     else
36         MOUNTED_="$MOUNTED_ $to_append_"
37     fi
38 }
39
40 function mountit
41 {
42     local type_="$1" # type _or_ src
43     local dest_="$2"
44     local options_="$3"
45
46     local all_options_=""
47
48     if [[ $options_ == "--bind" ]]; then
49         all_options_="--bind $type_"
50     else
51         all_options_="-t $type_ none"
52     fi
53     mount $all_options_ "${DEST_}/$dest_" && storeMounts "$dest_"
54 }
55
56 function umount_all
57 {
58     for i in $MOUNTED_; do
59         umount "${DEST_}/$i"
60     done
61 }
62
63
64 ###
65 ### __MAIN
66 ###
67
68 while getopts "h" opt; do
69     case "$opt" in
70         h) printUsage; exit 0 ;;
71         ?) printUsage; exit 64 ;;
72     esac
73 done
74 shift $(($OPTIND - 1))
75
76 if (( $# < 1 )); then
77     printUsage
78     die "Wrong number of arguments."
79 fi
80
81 DEST_="$1"; shift
82
83 if [ ! -d "$DEST_" ]; then
84     die "Target chroot does not exist: $DEST_"
85 fi
86
87
88 mountit "proc"  "proc"
89 mountit "sysfs" "sys"
90 mountit "/dev"   "dev"   "--bind"
91 if (( $# < 1 )); then
92     chroot "$DEST_"
93     RC=$?
94 else
95     chroot "$DEST_" "$@"
96     RC=$?
97 fi
98 umount_all
99
100 exit $RC