rev |
line source |
domcox@0
|
1 #!/bin/sh
|
domcox@0
|
2 # tazinst - SliTaz GNU/Linux installer.
|
domcox@0
|
3 #
|
domcox@0
|
4 # So this is the SliTaz installer. The script starts with a
|
domcox@2
|
5 # few main variables, then all the functions and then the
|
domcox@0
|
6 # full sequence of functions.
|
domcox@0
|
7 #
|
domcox@2
|
8 # (C) 2007-2013 SliTaz - GNU General Public License v3.
|
domcox@0
|
9 #
|
domcox@0
|
10 # Authors : Christophe Lincoln <pankso@slitaz.org>
|
domcox@0
|
11 # Dominique Corbex <domcox@slitaz.org>
|
domcox@2
|
12
|
domcox@0
|
13 # Exit codes:
|
domcox@2
|
14 # 1: Parameters error
|
domcox@2
|
15 # 2: Install file error
|
domcox@0
|
16 # 3: Source error
|
domcox@2
|
17 # 4: Target error
|
paul@5
|
18 # 5: Missing resource
|
domcox@0
|
19 # 6: SliTaz system to upgrade not found
|
domcox@0
|
20 # 7: Another instance is running
|
domcox@0
|
21 # 8: Internal error
|
domcox@2
|
22 # 9: User cancellation
|
domcox@0
|
23
|
domcox@0
|
24
|
domcox@2
|
25 # path
|
domcox@2
|
26 PATH="/usr/sbin:/usr/bin:/sbin:/bin"
|
domcox@2
|
27 umask 0177
|
domcox@2
|
28
|
domcox@2
|
29 # read Slitaz conf
|
domcox@2
|
30 [ -r /etc/slitaz/slitaz.conf ] && . /etc/slitaz/slitaz.conf
|
domcox@2
|
31
|
domcox@2
|
32 # read Tazinst conf
|
domcox@2
|
33 [ -r /etc/slitaz/tazinst.conf ] && . /etc/slitaz/tazinst.conf
|
domcox@2
|
34
|
domcox@2
|
35 # version
|
domcox@2
|
36 readonly VERSION=3.90
|
al@6
|
37 BANNER="$(gettext "Tazinst - SliTaz GNU/Linux Installer - Version $VERSION")"
|
domcox@2
|
38
|
domcox@2
|
39 # i18n
|
domcox@0
|
40 . /usr/bin/gettext.sh
|
domcox@0
|
41 TEXTDOMAIN='tazinst'
|
domcox@0
|
42 export TEXTDOMAIN
|
domcox@0
|
43
|
domcox@2
|
44 # files
|
domcox@2
|
45 readonly DEFAULT_INSTALL_FILE=./tazinst.rc
|
domcox@2
|
46 readonly SOURCE_ROOT=/media/source
|
domcox@2
|
47 readonly TARGET_ROOT=/mnt/target
|
domcox@2
|
48 readonly LOG=/var/log/tazinst.log
|
domcox@2
|
49 readonly LOCK=/run/tazinst.pid
|
domcox@2
|
50 MIRRORS="${MIRRORS:-$LOCALSTATE/mirrors}"
|
domcox@0
|
51
|
domcox@2
|
52 # settings
|
domcox@2
|
53 readonly SETTINGS="mode media source \
|
domcox@2
|
54 root_uuid root_format home_uuid home_format \
|
domcox@2
|
55 hostname root_pwd user_login user_pwd \
|
domcox@2
|
56 bootloader winboot"
|
domcox@0
|
57
|
domcox@2
|
58 # modes (key:help)
|
domcox@2
|
59 readonly LST_MODE="
|
al@6
|
60 install:$(gettext 'Fresh install on a HDD')
|
al@6
|
61 upgrade:$(gettext 'Upgrade an existing system')"
|
domcox@0
|
62
|
paul@5
|
63 # media (key:help)
|
domcox@2
|
64 readonly LST_MEDIA="
|
al@6
|
65 cdrom:$(gettext 'LiveCD')
|
al@6
|
66 usb:$(gettext 'LiveUSB')
|
al@6
|
67 iso:$(gettext 'ISO image on a local drive')
|
al@6
|
68 web:$(gettext 'ISO image on the Internet')"
|
domcox@0
|
69
|
domcox@2
|
70 # formats (key:help)
|
domcox@2
|
71 readonly LST_FORMAT="
|
al@6
|
72 btrfs:$(gettext 'B-tree file system (Oracle)')
|
al@6
|
73 ext2:$(gettext 'Second extended filesystem (Linux)')
|
al@6
|
74 ext3:$(gettext 'Third extended filesystem (Linux)')
|
al@6
|
75 ext4:$(gettext 'Fourth extended file system (Linux)')
|
al@6
|
76 jfs:$(gettext 'Journaled File System (IBM)')
|
al@6
|
77 minix:$(gettext 'File system of the MINIX operating system')
|
al@6
|
78 reiser4:$(gettext 'Journaled computer file system (Namesys)')
|
al@6
|
79 xfs:$(gettext 'Journaling file system (Silicon Graphics, Inc.)')"
|
domcox@2
|
80
|
domcox@2
|
81 # bootloaders (key:help)
|
domcox@2
|
82 readonly LST_BOOTLOADER="
|
al@6
|
83 auto:$(gettext 'Automatic selection')
|
al@6
|
84 grub:$(gettext 'Grub legacy bootoader')
|
al@6
|
85 syslinux:$(gettext 'Lightweight bootloader')"
|
domcox@2
|
86
|
domcox@2
|
87 # predefined iso (key:url:help)
|
domcox@2
|
88 SLITAZ_VERSION="${SLITAZ_VERSION:-cooking}"
|
domcox@2
|
89 [ "$SLITAZ_VERSION" = "cooking" ] && SLITAZ_VERSION="$(($(date "+%y")-8)).0"
|
domcox@2
|
90 [ -n "$URL_ISO" ] && readonly LST_WEB="$URL_ISO" || readonly LST_WEB="
|
domcox@2
|
91 stable:iso/stable/slitaz-$SLITAZ_VERSION.iso \
|
al@6
|
92 :$(gettext 'Stable release') $SLITAZ_VERSION
|
domcox@2
|
93 core:iso/stable/flavors/slitaz-$SLITAZ_VERSION-core.iso \
|
al@6
|
94 :$(gettext 'Stable version without nested subsets')
|
domcox@2
|
95 base:iso/stable/flavors/slitaz-$SLITAZ_VERSION-base.iso \
|
al@6
|
96 :$(gettext 'Stable text-only version (8.1MB)')
|
domcox@2
|
97 justx:iso/stable/flavors/slitaz-$SLITAZ_VERSION-justx.iso \
|
al@6
|
98 :$(gettext 'Stable basic graphic version without graphic apps')
|
domcox@2
|
99 gtkonly:iso/stable/flavors/slitaz-$SLITAZ_VERSION-gtkonly.iso \
|
al@6
|
100 :$(gettext 'Stable basic graphic version with only Gtk')
|
domcox@2
|
101 cooking:iso/cooking/slitaz-cooking.iso \
|
al@6
|
102 :$(gettext 'Development version for testing latest features')
|
domcox@2
|
103 rolling:iso/rolling/slitaz-rolling.iso \
|
al@6
|
104 :$(gettext 'Bleeding edge development version updated every day')
|
domcox@2
|
105 "
|
domcox@2
|
106
|
domcox@2
|
107
|
domcox@2
|
108 #-------
|
domcox@2
|
109 # usage
|
domcox@2
|
110 #-------
|
domcox@2
|
111
|
domcox@2
|
112 # print a short help
|
domcox@0
|
113 usage()
|
domcox@0
|
114 {
|
al@6
|
115 local B1=$(echo -en "\033[1m") B0=$(echo -en "\033[0m")
|
al@6
|
116 cat << EOT
|
domcox@0
|
117
|
al@6
|
118 $BANNER
|
al@6
|
119
|
al@6
|
120
|
al@6
|
121 $B1$(gettext "Usage"):$B0 $(gettext "tazinst [command] <setting> <value> <file>")
|
al@6
|
122
|
al@6
|
123 $B1$(gettext "Commands"): $B0
|
domcox@2
|
124 new $(gettext "Create a new install file.")
|
domcox@2
|
125 set $(gettext "Change value of a setting.")
|
domcox@2
|
126 unset $(gettext "Clear a setting.")
|
domcox@2
|
127 get $(gettext "Get the value of a setting.")
|
domcox@2
|
128 check $(gettext "Check settings.")
|
domcox@2
|
129 help $(gettext "Print a short help on settings")
|
paul@5
|
130 list $(gettext "List system resources.")
|
domcox@2
|
131 execute $(gettext "Execute a SliTaz installation.")
|
domcox@2
|
132 log $(gettext "Display log file contents.")
|
domcox@2
|
133 clean $(gettext "Clean install and log files.")
|
domcox@2
|
134 version $(gettext "Print version and exit.")
|
domcox@2
|
135 usage $(gettext "Print this short usage.")
|
al@6
|
136
|
al@6
|
137 EOT
|
domcox@2
|
138 exit 0
|
domcox@0
|
139 }
|
domcox@0
|
140
|
domcox@2
|
141 usage_error()
|
domcox@0
|
142 {
|
domcox@2
|
143 local command="$1"
|
domcox@2
|
144 printf "\n$BANNER\n\n"
|
domcox@2
|
145 if [ -z "$command" ]; then
|
al@6
|
146 printf "$(gettext 'Error: Missing parameter.')\n"
|
domcox@2
|
147 else
|
al@6
|
148 printf "\033[1m$command\033[0m: $(gettext 'Unknown command.')\n"
|
domcox@0
|
149 fi
|
domcox@2
|
150 local script_name=$(printf "$0" | /bin/busybox awk 'BEGIN{RS="/"}
|
domcox@2
|
151 {cmd=$command}END{print cmd}')
|
domcox@2
|
152 printf "$(gettext "Run"): '$script_name help' $(gettext "to get a list \
|
domcox@2
|
153 of available commands").\n\n"
|
domcox@0
|
154 }
|
domcox@0
|
155
|
domcox@2
|
156 option_error()
|
domcox@0
|
157 {
|
domcox@2
|
158 local option="$1" list="$2"
|
domcox@2
|
159 printf "\n$BANNER\n\n'$option': Unknown setting!\n
|
domcox@2
|
160 Please select one of these options: $list\n\n"
|
domcox@0
|
161 }
|
domcox@0
|
162
|
domcox@2
|
163 #---------------------
|
domcox@2
|
164 # 1. settings section
|
domcox@2
|
165 #---------------------
|
domcox@2
|
166
|
domcox@2
|
167 #----------
|
domcox@2
|
168 # 1.1 file
|
domcox@2
|
169 #----------
|
domcox@2
|
170
|
domcox@2
|
171 # create a new install file
|
domcox@2
|
172 new_file()
|
domcox@0
|
173 {
|
domcox@2
|
174 local install_file=$1
|
domcox@2
|
175 [ -z "$install_file" ] && install_file="$DEFAULT_INSTALL_FILE"
|
domcox@2
|
176 if [ -e "$install_file" ]; then
|
al@6
|
177 echo $(gettext "Warning: file already exists.") 1>&2
|
domcox@2
|
178 exit 0
|
domcox@2
|
179 fi
|
domcox@2
|
180 [ -n "$install_file" ] && touch "$install_file"
|
domcox@2
|
181 if [ -w "$install_file" ]; then
|
domcox@2
|
182 write_file "$install_file"
|
domcox@2
|
183 else
|
al@6
|
184 echo $(gettext "Error: Can't create file.") 1>&2
|
domcox@2
|
185 exit 2
|
domcox@2
|
186 fi
|
domcox@0
|
187 }
|
domcox@0
|
188
|
domcox@2
|
189 # fill up the install file
|
domcox@2
|
190 write_file()
|
domcox@0
|
191 {
|
domcox@2
|
192 local install_file="$1"
|
domcox@2
|
193 cat > "$install_file" << EOT
|
domcox@2
|
194 # $BANNER
|
domcox@2
|
195 #
|
domcox@0
|
196 # SliTaz Installer setup file.
|
domcox@0
|
197 #
|
domcox@0
|
198
|
domcox@2
|
199 # Mode of installation:
|
domcox@2
|
200 # install: Full install of SliTaz on a disk, all previous info will be erased
|
domcox@2
|
201 # upgrade: Upgrade an existing SliTaz installation to a new version
|
domcox@2
|
202 # run 'tazinst list mode' to have a full list.
|
domcox@2
|
203 MODE="$MODE"
|
domcox@0
|
204
|
domcox@2
|
205 # Media to install from:
|
domcox@2
|
206 # Options are cdrom usb iso web.
|
domcox@2
|
207 # run 'tazinst list media' to see available options on your system.
|
domcox@2
|
208 MEDIA="$MEDIA"
|
domcox@0
|
209
|
domcox@2
|
210 # Install source:
|
domcox@2
|
211 # it depends on the media used:
|
domcox@2
|
212 # usb: partition, run 'tazinst list uuid' to list your partitions
|
domcox@2
|
213 # iso: file.iso, ex: SOURCE=~/slitaz.5.0.iso
|
domcox@2
|
214 # web: url, ex: SOURCE=http://mirror.slitaz.org/../slitaz-cooking.iso
|
domcox@2
|
215 # web: iso names, ex: SOURCE=cooking
|
domcox@2
|
216 # run 'tazinst list <MEDIA>' to list source values. ex: tazinst list iso.
|
domcox@2
|
217 SOURCE="$SOURCE"
|
domcox@0
|
218
|
domcox@2
|
219 # root partition that SliTaz will be Installed on:
|
domcox@2
|
220 # Enter the UUID of the partition.
|
domcox@2
|
221 # run 'tazinst list uuid' to list your partitions
|
domcox@2
|
222 ROOT_UUID="$ROOT_UUID"
|
domcox@0
|
223
|
domcox@2
|
224 # Formatting the root partition:
|
domcox@2
|
225 # Let ROOT_FORMAT empty if you do not want to format the root partition.
|
domcox@2
|
226 # SliTaz uses ext2 ext3 ext4 by default but another filesystem can be
|
domcox@2
|
227 # installed if wanted, for this please adjust your /etc/fstab after
|
domcox@2
|
228 # installation.
|
domcox@2
|
229 # run 'tazinst list format' to list installed filesystems on your system.
|
domcox@2
|
230 ROOT_FORMAT="$ROOT_FORMAT"
|
domcox@2
|
231
|
domcox@2
|
232 # Home partition:
|
domcox@0
|
233 # On most GNU/Linux systems users personal files are stored in the directory
|
domcox@2
|
234 # /home. /home can be on another hard disk or on a separate partition.
|
paul@5
|
235 # Leave HOME_UUID empty if you do not intend to use a specific partition for /home
|
domcox@2
|
236 # or enter the UUID of the partition to be used.
|
domcox@2
|
237 # run 'tazinst list uuid' to list your partitions.
|
domcox@2
|
238 HOME_UUID="$HOME_UUID"
|
domcox@0
|
239
|
domcox@2
|
240 # Formatting the /home partition (if /home is on a separate partition):
|
paul@5
|
241 # Leave HOME_FORMAT empty if you do not want to format the /home partition.
|
domcox@2
|
242 # For options, see comments on 'Formatting the root partition' above.
|
domcox@2
|
243 HOME_FORMAT="$HOME_FORMAT"
|
domcox@0
|
244
|
domcox@2
|
245 # Hostname of the new system:
|
domcox@2
|
246 HOSTNAME="$HOSTNAME"
|
domcox@2
|
247
|
domcox@2
|
248 # root password:
|
domcox@0
|
249 # The root administrator privilege lets you manage and configure the full
|
domcox@0
|
250 # system. A root user can damage your system so you should always setup a
|
domcox@0
|
251 # strong password with special characters and/or numbers.
|
domcox@2
|
252 ROOT_PWD="$ROOT_PWD"
|
domcox@0
|
253
|
domcox@2
|
254 # Default user:
|
domcox@0
|
255 # The default user for the system will have his personal files stored
|
domcox@2
|
256 # in /home/<USER_LOGIN> (and will be automatically added to the audio group).
|
domcox@2
|
257 USER_LOGIN="$USER_LOGIN"
|
domcox@2
|
258 USER_PWD="$USER_PWD"
|
domcox@0
|
259
|
domcox@2
|
260 # Install bootloader:
|
paul@5
|
261 # If you do not want to install a bootloader, leave this field empty.
|
domcox@2
|
262 # It's generally safe to set it up as 'auto'.
|
domcox@2
|
263 # Run 'tazinst list bootloader' to list all options.
|
domcox@2
|
264 BOOTLOADER="$BOOTLOADER"
|
domcox@0
|
265
|
domcox@2
|
266 # Windows dual boot:
|
paul@5
|
267 # If you do not want enable Dual boot, leave WINBOOT empty (WINBOOT="").
|
domcox@2
|
268 # You may let tazinst automatically find your win partition by specifying auto
|
domcox@2
|
269 # (WINBOOT="auto"), otherwise enter the UUID of the partition to be used.
|
domcox@2
|
270 # Run 'tazinst list winboot' to see the Windows partitions found by tazinst.
|
domcox@2
|
271 WINBOOT="$WINBOOT"
|
domcox@0
|
272
|
domcox@2
|
273 EOT
|
domcox@2
|
274 return "$?"
|
domcox@2
|
275 }
|
domcox@2
|
276
|
domcox@2
|
277 read_file()
|
domcox@2
|
278 {
|
domcox@2
|
279 local install_file="$1"
|
domcox@2
|
280 [ -z "$install_file" ] && install_file="$DEFAULT_INSTALL_FILE"
|
domcox@2
|
281 if ! [ -r "$install_file" ]; then
|
al@6
|
282 echo $(gettext "Error: Unable to read install file") 1>&2
|
domcox@2
|
283 exit 2
|
domcox@2
|
284 fi
|
domcox@2
|
285 #
|
domcox@2
|
286 if ! CONTENTS="$(cat "$install_file")"; then
|
al@6
|
287 echo $(gettext "Error: Unable to read install file") 1>&2
|
domcox@2
|
288 exit 2
|
domcox@0
|
289 fi
|
domcox@0
|
290 }
|
domcox@0
|
291
|
domcox@2
|
292 # read value of a setting
|
domcox@2
|
293 get_value()
|
domcox@0
|
294 {
|
domcox@2
|
295 local setting="$1"
|
domcox@2
|
296 printf "%s" "$CONTENTS" | /bin/busybox awk -v setting="$setting" 'BEGIN{
|
domcox@2
|
297 setting="^" toupper(setting) "="
|
domcox@2
|
298 }
|
domcox@2
|
299 {
|
domcox@2
|
300 if (match($0,setting)){
|
domcox@2
|
301 n=index($0,"=")
|
domcox@2
|
302 value=substr($0,n+1)
|
domcox@2
|
303 gsub(/[\t\s]*$/,"",value)
|
domcox@2
|
304 sub(/^"/,"",value)
|
domcox@2
|
305 sub(/"$/,"",value)
|
domcox@2
|
306 }
|
domcox@2
|
307 }
|
domcox@2
|
308 END{
|
domcox@2
|
309 print value
|
domcox@2
|
310 }'
|
domcox@0
|
311 }
|
domcox@0
|
312
|
domcox@2
|
313 # list of settings
|
domcox@2
|
314 get_settings()
|
domcox@0
|
315 {
|
domcox@2
|
316 local "mode=$(get_value mode)"
|
domcox@2
|
317 case "$mode" in
|
domcox@2
|
318 upgrade)
|
domcox@2
|
319 echo "mode media source root_uuid bootloader winboot" ;;
|
domcox@2
|
320 *)
|
domcox@2
|
321 echo "$SETTINGS" ;;
|
domcox@2
|
322 esac
|
domcox@0
|
323 }
|
domcox@0
|
324
|
domcox@2
|
325 # get command
|
domcox@2
|
326 get()
|
domcox@0
|
327 {
|
domcox@2
|
328 local setting="$1"
|
domcox@2
|
329 [ -z "$setting" ] && setting="all"
|
domcox@2
|
330 # setting is valid: display value
|
domcox@2
|
331 if printf "%s" "$setting" | \
|
domcox@2
|
332 egrep -q "$(regex "$SETTINGS")"; then
|
domcox@2
|
333 get_value "$setting"
|
domcox@0
|
334 else
|
domcox@2
|
335 if [ "$setting" = "all" ]; then
|
domcox@2
|
336 printf "%-15s: %s\n" "mode" "$(get_value mode)"
|
domcox@2
|
337 printf "%-15s: %s\n" "media" "$(get_value media)"
|
domcox@2
|
338 printf "%-15s: %s\n" "source" "$(get_value source)"
|
domcox@2
|
339 printf "%-15s: %s\n" "root_uuid" "$(get_value root_uuid)"
|
domcox@2
|
340 printf "%-15s: %s\n" "root_format" "$(get_value root_format)"
|
domcox@2
|
341 printf "%-15s: %s\n" "home_uuid" "$(get_value home_uuid)"
|
domcox@2
|
342 printf "%-15s: %s\n" "home_format" "$(get_value home_format)"
|
domcox@2
|
343 printf "%-15s: %s\n" "hostname" "$(get_value hostname)"
|
domcox@2
|
344 printf "%-15s: %s\n" "root_pwd" "$(get_value root_pwd)"
|
domcox@2
|
345 printf "%-15s: %s\n" "user_login" "$(get_value user_login)"
|
domcox@2
|
346 printf "%-15s: %s\n" "user_pwd" "$(get_value user_pwd)"
|
domcox@2
|
347 printf "%-15s: %s\n" "bootloader" "$(get_value bootloader)"
|
domcox@2
|
348 printf "%-15s: %s\n" "winboot" "$(get_value winboot)"
|
domcox@2
|
349 elif [ "$setting" = "settings" ]; then
|
domcox@2
|
350 get_settings
|
domcox@0
|
351 else
|
domcox@2
|
352 option_error "$1" "$SETTINGS"
|
domcox@0
|
353 fi
|
domcox@0
|
354 fi
|
domcox@0
|
355 }
|
domcox@0
|
356
|
domcox@2
|
357 # set command
|
domcox@2
|
358 change()
|
domcox@0
|
359 {
|
domcox@2
|
360 local setting="$1" value="$2" install_file="$3"
|
domcox@2
|
361 # validate setting
|
domcox@2
|
362 if ! printf "%s" "$setting" | \
|
domcox@2
|
363 egrep -q "$(regex "$SETTINGS")"; then
|
al@6
|
364 echo $(gettext "Error: '$setting' unknown setting.") 1>&2
|
domcox@2
|
365 exit 1
|
domcox@2
|
366 fi
|
domcox@2
|
367 # and file
|
domcox@2
|
368 [ -z "$install_file" ] && install_file="$DEFAULT_INSTALL_FILE"
|
domcox@2
|
369 # write changes to file
|
domcox@2
|
370 if [ -w "$install_file" ]; then
|
domcox@2
|
371 printf "%s" "$CONTENTS" | \
|
domcox@2
|
372 /bin/busybox awk -v setting="$setting" -v value="$value" '
|
domcox@2
|
373 BEGIN{
|
domcox@2
|
374 set=0
|
domcox@2
|
375 }
|
domcox@2
|
376 {
|
domcox@2
|
377 if (match($0,"^" toupper(setting) "=")){
|
domcox@2
|
378 printf toupper(setting) "=\"" value "\"\n"
|
domcox@2
|
379 set++
|
domcox@2
|
380 }
|
domcox@2
|
381 else
|
domcox@2
|
382 printf $0 "\n"
|
domcox@2
|
383 }
|
domcox@2
|
384 END{
|
domcox@2
|
385 if (! set)
|
domcox@2
|
386 printf toupper(setting) "=\"" value "\"\n"
|
domcox@2
|
387 }' > "$install_file"
|
domcox@2
|
388 # check new value
|
domcox@2
|
389 read_file "$install_file"
|
domcox@2
|
390 check "$setting"
|
domcox@0
|
391 else
|
al@6
|
392 echo $(gettext "Error: Unable to write to install file.") 1>&2
|
domcox@2
|
393 exit 2
|
domcox@0
|
394 fi
|
domcox@0
|
395 }
|
domcox@0
|
396
|
domcox@2
|
397 #
|
domcox@2
|
398 load_settings()
|
domcox@0
|
399 {
|
domcox@2
|
400 MODE="$(get mode)"
|
domcox@2
|
401 local settings="$(get settings)"
|
domcox@2
|
402 MEDIA="$(get media)"
|
domcox@2
|
403 printf "source" | egrep -q "$(regex "$settings")" \
|
domcox@2
|
404 && SOURCE="$(get source)" \
|
domcox@2
|
405 || unset SOURCE
|
domcox@2
|
406 ROOT_UUID="$(get root_uuid)"
|
domcox@2
|
407 printf "root_format" | egrep -q "$(regex "$settings")" \
|
domcox@2
|
408 && ROOT_FORMAT="$(get root_format)" \
|
domcox@2
|
409 || unset ROOT_FORMAT
|
domcox@2
|
410 printf "home_uuid" | egrep -q "$(regex "$settings")" \
|
domcox@2
|
411 && HOME_UUID="$(get home_uuid)" \
|
domcox@2
|
412 || unset HOME_UUID
|
domcox@2
|
413 printf "home_format" | egrep -q "$(regex "$settings")" \
|
domcox@2
|
414 && HOME_FORMAT="$(get home_format)" \
|
domcox@2
|
415 || unset HOME_FORMAT
|
domcox@2
|
416 printf "hostname" | egrep -q "$(regex "$settings")" \
|
domcox@2
|
417 && HOSTNAME="$(get hostname)" \
|
domcox@2
|
418 || unset HOSTNAME
|
domcox@2
|
419 printf "root_pwd" | egrep -q "$(regex "$settings")" \
|
domcox@2
|
420 && ROOT_PWD="$(get root_pwd)" \
|
domcox@2
|
421 || unset ROOT_PWD
|
domcox@2
|
422 printf "user_login" | egrep -q "$(regex "$settings")" \
|
domcox@2
|
423 && USER_LOGIN="$(get user_login)" \
|
domcox@2
|
424 || unset USER_LOGIN
|
domcox@2
|
425 printf "user_pwd" | egrep -q "$(regex "$settings")" \
|
domcox@2
|
426 && USER_PWD="$(get user_pwd)" \
|
domcox@2
|
427 || unset USER_PWD
|
domcox@2
|
428 printf "bootloader" | egrep -q "$(regex "$settings")" \
|
domcox@2
|
429 && BOOTLOADER="$(get bootloader)" \
|
domcox@2
|
430 || unset BOOTLOADER
|
domcox@2
|
431 printf "winboot" | egrep -q "$(regex "$settings")" \
|
domcox@2
|
432 && WINBOOT="$(get winboot)" \
|
domcox@2
|
433 || unset WINBOOT
|
domcox@0
|
434 }
|
domcox@0
|
435
|
domcox@2
|
436 # clean command
|
domcox@2
|
437 clean()
|
domcox@0
|
438 {
|
domcox@2
|
439 # rm LOG
|
domcox@2
|
440 [ -r "$LOG" ] && rm -f "$LOG"
|
domcox@2
|
441 # rm temp files
|
domcox@2
|
442 rm -rf /tmp/tazinst
|
domcox@2
|
443 # rm install file
|
domcox@2
|
444 local install_file="$1"
|
domcox@2
|
445 [ -z "$install_file" ] && install_file="$DEFAULT_INSTALL_FILE"
|
domcox@2
|
446 echo "$(gettext "Deleting install file:") $install_file"
|
domcox@2
|
447 if ! [ -w "$install_file" ]; then
|
al@6
|
448 echo $(gettext "Error: Unable to delete install file") 1>&2
|
domcox@2
|
449 exit 2
|
domcox@0
|
450 else
|
domcox@2
|
451 rm -f "$install_file"
|
domcox@0
|
452 fi
|
domcox@0
|
453 }
|
domcox@0
|
454
|
domcox@2
|
455 #-----------
|
domcox@2
|
456 # 1.2 check
|
domcox@2
|
457 #-----------
|
domcox@2
|
458
|
domcox@2
|
459 # exit if user is not root.
|
domcox@2
|
460 check_root()
|
domcox@0
|
461 {
|
domcox@2
|
462 if test $(id -u) != 0 ; then
|
al@6
|
463 echo $(gettext "You must be the root user (system administrator) \
|
domcox@2
|
464 to install SliTaz, please use 'su' to get a root SHell and restart \
|
al@6
|
465 installation.") 1>&2
|
domcox@2
|
466 exit 1
|
domcox@0
|
467 fi
|
domcox@0
|
468 }
|
domcox@0
|
469
|
domcox@2
|
470 # exit if another instance of tazinst is running
|
domcox@2
|
471 check_instance()
|
domcox@0
|
472 {
|
domcox@2
|
473 if [ -e "$LOCK" ]; then
|
al@6
|
474 echo $(gettext "Another instance of tazinst is running.") 1>&2
|
domcox@2
|
475 exit 7
|
domcox@2
|
476 else
|
domcox@2
|
477 printf "$$" > $LOCK
|
domcox@0
|
478 fi
|
domcox@0
|
479 }
|
domcox@0
|
480
|
domcox@2
|
481 # exit if the setting is not in a list of keywords
|
domcox@2
|
482 check_key()
|
domcox@0
|
483 {
|
domcox@2
|
484 local setting="$1" keylist="$2" keyword="$(get $1)"
|
domcox@2
|
485 if ! printf "%s" "$keyword" | \
|
domcox@2
|
486 egrep -q "$(regex "$keylist")"; then
|
domcox@2
|
487 printf "$setting=$keyword
|
al@6
|
488 $(gettext 'Error:') '$keyword' $(gettext 'Invalid keyword.')
|
al@6
|
489 $(gettext 'Select one of these options:') $keylist
|
al@6
|
490 $(gettext 'For more information, see tazinst Manual.')\n" 1>&2
|
domcox@2
|
491 exit 1
|
domcox@0
|
492 fi
|
domcox@0
|
493 }
|
domcox@0
|
494
|
paul@5
|
495 # exit if the partition does not exist
|
domcox@2
|
496 check_uuid()
|
domcox@0
|
497 {
|
domcox@2
|
498 local setting="$1" value="$(get $1)" found=0 partition
|
domcox@2
|
499 for partition in $(list_uuid); do
|
domcox@2
|
500 [ "$partition" == "$value" ] && found="$(($found + 1))"
|
domcox@2
|
501 done
|
domcox@2
|
502 if [ "$found" != "1" ]; then
|
domcox@2
|
503 printf "$(gettext "$setting")=$value
|
al@6
|
504 $(gettext 'Error: Partition not found')
|
al@6
|
505 $(gettext 'To see available partitions, run') 'tazinst list uuid'.\n" 1>&2
|
domcox@2
|
506 exit 1
|
domcox@2
|
507 fi
|
domcox@0
|
508 }
|
domcox@0
|
509
|
paul@5
|
510 # exit if the source does not exist
|
domcox@2
|
511 check_source()
|
domcox@0
|
512 {
|
domcox@2
|
513 local media="$(get media)" source="$(get source)"
|
domcox@2
|
514 case $media in
|
domcox@2
|
515 usb)
|
domcox@2
|
516 check_uuid source ;;
|
domcox@2
|
517 iso)
|
domcox@2
|
518 if [ ! -r "$source" ]; then
|
al@6
|
519 echo $(gettext "Error: Source file not found") 1>&2
|
domcox@2
|
520 exit 1
|
domcox@2
|
521 fi ;;
|
domcox@2
|
522 web)
|
domcox@2
|
523 local valid=0
|
domcox@2
|
524 # check full url (http://...)
|
domcox@2
|
525 local regexp="^(https?|ftp):\/\/([a-z0-9\-]+\.)?[a-z0-9\-]+\.\
|
domcox@2
|
526 [a-z0-9]{2,4}(\.[a-z0-9]{2,4})?(\/.*)?iso$"
|
domcox@2
|
527 printf "%s" "$source" | \
|
domcox@2
|
528 egrep -q "$regexp" && valid=$(($valid+1))
|
domcox@2
|
529 # check iso names (stable cooking...)
|
domcox@2
|
530 regexp="$(regex "$(list web)")"
|
domcox@2
|
531 printf "%s" "$source" | \
|
domcox@2
|
532 egrep -q "$regexp" && valid=$(($valid+1))
|
domcox@2
|
533 if [ "$valid" -le "0" ]; then
|
al@6
|
534 echo $(gettext "Error: invalid URL"). 1>&2
|
domcox@2
|
535 exit 1
|
domcox@0
|
536 fi
|
domcox@2
|
537 esac
|
domcox@2
|
538 }
|
domcox@2
|
539
|
domcox@2
|
540 # exit if a partition is selected more than once
|
domcox@2
|
541 check_uuid_mix()
|
domcox@2
|
542 {
|
domcox@2
|
543 local list all nodup
|
domcox@2
|
544 list="$(get root_uuid) $(get source) $(get home_uuid) $(get winboot)"
|
domcox@2
|
545 all="$(echo $list | wc -w)"
|
domcox@2
|
546 nodup="$(echo $list | /bin/busybox awk 'BEGIN{RS=" "}{print $0}' | \
|
domcox@2
|
547 sort | uniq | wc -w)"
|
domcox@2
|
548 if [ "$all" != "$nodup" ]; then
|
domcox@2
|
549 printf "$(gettext "Error: multiple assignations for a disk. Please \
|
domcox@2
|
550 check your settings.")\n"
|
domcox@2
|
551 exit 1
|
domcox@2
|
552 fi
|
domcox@2
|
553 }
|
domcox@2
|
554
|
domcox@2
|
555 # exit if a password is invalid
|
domcox@2
|
556 check_password()
|
domcox@2
|
557 {
|
domcox@2
|
558 local pass="$(get "$1")"
|
domcox@2
|
559 local invalid="^[A-Za-z0-9!@#$%^&*()_]{0,40}$"
|
domcox@2
|
560 local errcode=0
|
domcox@2
|
561 # too long
|
domcox@2
|
562 if [ "${#pass}" -ge 40 ]; then
|
al@6
|
563 echo $(gettext "Error: password too long") 1>&2
|
domcox@2
|
564 exit 1
|
domcox@2
|
565 fi
|
domcox@2
|
566 # bad chars
|
domcox@2
|
567 if ! (echo "$pass" | egrep -q "$invalid"); then
|
al@6
|
568 echo $(gettext "Error: Unallowed characters in password.") 1>&2
|
domcox@2
|
569 exit 1
|
domcox@2
|
570 fi
|
domcox@2
|
571 # short pwd
|
domcox@2
|
572 [ "${#pass}" -le 4 ] && errcode=128
|
domcox@2
|
573 # empty pwd
|
domcox@2
|
574 [ -z "$pass" ] && errcode=129
|
domcox@2
|
575 case "$errcode" in
|
domcox@2
|
576 128)
|
al@6
|
577 echo $(gettext "Warning: short password!") 1>&2 ;;
|
domcox@2
|
578 129)
|
al@6
|
579 echo $(gettext "Warning: no password!") 1>&2 ;;
|
domcox@2
|
580 esac
|
domcox@2
|
581 return "$errcode"
|
domcox@2
|
582 }
|
domcox@2
|
583
|
domcox@2
|
584 # exit if a name is invalid
|
domcox@2
|
585 check_name()
|
domcox@2
|
586 {
|
domcox@2
|
587 local name="$1" value="$(get "$1")"
|
domcox@2
|
588 if [ "${#value}" -lt 2 ]; then
|
domcox@2
|
589 printf "$name=$value\n$(gettext "Error: Too short.")\n" 1>&2
|
domcox@2
|
590 exit 1
|
domcox@2
|
591 fi
|
domcox@2
|
592 if [ "${#value}" -gt 32 ]; then
|
domcox@2
|
593 printf "$name=$value\n$(gettext "Error: Too long.")\n" 1>&2
|
domcox@2
|
594 exit 1
|
domcox@2
|
595 fi
|
domcox@2
|
596 if printf "$value" | \
|
domcox@2
|
597 grep -q "[[:space:]\&\"\'\(\)\|\*\\#\`\+\:/;<>]"; then
|
domcox@2
|
598 printf "$name='$value'\n$(gettext "Error: Invalid chars.")\n" 1>&2
|
domcox@2
|
599 exit 1
|
domcox@2
|
600 fi
|
domcox@2
|
601 }
|
domcox@2
|
602
|
domcox@2
|
603 # check bootloader + winboot
|
domcox@2
|
604 check_boot_mix()
|
domcox@2
|
605 {
|
domcox@2
|
606 local bootloader=$(get bootloader)
|
domcox@2
|
607 local winboot=$(get winboot)
|
domcox@2
|
608 if [ -z "$bootloader" ] && [ -n "$winboot" ]; then
|
al@6
|
609 echo $(gettext "Error: Dualboot set with no bootloader.") 1>&2
|
domcox@2
|
610 exit 1
|
domcox@2
|
611 fi
|
domcox@2
|
612 }
|
domcox@2
|
613
|
domcox@2
|
614 # exit if partition table is not in list
|
domcox@2
|
615 check_table()
|
domcox@2
|
616 {
|
domcox@2
|
617 local pt_list="gpt msdos"
|
domcox@2
|
618 # get root uuid
|
domcox@2
|
619 local uuid="$(get root_uuid)"
|
domcox@2
|
620 if [ "$(/sbin/blkid | grep -c "$uuid")" == "1" ]; then
|
domcox@2
|
621 if ! printf "$(p_table $uuid)" | \
|
domcox@2
|
622 egrep -q "$(regex "$pt_list")"; then
|
al@6
|
623 echo $(gettext "Error: Unsupported Partition Table") 1>&2
|
domcox@2
|
624 exit 1
|
domcox@2
|
625 fi
|
domcox@2
|
626 else
|
al@6
|
627 echo $(gettext "Error: No disk selected, can't install any \
|
al@6
|
628 bootloader.") 1>&2
|
domcox@2
|
629 exit 1
|
domcox@2
|
630 fi
|
domcox@2
|
631 }
|
domcox@2
|
632
|
domcox@2
|
633
|
domcox@2
|
634 # check all settings()
|
domcox@2
|
635 check_all()
|
domcox@2
|
636 {
|
domcox@2
|
637 # check only settings we need
|
domcox@2
|
638 for key in $(get settings); do
|
domcox@2
|
639 case "$key" in
|
domcox@2
|
640 mode)
|
domcox@2
|
641 printf "%-15s: " "mode"
|
domcox@2
|
642 check_key mode "$(key "$LST_MODE")" && echo "ok" ;;
|
domcox@2
|
643 media)
|
domcox@2
|
644 printf "%-15s: " "media"
|
domcox@2
|
645 check_key media "$(key "$LST_MEDIA")" && echo "ok" ;;
|
domcox@2
|
646 source)
|
domcox@2
|
647 printf "%-15s: " "source"
|
domcox@2
|
648 check_source && echo "ok" ;;
|
domcox@2
|
649 root_uuid)
|
domcox@2
|
650 printf "%-15s: " "root_uuid"
|
domcox@2
|
651 check_uuid root_uuid && echo "ok" ;;
|
domcox@2
|
652 root_format)
|
domcox@2
|
653 printf "%-15s: " "root_format"
|
domcox@2
|
654 [ -n "$(get root_format)" ] && \
|
domcox@2
|
655 { check_key root_format "$(key "$LST_FORMAT")" && echo "ok"; } \
|
domcox@2
|
656 || echo "ok" ;;
|
domcox@2
|
657 home_uuid)
|
domcox@2
|
658 printf "%-15s: " "home_uuid"
|
domcox@2
|
659 [ -n "$(get home_uuid)" ] && \
|
domcox@2
|
660 { check_uuid home_uuid && check_uuid_mix && echo "ok"; } \
|
domcox@2
|
661 || echo "ok" ;;
|
domcox@2
|
662 home_format)
|
domcox@2
|
663 printf "%-15s: " "home_format"
|
domcox@2
|
664 [ -n "$(get home_format)" ] && \
|
domcox@2
|
665 { check_key home_format "$(key "$LST_FORMAT")" && echo "ok"; } \
|
domcox@2
|
666 || echo "ok" ;;
|
domcox@2
|
667 hostname)
|
domcox@2
|
668 printf "%-15s: " "hostname"
|
domcox@2
|
669 check_name hostname && echo "ok" ;;
|
domcox@2
|
670 root_pwd)
|
domcox@2
|
671 printf "%-15s: " "root_password"
|
domcox@2
|
672 check_password root_pwd && echo "ok" ;;
|
domcox@2
|
673 user_login)
|
domcox@2
|
674 printf "%-15s: " "user_login"
|
domcox@2
|
675 check_name user_login && echo "ok" ;;
|
domcox@2
|
676 user_pwd)
|
domcox@2
|
677 printf "%-15s: " "user_password"
|
domcox@2
|
678 check_password user_pwd && echo "ok" ;;
|
domcox@2
|
679 bootloader)
|
domcox@2
|
680 printf "%-15s: " "bootloader"
|
domcox@2
|
681 [ -n "$(get bootloader)" ] \
|
domcox@2
|
682 && { check_key bootloader "$(list_bootloader)" \
|
domcox@2
|
683 && check_table && echo "ok" ; } \
|
domcox@2
|
684 || echo "ok" ;;
|
domcox@2
|
685 winboot)
|
domcox@2
|
686 printf "%-15s: " "winboot"
|
domcox@2
|
687 [ -n "$(get winboot)" ] && [ "$(get winboot)" != "auto" ] \
|
domcox@2
|
688 && { check_uuid winboot && check_boot_mix && echo "ok"; } \
|
domcox@2
|
689 || echo "ok" ;;
|
domcox@2
|
690 esac
|
domcox@0
|
691 done
|
domcox@0
|
692 }
|
domcox@0
|
693
|
domcox@2
|
694 # check command
|
domcox@2
|
695 check()
|
domcox@0
|
696 {
|
domcox@2
|
697 local setting="$1"
|
domcox@2
|
698 case "$setting" in
|
domcox@2
|
699 mode)
|
domcox@2
|
700 check_key mode "$(key "$LST_MODE")" ;;
|
domcox@2
|
701 media)
|
domcox@2
|
702 check_key media "$(key "$LST_MEDIA")" ;;
|
domcox@2
|
703 source)
|
domcox@2
|
704 check_source ;;
|
domcox@2
|
705 root_uuid)
|
domcox@2
|
706 check_uuid root_uuid
|
domcox@2
|
707 check_uuid_mix ;;
|
domcox@2
|
708 home_uuid)
|
domcox@2
|
709 [ -z "$(get home_uuid)" ] || check_uuid home_uuid
|
domcox@2
|
710 check_uuid_mix ;;
|
domcox@2
|
711 root_format)
|
domcox@2
|
712 [ -z "$(get root_format)" ] \
|
domcox@2
|
713 || check_key root_format "$(key "$LST_FORMAT")" ;;
|
domcox@2
|
714 home_format)
|
domcox@2
|
715 [ -z "$(get home_format)" ] \
|
domcox@2
|
716 || check_key home_format "$(key "$LST_FORMAT")" ;;
|
domcox@2
|
717 hostname)
|
domcox@2
|
718 check_name hostname ;;
|
domcox@2
|
719 root_pwd)
|
domcox@2
|
720 check_password root_pwd ;;
|
domcox@2
|
721 user_login)
|
domcox@2
|
722 check_name user_login ;;
|
domcox@2
|
723 user_pwd)
|
domcox@2
|
724 check_password user_pwd ;;
|
domcox@2
|
725 bootloader)
|
domcox@2
|
726 [ -z "$(get bootloader)" ] \
|
domcox@2
|
727 || (check_key bootloader "$(list_bootloader)" \
|
domcox@2
|
728 && check_table ; ) ;;
|
domcox@2
|
729 winboot)
|
domcox@2
|
730 ([ -z "$(get winboot)" ] || [ "$(get winboot)" = "auto" ]) \
|
domcox@2
|
731 || check_uuid winboot && check_boot_mix ;;
|
domcox@2
|
732 ""|all)
|
domcox@2
|
733 check_all ;;
|
domcox@2
|
734 *)
|
domcox@2
|
735 option_error "$setting" "$SETTINGS" ;;
|
domcox@2
|
736 esac
|
domcox@0
|
737 }
|
domcox@0
|
738
|
domcox@2
|
739 #----------
|
domcox@2
|
740 # 1.3 help
|
domcox@2
|
741 #----------
|
domcox@2
|
742
|
domcox@2
|
743 help_source()
|
domcox@0
|
744 {
|
domcox@2
|
745 printf "$(gettext "The Source setting depends on the type of media:")\n"
|
domcox@2
|
746 printf "%-12s%s\n" "cdrom" "$(help cdrom)"
|
domcox@2
|
747 printf "%-12s%s\n" "usb" "$(help usb)"
|
domcox@2
|
748 printf "%-12s%s\n" "iso" "$(help iso)"
|
domcox@2
|
749 printf "%-12s%s\n" "web" "$(gettext "Name or URL of the image on the web. \
|
domcox@2
|
750 Type: tazinst help web")"
|
domcox@2
|
751 }
|
domcox@2
|
752
|
domcox@2
|
753 help_all()
|
domcox@2
|
754 {
|
domcox@2
|
755 local text="mode:$(gettext "Mode of install")
|
domcox@2
|
756 media:$(gettext "Media containing the SliTaz source files")
|
domcox@2
|
757 source:$(gettext "Source file containing SliTaz")
|
domcox@2
|
758 root_uuid:$(gettext "The name of the target partition")
|
domcox@2
|
759 root_format:$(gettext "Format of the target partition")
|
domcox@2
|
760 home_uuid:$(gettext "Separate home partition")
|
domcox@2
|
761 home_format:$(gettext "Format of the root partition")
|
domcox@2
|
762 hostname:$(gettext "Name of the system")
|
domcox@2
|
763 root_pwd:$(gettext "Superuser password")
|
domcox@2
|
764 user_login:$(gettext "First user name")
|
domcox@2
|
765 user_pwd:$(gettext "First user password")
|
domcox@2
|
766 bootloader:$(gettext "Install a bootloader")
|
domcox@2
|
767 winboot:$(gettext "Partition to duaboot Windows from")"
|
domcox@2
|
768 printf "$(gettext "List of settings:")\n"
|
domcox@2
|
769 printf "$text" | /bin/busybox awk -F: '/..*/{printf "%-12s%s\n", $1, $2}'
|
domcox@2
|
770 }
|
domcox@2
|
771
|
domcox@2
|
772 # help command
|
domcox@2
|
773 help()
|
domcox@2
|
774 {
|
domcox@2
|
775 local setting="$1"
|
domcox@2
|
776 case "$setting" in
|
domcox@2
|
777 mode)
|
domcox@2
|
778 echo "$LST_MODE" | \
|
domcox@2
|
779 /bin/busybox awk -F: '/..*/{printf "%-12s%s\n", $1, $2}' ;;
|
domcox@2
|
780 media)
|
domcox@2
|
781 echo "$LST_MEDIA" | \
|
domcox@2
|
782 /bin/busybox awk -F: '/..*/{printf "%-12s%s\n", $1, $2}' ;;
|
domcox@2
|
783 source)
|
domcox@2
|
784 help_source ;;
|
domcox@2
|
785 cdrom)
|
domcox@2
|
786 echo "$(gettext "Automatically set")" ;;
|
domcox@2
|
787 usb)
|
domcox@2
|
788 echo "$(gettext "USB partition. For a list, type: tazinst list usb")" ;;
|
domcox@2
|
789 iso)
|
domcox@2
|
790 echo "$(gettext "ISO file name. For a list, type: tazinst list iso")" ;;
|
domcox@2
|
791 web)
|
domcox@2
|
792 echo "$LST_WEB" | \
|
domcox@2
|
793 /bin/busybox awk -F: '/..*/{printf "%-12s%s\n", $1, $3}' ;;
|
domcox@2
|
794 root_uuid)
|
domcox@2
|
795 /sbin/blkid -s TYPE -s LABEL | sort ;;
|
domcox@2
|
796 root_format)
|
domcox@2
|
797 echo "$LST_FORMAT" | \
|
domcox@2
|
798 /bin/busybox awk -F: '/..*/{printf "%-12s%s\n", $1, $2}' ;;
|
domcox@2
|
799 home_uuid)
|
domcox@2
|
800 /sbin/blkid -s TYPE -s LABEL | sort ;;
|
domcox@2
|
801 home_format)
|
domcox@2
|
802 echo "$LST_FORMAT" | \
|
domcox@2
|
803 /bin/busybox awk -F: '/..*/{printf "%-12s%s\n", $1, $2}' ;;
|
domcox@2
|
804 hostname)
|
domcox@2
|
805 echo "$(gettext "Name of the system")" ;;
|
domcox@2
|
806 root_pwd)
|
domcox@2
|
807 echo "$(gettext "Superuser password")" ;;
|
domcox@2
|
808 user_login)
|
domcox@2
|
809 echo "$(gettext "First user name")" ;;
|
domcox@2
|
810 user_pwd)
|
domcox@2
|
811 echo "$(gettext "First user password")" ;;
|
domcox@2
|
812 bootloader)
|
domcox@2
|
813 printf "$LST_BOOTLOADER" | \
|
domcox@2
|
814 /bin/busybox awk -F: '/..*/{printf "%-12s%s\n",$1,$2}' ;;
|
domcox@2
|
815 winboot)
|
domcox@2
|
816 echo "$(gettext "Partition containing Windows, or 'auto'")" ;;
|
domcox@2
|
817 ""|all)
|
domcox@2
|
818 help_all ;;
|
domcox@2
|
819 *)
|
domcox@2
|
820 option_error "$setting" "$SETTINGS" ;;
|
domcox@2
|
821 esac
|
domcox@2
|
822 }
|
domcox@2
|
823
|
domcox@2
|
824 #---------
|
domcox@2
|
825 # 2. list
|
domcox@2
|
826 #---------
|
domcox@2
|
827
|
domcox@2
|
828 list_media()
|
domcox@2
|
829 {
|
domcox@2
|
830 local key media
|
domcox@2
|
831 for key in $(key "$LST_MEDIA") ; do
|
domcox@2
|
832 case "$key" in
|
domcox@2
|
833 cdrom)
|
domcox@2
|
834 [ -e "/dev/cdrom" ] && media="cdrom" ;;
|
domcox@2
|
835 usb)
|
domcox@2
|
836 [ -e "/sys/bus/usb" ] && media="$media usb" ;;
|
domcox@2
|
837 web)
|
domcox@2
|
838 [ "$(ifconfig -a | grep -c Link)" -gt 2 ] \
|
domcox@2
|
839 && media="$media web" ;;
|
domcox@2
|
840 *)
|
domcox@2
|
841 media="$media $key"
|
domcox@2
|
842 esac
|
domcox@2
|
843 done
|
domcox@2
|
844 echo "$media" | sed 's/^\s//'
|
domcox@2
|
845 }
|
domcox@2
|
846
|
domcox@2
|
847 list_usb()
|
domcox@2
|
848 {
|
domcox@2
|
849 # List plugged USB disks
|
domcox@2
|
850 if [ -d /proc/scsi/usb-storage ]; then
|
domcox@2
|
851 for DEV in /sys/block/sd* ; do
|
domcox@2
|
852 if readlink $DEV | grep -q usb; then
|
domcox@2
|
853 DEV=$(basename $DEV)
|
domcox@2
|
854 if [ -d /sys/block/${DEV}/${DEV}1 ]; then
|
domcox@2
|
855 /sbin/blkid /dev/$DEV* | /bin/busybox awk 'BEGIN{RS=" "}
|
domcox@2
|
856 /^\/dev\// {
|
domcox@2
|
857 DEV=$1
|
domcox@2
|
858 gsub(/:/,"",DEV)
|
domcox@2
|
859 }
|
domcox@2
|
860 /UUID/ {
|
domcox@2
|
861 UUID=$1
|
domcox@2
|
862 gsub(/"/,"",UUID)
|
domcox@2
|
863 printf "%s %s\n",UUID,DEV}'
|
domcox@2
|
864 fi
|
domcox@0
|
865 fi
|
domcox@0
|
866 done
|
domcox@0
|
867 fi
|
domcox@0
|
868 }
|
domcox@0
|
869
|
domcox@2
|
870 list_iso()
|
domcox@0
|
871 {
|
domcox@2
|
872 for i in /root/*.iso /home/*/*.iso /home/*/*/*.iso ; do
|
domcox@2
|
873 echo $i | grep -v "*"
|
domcox@2
|
874 done
|
domcox@0
|
875 }
|
domcox@0
|
876
|
domcox@2
|
877 list_format()
|
domcox@0
|
878 {
|
domcox@2
|
879 local fs
|
domcox@2
|
880 type mkfs.btrfs > /dev/null && fs="btrfs"
|
domcox@2
|
881 type mkfs.ext2 > /dev/null && fs="$fs ext2"
|
domcox@2
|
882 type mkfs.ext3 > /dev/null && fs="$fs ext3"
|
domcox@2
|
883 type mkfs.ext4 > /dev/null && fs="$fs ext4"
|
domcox@2
|
884 type mkfs.jfs > /dev/null && fs="$fs jfs"
|
domcox@2
|
885 type mkfs.minix > /dev/null && fs="$fs minix"
|
domcox@2
|
886 type mkfs.reiser4 > /dev/null && fs="$fs reiser4"
|
domcox@2
|
887 type mkfs.xfs > /dev/null && fs="$fs xfs"
|
domcox@2
|
888 echo "$fs" | sed 's/^\s//'
|
domcox@0
|
889 }
|
domcox@0
|
890
|
domcox@2
|
891 # list partitions
|
domcox@2
|
892 list_uuid()
|
domcox@0
|
893 {
|
domcox@2
|
894 /sbin/blkid | sort | /bin/busybox awk '
|
domcox@2
|
895 /UUID/ {
|
domcox@2
|
896 UUID=substr($0,index($0,"UUID="))
|
domcox@2
|
897 UUID=substr(UUID,1,index(UUID,"\" "))
|
domcox@2
|
898 gsub(/"/,"",UUID)
|
domcox@2
|
899 DEV=substr($1,1,index($1,":")-1)
|
domcox@2
|
900 printf "%s %s\n", UUID, DEV
|
domcox@2
|
901 }'
|
domcox@0
|
902 }
|
domcox@0
|
903
|
domcox@2
|
904 list_partition_table()
|
domcox@0
|
905 {
|
domcox@2
|
906 /usr/sbin/parted -lm | \
|
domcox@2
|
907 /bin/busybox awk -F: '/^\/dev\//{printf "%s: %s\n", $1,$6}'
|
domcox@2
|
908 }
|
domcox@2
|
909
|
domcox@2
|
910 list_web()
|
domcox@0
|
911 {
|
domcox@2
|
912 local key="$1"
|
domcox@2
|
913 # print url of a given iso
|
domcox@2
|
914 if printf "$LST_WEB" | egrep -q "^$key:"; then
|
domcox@2
|
915 printf "$LST_WEB" | egrep "^$key:" | \
|
domcox@2
|
916 /bin/busybox awk -F: '{print $2}'
|
domcox@2
|
917 fi
|
domcox@2
|
918 # print all key
|
domcox@2
|
919 if [ -z "$key" ]; then
|
domcox@2
|
920 key "$LST_WEB"
|
domcox@2
|
921 fi
|
domcox@0
|
922 }
|
domcox@2
|
923
|
domcox@2
|
924 list_bootloader()
|
domcox@2
|
925 {
|
domcox@2
|
926 local btlr
|
domcox@2
|
927 type grub-install > /dev/null && btlr=" grub"
|
domcox@2
|
928 type syslinux > /dev/null && btlr="$btlr syslinux"
|
domcox@2
|
929 [ -n "$btlr" ] && printf "auto$btlr\n"
|
domcox@2
|
930 }
|
domcox@2
|
931
|
domcox@2
|
932 # list Windows partitions
|
domcox@2
|
933 list_winboot()
|
domcox@2
|
934 {
|
domcox@2
|
935 /usr/sbin/parted -lm | /bin/busybox awk '
|
domcox@2
|
936 BEGIN{
|
domcox@2
|
937 FS=":"
|
domcox@2
|
938 disknum=-1
|
domcox@2
|
939 found=0
|
domcox@2
|
940 winboot=""
|
domcox@2
|
941 printf "auto"
|
domcox@2
|
942 }
|
domcox@2
|
943 {
|
domcox@2
|
944 # Count disks
|
domcox@2
|
945 if (match($1,"^/dev")){
|
domcox@2
|
946 disknum++
|
domcox@2
|
947 part=0
|
domcox@2
|
948 disk=substr($1,1,8)
|
domcox@2
|
949 dev=substr($1,6,3)
|
domcox@2
|
950 # get removable status
|
domcox@2
|
951 file="/sys/block/"dev"/removable"
|
domcox@2
|
952 "cat " file | getline removable
|
domcox@2
|
953 close("cat ")
|
domcox@2
|
954 }
|
domcox@2
|
955 # Count partitions
|
domcox@2
|
956 if (match($1,"[0-9][0-9]?")){
|
domcox@2
|
957 # List fixed drives only
|
domcox@2
|
958 if (removable==0){
|
domcox@2
|
959 part++
|
domcox@2
|
960 # Read partition Id
|
domcox@2
|
961 if (match($7,"boot")){
|
domcox@2
|
962 fs=$5
|
domcox@2
|
963 # Detect Windows Partition Type: ntfs vfat
|
domcox@2
|
964 WPT="ntfs|vfat"
|
domcox@2
|
965 if (fs ~ WPT){
|
domcox@2
|
966 found++
|
domcox@2
|
967 # record 1st Windows partition found
|
domcox@2
|
968 if (found==1){
|
domcox@2
|
969 printf(" %s%d",disk,part)
|
domcox@2
|
970 }
|
domcox@2
|
971 }
|
domcox@0
|
972 }
|
domcox@0
|
973 }
|
domcox@0
|
974 }
|
domcox@0
|
975 }
|
domcox@2
|
976 END{printf "\n"}'
|
domcox@0
|
977 }
|
domcox@2
|
978
|
domcox@2
|
979 # list commmand
|
domcox@2
|
980 list()
|
domcox@2
|
981 {
|
domcox@2
|
982 local ressource="$1"
|
domcox@2
|
983 case "$ressource" in
|
domcox@2
|
984 mode)
|
domcox@2
|
985 echo "$(key "$LST_MODE")" ;;
|
domcox@2
|
986 media)
|
domcox@2
|
987 list_media ;;
|
domcox@2
|
988 iso)
|
domcox@2
|
989 list_iso ;;
|
domcox@2
|
990 usb)
|
domcox@2
|
991 list_usb ;;
|
domcox@2
|
992 web)
|
domcox@2
|
993 list_web "$2" ;;
|
domcox@2
|
994 uuid)
|
domcox@2
|
995 list_uuid ;;
|
domcox@2
|
996 format)
|
domcox@2
|
997 list_format ;;
|
domcox@2
|
998 bootloader)
|
domcox@2
|
999 list_bootloader ;;
|
domcox@2
|
1000 winboot)
|
domcox@2
|
1001 list_winboot ;;
|
domcox@2
|
1002 partition_table)
|
domcox@2
|
1003 list_partition_table ;;
|
domcox@2
|
1004 ""|all)
|
domcox@2
|
1005 printf "* mode:\n$(key "$LST_MODE")\n\n"
|
domcox@2
|
1006 printf "* media:\n$(list_media)\n\n"
|
domcox@2
|
1007 printf "* usb:\n$(list usb)\n\n"
|
domcox@2
|
1008 printf "* iso:\n$(list_iso)\n\n"
|
domcox@2
|
1009 printf "* web:\n$(list_web)\n\n"
|
domcox@2
|
1010 printf "* format:\n$(list_format)\n\n"
|
domcox@2
|
1011 printf "* bootloader:\n$(list_bootloader)\n\n"
|
domcox@2
|
1012 printf "* partition_table:\n$(list_partition_table)\n\n"
|
domcox@2
|
1013 printf "* winboot:\n$(list_winboot)\n"
|
domcox@2
|
1014 ;;
|
domcox@2
|
1015 *)
|
domcox@2
|
1016 local options="mode media usb iso web uuid format bootloader \
|
domcox@2
|
1017 partition_table winboot"
|
domcox@2
|
1018 option_error "$1" "$options" ;;
|
domcox@2
|
1019 esac
|
domcox@2
|
1020 }
|
domcox@2
|
1021
|
domcox@2
|
1022 #----------
|
domcox@2
|
1023 # 3. tools
|
domcox@2
|
1024 #----------
|
domcox@2
|
1025
|
domcox@2
|
1026 # list indexes from a list
|
domcox@2
|
1027 key()
|
domcox@2
|
1028 {
|
domcox@2
|
1029 printf "$1" | /bin/busybox awk -F: 'BEGIN{
|
domcox@2
|
1030 other=-1
|
domcox@2
|
1031 }
|
domcox@2
|
1032 !/^#|^$/{
|
domcox@2
|
1033 if(other){
|
domcox@2
|
1034 printf "%s", $1
|
domcox@2
|
1035 other++}
|
domcox@2
|
1036 else
|
domcox@2
|
1037 printf " %s", $1
|
domcox@2
|
1038 }
|
domcox@2
|
1039 END{printf "\n"}'
|
domcox@2
|
1040 }
|
domcox@2
|
1041
|
domcox@2
|
1042 # convert a list of words to a regex
|
domcox@2
|
1043 regex()
|
domcox@2
|
1044 {
|
domcox@2
|
1045 printf "^$1$" | sed s'/ /$|^/g'
|
domcox@2
|
1046 }
|
domcox@2
|
1047
|
domcox@2
|
1048 # print dev from uuid
|
domcox@2
|
1049 uuid2dev()
|
domcox@2
|
1050 {
|
domcox@2
|
1051 local uuid="$1" id
|
domcox@2
|
1052 if [ "$(echo $uuid | cut -d '=' -f1)" = "UUID" ]; then
|
domcox@2
|
1053 id="$(echo $uuid | cut -d'=' -f2)"
|
domcox@2
|
1054 printf "$(/sbin/blkid -U $id)"
|
domcox@2
|
1055 else
|
domcox@2
|
1056 printf "$uuid"
|
domcox@2
|
1057 fi
|
domcox@2
|
1058 }
|
domcox@2
|
1059
|
domcox@2
|
1060 # print disk from uuid
|
domcox@2
|
1061 uuid2disk()
|
domcox@2
|
1062 {
|
domcox@2
|
1063 local uuid="$1"
|
domcox@2
|
1064 printf "$(uuid2dev $uuid | /bin/busybox awk '{print substr($0,1,8)}')"
|
domcox@2
|
1065 }
|
domcox@2
|
1066
|
domcox@2
|
1067 dev2uuid()
|
domcox@2
|
1068 {
|
domcox@2
|
1069 local uuid="$1"
|
domcox@2
|
1070 if printf "$uuid" | grep -q dev; then
|
domcox@2
|
1071 printf "UUID=$(/sbin/blkid -p -i -o udev "$uuid" \
|
domcox@2
|
1072 | grep ID_FS_UUID= | cut -d '=' -f2)"
|
domcox@2
|
1073 else
|
domcox@2
|
1074 printf "$uuid"
|
domcox@2
|
1075 fi
|
domcox@2
|
1076 }
|
domcox@2
|
1077
|
domcox@2
|
1078 # print partition scheme from uuid
|
domcox@2
|
1079 p_table()
|
domcox@2
|
1080 {
|
domcox@2
|
1081 local uuid="$1" device
|
domcox@2
|
1082 device="$(uuid2disk $uuid)"
|
domcox@2
|
1083 printf "$(/usr/sbin/parted -lm | grep "$device" | \
|
domcox@2
|
1084 cut -d':' -f6)"
|
domcox@2
|
1085 }
|
domcox@2
|
1086
|
domcox@2
|
1087 # print filesystem from uuid
|
domcox@2
|
1088 filesys()
|
domcox@2
|
1089 {
|
domcox@2
|
1090 local uuid="$1"
|
domcox@2
|
1091 local fs="$(/sbin/blkid -s UUID -s TYPE | \
|
domcox@2
|
1092 grep "$(uuid2dev $uuid)" | cut -d' ' -f3)"
|
domcox@2
|
1093 fs="${fs#TYPE=\"}"
|
domcox@2
|
1094 fs="${fs%\"}"
|
domcox@2
|
1095 printf "$fs"
|
domcox@2
|
1096 }
|
domcox@2
|
1097
|
domcox@2
|
1098 # return removable status from uuid
|
domcox@2
|
1099 is_removable()
|
domcox@2
|
1100 {
|
domcox@2
|
1101 local uuid="$1" removable=1
|
domcox@2
|
1102 local disk="$(uuid2disk $uuid | /bin/busybox awk '{print substr($0,6,3)}')"
|
domcox@2
|
1103 if [ "$(echo $disk | wc -w)" -eq "1" ]; then
|
domcox@2
|
1104 [ "$(cat /sys/block/"$disk"/removable)" -gt "0" ] \
|
domcox@2
|
1105 && removable=0
|
domcox@2
|
1106 fi
|
domcox@2
|
1107 return "$removable"
|
domcox@2
|
1108 }
|
domcox@2
|
1109
|
domcox@2
|
1110 randomize_mirrors()
|
domcox@2
|
1111 {
|
domcox@2
|
1112 local list_mirrors
|
domcox@2
|
1113 if [ -r "$MIRRORS" ]; then
|
domcox@2
|
1114 # randomize list of mirrors
|
domcox@2
|
1115 list_mirrors="$(cat $MIRRORS | \
|
domcox@2
|
1116 /bin/busybox awk 'BEGIN {srand()}{
|
domcox@2
|
1117 printf "%05.0f %s \n",rand()*99999, $0;
|
domcox@2
|
1118 }' | sort -n | sed 's/^[0-9]* //' )"
|
domcox@2
|
1119 else
|
domcox@2
|
1120 log "$(gettext "No mirror list found, run tazpkg recharge.")"
|
domcox@2
|
1121 list_mirrors="http://mirror.slitaz.org/"
|
domcox@2
|
1122 fi
|
domcox@2
|
1123 MIRRORS="$list_mirrors"
|
domcox@2
|
1124 }
|
domcox@2
|
1125
|
domcox@2
|
1126 # download a file
|
domcox@2
|
1127 dnl()
|
domcox@2
|
1128 {
|
domcox@2
|
1129 local file="$1" mirror transfer=0 oldfile
|
domcox@2
|
1130 mkdir -p /tmp/tazinst
|
domcox@2
|
1131 for mirror in $MIRRORS; do
|
domcox@2
|
1132 log "$(gettext "Downloading:") $mirror$file"
|
domcox@2
|
1133 oldfile="$(printf $file | \
|
domcox@2
|
1134 /bin/busybox awk 'BEGIN{RS="/"}{text=$1}END{print text}')"
|
domcox@2
|
1135 [ -e "/tmp/tazinst/$oldfile" ] && rm -f "/tmp/tazinst/$oldfile"
|
domcox@2
|
1136 /bin/busybox wget $mirror$file -P /tmp/tazinst && transfer=1 && break
|
domcox@2
|
1137 done
|
domcox@2
|
1138 if [ "$transfer" -gt "0" ];then
|
domcox@2
|
1139 log "$(gettext "Download completed.")"
|
domcox@2
|
1140 else
|
domcox@2
|
1141 error 5 "$file: $(gettext "Download failed.")"
|
domcox@2
|
1142 fi
|
domcox@2
|
1143 }
|
domcox@2
|
1144
|
domcox@2
|
1145 # install pkg in current system
|
domcox@2
|
1146 need_package()
|
domcox@2
|
1147 {
|
domcox@2
|
1148 local pkg="$1"
|
domcox@2
|
1149 if [ ! -d /var/lib/tazpkg/installed/$pkg ]; then
|
domcox@2
|
1150 log "$(gettext "Installing package to the current system:") $pkg"
|
domcox@2
|
1151 [ -z "$RECHARGE" ] && RECHARGE=true && /usr/bin/tazpkg recharge
|
domcox@2
|
1152 /usr/bin/tazpkg get-install "$pkg" || error 5 "Cannot install $pkg"
|
domcox@2
|
1153 fi
|
domcox@2
|
1154 }
|
domcox@2
|
1155
|
domcox@2
|
1156 # install pkg in target system
|
domcox@2
|
1157 add_pkg()
|
domcox@2
|
1158 {
|
domcox@2
|
1159 local pkg="$1"
|
domcox@2
|
1160 log "$(gettext "Adding package to the target system:") $pkg..."
|
domcox@2
|
1161 [ -z "$RECHARGE" ] && RECHARGE=true && /usr/bin/tazpkg recharge
|
domcox@2
|
1162 /usr/bin/tazpkg get "$pkg" >> "$LOG" 2>> "$LOG"
|
domcox@2
|
1163 yes "" | /usr/bin/tazpkg install $pkg.tazpkg \
|
domcox@2
|
1164 --root=$TARGET_ROOT >> "$LOG" 2>> "$LOG"
|
domcox@2
|
1165 rm -f $pkg.tazpkg
|
domcox@2
|
1166 }
|
domcox@2
|
1167
|
domcox@2
|
1168 #---------
|
domcox@2
|
1169 # 3.1 log
|
domcox@2
|
1170 #---------
|
domcox@2
|
1171
|
domcox@2
|
1172 # start log
|
domcox@2
|
1173 log_open()
|
domcox@2
|
1174 {
|
paul@5
|
1175 printf "=== Tazinst: started on $(date "+%x %X") ===\n" > "$LOG"
|
domcox@2
|
1176 LOGGING="true"
|
domcox@2
|
1177 }
|
domcox@2
|
1178
|
domcox@2
|
1179 # print and log a comment
|
domcox@2
|
1180 log(){
|
domcox@2
|
1181 # for front-ends, sleep 1 if $1 is num
|
domcox@2
|
1182 printf "$1" | awk '{
|
domcox@2
|
1183 num=$1+0
|
domcox@2
|
1184 if(num>0 && num<=100)
|
domcox@2
|
1185 exit 0
|
domcox@2
|
1186 else
|
domcox@2
|
1187 exit 1
|
domcox@2
|
1188 }' && sleep 1
|
domcox@2
|
1189 # log
|
domcox@2
|
1190 printf "$1\n"
|
domcox@2
|
1191 [ -n "$LOGGING" ] && printf "$1\n" >> $LOG
|
domcox@2
|
1192 }
|
domcox@2
|
1193
|
domcox@2
|
1194 #--------------------
|
domcox@2
|
1195 # 3.2 error handling
|
domcox@2
|
1196 #--------------------
|
domcox@2
|
1197
|
domcox@2
|
1198 # print an error msg & exit
|
domcox@2
|
1199 error()
|
domcox@2
|
1200 {
|
domcox@2
|
1201 local error="$1" msg="$2" cancel="$(gettext "Process not completed")"
|
domcox@2
|
1202 printf "$(gettext "Error"): $msg\n$cancel\n" 1>&2
|
domcox@2
|
1203 if [ -n "$LOGGING" ]; then
|
domcox@2
|
1204 # 1st pattern
|
domcox@2
|
1205 printf "-x-x- \n" >> "$LOG"
|
domcox@2
|
1206 printf "$(gettext "Error") $error: $msg\n$cancel\n" >> "$LOG"
|
domcox@2
|
1207 # 2nd pattern
|
domcox@2
|
1208 printf "x-x-x \n" >> "$LOG"
|
domcox@2
|
1209 printf "=== Tazinst error on $(date "+%x %X") ===\n" >> "$LOG"
|
domcox@2
|
1210 fi
|
domcox@2
|
1211 unset LOGGING
|
domcox@2
|
1212 umount_devices
|
domcox@2
|
1213 exit "$error"
|
domcox@2
|
1214 }
|
domcox@2
|
1215
|
domcox@2
|
1216 error8()
|
domcox@2
|
1217 {
|
domcox@2
|
1218 error 8 "$(gettext "Internal error")"
|
domcox@2
|
1219 }
|
domcox@2
|
1220
|
domcox@2
|
1221 error9()
|
domcox@2
|
1222 {
|
domcox@2
|
1223 error 9 "$(gettext "Cancelled by user")"
|
domcox@2
|
1224 }
|
domcox@2
|
1225
|
domcox@2
|
1226 #------------------
|
domcox@2
|
1227 # 4. disks section
|
domcox@2
|
1228 #------------------
|
domcox@2
|
1229
|
domcox@2
|
1230 #------------
|
domcox@2
|
1231 # 4.1 source
|
domcox@2
|
1232 #------------
|
domcox@2
|
1233
|
domcox@2
|
1234 # liveCD
|
domcox@2
|
1235 mount_cdrom()
|
domcox@2
|
1236 {
|
domcox@2
|
1237 # set device name
|
domcox@2
|
1238 local drive="$(cat /proc/sys/dev/cdrom/info | \
|
domcox@2
|
1239 grep "drive name" | cut -f 3)"
|
domcox@2
|
1240 [ -n "$drive" ] || drive=cdrom
|
domcox@2
|
1241 local cdrom=/dev/$drive
|
domcox@2
|
1242 # mount cdrom
|
domcox@2
|
1243 if mount -t iso9660 "$cdrom" "$SOURCE_ROOT" 2>>"$LOG"; then
|
domcox@2
|
1244 log "$(gettext "Using files from") $cdrom."
|
domcox@2
|
1245 else
|
domcox@2
|
1246 error 3 "$cdrom: $(gettext "Mount failed")."
|
domcox@2
|
1247 fi
|
domcox@2
|
1248 }
|
domcox@2
|
1249
|
domcox@2
|
1250 # liveUSB
|
domcox@2
|
1251 mount_usb()
|
domcox@2
|
1252 {
|
domcox@2
|
1253 # /home is on LiveUSB
|
domcox@2
|
1254 if [ -d /home/boot ]; then
|
domcox@2
|
1255 log "$(gettext "Using files from USB device...")"
|
domcox@2
|
1256 ln -s /home/boot $SOURCE_ROOT/boot
|
domcox@2
|
1257 else
|
domcox@2
|
1258 # mount LiveUSB
|
domcox@2
|
1259 if mount "$SOURCE" "$SOURCE_ROOT" 2>>"$LOG"; then
|
domcox@2
|
1260 log "$(gettext "Using files from USB device") $SOURCE."
|
domcox@2
|
1261 else
|
domcox@2
|
1262 error 3 "$SOURCE: $(gettext "Failed to mount USB device")."
|
domcox@0
|
1263 fi
|
domcox@0
|
1264 fi
|
domcox@0
|
1265 }
|
domcox@0
|
1266
|
domcox@2
|
1267 # ISO file on HDD
|
domcox@2
|
1268 mount_iso()
|
domcox@0
|
1269 {
|
domcox@2
|
1270 # check integrity
|
domcox@2
|
1271 local md5file=$(echo $SOURCE | sed 's/.iso$/.md5/')
|
domcox@2
|
1272 if [ -r "$md5file" ]; then
|
domcox@2
|
1273 local md5ref="$(cat "$md5file" | cut -d' ' -f1)"
|
domcox@2
|
1274 local md5calc="$(md5sum $SOURCE | cut -d' ' -f1)"
|
domcox@2
|
1275 if [ ! "$md5calc" = "$md5ref" ]; then
|
domcox@2
|
1276 log "md5sum iso=$md5ref md5sum tazinst=$md5calc"
|
domcox@2
|
1277 error 3 "$(gettext "md5sum error, file corrupted.")"
|
domcox@0
|
1278 fi
|
domcox@2
|
1279 else
|
domcox@2
|
1280 log "$SOURCE: $(gettext "md5 file not found, can't check integrity.")"
|
domcox@2
|
1281 fi
|
domcox@2
|
1282 # mount ISO
|
domcox@2
|
1283 if mount -o loop -t iso9660 "$SOURCE" \
|
domcox@2
|
1284 "$SOURCE_ROOT" 2>>"$LOG"; then
|
domcox@2
|
1285 log "$(gettext "Using files from ISO") $SOURCE."
|
domcox@2
|
1286 else
|
domcox@2
|
1287 error 3 "$SOURCE: $(gettext "Failed to mount ISO.")"
|
domcox@2
|
1288 fi
|
domcox@0
|
1289 }
|
domcox@0
|
1290
|
domcox@2
|
1291 # ISO file on the web
|
domcox@2
|
1292 mount_web()
|
domcox@2
|
1293 {
|
domcox@2
|
1294 if (echo "$SOURCE" | egrep -q "$(regex "$(list web)")"); then
|
domcox@2
|
1295 SOURCE="$(list web $SOURCE)"
|
domcox@2
|
1296 fi
|
domcox@2
|
1297 dnl "$SOURCE"
|
domcox@2
|
1298 local md5file="$(echo $SOURCE | sed 's/.iso$/.md5/')"
|
domcox@2
|
1299 dnl "$md5file"
|
domcox@2
|
1300 local webiso="$(echo $SOURCE | /bin/busybox awk 'BEGIN{RS="/"}{out=$1}
|
domcox@2
|
1301 END{printf"%s",out}')"
|
domcox@2
|
1302 SOURCE="/tmp/tazinst/$webiso"
|
domcox@2
|
1303 mount_iso
|
domcox@2
|
1304 }
|
domcox@2
|
1305
|
domcox@2
|
1306 # set up source and check Slitaz' content
|
domcox@2
|
1307 mount_source()
|
domcox@2
|
1308 {
|
domcox@2
|
1309 log "$(gettext "Creating mount point:") $SOURCE_ROOT..."
|
domcox@2
|
1310 mkdir -p "$SOURCE_ROOT"
|
domcox@2
|
1311 case "$MEDIA" in
|
domcox@2
|
1312 cdrom)
|
domcox@2
|
1313 mount_cdrom ;;
|
domcox@2
|
1314 usb)
|
domcox@2
|
1315 mount_usb ;;
|
domcox@2
|
1316 iso)
|
domcox@2
|
1317 mount_iso ;;
|
domcox@2
|
1318 web)
|
domcox@2
|
1319 mount_web ;;
|
domcox@2
|
1320 *)
|
domcox@2
|
1321 error8 ;;
|
domcox@2
|
1322 esac
|
domcox@2
|
1323
|
domcox@2
|
1324 # exit if no rootfs.gz found.
|
domcox@2
|
1325 log "$(gettext "Checking installation media...")"
|
domcox@2
|
1326 if [ ! -f $SOURCE_ROOT/boot/rootfs.gz -a \
|
domcox@2
|
1327 ! -f $SOURCE_ROOT/boot/rootfs1.gz ]; then
|
domcox@2
|
1328 error 3 $(gettext "Invalid source")
|
domcox@2
|
1329 else
|
domcox@2
|
1330 log "$(gettext "Installation media checked ok")"
|
domcox@2
|
1331 fi
|
domcox@2
|
1332 }
|
domcox@2
|
1333
|
domcox@2
|
1334 #------------
|
domcox@2
|
1335 # 4.2 target
|
domcox@2
|
1336 #------------
|
domcox@2
|
1337
|
domcox@2
|
1338 # format a partition
|
domcox@2
|
1339 format()
|
domcox@2
|
1340 {
|
domcox@2
|
1341 local uuid="$1" fmt="$2" dest="$3" dev format
|
domcox@2
|
1342 log "$(gettext "Format") $uuid ($fmt)"
|
domcox@2
|
1343 format="mkfs.$fmt"
|
domcox@2
|
1344 if (printf "$uuid" | grep -q "UUID="); then
|
domcox@2
|
1345 # case UUID=
|
domcox@2
|
1346 dev="$(uuid2dev $uuid)"
|
domcox@2
|
1347 "$format" "$dev" >>"$LOG" 2>>"$LOG" || error 4 "Formatting has failed"
|
domcox@2
|
1348 # uuid has changed
|
domcox@2
|
1349 case "$dest" in
|
domcox@2
|
1350 root_uuid)
|
domcox@2
|
1351 ROOT_UUID="$(/sbin/blkid -p "$dev" -o export | \
|
domcox@2
|
1352 grep ^UUID=)" ;;
|
domcox@2
|
1353 home_uuid)
|
domcox@2
|
1354 HOME_UUID="$(/sbin/blkid -p "$dev" -o export | \
|
domcox@2
|
1355 grep ^UUID=)" ;;
|
domcox@2
|
1356 esac
|
domcox@2
|
1357 else
|
domcox@2
|
1358 # case /dev/xxxx
|
domcox@2
|
1359 "$format" $uuid >>"$LOG" 2>>"$LOG" || error 4 "Formatting has failed"
|
domcox@2
|
1360 fi
|
domcox@2
|
1361 }
|
domcox@2
|
1362
|
domcox@2
|
1363 # prepare partitions
|
domcox@2
|
1364 prepare_uuid()
|
domcox@2
|
1365 {
|
domcox@2
|
1366 log "$(gettext "Preparing target partition...")"
|
domcox@2
|
1367 local uuid
|
domcox@2
|
1368 # target may be in use
|
domcox@2
|
1369 mount | grep -q "$ROOT_UUID" && \
|
domcox@2
|
1370 error 4 "$ROOT_UUID: $(gettext "Partition is already in use.")"
|
domcox@2
|
1371 # Mount point can be already used.
|
domcox@2
|
1372 mount | grep -q "$TARGET_ROOT" && \
|
domcox@2
|
1373 umount "$TARGET_ROOT" 2>>"$LOG"
|
domcox@2
|
1374
|
domcox@2
|
1375 # Formatting root partition
|
domcox@2
|
1376 case "$ROOT_FORMAT" in
|
domcox@2
|
1377 "")
|
domcox@2
|
1378 log "$ROOT_UUID: $(gettext "The partition will be cleaned...")" ;;
|
domcox@2
|
1379 *)
|
domcox@2
|
1380 format "$ROOT_UUID" "$ROOT_FORMAT" root_uuid
|
domcox@2
|
1381 esac
|
domcox@2
|
1382
|
domcox@2
|
1383 # Formatting /home
|
domcox@2
|
1384 if [ -n "$HOME_UUID" ]; then
|
domcox@2
|
1385 case "$HOME_FORMAT" in
|
domcox@2
|
1386 "")
|
domcox@2
|
1387 log "$HOME_UUID $(gettext "The partition will be kept...")" ;;
|
domcox@2
|
1388 *)
|
domcox@2
|
1389 format "$HOME_UUID" "$HOME_FORMAT" home_uuid
|
domcox@2
|
1390 esac
|
domcox@2
|
1391 fi
|
domcox@2
|
1392
|
domcox@2
|
1393 log "$(gettext "Creating mount point:") $TARGET_ROOT"
|
domcox@2
|
1394 mkdir -p "$TARGET_ROOT" >> "$LOG" || error8
|
domcox@2
|
1395 # Mount target.
|
domcox@2
|
1396 local mount_fs="$ROOT_FORMAT"
|
domcox@2
|
1397 [ -z "$mount_fs" ] && mount_fs="$(filesys $ROOT_UUID)"
|
domcox@2
|
1398 mount -t "$mount_fs" "$ROOT_UUID" \
|
domcox@2
|
1399 "$TARGET_ROOT" >>"$LOG" 2>>"$LOG"
|
domcox@2
|
1400 if [ $(mount | \
|
domcox@2
|
1401 grep -c "mnt/target") == "0" ]; then
|
domcox@2
|
1402 error 4 "$ROOT_UUID: $(gettext "Unable to mount partition")"
|
domcox@2
|
1403 fi
|
domcox@2
|
1404 }
|
domcox@2
|
1405
|
domcox@2
|
1406
|
domcox@2
|
1407 #------------
|
domcox@2
|
1408 # 4.3 umount
|
domcox@2
|
1409 #------------
|
domcox@2
|
1410
|
domcox@2
|
1411 # copy log file, umount target and eject cdrom.
|
domcox@2
|
1412 umount_devices()
|
domcox@2
|
1413 {
|
domcox@2
|
1414 # umount target
|
domcox@2
|
1415 if mount | grep -q "$TARGET_ROOT"; then
|
domcox@2
|
1416 log "$(gettext "Unmounting target partition:") $ROOT_UUID"
|
domcox@2
|
1417 umount -l "$TARGET_ROOT" 2>>$LOG
|
domcox@2
|
1418 fi
|
domcox@2
|
1419
|
domcox@2
|
1420 # umount source
|
domcox@2
|
1421 if mount | grep -q "$SOURCE_ROOT"; then
|
domcox@2
|
1422 log "$(gettext "Unmounting:") $SOURCE_ROOT"
|
domcox@2
|
1423 umount -l "$SOURCE_ROOT"
|
domcox@2
|
1424 fi
|
domcox@2
|
1425 if [ -h $SOURCE_ROOT/boot ]; then
|
domcox@2
|
1426 log "$(gettext "Unlinking:") $SOURCE_ROOT"
|
domcox@2
|
1427 rm -f $SOURCE_ROOT/boot
|
domcox@2
|
1428 fi
|
domcox@2
|
1429
|
domcox@2
|
1430 # eject cd
|
domcox@2
|
1431 if [ "$SOURCE" == "cdrom" ]; then
|
domcox@2
|
1432 gettext "Ejecting cdrom..."
|
domcox@2
|
1433 eject
|
domcox@2
|
1434 fi
|
domcox@2
|
1435 # remove lock file
|
domcox@2
|
1436 rm -f "$LOCK"
|
domcox@2
|
1437 }
|
domcox@2
|
1438
|
domcox@2
|
1439 end_of_install()
|
domcox@2
|
1440 {
|
domcox@2
|
1441 log "\n$(gettext "Process completed. You can now restart (reboot)")"
|
domcox@2
|
1442 log "$(gettext "from your SliTaz GNU/Linux system.")"
|
paul@5
|
1443 printf "=== Tazinst ended on $(date "+%x %X") ===\n" >> "$LOG"
|
domcox@2
|
1444 unset LOGGING
|
domcox@2
|
1445 # saving log
|
domcox@2
|
1446 log "$(gettext "Copying log to /var/log/tazinst.log")"
|
domcox@2
|
1447 cp -a "$LOG" $TARGET_ROOT/var/log
|
domcox@2
|
1448 umount_devices
|
domcox@2
|
1449 }
|
domcox@2
|
1450
|
domcox@2
|
1451
|
domcox@2
|
1452 #---------------
|
domcox@2
|
1453 # 5. bootloader
|
domcox@2
|
1454 #---------------
|
domcox@2
|
1455
|
domcox@2
|
1456 #------------
|
domcox@2
|
1457 # 5.1 common
|
domcox@2
|
1458 #------------
|
domcox@2
|
1459
|
domcox@2
|
1460 # selection
|
domcox@2
|
1461 bootloader()
|
domcox@2
|
1462 {
|
domcox@2
|
1463 if [ "$BOOTLOADER" == "auto" ]; then
|
domcox@2
|
1464 # use syslinux, but if p_table=msdos take grub (if available)
|
domcox@2
|
1465 unset BOOTLOADER
|
domcox@2
|
1466 printf "$(list_bootloader)" | \
|
domcox@2
|
1467 grep -q "syslinux" && BOOTLOADER=syslinux
|
domcox@2
|
1468 if [ "$(p_table $ROOT_UUID)" == "msdos" ]; then
|
domcox@2
|
1469 printf "$(list_bootloader)" | \
|
domcox@2
|
1470 grep -q " grub" && BOOTLOADER=grub
|
domcox@2
|
1471 fi
|
domcox@2
|
1472 fi
|
domcox@2
|
1473 case "$BOOTLOADER" in
|
domcox@2
|
1474 grub)
|
domcox@2
|
1475 grub_config
|
domcox@2
|
1476 grub_install ;;
|
domcox@2
|
1477 syslinux)
|
domcox@2
|
1478 syslinux_config
|
domcox@2
|
1479 syslinux_install ;;
|
domcox@2
|
1480 *)
|
domcox@2
|
1481 syslinux_config
|
domcox@2
|
1482 log "$(gettext "No bootloader to install.")" ;;
|
domcox@2
|
1483 esac
|
domcox@2
|
1484 }
|
domcox@2
|
1485
|
domcox@2
|
1486 # print disk num
|
domcox@2
|
1487 disknum()
|
domcox@2
|
1488 {
|
domcox@2
|
1489 local partition="$(uuid2dev $1)"
|
domcox@2
|
1490 partition="${partition%[0-9]}"
|
domcox@2
|
1491 /usr/sbin/parted -lm | grep "^/dev" | \
|
domcox@2
|
1492 /bin/busybox awk -v PART="$partition" '{if (match($0,PART)) print NR-1}'
|
domcox@2
|
1493 }
|
domcox@2
|
1494
|
domcox@2
|
1495 # print partition num
|
domcox@2
|
1496 partnum()
|
domcox@2
|
1497 {
|
domcox@2
|
1498 local partition="$(uuid2dev $1)"
|
domcox@2
|
1499 printf "$((${partition#/dev/[h-s]d[a-z]}-1))\n"
|
domcox@2
|
1500 }
|
domcox@2
|
1501
|
domcox@2
|
1502 # print root device
|
domcox@2
|
1503 rootdev()
|
domcox@2
|
1504 {
|
domcox@2
|
1505 local partition="$1"
|
domcox@2
|
1506 case "$(p_table $partition)" in
|
domcox@2
|
1507 msdos)
|
domcox@2
|
1508 # print device
|
domcox@2
|
1509 printf "$(uuid2dev $partition)" ;;
|
domcox@2
|
1510 gpt)
|
domcox@2
|
1511 # print PARTUUID (different from UUID)
|
domcox@2
|
1512 printf "PARTUUID="
|
domcox@2
|
1513 /sbin/blkid -p -i -o udev $(uuid2dev $partition) \
|
domcox@2
|
1514 | grep ENTRY_UUID | cut -d '=' -f2 ;;
|
domcox@2
|
1515 esac
|
domcox@2
|
1516 }
|
domcox@2
|
1517
|
domcox@2
|
1518 # add rootdelay for removable devices
|
domcox@2
|
1519 rootdelay()
|
domcox@2
|
1520 {
|
domcox@2
|
1521 is_removable "$ROOT_UUID" && printf "rootdelay=9"
|
domcox@2
|
1522 }
|
domcox@2
|
1523
|
domcox@2
|
1524 # print winboot uuid
|
domcox@2
|
1525 winboot_uuid()
|
domcox@2
|
1526 {
|
domcox@2
|
1527 if [ "$WINBOOT" = "auto" ]; then
|
domcox@2
|
1528 # get the first uuid if any
|
domcox@2
|
1529 [ $(list_winboot | wc -w) -gt 1 ] \
|
domcox@2
|
1530 && printf "$(list_winboot | cut -d' ' -f2)"
|
domcox@2
|
1531 else
|
domcox@2
|
1532 printf "$WINBOOT"
|
domcox@2
|
1533 fi
|
domcox@2
|
1534 }
|
domcox@2
|
1535
|
domcox@2
|
1536
|
domcox@2
|
1537 #-----------
|
domcox@2
|
1538 # 5.1 grub1
|
domcox@2
|
1539 #-----------
|
domcox@2
|
1540
|
domcox@2
|
1541 # create grub legacy conf
|
domcox@0
|
1542 grub_config()
|
domcox@0
|
1543 {
|
domcox@2
|
1544 # backup an existing conf
|
domcox@2
|
1545 [ -e "$TARGET_ROOT/boot/grub/menu.lst" ] && \
|
domcox@2
|
1546 cp $TARGET_ROOT/boot/grub/menu.lst \
|
domcox@2
|
1547 $TARGET_ROOT/boot/grub/menu.bak
|
domcox@2
|
1548 # create the target GRUB configuration.
|
domcox@2
|
1549 mkdir -p $TARGET_ROOT/boot/grub || error8
|
domcox@0
|
1550 cat > $TARGET_ROOT/boot/grub/menu.lst << _EOF_
|
domcox@0
|
1551 # /boot/grub/menu.lst: GRUB boot loader configuration.
|
domcox@0
|
1552 #
|
domcox@0
|
1553
|
domcox@0
|
1554 # By default, boot the first entry.
|
domcox@0
|
1555 default 0
|
domcox@0
|
1556
|
domcox@0
|
1557 # Boot automatically after 8 secs.
|
domcox@0
|
1558 timeout 8
|
domcox@0
|
1559
|
domcox@0
|
1560 # Graphical splash image.
|
domcox@0
|
1561 splashimage=/boot/grub/splash.xpm.gz
|
domcox@0
|
1562
|
domcox@0
|
1563 # Change the colors.
|
domcox@0
|
1564 #color yellow/brown light-green/black
|
domcox@0
|
1565
|
domcox@2
|
1566 # For booting SliTaz from : $ROOT_UUID
|
domcox@0
|
1567 #
|
domcox@2
|
1568 title SliTaz GNU/Linux $(cat $TARGET_ROOT/etc/slitaz-release) (Kernel $KERNEL)
|
domcox@2
|
1569 root (hd$(disknum $ROOT_UUID),$(partnum $ROOT_UUID))
|
domcox@2
|
1570 kernel /boot/$KERNEL root=$(rootdev $ROOT_UUID) quiet $(rootdelay)
|
domcox@0
|
1571
|
domcox@0
|
1572 _EOF_
|
domcox@2
|
1573
|
domcox@2
|
1574 local winpart="$(winboot_uuid)"
|
domcox@2
|
1575 if [ -n "$winpart" ]; then
|
domcox@2
|
1576 log "$(gettext "Enabling Windows dual-boot")"
|
domcox@0
|
1577 cat >> $TARGET_ROOT/boot/grub/menu.lst << _EOF_
|
domcox@0
|
1578 # For booting Windows :
|
domcox@0
|
1579 #
|
domcox@0
|
1580 title Microsoft Windows
|
domcox@2
|
1581 rootnoverify (hd$(disknum $winpart),$(partnum $winpart))
|
domcox@0
|
1582 chainloader +1
|
domcox@0
|
1583
|
domcox@0
|
1584 _EOF_
|
domcox@0
|
1585 fi
|
domcox@2
|
1586
|
domcox@0
|
1587 # log
|
domcox@2
|
1588 printf "/boot/grub/menu.lst:\n" >> "$LOG"
|
domcox@2
|
1589 printf "--- menu.lst -------------\n" >> "$LOG"
|
domcox@2
|
1590 cat $TARGET_ROOT/boot/grub/menu.lst >> "$LOG"
|
domcox@2
|
1591 printf "--- menu.lst -------------\n\n" >> "$LOG"
|
domcox@0
|
1592 }
|
domcox@0
|
1593
|
domcox@2
|
1594 # GRUB info with disk name used for grub
|
domcox@0
|
1595 grub_install()
|
domcox@0
|
1596 {
|
domcox@2
|
1597 # install grub
|
domcox@2
|
1598 local target_disk="$(uuid2disk $ROOT_UUID)"
|
domcox@2
|
1599 log "$(gettext "Installing grub on:") $target_disk"
|
domcox@2
|
1600 /usr/sbin/grub-install --version >> "$LOG" || error 5 "grub not found"
|
domcox@2
|
1601 /usr/sbin/grub-install --no-floppy \
|
domcox@2
|
1602 --root-directory=$TARGET_ROOT $target_disk >>"$LOG" 2>>"$LOG"
|
domcox@2
|
1603 # set boot flag
|
domcox@2
|
1604 log "$(gettext "Setting the boot flag")"
|
domcox@2
|
1605 /usr/sbin/parted "$(uuid2disk $ROOT_UUID)" \
|
domcox@2
|
1606 set "$(($(partnum $ROOT_UUID)+1))" boot on 2>> "$LOG"
|
domcox@2
|
1607 # splash image
|
domcox@2
|
1608 if [ -f "$SOURCE_ROOT/boot/grub/splash.xpm.gz" ]; then
|
domcox@2
|
1609 log "$(gettext "Copying splash image")"
|
domcox@2
|
1610 mkdir -p $TARGET_ROOT/boot/grub
|
domcox@2
|
1611 cp $SOURCE_ROOT/boot/grub/splash.xpm.gz \
|
domcox@2
|
1612 $TARGET_ROOT/boot/grub
|
domcox@0
|
1613 fi
|
domcox@0
|
1614 }
|
domcox@0
|
1615
|
domcox@2
|
1616
|
domcox@2
|
1617 #--------------
|
domcox@2
|
1618 # 5.2 syslinux
|
domcox@2
|
1619 #--------------
|
domcox@2
|
1620
|
domcox@2
|
1621 # create syslinux conf
|
domcox@2
|
1622 syslinux_config()
|
domcox@0
|
1623 {
|
domcox@2
|
1624 local version="[$(cat $TARGET_ROOT/etc/slitaz-release)]"
|
domcox@2
|
1625 version="$version\(Kernel $KERNEL)"
|
domcox@2
|
1626 # backup an existing conf
|
domcox@2
|
1627 [ -e "$TARGET_ROOT/boot/syslinux/syslinux.cfg" ] && \
|
domcox@2
|
1628 cp $TARGET_ROOT/boot/syslinux/syslinux.cfg \
|
domcox@2
|
1629 $TARGET_ROOT/boot/syslinux/syslinux.bak
|
domcox@2
|
1630 # create the target syslinux configuration.
|
domcox@2
|
1631 mkdir -p $TARGET_ROOT/boot/syslinux || error8
|
domcox@2
|
1632 cat > $TARGET_ROOT/boot/syslinux/syslinux.cfg << EOF
|
domcox@2
|
1633 # use a boot menu
|
domcox@2
|
1634 UI vesamenu.c32
|
domcox@2
|
1635
|
domcox@2
|
1636 # display the boot
|
domcox@2
|
1637 PROMPT 1
|
domcox@2
|
1638
|
domcox@2
|
1639 # how long to pause at the boot
|
domcox@2
|
1640 TIMEOUT 50
|
domcox@2
|
1641
|
domcox@2
|
1642 # default label
|
domcox@2
|
1643 DEFAULT slitaz
|
domcox@2
|
1644
|
domcox@2
|
1645 # Menu settings
|
domcox@2
|
1646 MENU TITLE SliTaz GNU/Linux boot menu
|
domcox@2
|
1647 MENU BACKGROUND splash.jpg
|
domcox@2
|
1648 MENU WIDTH 78
|
domcox@2
|
1649 MENU MARGIN 6
|
domcox@2
|
1650 MENU ROW 10
|
domcox@2
|
1651 MENU VSHIFT 2
|
domcox@2
|
1652 MENU TIMEOUTROW 18
|
domcox@2
|
1653 MENU TABMSGROW 16
|
domcox@2
|
1654 MENU CMDLINEROW 16
|
domcox@2
|
1655
|
domcox@2
|
1656 # Menu colors
|
domcox@2
|
1657 MENU COLOR border * #00000000 #00000000 none
|
domcox@2
|
1658 MENU COLOR title * #ffffffff #00000000 *
|
domcox@2
|
1659 MENU COLOR sel 0 #ffffffff #00000000 none
|
domcox@2
|
1660 MENU COLOR unsel 0 #50ffffff #00000000 none
|
domcox@2
|
1661 MENU COLOR help * #ffffffff #00000000 *
|
domcox@2
|
1662 MENU COLOR timeout_msg 37;40 #80ffffff #00000000 std
|
domcox@2
|
1663 MENU COLOR timeout 1;37;40 #c0ffffff #00000000 std
|
domcox@2
|
1664 MENU COLOR msg07 37;40 #90ffffff #a0000000 std
|
domcox@2
|
1665 MENU COLOR tabmsg 31;40 #30ffffff #00000000 std
|
domcox@2
|
1666
|
domcox@2
|
1667 # Labels
|
domcox@2
|
1668 LABEL slitaz
|
domcox@2
|
1669 MENU LABEL SliTaz GNU/Linux $version
|
domcox@2
|
1670 LINUX /boot/$KERNEL
|
domcox@2
|
1671 APPEND root=$(rootdev $ROOT_UUID) quiet $(rootdelay)
|
domcox@2
|
1672
|
domcox@2
|
1673 LABEL cmdline
|
domcox@2
|
1674 MENU LABEL Command Line
|
domcox@2
|
1675 MENU QUIT
|
domcox@2
|
1676
|
domcox@2
|
1677 EOF
|
domcox@2
|
1678 local winpart="$(winboot_uuid)"
|
domcox@2
|
1679 if [ -n "$winpart" ]; then
|
domcox@2
|
1680 log "$(gettext "Enabling Windows dual-boot")"
|
domcox@2
|
1681 cat >> $TARGET_ROOT/boot/syslinux/syslinux.cfg << EOF
|
domcox@2
|
1682 LABEL windows
|
domcox@2
|
1683 MENU LABEL Windows
|
domcox@2
|
1684 COM32 chain.c32
|
domcox@2
|
1685 APPEND hd$(disknum $winpart) $(($(partnum $winpart)+1))
|
domcox@2
|
1686
|
domcox@2
|
1687 EOF
|
domcox@0
|
1688 fi
|
domcox@2
|
1689 # log
|
domcox@2
|
1690 printf "/boot/syslinux/syslinux.cfg:\n" >> "$LOG"
|
domcox@2
|
1691 printf "--- syslinux.cfg -------------\n" >> "$LOG"
|
domcox@2
|
1692 cat $TARGET_ROOT/boot/syslinux/syslinux.cfg >> "$LOG"
|
domcox@2
|
1693 printf "--- syslinux.cfg -------------\n\n" >> "$LOG"
|
domcox@0
|
1694 }
|
domcox@0
|
1695
|
domcox@2
|
1696 # install syslinux
|
domcox@2
|
1697 syslinux_install()
|
domcox@0
|
1698 {
|
domcox@2
|
1699 log "$(gettext "Installing syslinux")"
|
domcox@2
|
1700 # needed tools
|
domcox@2
|
1701 local dir disk="$(uuid2disk $ROOT_UUID)"
|
domcox@2
|
1702 for dir in /home/boot/extlinux /home/boot/syslinux /boot/syslinux; do
|
domcox@2
|
1703 [ -d "$dir" ] && cp $dir/*.c32 "$TARGET_ROOT/boot/syslinux/"
|
domcox@2
|
1704 [ -d "$dir" ] && cp $dir/*.sys "$TARGET_ROOT/boot/syslinux/"
|
domcox@2
|
1705 done
|
domcox@2
|
1706 /usr/bin/lzma d /usr/share/boot/chain.c32.lzma \
|
domcox@2
|
1707 $TARGET_ROOT/boot/syslinux/chain.c32 2>> "$LOG"
|
domcox@2
|
1708 # install syslinux
|
domcox@2
|
1709 /bin/syslinux -version >> "$LOG" || error 5 "syslinux not found"
|
domcox@2
|
1710 /bin/extlinux --install $TARGET_ROOT/boot/syslinux >> "$LOG" 2>> "$LOG"
|
domcox@2
|
1711 case "$(p_table $ROOT_UUID)" in
|
domcox@2
|
1712 msdos)
|
domcox@2
|
1713 log "$(gettext "Setting the boot flag on")"
|
domcox@2
|
1714 /usr/sbin/parted "$disk" \
|
domcox@2
|
1715 set "$(($(partnum $ROOT_UUID)+1))" boot on 2>> "$LOG"
|
domcox@2
|
1716 [ -r /usr/share/boot/mbr.bin ] || error 5 "mbr.bin not found"
|
domcox@2
|
1717 log "$(gettext "Installing mbr")"
|
domcox@2
|
1718 dd bs=440 count=1 conv=notrunc \
|
domcox@2
|
1719 if=/usr/share/boot/mbr.bin of=$disk >> "$LOG" ;;
|
domcox@2
|
1720 gpt)
|
domcox@2
|
1721 log "$(gettext "Setting the legacy_boot flag on")"
|
domcox@2
|
1722 # remove old boot flag
|
domcox@2
|
1723 local oldboot="$(parted $disk print \
|
domcox@2
|
1724 | grep boot | /bin/busybox awk '{print $1}')"
|
domcox@2
|
1725 /usr/sbin/parted "$disk" \
|
domcox@2
|
1726 set "$oldboot" legacy_boot off 2>> "$LOG"
|
domcox@2
|
1727 # set boot flag
|
domcox@2
|
1728 /usr/sbin/parted "$disk" \
|
domcox@2
|
1729 set "$(($(partnum $ROOT_UUID)+1))" legacy_boot on 2>> "$LOG"
|
domcox@2
|
1730 log "$(gettext "Installing gptmbr")"
|
domcox@2
|
1731 [ -r /usr/share/boot/gptmbr.bin ] || error 5 "gptmbr.bin not found"
|
domcox@2
|
1732 dd bs=440 conv=notrunc count=1 \
|
domcox@2
|
1733 if=/usr/share/boot/gptmbr.bin of=$disk >> "$LOG" ;;
|
domcox@2
|
1734 esac
|
domcox@2
|
1735 # splash image
|
domcox@2
|
1736 if [ -f "$SOURCE_ROOT/boot/isolinux/splash.jpg" ]; then
|
domcox@2
|
1737 log "$(gettext "Copying splash image")"
|
domcox@2
|
1738 cp -a $SOURCE_ROOT/boot/isolinux/splash.jpg \
|
domcox@2
|
1739 $TARGET_ROOT/boot/syslinux
|
domcox@0
|
1740 fi
|
domcox@0
|
1741 }
|
domcox@0
|
1742
|
domcox@2
|
1743
|
domcox@2
|
1744 #--------------------
|
domcox@2
|
1745 # 6. execute section
|
domcox@2
|
1746 #--------------------
|
domcox@2
|
1747
|
domcox@2
|
1748 execute()
|
domcox@2
|
1749 {
|
domcox@2
|
1750 local mode="$(get mode)" sighup=1 sigint=2 sigquit=3
|
domcox@2
|
1751 randomize_mirrors
|
domcox@2
|
1752 trap "error9" "$sighup" "$sigint" "$sigquit"
|
domcox@2
|
1753 case "$mode" in
|
domcox@2
|
1754 install)
|
domcox@2
|
1755 install ;;
|
domcox@2
|
1756 upgrade)
|
domcox@2
|
1757 upgrade ;;
|
domcox@2
|
1758 esac
|
domcox@2
|
1759 }
|
domcox@2
|
1760
|
domcox@2
|
1761 #-------------
|
domcox@2
|
1762 # 6.1 install
|
domcox@2
|
1763 #-------------
|
domcox@2
|
1764
|
domcox@2
|
1765 # get a clean target device
|
domcox@2
|
1766 clean_target()
|
domcox@2
|
1767 {
|
domcox@2
|
1768 if [ -z "$ROOT_FORMAT" ]; then
|
domcox@2
|
1769 # partition was not formatted
|
domcox@2
|
1770 log "$(gettext "Cleaning the root partition") ($ROOT_UUID)..."
|
domcox@2
|
1771 # keep /home in case of reinstall.
|
domcox@2
|
1772 local path="$(pwd)"
|
domcox@2
|
1773 cd "$TARGET_ROOT" || error8
|
domcox@2
|
1774 local dir
|
domcox@2
|
1775 for dir in *
|
domcox@2
|
1776 do
|
domcox@2
|
1777 case "$dir" in
|
domcox@2
|
1778 home)
|
domcox@2
|
1779 log "$(gettext "keeping /home found on:") $ROOT_UUID"
|
domcox@2
|
1780 mv home home.bak ;;
|
domcox@2
|
1781 lost+found)
|
domcox@2
|
1782 continue ;;
|
domcox@2
|
1783 *)
|
domcox@2
|
1784 log "$(gettext "removing target:") $dir"
|
domcox@2
|
1785 rm -rf "$dir" 2>>"$LOG" ;;
|
domcox@2
|
1786 esac
|
domcox@2
|
1787 done
|
domcox@2
|
1788 if [ ! -d lost+found ]; then
|
domcox@2
|
1789 mklost+found 2>>"$LOG"
|
domcox@2
|
1790 fi
|
domcox@2
|
1791 cd "$path" || error8
|
domcox@2
|
1792 fi
|
domcox@2
|
1793 }
|
domcox@2
|
1794
|
domcox@2
|
1795 # kernel is renamed to standard vmlinuz-$VERSION.
|
domcox@2
|
1796 install_kernel()
|
domcox@2
|
1797 {
|
domcox@2
|
1798 if [ -d /$TARGET_ROOT/lib/modules ]; then
|
domcox@2
|
1799 KERNEL=$(ls /$TARGET_ROOT/lib/modules | tail -1)
|
domcox@2
|
1800 KERNEL="vmlinuz-$KERNEL"
|
domcox@2
|
1801 else
|
domcox@2
|
1802 KERNEL="vmlinuz-$(uname -r)"
|
domcox@2
|
1803 log "$(gettext "Kernel name not found, falling back to:") $(uname -r)"
|
domcox@2
|
1804 fi
|
domcox@2
|
1805 mkdir -p $TARGET_ROOT/boot || error8
|
domcox@2
|
1806 cp $SOURCE_ROOT/boot/bzImage $TARGET_ROOT/boot/$KERNEL
|
domcox@2
|
1807 log "$(gettext "install_kernel:") $KERNEL"
|
domcox@2
|
1808 }
|
domcox@2
|
1809
|
domcox@2
|
1810 # extract packed rootfs: squashfs or cromfs
|
domcox@2
|
1811 extract_loramfs()
|
domcox@2
|
1812 {
|
domcox@2
|
1813 local i
|
domcox@2
|
1814 for i in $(/bin/busybox cpio -idvum 2> /dev/null); do
|
domcox@2
|
1815 case "$i" in
|
domcox@2
|
1816 rootfs*)
|
domcox@2
|
1817 need_package squashfs
|
domcox@2
|
1818 if ! unsquashfs $i ; then
|
domcox@2
|
1819 need_package cromfs
|
domcox@2
|
1820 unmkcromfs $i squashfs-root
|
domcox@2
|
1821 fi
|
domcox@2
|
1822 mv -f squashfs-root/* .
|
domcox@2
|
1823 rmdir squashfs-root
|
domcox@2
|
1824 rm -f $i
|
domcox@2
|
1825 esac
|
domcox@2
|
1826 done
|
domcox@2
|
1827 }
|
domcox@2
|
1828
|
domcox@2
|
1829 # this is a loram rootfs.gz, skip loram bootstrap and extract
|
domcox@2
|
1830 extract_first_loramfs()
|
domcox@2
|
1831 {
|
domcox@2
|
1832 local path="$(pwd)"
|
domcox@2
|
1833 (zcat $1 || /usr/bin/unlzma -c $1) | \
|
domcox@2
|
1834 /bin/busybox cpio -i extractfs.cpio 2> /dev/null &&
|
domcox@2
|
1835 ( cd / ; /bin/busybox cpio -id ) < extractfs.cpio && \
|
domcox@2
|
1836 rm -f extractfs.cpio
|
domcox@2
|
1837 ofs=$(/bin/busybox awk '/07070100/ { o+=index($0,"07070100"); printf "%d\n",o/4 ; exit } { o+=1+length() }' < $1)
|
domcox@2
|
1838 dd if=$1 skip=$(($ofs / 1024)) bs=4k count=1 2> /dev/null | \
|
domcox@2
|
1839 ( dd skip=$(($ofs % 1024)) bs=4 2> /dev/null ; \
|
domcox@2
|
1840 dd if=$1 skip=$((1 + ($ofs / 1024) )) bs=4k ) | \
|
domcox@2
|
1841 extract_loramfs
|
domcox@2
|
1842 cd "$path" || error8
|
domcox@2
|
1843 }
|
domcox@2
|
1844
|
domcox@2
|
1845 # extract lzma'ed or gziped rootfs.
|
domcox@2
|
1846 extract_rootfs()
|
domcox@2
|
1847 {
|
domcox@2
|
1848 local path="$(pwd)"
|
domcox@2
|
1849 local isloramfs
|
domcox@2
|
1850 cd "$TARGET_ROOT" || error8
|
domcox@2
|
1851 if [ -d "$1"/../fs/etc ]; then
|
domcox@2
|
1852 # this is a tazlitobox loram (cdrom)
|
domcox@2
|
1853 cp -a "$1"/../fs/. .
|
domcox@2
|
1854 else
|
domcox@2
|
1855 for i in $(ls "$1"/rootfs* | sort -r); do
|
domcox@2
|
1856 if [ ! -d etc ]; then
|
domcox@2
|
1857 if [ $( (zcat "$i" 2>/dev/null \
|
domcox@2
|
1858 || /usr/bin/lzma d "$i" -so) | \
|
domcox@2
|
1859 wc -c) -lt $(stat -c %s "$i") ]; then
|
domcox@2
|
1860 # this is a tazlitobox loram (ram)
|
domcox@2
|
1861 isloramfs="$i"
|
domcox@2
|
1862 extract_first_loramfs "$i"
|
domcox@2
|
1863 continue
|
domcox@2
|
1864 fi
|
domcox@2
|
1865 fi
|
domcox@2
|
1866 if [ -n "$isloramfs" ]; then
|
domcox@2
|
1867 extract_loramfs < "$i"
|
domcox@2
|
1868 continue
|
domcox@2
|
1869 fi
|
domcox@2
|
1870 ( zcat "$i" 2>/dev/null || /usr/bin/lzma d "$i" -so || \
|
domcox@2
|
1871 cat "$i" ) 2>>"$LOG" | /bin/busybox cpio -idu
|
domcox@2
|
1872 done 2>>"$LOG" > /dev/null
|
domcox@2
|
1873 fi
|
domcox@2
|
1874 cp /etc/keymap.conf etc
|
domcox@2
|
1875 # unpack /usr (double check...)
|
domcox@2
|
1876 if ls etc/tazlito | grep -q ".extract"; then
|
domcox@2
|
1877 for i in etc/tazlito/*.extract; do
|
domcox@2
|
1878 [ -f "$i" ] && . "$i" /media/cdrom
|
domcox@2
|
1879 done
|
domcox@2
|
1880 fi
|
domcox@2
|
1881 cd "$pwd" || error8
|
domcox@2
|
1882 }
|
domcox@2
|
1883
|
domcox@2
|
1884
|
domcox@2
|
1885 # pre configure freshly installed system (60 - 80%).
|
domcox@2
|
1886 pre_config_system()
|
domcox@2
|
1887 {
|
domcox@2
|
1888 local path="$(pwd)"
|
domcox@2
|
1889 cd "$TARGET_ROOT" || error8
|
domcox@2
|
1890 # restore backup of existing /home if exists.
|
domcox@2
|
1891 # (created by prepare_target_dev)
|
domcox@2
|
1892 if [ -d home.bak ]; then
|
domcox@2
|
1893 log "$(gettext "Restoring directory: /home...")"
|
domcox@2
|
1894 rm -rf home
|
domcox@2
|
1895 mv home.bak home
|
domcox@2
|
1896 fi
|
domcox@2
|
1897 # add root device to CHECK_FS in rcS.conf to check filesystem
|
domcox@2
|
1898 # on each boot.
|
domcox@2
|
1899 log "$(gettext "Adding / partition and CHECK_FS to file /etc/rcS.conf...")"
|
domcox@2
|
1900 sed -i s#'CHECK_FS=\"\"'#"CHECK_FS=\"$ROOT_UUID\""# etc/rcS.conf
|
domcox@2
|
1901 # set hostname.
|
domcox@2
|
1902 log "$(gettext "Configuring host name:") $HOSTNAME"
|
domcox@2
|
1903 printf "$HOSTNAME\n" > etc/hostname
|
domcox@2
|
1904 printf "127.0.0.1 localhost $HOSTNAME tazpanel\n" > etc/hosts
|
domcox@2
|
1905 cd "$path" || error8
|
domcox@2
|
1906 }
|
domcox@2
|
1907
|
domcox@2
|
1908 # set root passwd and create user after rootfs extraction.
|
domcox@2
|
1909 users_settings()
|
domcox@2
|
1910 {
|
domcox@2
|
1911 # create file
|
domcox@2
|
1912 cat > "$TARGET_ROOT/users.sh" << _EOF_
|
domcox@2
|
1913 #!/bin/sh
|
domcox@2
|
1914 umask 0022
|
domcox@2
|
1915 echo "root:$ROOT_PWD" | chpasswd -m
|
domcox@2
|
1916 adduser -D -H $USER_LOGIN
|
domcox@2
|
1917
|
domcox@2
|
1918 for grp in audio cdrom floppy dialout disk kmem tape tty video; do
|
domcox@2
|
1919 if ! grep \$grp /etc/group | grep -q $USER_LOGIN ; then
|
domcox@2
|
1920 grep -q \$grp /etc/group && addgroup $USER_LOGIN \$grp
|
domcox@2
|
1921 fi
|
domcox@2
|
1922 done
|
domcox@2
|
1923
|
domcox@2
|
1924 echo "$USER_LOGIN:$USER_PWD" | chpasswd -m
|
domcox@2
|
1925 if [ ! -d /home/$USER_LOGIN ]; then
|
domcox@2
|
1926 cp -a /etc/skel /home/$USER_LOGIN
|
domcox@2
|
1927 [ -e /root/.xinitrc ] && cp /root/.xinitrc /home/$USER_LOGIN
|
domcox@2
|
1928 mkdir -p /home/$USER_LOGIN/.config/slitaz
|
domcox@2
|
1929 cp -a /etc/slitaz/applications.conf /home/$USER_LOGIN/.config/slitaz
|
domcox@2
|
1930 # Set ownership
|
domcox@2
|
1931 if grep -q ^users: /etc/group; then
|
domcox@2
|
1932 chown -R $USER_LOGIN:users /home/$USER_LOGIN
|
domcox@2
|
1933 else
|
domcox@2
|
1934 chown -R $USER_LOGIN:$USER_LOGIN /home/$USER_LOGIN
|
domcox@2
|
1935 fi
|
domcox@2
|
1936 # Path for user desktop files.
|
domcox@2
|
1937 for i in /home/$USER_LOGIN/.local/share/applications/*.desktop
|
domcox@2
|
1938 do
|
domcox@2
|
1939 [ -e "$i" ] && sed -i s/"user_name"/"$USER_LOGIN"/g \$i
|
domcox@2
|
1940 done
|
domcox@2
|
1941 fi
|
domcox@2
|
1942 # Slim default user.
|
domcox@2
|
1943 if [ -f /etc/slim.conf ]; then
|
domcox@2
|
1944 sed -i s/"default_user .*"/"default_user $USER_LOGIN"/ \
|
domcox@2
|
1945 /etc/slim.conf
|
domcox@2
|
1946 fi
|
domcox@2
|
1947 _EOF_
|
domcox@2
|
1948 chmod o+x "$TARGET_ROOT/users.sh"
|
domcox@2
|
1949 chroot "$TARGET_ROOT" ./users.sh 2>>"$LOG" >> "$LOG"
|
domcox@2
|
1950 rm "$TARGET_ROOT/users.sh"
|
domcox@2
|
1951 umask 0177
|
domcox@2
|
1952 }
|
domcox@2
|
1953
|
domcox@2
|
1954 # /home can be on a separate partition. If default user exists in /home
|
domcox@2
|
1955 # we remove default file created by users_settings().
|
domcox@2
|
1956 home_config()
|
domcox@2
|
1957 {
|
domcox@2
|
1958 if [ -n "$HOME_UUID" ]; then
|
domcox@2
|
1959 local path="$(pwd)" uuid
|
domcox@2
|
1960 cd "$TARGET_ROOT" || error8
|
domcox@2
|
1961 # detect fs
|
domcox@2
|
1962 local home_fs="$HOME_FORMAT"
|
domcox@2
|
1963 [ -z "$home_fs" ] && home_fs="$(filesys $HOME_UUID)"
|
domcox@2
|
1964 # manage /home
|
domcox@2
|
1965 log "$(gettext "Configuring partition to be used as /home:") $HOME_UUID"
|
domcox@2
|
1966 mv home/$USER_LOGIN tmp
|
domcox@2
|
1967 mount -t "$home_fs" "$HOME_UUID" home >> "$LOG" 2>> "$LOG"
|
domcox@2
|
1968 if [ -d $TARGET_ROOT/home/$USER_LOGIN ]; then
|
domcox@2
|
1969 rm -rf tmp/home/$USER_LOGIN
|
domcox@2
|
1970 else
|
domcox@2
|
1971 mv tmp/$USER_LOGIN home
|
domcox@2
|
1972 fi
|
domcox@2
|
1973 # write entry in fstab, force uuid
|
domcox@2
|
1974 uuid="$(dev2uuid "$HOME_UUID")"
|
domcox@2
|
1975 printf "$uuid /home $home_fs defaults \t0 \t2\n" >> etc/fstab
|
domcox@2
|
1976 umount home >> "$LOG" 2>> "$LOG"
|
domcox@2
|
1977 cd "$path" || error8
|
domcox@2
|
1978 fi
|
domcox@2
|
1979 }
|
domcox@2
|
1980
|
domcox@2
|
1981 install()
|
domcox@2
|
1982 {
|
domcox@2
|
1983 log_open
|
domcox@2
|
1984 log "1 $(gettext "Installing SliTaz on:") $(get root_uuid)"
|
domcox@2
|
1985 log "5 $(gettext "Checking settings")..."
|
domcox@2
|
1986 check all >> "$LOG" 2>> "$LOG"
|
domcox@2
|
1987 load_settings
|
domcox@2
|
1988
|
domcox@2
|
1989 log "10 $(gettext "Preparing source media")..."
|
domcox@2
|
1990 mount_source
|
domcox@2
|
1991
|
domcox@2
|
1992 log "20 $(gettext "Preparing target disk")..."
|
domcox@2
|
1993 prepare_uuid
|
domcox@2
|
1994
|
domcox@2
|
1995 log "30 $(gettext "Cleaning the root partition if necessary")..."
|
domcox@2
|
1996 clean_target
|
domcox@2
|
1997
|
domcox@2
|
1998 log "40 $(gettext "Extracting the root system")..."
|
domcox@2
|
1999 extract_rootfs $SOURCE_ROOT/boot
|
domcox@2
|
2000
|
domcox@2
|
2001 log "50 $(gettext "Installing the kernel")..."
|
domcox@2
|
2002 install_kernel
|
domcox@2
|
2003
|
domcox@2
|
2004 log "60 $(gettext "Preconfiguring the system")..."
|
domcox@2
|
2005 pre_config_system
|
domcox@2
|
2006
|
domcox@2
|
2007 log "70 $(gettext "Configuring root and default user account")..."
|
domcox@2
|
2008 users_settings
|
domcox@2
|
2009
|
domcox@2
|
2010 log "80 $(gettext "Configuring /home")..."
|
domcox@2
|
2011 home_config
|
domcox@2
|
2012
|
domcox@2
|
2013 log "90 $(gettext "Checking bootloader installation...")"
|
domcox@2
|
2014 bootloader
|
domcox@2
|
2015
|
domcox@2
|
2016 log "100 $(gettext "Files installation completed")"
|
domcox@2
|
2017 end_of_install
|
domcox@2
|
2018 }
|
domcox@2
|
2019
|
domcox@2
|
2020
|
domcox@2
|
2021 #-------------
|
domcox@2
|
2022 # 6.2 upgrade
|
domcox@2
|
2023 #-------------
|
domcox@2
|
2024
|
domcox@2
|
2025 # search for SliTaz
|
domcox@0
|
2026 check_release()
|
domcox@0
|
2027 {
|
domcox@0
|
2028 if [ -f $TARGET_ROOT/etc/slitaz-release ]; then
|
domcox@2
|
2029 local release="$(cat $TARGET_ROOT/etc/slitaz-release)"
|
domcox@2
|
2030 log "$(gettext "Preparing upgrade of SliTaz release:") $release"
|
domcox@0
|
2031 else
|
domcox@2
|
2032 error 6 "$ROOT_UUID: $(gettext "This partition doesn't appear to \
|
domcox@2
|
2033 contain a valid SliTaz system, the file: /etc/slitaz-release doesn't exist.")"
|
domcox@2
|
2034 fi
|
domcox@0
|
2035 }
|
domcox@0
|
2036
|
domcox@2
|
2037 # backup packages list.
|
domcox@0
|
2038 backup_files()
|
domcox@0
|
2039 {
|
domcox@2
|
2040 local path="$(pwd)"
|
domcox@2
|
2041 cd "$TARGET_ROOT" || error8
|
domcox@0
|
2042 ls -1 var/lib/tazpkg/installed > home/packages-selection.list
|
domcox@2
|
2043 local dir
|
domcox@0
|
2044 for dir in *
|
domcox@0
|
2045 do
|
domcox@0
|
2046 case "$dir" in
|
domcox@0
|
2047 boot)
|
domcox@0
|
2048 rm -rf boot/vmlinuz-* ;;
|
domcox@0
|
2049 home)
|
domcox@0
|
2050 mv home home.bak
|
domcox@2
|
2051 log "$(gettext "keeping /home found on:") $ROOT_UUID" ;;
|
domcox@0
|
2052 etc)
|
domcox@2
|
2053 /bin/busybox tar czf etc.tar.gz etc
|
domcox@0
|
2054 mv etc etc.bak
|
domcox@2
|
2055 log "$(gettext "keeping /etc found on:") $ROOT_UUID" ;;
|
domcox@0
|
2056 var)
|
domcox@0
|
2057 if [ -d var/www ]; then
|
domcox@0
|
2058 mv var/www www.bak
|
domcox@2
|
2059 log "$(gettext "keeping /var/www found on:") $ROOT_UUID"
|
domcox@0
|
2060 fi
|
domcox@2
|
2061 rm -rf var 2>>"$LOG" ;;
|
domcox@0
|
2062 lost+found)
|
domcox@0
|
2063 continue ;;
|
domcox@0
|
2064 *)
|
domcox@2
|
2065 log "$(gettext "removing target: $dir")"
|
domcox@2
|
2066 rm -rf "$dir" 2>>"$LOG" ;;
|
domcox@0
|
2067 esac
|
domcox@0
|
2068 done
|
domcox@0
|
2069 if [ -d mklost+found ]; then
|
domcox@2
|
2070 mklost+found 2>>"$LOG"
|
domcox@0
|
2071 fi
|
domcox@2
|
2072 cd "$path" || error8
|
domcox@0
|
2073 }
|
domcox@0
|
2074
|
domcox@2
|
2075 # restore backups.
|
domcox@0
|
2076 restore_files()
|
domcox@0
|
2077 {
|
domcox@0
|
2078 rm -rf $TARGET_ROOT/home
|
domcox@0
|
2079 mv $TARGET_ROOT/home.bak $TARGET_ROOT/home
|
domcox@0
|
2080 rm -rf $TARGET_ROOT/etc
|
domcox@0
|
2081 mv $TARGET_ROOT/etc.bak $TARGET_ROOT/etc
|
domcox@0
|
2082 if [ -d $TARGET_ROOT/www.bak ]; then
|
domcox@0
|
2083 rm -rf $TARGET_ROOT/var/www
|
domcox@0
|
2084 mv $TARGET_ROOT/www.bak $TARGET_ROOT/var/www
|
domcox@0
|
2085 fi
|
domcox@2
|
2086 log "$(gettext "backups restored:") $(date)"
|
domcox@0
|
2087
|
domcox@0
|
2088 # /var/lib/slitaz-installer
|
domcox@2
|
2089 mkdir -p $TARGET_ROOT/var/lib/tazinst && \
|
domcox@2
|
2090 mv $TARGET_ROOT/etc.tar.gz $TARGET_ROOT/var/lib/tazinst && \
|
domcox@2
|
2091 mv $TARGET_ROOT/home/packages-selection.list \
|
domcox@2
|
2092 $TARGET_ROOT/var/lib/tazinst \
|
domcox@2
|
2093 && log "$(gettext "backups saved in /var/lib/tazinst")"
|
domcox@0
|
2094 }
|
domcox@0
|
2095
|
domcox@2
|
2096 # upgrade added pkgs
|
domcox@0
|
2097 install_pkgs()
|
domcox@0
|
2098 {
|
domcox@2
|
2099 # check if the pkg is on the mirror.
|
domcox@2
|
2100 log "$(gettext "Checking the availability of packages...")"
|
domcox@0
|
2101 touch packages-to-install.list
|
domcox@0
|
2102 packages=0
|
domcox@2
|
2103 diff="$(cat packages-selection.diff | sort)"
|
domcox@0
|
2104 for pkg in $diff
|
domcox@0
|
2105 do
|
domcox@0
|
2106 if grep -q ^$pkg-[0-9] /var/lib/tazpkg/packages.list; then
|
domcox@2
|
2107 packages="$(($packages+1))"
|
domcox@0
|
2108 echo "$pkg" >> packages-to-install.list
|
domcox@0
|
2109 fi
|
domcox@0
|
2110 done
|
domcox@0
|
2111
|
domcox@2
|
2112 # install packages.
|
domcox@2
|
2113 log "$(gettext "Installing packages...")"
|
domcox@0
|
2114 if [ "$packages" == "0" ]; then
|
domcox@2
|
2115 log "$(gettext "packages to install: 0")"
|
domcox@0
|
2116 else
|
domcox@2
|
2117 # get-install all missing pkgs.
|
domcox@2
|
2118 for pkg in $(cat packages-to-install.list)
|
domcox@0
|
2119 do
|
domcox@2
|
2120 log "$(gettext "Installing:") $pkg..."
|
domcox@2
|
2121 # get install package and answer yes in case of dependencies.
|
domcox@2
|
2122 pkgname="$(grep ^$pkg /var/lib/tazpkg/packages.list)"
|
domcox@2
|
2123 /usr/bin/tazpkg get "$pkg" >/dev/null 2>/dev/null
|
domcox@2
|
2124 yes "" | /usr/bin/tazpkg install $pkgname.tazpkg \
|
domcox@2
|
2125 --root=$TARGET_ROOT >/dev/null 2>/dev/null
|
domcox@0
|
2126 rm -f $pkgname.tazpkg
|
domcox@0
|
2127 done
|
domcox@0
|
2128 fi
|
domcox@2
|
2129 log "$(gettext "Installation of packages complete...")"
|
domcox@0
|
2130 }
|
domcox@0
|
2131
|
domcox@2
|
2132 # search for added pkgs
|
domcox@0
|
2133 update_pkgs()
|
domcox@0
|
2134 {
|
domcox@2
|
2135 local path="$(pwd)"
|
domcox@2
|
2136 cd $TARGET_ROOT/var/lib/tazinst || error8
|
domcox@0
|
2137 # LiveCD packages list.
|
domcox@2
|
2138 log "$(gettext "Creating package lists...")"
|
domcox@2
|
2139 ls -1 $TARGET_ROOT/var/lib/tazpkg/installed > packages-source.list || error8
|
domcox@2
|
2140 log "$(gettext "packages-source.list: done")"
|
domcox@2
|
2141 # diff
|
domcox@2
|
2142 /bin/busybox diff packages-source.list packages-selection.list | \
|
domcox@0
|
2143 grep ^+[a-z] | sed s/^+// > packages-selection.diff
|
domcox@2
|
2144 log "$(gettext "packages-selection.diff: done")"
|
domcox@2
|
2145 # get mirror list.
|
domcox@2
|
2146 /usr/bin/tazpkg recharge >>$LOG 2>>$LOG
|
domcox@0
|
2147 if [ -f /var/lib/tazpkg/packages.list ]; then
|
domcox@0
|
2148 install_pkgs
|
domcox@0
|
2149 else
|
domcox@0
|
2150 touch packages-to-install.list
|
domcox@2
|
2151 printf "$(gettext "The list of available packages on the mirror could \
|
domcox@2
|
2152 not be downloaded. No missing packages will be reinstalled now, but you can do \
|
domcox@2
|
2153 so later by looking at the following list:
|
domcox@2
|
2154 /var/lib/tazinst/packages-selection.diff")"
|
domcox@0
|
2155 fi
|
domcox@2
|
2156 cd "$path" || error8
|
domcox@0
|
2157 }
|
domcox@0
|
2158
|
domcox@2
|
2159 # upgrade command
|
domcox@2
|
2160 upgrade()
|
domcox@0
|
2161 {
|
domcox@2
|
2162 log_open
|
domcox@2
|
2163 log "1 $(gettext "Upgrading SliTaz on:") $(get root_uuid)"
|
domcox@2
|
2164 log "5 $(gettext "Checking settings")..."
|
domcox@2
|
2165 check all >> "$LOG"
|
domcox@2
|
2166 load_settings
|
domcox@2
|
2167
|
domcox@2
|
2168 log "10 $(gettext "Preparing source media")..."
|
domcox@2
|
2169 mount_source
|
domcox@2
|
2170
|
domcox@2
|
2171 log "20 $(gettext "Preparing target disk")..."
|
domcox@2
|
2172 prepare_uuid
|
domcox@2
|
2173
|
domcox@2
|
2174 log "30 $(gettext "Searching for /etc/slitaz-release")..."
|
domcox@2
|
2175 check_release
|
domcox@2
|
2176
|
domcox@2
|
2177 log "40 $(gettext "Backup /etc, /home and the packages list")..."
|
domcox@2
|
2178 backup_files
|
domcox@2
|
2179
|
domcox@2
|
2180 log "50 $(gettext "Extracting the root system")..."
|
domcox@2
|
2181 extract_rootfs $SOURCE_ROOT/boot
|
domcox@2
|
2182
|
domcox@2
|
2183 log "60 $(gettext "Restoring configuration files")..."
|
domcox@2
|
2184 restore_files
|
domcox@2
|
2185
|
domcox@2
|
2186 log "70 $(gettext "Installing the kernel")..."
|
domcox@2
|
2187 install_kernel
|
domcox@2
|
2188
|
domcox@2
|
2189 log "80 $(gettext "Upgrading added packages")..."
|
domcox@2
|
2190 update_pkgs
|
domcox@2
|
2191
|
domcox@2
|
2192 log "90 $(gettext "Bootloader")..."
|
domcox@2
|
2193 bootloader
|
domcox@2
|
2194
|
domcox@2
|
2195 log "100 $(gettext "Files installation completed")"
|
domcox@2
|
2196 end_of_install
|
domcox@0
|
2197 }
|
domcox@0
|
2198
|
domcox@0
|
2199
|
domcox@2
|
2200 #--------------
|
domcox@2
|
2201 # tazinst main
|
domcox@2
|
2202 #--------------
|
domcox@0
|
2203
|
domcox@0
|
2204 case $1 in
|
domcox@2
|
2205 new)
|
domcox@2
|
2206 new_file "$2" ;;
|
domcox@2
|
2207 set)
|
domcox@2
|
2208 read_file "$4"
|
domcox@2
|
2209 change "$2" "$3" "$4" ;;
|
domcox@2
|
2210 unset)
|
domcox@2
|
2211 read_file "$3"
|
domcox@2
|
2212 change "$2" "" "$3" "$4" ;;
|
domcox@2
|
2213 get)
|
domcox@2
|
2214 read_file "$3"
|
domcox@2
|
2215 get "$2" ;;
|
domcox@2
|
2216 check)
|
domcox@2
|
2217 read_file "$3"
|
domcox@2
|
2218 check "$2" ;;
|
domcox@2
|
2219 list)
|
domcox@2
|
2220 list "$2" "$3" ;;
|
domcox@2
|
2221 execute)
|
domcox@0
|
2222 check_root
|
domcox@2
|
2223 read_file "$2"
|
domcox@2
|
2224 execute "$2" ;;
|
domcox@0
|
2225 log)
|
domcox@2
|
2226 [ -r "$LOG" ] && cat "$LOG" ;;
|
domcox@2
|
2227 clean)
|
domcox@2
|
2228 clean "$2" ;;
|
domcox@0
|
2229 version)
|
domcox@2
|
2230 echo "$VERSION" ;;
|
domcox@2
|
2231 ""|usage)
|
domcox@0
|
2232 usage ;;
|
domcox@2
|
2233 help)
|
domcox@2
|
2234 help "$2" ;;
|
domcox@2
|
2235 *)
|
domcox@2
|
2236 usage_error ;;
|
domcox@0
|
2237 esac
|