Releasing debian version 2.0.15-1.
[live-boot-grml.git] / bin / live-toram
1 #!/bin/sh
2
3 set -e
4
5 # Read cmdline
6 for _PARAMETER in $(cat /proc/cmdline)
7 do
8         case "${_PARAMETER}" in
9                 module=*)
10                         _MODULE="${_PARAMETER#module=}"
11                         ;;
12         esac
13 done
14
15 # Assemble filesystems
16 if [ -z "${_MODULE}" ]
17 then
18         _FILESYSTEMS="/live/image/live/filesystem.squashfs"
19 else
20         for _FILESYSTEM in _MODULE
21         do
22                 _FILESYSTEMS="${_FILESYSTEMS} /live/image/live/${_FILESYSTEM}"
23         done
24 fi
25
26 # Exit if system is not debian live
27 if [ ! -d /live/image ]
28 then
29         echo "E: live-toram only works on Debian Live systems."
30
31         exit 1
32 fi
33
34 # Exit if filesystem not accessible
35 for _FILESYSTEM in ${_FILESYSTEMS}
36 do
37         if [ ! -r ${_FILESYSTEM} ]
38         then
39                 echo "E: ${_FILESYSTEM}: No such file"
40                 echo "I: live-toram already run?"
41
42                 exit 1
43         fi
44 done
45
46 # Exit if user is unprivileged
47 if [ "$(id -u)" -ne 0 ]
48 then
49         echo "E: need root privileges"
50
51         exit 1
52 fi
53
54 # Exit if not enough free memory
55 _SIZE=0
56
57 for _FILESYSTEM in ${_FILESYSTEMS}
58 do
59         _SIZE="$((${_SIZE} + $(du ${_FILESYSTEM} | awk '{ print $1 }')))"
60         _MEMORY="$(awk '/MemFree/ { print $2 }' /proc/meminfo)"
61 done
62
63 case ${@} in
64         -f|--force)
65                 echo "W: Ignoring memory constrains as requested"
66                 ;;
67
68         *)
69                 if [ $_MEMORY -lt $_SIZE ]
70                 then
71                         echo "E: not enough free memory available."
72                         echo "I: images need ${_SIZE}kB, free memory is ${_MEMORY}kB."
73
74                         exit 1
75                 fi
76                 ;;
77 esac
78
79 # Copying image to memory
80 echo "P: Copying images to memory."
81 echo "P: This may take a while..."
82
83 # FIXME: doesn't work with multiple filesystems
84 for _FILESYSTEM in ${_FILESYSTEMS}
85 do
86         if [ ! -x "$(which rsync 2>/dev/null)" ]
87         then
88                 rsync -a --progress ${_FILESYSTEM} /tmp/live
89         else
90                 cp -av ${_FILESYSTEM} /tmp/live
91         fi
92
93 LANGUAGE=C LANG=C LC_ALL=C perl << EOF
94 open LOOP, '</dev/loop0' or die $!;
95 open DEST, '</tmp/live' or die $!;
96 ioctl(LOOP, 0x4C06, fileno(DEST)) or die $!
97 close LOOP;
98 close DEST;
99 EOF
100
101 done
102
103 # Unmounting live media
104 _DEVICE="$(awk '/\/live\/image / { print $1 }' /proc/mounts)"
105
106 if [ -d /live/image ]
107 then
108         umount /live/image
109         rmdir --ignore-fail-on-non-empty /live/image || true
110 fi
111
112 # Ejecting live media if it is not an optical device
113 if [ "$(expr substr ${_DEVICE} 1 2)" != "sd" ] && \
114    ! readlink /sys/block/$(expr substr ${_DEVICE} 6 3) | grep -q usb
115 then
116         if [ ! -x "$(which rsync 2>/dev/null)" ]
117         then
118                 eject -p -m ${_DEVICE} >/dev/null 2>&1
119         fi
120 fi