summaryrefslogtreecommitdiff
path: root/packages/nslu2-binary-only/unslung-rootfs/unsling
blob: 6e5a5ef8c3a17f7bcd1cd7607bd9a34374fe4c27 (plain)
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
142
143
144
145
146
147
148
149
150
151
152
153
#!/bin/sh

usage="Usage: $0 disk1|disk2"

# Set target disk

if [ $# -gt 1 ] ; then
    echo $usage
    exit 1
fi

if [ $# -eq 1 ] ; then
    if [ "$1" = "disk1" ] ; then
	targ=/share/hdd/data
	copy=true
	flag=.sda1root
    elif [ "$1" = "disk2" ] ; then
	targ=/share/flash/data
	copy=true
	flag=.sdb1root
    elif [ "$1" = "hdd-data" ] ; then
	targ=/share/hdd/data
	copy=true
	flag=.sda1root
    elif [ "$1" = "hdd-conf" ] ; then
	targ=/share/hdd/conf
	copy=true
	flag=.sda2root
    elif [ "$1" = "flash-data" ] ; then
	targ=/share/flash/data
	copy=true
	flag=.sdb1root
    elif [ "$1" = "flash-conf" ] ; then
	targ=/share/flash/conf
	copy=true
	flag=.sdb2root
    elif [ "$1" = "jffs2-hdd-data" ] ; then
	targ=/share/hdd/data
	copy=
    elif [ "$1" = "jffs2-hdd-conf" ] ; then
	targ=/share/hdd/conf
	copy=
    elif [ "$1" = "jffs2-flash-data" ] ; then
	targ=/share/flash/data
	copy=
    elif [ "$1" = "jffs2-flash-conf" ] ; then
	targ=/share/flash/conf
	copy=
    else
	echo $usage
	exit 1
    fi
else
    echo $usage
    exit 1
fi

# Check it's a real mount point

if grep $targ /proc/mounts >/dev/null 2>&1 ; then
    echo "Target disk is $targ"
else
    echo "Error: $targ is not a mounted disk"
    exit 1
fi

# Start at the root directory

cd /

if [ -z "$copy" ] ; then

    # Ensure /opt is there.

    if [ ! -d $targ/opt ] ; then
	echo "Creating new /opt directory on target disk."
	mkdir -p $targ/opt
    else
	echo "Preserving existing /opt directory on target disk."
    fi
  
    if [ -d /opt -a ! -h /opt ] ; then
	echo "Copying existing /opt directory from root disk to target disk."
	tar cf - opt | ( cd $targ ; tar xf - )
	mv /opt /opt.old
    fi

    echo "Linking /opt directory from target disk to root disk."
    rm -f /opt ; ln -s $targ/opt /opt

    # Ensure /usr/lib/ipkg is there.

    if [ ! -d $targ/usr/lib/ipkg ] ; then
	echo "Creating new /usr/lib/ipkg directory on target disk."
	mkdir -p $targ/usr/lib/ipkg
    fi
  
    if [ ! -f $targ/usr/lib/ipkg/status -a -d /usr/lib/ipkg -a ! -h /usr/lib/ipkg ] ; then
	echo "Copying existing /usr/lib/ipkg directory from root disk to target disk."
	tar cf - usr/lib/ipkg | ( cd $targ ; tar xf - )
    else
	echo "Preserving existing ipkg database on target disk."
    fi

    if [ -d /usr/lib/ipkg -a ! -h /usr/lib/ipkg ] ; then
	echo "Saving /usr/lib/ipkg directory on root disk in /usr/lib/ipkg.old"
	rm -rf /usr/lib/ipkg.old
	mv /usr/lib/ipkg /usr/lib/ipkg.old
    fi

    echo "Linking /usr/lib/ipkg directory from target disk to root disk."
    rm -f /usr/lib/ipkg ; ln -s $targ/usr/lib/ipkg /usr/lib/ipkg

    echo "Linking /usr/bin/ipkg executable on root disk."
    rm -f /usr/bin/ipkg ; ln -s /usr/bin/ipkg-cl /usr/bin/ipkg

else

    # Save the existing ipkg database.

    rm -rf $targ/usr/lib/ipkg.old
    if [ -f $targ/usr/lib/ipkg/status ] ; then
	mv $targ/usr/lib/ipkg $targ/usr/lib/ipkg.old
    fi

    # Copy the complete rootfs to the target.

    echo "Copying the complete rootfs from / to $targ."
    /usr/bin/find / -print0 -mount | /usr/bin/cpio -p -0 -d -m -u $targ
    rm -rf $targ/dev ; mv $targ/dev.state $targ/dev
    rm -rf $targ/var ; mv $targ/var.state $targ/var

    # Copy over the existing ipkg database.

    if [ -f $targ/usr/lib/ipkg.old/status ] ; then
	echo "Preserving existing ipkg database on target disk."
	( cd $targ/usr/lib/ipkg.old ; tar cf - . ) | ( cd $targ/usr/lib/ipkg ; tar xf - )
    fi

    echo "Linking /usr/bin/ipkg executable on target disk."
    rm -f $targ/usr/bin/ipkg ; ln -s /usr/bin/ipkg-cl $targ/usr/bin/ipkg

    # Create the boot flag file.

    rm -f /.sd??root $targ/.sd??root /.ramdisk $targ/.ramdisk

    echo "Creating /$flag to direct switchbox to boot from $targ."
    echo > /$flag
    echo > $targ/$flag

fi

exit 0