-
Notifications
You must be signed in to change notification settings - Fork 271
/
init
executable file
·1538 lines (1419 loc) · 54.7 KB
/
init
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#!/bin/sh
# see also /sbin scripts: usablefs, set_plang, switch
#
# _FN = _FILENAME
# _MP = _MOUNTPOINT
#
#Aufs layers setup by this script...
#aufs layers: RW (top) RO1 RO2 PUPMODE
#First boot (or pfix=ram): tmpfs pup_xxx.sfs 5
#Normal running puppy: pup_save.3fs pup_xxx.sfs 12
#ditto, but flash drive: tmpfs pup_save.3fs pup_xxx.sfs 13
#Multisession cd/dvd: tmpfs folders pup_xxx.sfs 77
######################## localization ########################
#ex: /locale/<locale>/init.mo
L_WINDOWS_HIBERNATED="ERROR: Windows NTFS hibernated partition, cannot mount"
L_DONE="done"
L_FAILED="failed"
L_DUMPING_BOOTINIT_LOG="Dumping last lines of /tmp/bootinit.log..."
L_DUMPING_KERNEL_LOG="Dumping last lines of kernel log..."
L_ERROR_IS_TOO_CRITICAL="Error is too critical, dropping out to console..."
L_PAUSING_60_SECONDS="Pausing for 60 seconds..."
L_LOADING_FILE="Loading the '%s' %s file..." #printf
L_LOADING_SAVE_ARCHIVE='Loading save-archive %s [%s]...' #printf
L_LOADING_PUPSAVE='Loading savefolder %s [%s]...' #printf
L_LOADING_PUPSAVE_FILE='Loading savefile %s [%s] (%s)...' #printf
L_UPGRADE_NO="Backing off, not using personal storage, booting in RAM only, PUPMODE=5..."
L_LOADING_FROM_CD="Loading folder %s from CD/DVD..." #printf
L_RAM_DISK_FULL="RAM disk full, copy failed at %s" #printf
L_ADDING_SAVE_LAYER_FAILED="adding %s to aufs stack failed." #printf
L_WAITING_FOR_DEV='Waiting %s seconds for slow storage devices [%s/%s].' #printf
L_WAITING_FOR_PART='Waiting for partition [%s]' #printf
L_LOADING_KEYBOARD_LAYOUT="Loading '%s' keyboard layout..." #printf
L_COPY_MESSAGE="Copying '%s' to ram..." #printf
L_LOAD_MESSAGE="main"
L_PRE_MESSAGE="Loading puppy main sfs file."
L_ERR_PDRV_INCOMPLETE="%s information is incomplete." #printf
L_ERR_ONEPART_NOT_MOUNTED="%s is not mounted." #printf
L_ERR_ONEPART_NOT_OK="%s %s is not Ok." #printf
L_ERR_ONEPART_MOUNT_SFS_FAILED="%s %s mount of sfs failed." #printf
L_ERR_AUFS_SFS_FAILED="aufs mount of %s failed." #printf
L_ERR_TYPE_PUPSAVE="Type a number to choose which personal file to use:"
L_DROPPED_TO_INITRD_SHELL="Dropped to initramfs shell. Type 'exec switch' to continue booting Puppy."
L_SWITCH_ROOT="Performing a 'switch_root' to the %s filesystem..." #printf
L_FOLDER_MARKED_BAD="Folder %s marked bad." #printf
L_0_NONE="0 none"
L_ERROR_FAILED_AUFS_STACK='Failed to create empty aufs stack'
L_ADDING_MODULE="Adding module %s" #printf
L_NO_DISTRO_SPECS="No DISTRO_SPECS file found, assuming that personal storage is empty."
L_DEBUG_SAVE="To save debug info to a partition, type 'debugsave'"
L_SFFS_ERROR="ERROR: savefile filesystem is not ext2/3/4"
##############################################################
/sbin/usablefs # mount: /proc /sys /dev / (proc sysfs devtmpfs rootfs)
for i in $(cat /proc/cmdline) ; do
case $i in
fullinstall) exec ash /sbin/init_full_install ;;
bootmenu) ZBOOTMENU=1 ;;
loglevel=*) LOGLEVEL=${i##*=} ;;
root=*) GRUB_ROOT=${i#root=} ;;
esac
done
if [ "$GRUB_ROOT" ]; then
[ "${GRUB_ROOT%=*}" = 'UUID' ] && GRUB_ROOT=${GRUB_ROOT#*=}
fi
# always call init-bootmenu on ARM devices
case $(uname -m) in arm*) ZBOOTMENU=1 ;; esac
export TERMINFO="/etc/terminfo"
export LANG=C
export INIT_SCRIPT=1
PATH="/bin:/sbin"
export KERNELVER="$(uname -r)"
. /DISTRO_SPECS #v412 has DISTRO_VERSION, DISTRO_FILE_PREFIX
. /etc/rc.d/functions_x
export DISTRODESC="${DISTRO_NAME} ${DISTRO_VERSION} - Linux ${KERNELVER} - `uname -m`"
#precaution - if DISTRO_SPECS was not processed by 3builddistro...
[ ! "$DISTRO_ZDRVSFS" ] && DISTRO_ZDRVSFS="zdrv_${DISTRO_FILE_PREFIX}_${DISTRO_VERSION}.sfs"
[ ! "$DISTRO_FDRVSFS" ] && DISTRO_FDRVSFS="fdrv_${DISTRO_FILE_PREFIX}_${DISTRO_VERSION}.sfs"
[ ! "$DISTRO_ADRVSFS" ] && DISTRO_ADRVSFS="adrv_${DISTRO_FILE_PREFIX}_${DISTRO_VERSION}.sfs"
[ ! "$DISTRO_YDRVSFS" ] && DISTRO_YDRVSFS="ydrv_${DISTRO_FILE_PREFIX}_${DISTRO_VERSION}.sfs"
[ ! "$DISTRO_BDRVSFS" ] && DISTRO_BDRVSFS="bdrv_${DISTRO_FILE_PREFIX}_${DISTRO_VERSION}.sfs"
[ ! "$DISTRO_PUPPYSFS" ] && DISTRO_PUPPYSFS="puppy_${DISTRO_FILE_PREFIX}_${DISTRO_VERSION}.sfs"
# filenames specified in DISTRO_SPECS: DISTRO_ZDRVSFS, DISTRO_PUPPYSFS...
Z_DEF_FN="$DISTRO_ZDRVSFS"
F_DEF_FN="$DISTRO_FDRVSFS"
A_DEF_FN="$DISTRO_ADRVSFS"
Y_DEF_FN="$DISTRO_YDRVSFS"
B_DEF_FN="$DISTRO_BDRVSFS"
P_DEF_FN="$DISTRO_PUPPYSFS"
KBUILD_DEF_FN="kbuild-$KERNELVER.sfs"
DEVX_DEF_FN="devx_${DISTRO_FILE_PREFIX}_${DISTRO_VERSION}.sfs"
DOCX_DEF_FN="docx_${DISTRO_FILE_PREFIX}_${DISTRO_VERSION}.sfs"
NLSX_DEF_FN="nlsx_${DISTRO_FILE_PREFIX}_${DISTRO_VERSION}.sfs"
if [ ! "$LOGLEVEL" ] ; then
echo '3' > /proc/sys/kernel/printk # '3' is the standard loglevel.
LOGLEVEL=3
fi
#List the builtin filesystem support
KFILESYSTEMS="$(cat /proc/filesystems | grep -v "nodev" | grep -v "fuseblk" | sed -e "s#\t##g" | tr '\n' '|' | sed -e 's#|$##g')"
#List linux filesystems
LINUXFSLIST="ext2|ext3|ext4|btrfs|minix|f2fs|reiserfs"
#Filesystem to be fsck
FSCKLIST="ext2|ext3|ext4|f2fs|vfat|msdos|exfat"
# Layered file system to use
UNIONFS='aufs'
#=============================================================
# FUNCTIONS
#=============================================================
fsck_func() {
# "$1" - partition device - ex: /dev/sdb2
# "$2" - fstype - ex: ext2
case $2 in
ext2|ext3|ext4) fsck_app='e2fsck -y' ;;
f2fs) fsck_app='fsck.f2fs -y' ;;
#vfat) fsck_app='fsck.fat -y' ;;
#exfat) fsck_app='exfatfsck' ;;
*) return ;;
esac
if [ "$(echo "$FSCKDPARTS" | grep "${1}|")" = "" ];then
${fsck_app} ${1} > /dev/console 2>&1 || sleep 3 #so the user has time to read the error msg..
FSCKDPARTS="${FSCKDPARTS}${1}|"
fi
}
check_status() #args: [-critical] $RET_VAL "$ERROR_MSG"
{
ERROR_CRITICAL=""
[ "$1" = "-critical" ] && { ERROR_CRITICAL="yes" ; shift; }
RET_VAL=$1
shift
ERROR_MSG="$@"
if [ $RET_VAL -eq 0 ] ; then
echo -en "\\033[74G" >/dev/console #move to column 72. 110426: 74
echo -e "\\033[1;32m${L_DONE}\\033[0;39m" >/dev/console #32=green
else
echo -en "\\033[72G" >/dev/console #move to column 72.
echo -e "\\033[1;31m${L_FAILED}\\033[0;39m" >/dev/console #31=red
if [ "$FLAG_NO_TIMEOUT" ] ; then
FLAG_NO_TIMEOUT=
return
fi
echo -e "\\033[1;35m${L_DUMPING_BOOTINIT_LOG}\\033[0;39m" >/dev/console #35=purple
echo -en "\\033[1;31m" >/dev/console #31=red
cat /tmp/bootinit.log | tail -n 4 >/dev/console
echo -en "\\033[0;39m" >/dev/console
echo -e "\\033[1;35m${L_DUMPING_KERNEL_LOG}\\033[0;39m" >/dev/console #35=purple
echo -en "\\033[1;31m" >/dev/console #31=red
dmesg | tail -n 4 >/dev/console
echo -en "\\033[0;39m" >/dev/console
#exit to initial ramdisk shell...
[ "$RDSH" != "" ] && exec /bin/sh >/dev/console 2>&1
if [ "$ERROR_CRITICAL" = "yes" ] ; then
echo -en "\\033[1;35m" >/dev/console #35=purple
[ "$ERROR_MSG" != "" ] && echo "*** $ERROR_MSG" >/dev/console
echo "*** ${L_ERROR_IS_TOO_CRITICAL}" >/dev/console
echo -en "\\033[0;39m" >/dev/console
echo -e "\\033[1;32m*** $L_DEBUG_SAVE\\033[0;39m" >/dev/console
exec /bin/sh >/dev/console 2>&1
else
echo "${L_PAUSING_60_SECONDS}" >/dev/console
sleep 60
fi
fi
}
decode_spec() {
#${1} = an sfs spec e.g. sdb2:/pup/test_it.sfs
ONE_BP_ID=""; ONE_BP_FN=""
[ "${1}" ] || return
case "${1}" in
*:*) ONE_BP_ID="${1%%:*}"; ONE_BP_FN="${1#*:}" ;;
*) ONE_BP_ID="${1}" ;;
esac
if [ "$ONE_BP_FN" ];then
case "$ONE_BP_FN" in
*/*) [ "${ONE_BP_FN:0:1}" != "/" ] && ONE_BP_FN="/$ONE_BP_FN" ;;
*) ONE_BP_FN="$PSUBDIR/$ONE_BP_FN" ;;
esac
fi
}
wait_for_blkid() {
# $1 value to look for
BLKID_PART=''
[ "$1" ] || return
local PART DIDMSG NUM
DIDMSG=''
# use loop to wait for device, if not found immediately
for NUM in $(seq 1 15); do
PART="$(blkid | grep "$1" | grep -E "^/dev/$1| LABEL=.$1| UUID=.$1" | cut -f1 -d':' | cut -f3 -d'/')"
[ "$PART" ] && break
[ $NUM -eq 1 ] && { echo -n "$(printf "$L_WAITING_FOR_PART" "${1}")" > /dev/console; DIDMSG='yes'; }
sleep 1
echo -en "\\033[1;33m.\\033[0;39m" >/dev/console #yellow dot
done
[ "$PART" ] && BLKID_PART="$PART"
if [ "$DIDMSG" ];then
get_part_info
if [ "$PART" ];then
check_status 0
else
check_status 1
fi
fi
}
decode_id() {
ONE_PART=''
[ "${1}" ] || return
if grep -q " ${1}$" /proc/partitions;then #known partition name
ONE_PART="$1"
return
fi
wait_for_blkid "$1"
ONE_PART="$BLKID_PART"
}
decode_other_ids() {
#get ONE_PART from DEV or ID specified in sfs boot params
decode_id "$Z_BP_ID"
[ "$ONE_PART" ] && { Z_PART="$ONE_PART"; Z_BP_ID=""; }
decode_id "$F_BP_ID"
[ "$ONE_PART" ] && { F_PART="$ONE_PART"; F_BP_ID=""; }
decode_id "$A_BP_ID"
[ "$ONE_PART" ] && { A_PART="$ONE_PART"; A_BP_ID=""; }
decode_id "$Y_BP_ID"
[ "$ONE_PART" ] && { Y_PART="$ONE_PART"; Y_BP_ID=""; }
decode_id "$B_BP_ID"
[ "$ONE_PART" ] && { B_PART="$ONE_PART"; B_BP_ID=""; }
decode_id "$SAVE_BP_ID"
[ "$ONE_PART" ] && { SAVEPART="$ONE_PART"; PSAVEPART="$ONE_PART"; SAVE_BP_ID=""; }
}
log_part_id() {
# "$1" - partition id - ex: Work or sdc4
echo "Partition ${1} not found."
}
ensure_mounted() {
# "$1" - partition - ex: sda3
# "$2" - mountpoint - ex: /mnt/pdrv
ONE_MP="$(grep -m1 "^/dev/${1} " /proc/mounts | cut -f 2 -d ' ')"
if [ "$ONE_MP" ];then
ONE_FS="$(grep -m1 "^/dev/${1} " /proc/mounts | cut -f 3 -d ' ')"
return
fi
ONE_FS="$(blkid /dev/${1} | grep -o ' TYPE=.*' | cut -f 2 -d '"')"
ONE_MP="${2}"
if [ "$PFSCKP" = "yes" ] ; then # pfix=fsckp
fsck_func /dev/${1} $ONE_FS
fi
/sbin/mountpartition /dev/${1} $ONE_MP $ONE_FS #-t $ONE_FS /dev/$ONE_PART $ONE_MP
if [ $? -ne 0 ] ; then
sleep 3 # usb optical drive showing as /sys/block/sr0, but won't mount, needs more delay...
/sbin/mountpartition /dev/${1} $ONE_MP $ONE_FS
[ $? -ne 0 ] && { echo "${1} on $ONE_MP as $ONE_FS mount failed."; ONE_MP=""; return 1; }
fi
# fsckme.flg is created by rc.sysinit and deleted by rc.shutdown
# this flag will be set for any prior improper shutdown. if have lots of installations
# of puppy on the pc, the flag may not even be for this install of puppy, however, this is
# the simplest implementation...
if [ -f ${ONE_MP}/fsckme.flg ] ; then
#sda1,ext3,/PUPPYBOOT/precise/precisesave.4fs
FSCKME="`cat ${ONE_MP}/fsckme.flg`"
echo -e "${ONE_MP}/fsckme.flg\n $FSCKME"
FSCK_PART="$(echo "$FSCKME" | cut -f 1 -d ",")"
FSCK_EXT="$(echo "$FSCKME" | cut -f 2 -d ",")"
FSCK_SAVEFILE="$(echo "$FSCKME" | cut -f 3 -d ",")"
rm -f ${ONE_MP}/fsckme.flg
[ "$FSCK_SAVEFILE" ] && PFSCK="yes"
[ "$PFSCKP" = "yes" ] && return # boot param, partition already fsck'ed
if [ "$(echo "$FSCKLIST" | grep "${FSCK_EXT}")" != "" ]; then
umount ${ONE_MP}
[ "$FSCKME" ] && fsck_func /dev/${FSCK_PART} ${FSCK_EXT}
ensure_mounted "$1" "$2"
fi
fi
}
ensure_save_mounted() {
SAVE_MP="/mnt/dev_save"
ensure_mounted "$SAVEPART" "$SAVE_MP"
if [ "$ONE_MP" ];then
if [ "$ONE_MP" != "$SAVE_MP" ];then
#ensure SAVEPART is mounted on /mnt/dev_save
[ -d "$SAVE_MP" ] || mkdir -p $SAVE_MP
echo "mount -o move $ONE_MP $SAVE_MP" #debug
mount -o move $ONE_MP $SAVE_MP
fi
SAVE_FS="$ONE_FS"
else
SAVE_MP=""
fi
}
find_drv_file() {
# "$1" - specified filename - ex: /pup/mydrv-1.2.3.sfs
# "$2" - default filename - ex: adrv_tahr_6.0.5.sfs
# "$3" - look under root too - ex. 1
ONE_FN=""
[ "${1}" ] || [ "${2}" ] || return
if [ "${1}" ];then
case ${1} in
*/) ONE_TRY_FN="${1}${2}" ;;
*) ONE_TRY_FN="${1}" ;;
esac
else
ONE_TRY_FN="${PSUBDIR}/${2}"
[ "$3" -a ! -e "${ONE_MP}${ONE_TRY_FN}" ] && ONE_TRY_FN="/$2"
fi
if [ -L "${ONE_MP}${ONE_TRY_FN}" ];then
C_MP="$(readlink -f "$ONE_MP")"
ONE_TRY_FN="$(readlink -f "${C_MP}${ONE_TRY_FN}")"
ONE_TRY_FN="${ONE_TRY_FN#${C_MP}}"
fi
[ -f "${ONE_MP}${ONE_TRY_FN}" ] && ONE_FN="$ONE_TRY_FN"
}
find_onepupdrv() {
# "$1" - partition - ex: sda3
# "$2" - specified filename - ex: /pup/mydrv-1.2.3.sfs
# "$3" - default filename - ex: adrv_tahr_6.0.5.sfs
# "$4" - prefix for "drv" mountpoint - ex: a
# "$5" - look under root too - ex. 1
ONE_FN=""
[ "${2}" ] || [ "${3}" ] || return
[ "${4}" ] || return
if [ "${1}" ];then
ONE_PART="${1}"
else
ONE_PART="$P_PART"
fi
[ "$ONE_PART" ] || return
ensure_mounted "$ONE_PART" "/mnt/${4}drv"
[ "$ONE_MP" ] || return
find_drv_file "${2}" "${3}" "${5}"
[ "$ONE_FN" = "" -a "${2}" ] && echo "$ONE_PART, $ONE_TRY_FN file not found."
}
stack_onepupdrv() {
# "$1" - sfs spec - ex: sdb2,ext4,/pup/mydrv-1.2.3.sfs
# "$2" - suffix for "pup_" branch directory - ex: a
# "$3" - prepend after rw layer indicator - ex: p
ONE_LAYER=""
ONE_PART="$(echo "${1}" | cut -f 1 -d ',')"
[ "$ONE_PART" ] || return 1
ONE_REL_FN="$(echo "${1}" | cut -f 3 -d ',')"
[ "$ONE_REL_FN" ] || return 1
ONE_SFX="${2}"
ONE_PREP="${3}"
if [ "$ONE_PART" = "rootfs" ];then #humongous initrd.
ONE_MP="" #actually it's '/'.
else
ONE_MP="$(mount | grep -m1 "/dev/$ONE_PART " | cut -f 3 -d ' ')"
[ "$ONE_MP" ] || return 2
fi
ONE_FN="${ONE_MP}${ONE_REL_FN}"
ONE_BASENAME="$(basename $ONE_REL_FN)"
if ! [ -s "$ONE_FN" ] ; then
return 3 #sfs not Ok - empty file
fi
# ======= load_sfs_file()
echo -n "$(printf "${L_LOADING_FILE}" "$ONE_BASENAME" "$LOADMSG")" > /dev/console
#-
ONE_LOOP="$(losetup -f)"
if [ -f /mnt/tmpfs/$ONE_BASENAME ] ; then
losetup -r $ONE_LOOP /mnt/tmpfs/$ONE_BASENAME
else
losetup -r $ONE_LOOP $ONE_FN
[ "$ONE_PART" != "rootfs" ] && KEEPMOUNTED="${KEEPMOUNTED}${ONE_PART} "
fi
SFS_MP="/pup_${ONE_SFX}"
[ "$ONE_SFX" = "p" ] && SFS_MP="/pup_ro2"
[ -d "$SFS_MP" ] || mkdir $SFS_MP
mount -r -t squashfs -o noatime $ONE_LOOP $SFS_MP > /dev/console 2>&1
STATUS=$? ; check_status $STATUS
[ $STATUS -eq 0 ] && ONE_LAYER="$SFS_MP=rr"
# ======= end of load_sfs_file()
if ! [ "$ONE_LAYER" ] ; then
return 4 #sfs mount failed
fi
if [ -n "$punionfs" ]; then
UNIONFS="$punionfs"
elif [ "$UNIONFS" = 'aufs' ]; then
grep -qm1 aufs /proc/filesystems || UNIONFS="overlay"
fi
if [ "$UNIONFS" = 'overlay' ]; then
if [ "$ONE_PREP" ];then
remount_overlay -e "s~lowerdir=([^,]+)~lowerdir=${SFS_MP}:\1~" -e "s~lowerdir=,~lowerdir=${SFS_MP},~"
[ $? -eq 0 ] || return 5
else
remount_overlay -e "s~lowerdir=([^,]+)~lowerdir=\1:${SFS_MP}~" -e "s~lowerdir=,~lowerdir=${SFS_MP},~"
[ $? -eq 0 ] || return 5
fi
else
mountpoint -q /pup_new
if [ $? -ne 0 ];then
echo "mount -t aufs -o udba=reval,diropq=w,br=/mnt/tmpfs/pup_rw=rw,xino=/mnt/tmpfs/.aufs.xino unionfs /pup_new" #debug
mount -t aufs -o udba=reval,diropq=w,br=/mnt/tmpfs/pup_rw=rw,xino=/mnt/tmpfs/.aufs.xino unionfs /pup_new
[ $? -eq 0 ] || fatal_error "${L_ERROR_FAILED_AUFS_STACK}"
fi
if [ "$ONE_PREP" ];then
echo "mount -o remount,add:1:$ONE_LAYER /pup_new" #debug
mount -o remount,add:1:$ONE_LAYER /pup_new
[ $? -eq 0 ] || return 5
else
echo "mount -o remount,append:$ONE_LAYER /pup_new" #debug
mount -o remount,append:$ONE_LAYER /pup_new
[ $? -eq 0 ] || return 5
fi
fi
NEWUNIONRECORD="${NEWUNIONRECORD}${ONE_BASENAME} "
return 0
}
copy_onepupdrv() {
# "$1" - sfs spec - ex: sdb2,ext4,/pup/mydrv-1.2.3.sfs
[ $RAMSIZE -le 1048576 ] && return 0
ONE_PART="$(echo "${1}" | cut -f 1 -d ',')"
[ "$ONE_PART" ] || return 1
[ "$COPY2RAM" = "no" -a "$ONE_PART" != "rootfs" ] && return 0
ONE_REL_FN="$(echo "${1}" | cut -f 3 -d ',')"
[ "$ONE_REL_FN" ] || return 1
ONE_FN="${ONE_MP}${ONE_REL_FN}"
ONE_BASENAME="$(basename $ONE_REL_FN)"
[ -s "$ONE_FN" ] || return 3 #sfs not Ok - empty file
SIZEZK=$(du -k $ONE_FN | cut -f 1)
TNEEDK=$SIZEZK
[ "$COPY2RAM" = "" ] && TNEEDK=$(($TNEEDK + 65535)) #some slack.
TFREEK=$(df | grep -m1 ' /mnt/tmpfs' | tr -s ' ' | cut -f 4 -d ' ')
if [ $TFREEK -le $TNEEDK ];then
COPY2RAM="no" # stop copying when running out of ram
return 0
fi
if [ "$ONE_MP" = "" ];then #101101 humongous initrd, actually it is already in ram, but load_sfs_file code puts it in a tmpfs.
mv -f $ONE_FN /mnt/tmpfs/
else
echo -en "\\033[1;35m$(printf "${L_COPY_MESSAGE}" "$ONE_BASENAME")\\033[0;39m" > /dev/console
TOTAL_SIZEK_SFS_RAM=$(($TOTAL_SIZEK_SFS_RAM + $SIZEZK))
cp -af $ONE_FN /mnt/tmpfs/
STATUS=$? ; check_status $STATUS
fi
sync
return 0
}
setup_onepupdrv() {
# "$1" - sfs spec - ex: sdb2,ext4,/pup/mydrv-1.2.3.sfs
# "$2" - suffix for "pup_" branch directory - ex: a
# "$3" - prepend after rw layer indicator - ex: p
copy_onepupdrv "$1"
STATUS=$?
[ $STATUS -gt 0 ] && return $STATUS
stack_onepupdrv "$1" "$2" "$3"
}
setup_psave(){ # setup savefile or savefolder
SAVE_REL_FN="$(echo "$PUPSAVE" | cut -f 3 -d ',')"
if [ -f "${SAVE_MP}${SAVE_REL_FN}" ];then #savefile
PUPSAVE_SIZE="$(fx_format_bytes $(stat -c %s "${SAVE_MP}${SAVE_REL_FN}"))"
echo -n "$(printf "${L_LOADING_PUPSAVE_FILE}" "$SAVE_REL_FN" "$SAVEPART" "$PUPSAVE_SIZE")" > /dev/console
else
echo -n "$(printf "${L_LOADING_PUPSAVE}" "$SAVE_REL_FN" "$SAVEPART")" > /dev/console
fi
rm -r -f "$SAVE_LAYER"
SAVE_FN="${SAVE_MP}${SAVE_REL_FN}"
if [ -f "$SAVE_FN" ];then #savefile. ex: stretchsave.4fs
echo "--SAVEFILE-- $SAVE_FN" #debug
/sbin/load_ext_file "$SAVE_FN" "$SAVE_MP" #reads $PFSCK
if [ -f /tmp/savefile_loop ] ; then
. /tmp/savefile_loop # $SAVEFILE_LOOP $SFFS
if [ "$UNIONFS" = 'overlay' ]; then
mkdir /pup_loop
echo "mount -t $SFFS -o noatime $SAVEFILE_LOOP /pup_loop" #debug
mount -t $SFFS -o noatime $SAVEFILE_LOOP /pup_loop
if [ $? -ne 0 ]; then
PUPSAVE=""
else
mkdir -p "/pup_loop/upper" "/pup_loop/work"
ln -sv "/pup_loop/upper" "$SAVE_LAYER"
ln -sv "/pup_loop/work" "$WORKDIR"
fi
else
[ -d "$SAVE_LAYER" ] || mkdir $SAVE_LAYER
echo "mount -t $SFFS -o noatime $SAVEFILE_LOOP $SAVE_LAYER" #debug
mount -t $SFFS -o noatime $SAVEFILE_LOOP $SAVE_LAYER
[ $? -ne 0 ] && PUPSAVE=""
fi
else # load_ext_file failed
FLAG_NO_TIMEOUT=1
PUPSAVE=""
fi
elif [ -d "$SAVE_FN" ];then #savefolder
echo "--SAVEFOLDER-- $SAVE_FN" #debug
if [ "$UNIONFS" = 'overlay' ]; then
mkdir -p "$SAVE_FN/upper" "$SAVE_FN/work"
ln -sv "$SAVE_FN/upper" "$SAVE_LAYER"
ln -sv "$SAVE_FN/work" "$WORKDIR"
else
ln -sv "$SAVE_FN" "$SAVE_LAYER"
fi
else
PUPSAVE=""
fi
#[ "$PUPSAVE" ] && decrypt directory at SAVE_LAYER
if [ "$PUPSAVE" ];then
SAVE_NAME="$(basename $SAVE_REL_FN)"
#- fix for empty pupsaves (missing /initrd/DISTRO_SPECS)
if [ ! -f "$SAVE_LAYER/initrd/DISTRO_SPECS" ] ; then
touch /tmp/rc_update_force_pm5 # see /etc/rc.d/rc.update
PCLEAN=""
fi
#-
if [ "$PCLEAN" != "yes" -a -f "$SAVE_LAYER/initrd/DISTRO_SPECS" ];then
validate_pupsave_upgrade /DISTRO_SPECS $SAVE_LAYER/initrd/DISTRO_SPECS
case $? in
0) PCLEAN="yes" ;; # perform upgrade
1) PUPSAVE="" ;; # do not perform upgrade
esac
fi
if [ "$PCLEAN" = "yes" ];then
#do upgrade processing
touch /tmp/version_update_flag
CURDIR="$(pwd)"
cd "$SAVE_LAYER"
#delete critical system files
#keep rc.local - user customisations and/or fixes.
echo "Removing $(ls ./lib/modules/$KERNELVER/modules.*)"
rm -f ./lib/modules/$KERNELVER/modules.*
RC_STUFF="$(ls ./etc/rc.d/rc.* | grep -v "/rc.local$" | tr '\n' ' ')"
rm -fv $RC_STUFF
rm -fv ./etc/rc.d/funct*
#iterate over all files in save
if [ "$UNIONFS" = 'overlay' ]; then
for ONE_FILE in $(find . -type c -print); do
[ "`stat -c '%t,%T' "$ONE_FILE" 2>/dev/null`" != '0,0' ] && continue
[ "${ONE_FILE%/*}" = "./root/.config/autostart" ] && continue #keep autostart changes
echo "Removing ${ONE_FILE}"
rm -f "$ONE_FILE" #remove whiteout file
done
else
for ONE_FILE in $(find . \( -type f -or -type l \) -print); do
ONE_BASE="${ONE_FILE##*/}" #basename
if [ "${ONE_BASE:0:4}" = ".wh." ]; then #remove most whiteout files
[ "${ONE_BASE:4:4}" = ".wh." ] && continue #internal aufs files
[ "${ONE_FILE%/*}" = "./root/.config/autostart" ] && continue #keep autostart changes
echo "Removing ${ONE_FILE}"
rm -f "$ONE_FILE" #remove whiteout file
fi
done
fi
cd "$CURDIR"
sync
fi
check_status 0
else
check_status 1
fi
if [ ! "$PUPSAVE" ] ; then
echo "No pupsave. Setting PUPMODE 5" #debug
if ! [ -L $SAVE_LAYER ] ; then # $SAVE_LAYER is a true mp
echo -e "Unmounting savefile\numount -d $SAVE_LAYER" #debug
umount -d $SAVE_LAYER
fi
PUPMODE=5
SAVE_MP=""
SAVE_LAYER=""
fi
}
copy_folders() { #SAVE_LAYER=/pup_ro1
echo -e "\n-------------------- copy_folders" #debug
echo "SAVE_MP=$SAVE_MP"
DESTDIR="/mnt/tmpfs/pup_ro1"
[ -d "$DESTDIR" ] || mkdir -p $DESTDIR
rm -r -f "$SAVE_LAYER"
SAVE_FN="$DESTDIR"
ln -s $DESTDIR $SAVE_LAYER
#BKFOLDERS now set in check for pupmode=77
BKLASTFOLDER="$(echo "${BKFOLDERS}" | head -n 1)"
#a boot option allows ignore last n sessions, also need to create a badlist...
if [ "$PIGNORELAST" ];then
BKBADLIST="$(echo "${BKFOLDERS}" | head -n ${PIGNORELAST})"
if [ -f ${SAVE_MP}/${BKLASTFOLDER}/.badfolders ];then
cp ${SAVE_MP}/${BKLASTFOLDER}/.badfolders ${DESTDIR}/
if [ $? -ne 0 ];then
#fallback, in case last folder badly corrupted...
BKPREVFOLDER="$(echo "${BKFOLDERS}" | head -n 2 | tail -n 1)"
[ -f ${SAVE_MP}/${BKPREVFOLDER}/.badfolders ] && cp ${SAVE_MP}/${BKPREVFOLDER}/.badfolders ${DESTDIR}/
fi
fi
echo "$BKBADLIST" >> ${DESTDIR}/.badfolders
#note, rc.shutdown and savesession-dvd 'touch' this file so it will get saved.
sync
else
[ -f ${SAVE_MP}/${BKLASTFOLDER}/.badfolders ] && cp ${SAVE_MP}/${BKLASTFOLDER}/.badfolders ${DESTDIR}/
fi
[ -f ${DESTDIR}/.badfolders ] && BKBADLIST="$(cat ${DESTDIR}/.badfolders | tr "\n" " ")"
echo "BKBADLIST=${BKBADLIST}" #debug
BKFOLDERS="$(echo -n "${BKFOLDERS}" | tr "\n" " ")"
for ONEFOLDER in ${BKFOLDERS}
do
if [ "$(echo -n "$BKBADLIST" | grep "${ONEFOLDER}")" != "" -o -L "${SAVE_MP}/${ONEFOLDER}" ];then
echo "$(printf "${L_FOLDER_MARKED_BAD}" "${ONEFOLDER}")" >/dev/console
continue #ignore bad folder.
fi
echo "$ONEFOLDER" #debug
echo -n "$(printf "${L_LOADING_FROM_CD}" "${ONEFOLDER}")" >/dev/console
#need to be careful not to overfill the ramdisk...
FREERAMDISK=$(df 2>/dev/null | grep /mnt/tmpfs | head -n 1 | tr -s " " | cut -f 4 -d " ")
SIZEFOLDER=$(du -k -s ${SAVE_MP}/${ONEFOLDER} | cut -f 1)
SIZEARCHIVE=0
if [ -d ${SAVE_MP}/${ONEFOLDER}/archive ];then
SIZEARCHIVE=$(du -k -s ${SAVE_MP}/${ONEFOLDER}/archive | cut -f 1)
fi
SIZESOURCE=$(expr $SIZEFOLDER - $SIZEARCHIVE)
if [ $FREERAMDISK -gt $SIZESOURCE ];then
#well, -u will only copy if files newer, so less stuff may get copied than calc'd above.
#need to copy everything except archive folder...
[ -d ${SAVE_MP}/${ONEFOLDER}/bin ] && cp -a -u ${SAVE_MP}/${ONEFOLDER}/bin ${DESTDIR}/
[ -d ${SAVE_MP}/${ONEFOLDER}/sbin ] && cp -a -u ${SAVE_MP}/${ONEFOLDER}/sbin ${DESTDIR}/
[ -d ${SAVE_MP}/${ONEFOLDER}/etc ] && cp -a -u ${SAVE_MP}/${ONEFOLDER}/etc ${DESTDIR}/
[ -d ${SAVE_MP}/${ONEFOLDER}/lib ] && cp -a -u ${SAVE_MP}/${ONEFOLDER}/lib ${DESTDIR}/
[ -d ${SAVE_MP}/${ONEFOLDER}/opt ] && cp -a -u ${SAVE_MP}/${ONEFOLDER}/opt ${DESTDIR}/
[ -d ${SAVE_MP}/${ONEFOLDER}/var ] && cp -a -u ${SAVE_MP}/${ONEFOLDER}/var ${DESTDIR}/
[ -d ${SAVE_MP}/${ONEFOLDER}/root ] && cp -a -u ${SAVE_MP}/${ONEFOLDER}/root ${DESTDIR}/
[ -d ${SAVE_MP}/${ONEFOLDER}/home ] && cp -a -u ${SAVE_MP}/${ONEFOLDER}/home ${DESTDIR}/
[ -d ${SAVE_MP}/${ONEFOLDER}/usr ] && cp -a -u ${SAVE_MP}/${ONEFOLDER}/usr ${DESTDIR}/
[ -f ${DESTDIR}/root/.XLOADED ] && rm -fv ${DESTDIR}/root/.XLOADED #toxic
[ -f ${DESTDIR}/var/local/shared/.XLOADED ] && rm -fv ${DESTDIR}/var/local/shared/.XLOADED #toxic
cp -a -u ${SAVE_MP}/${ONEFOLDER}/*.sfs ${DESTDIR}/ 2>/dev/null
#delete deleted files (.wh.filename)... 110212 screen out .wh..wh..opq
WHITEOUTS="$(find ${DESTDIR} -xdev -type f -name .wh.* | grep -v '__dir_opaque' | grep -v '.wh..wh.')" #110212
echo "$WHITEOUTS" | while read DELWHITE ; do
DELFILE="$(echo -n "$DELWHITE" | sed -e 's/\.wh\.//g')"
if [ -e "$DELFILE" ];then
[ "$PDEBUG" ] && echo "Deleting $DELFILE" #debug
rm -rf "$DELFILE"
rm -rf "$DELWHITE"
fi
done
check_status 0 #display 'done' for each folder loaded.
else
printf "${L_RAM_DISK_FULL}\n" "${ONEFOLDER}"
check_status 1
break
fi
done
sync
echo -e "--------------------\n" # debug
}
set_fs_linux() {
# "$1" - file system type - ex: ext4
ONE_FS_IS_LINUX=""
[ "$(echo "$LINUXFSLIST" | grep "$1")" != "" ] && ONE_FS_IS_LINUX="yes"
}
find_save_file() {
# "$1" - mount point - ex: /mnt/pdrv
# "$2" - partition name - ex: sdb2
# "$3" - file system type - ex: ext4
if [ "$SAVE_BP_DIR" ];then
SAVE_DIR="$SAVE_BP_DIR"
else
SAVE_DIR="${PSUBDIR}/"
fi
SAVE_FILES="$(ls -d ${1}${SAVE_DIR}${DISTRO_FILE_PREFIX}save* 2>/dev/null)"
for ONE_SAVE in $SAVE_FILES;do
#validate savefiles here
IS_OK=""
case $ONE_SAVE in
*.2fs|*.3fs|*.4fs) [ -s "$ONE_SAVE" ] && IS_OK="yes" ;;
*) [ "$ONE_FS_IS_LINUX" = "yes" ] && [ -d "$ONE_SAVE" ] && IS_OK="yes" ;;
esac
[ "$IS_OK" = "yes" ] && PUP_SAVES="${PUP_SAVES}${2},${3},${SAVE_DIR}$(basename $ONE_SAVE)
"
done
PUP_SAVES="$(echo "$PUP_SAVES")" #remove trailing newline char
}
search_func() {
[ "$PDEBUG" -a "$LOOK_SAVE" ] && echo "3: filename=${PSUBDIR}/${DISTRO_FILE_PREFIX}save"
[ "$PDEBUG" -a "$LOOK_PUP" ] && echo "3: PSUBDIR=$PSUBDIR P_BP_FN=$P_BP_FN P_DEF_FN=$P_DEF_FN"
echo "HAVE_PARTS='${HAVE_PARTS}'" #debug
if [ "${1}" ];then
echo "param='${1}'" #debug
TRY_PARTS_FIRST="$(echo "$HAVE_PARTS" | grep -E "${1}")"
TRY_PARTS_LAST="$(echo "$HAVE_PARTS" | grep -Ev "${1}")"
TRY_PARTS="$TRY_PARTS_FIRST
$TRY_PARTS_LAST"
else
TRY_PARTS="$HAVE_PARTS"
fi
echo "TRY_PARTS='${TRY_PARTS}'" #debug
[ "$TRY_PARTS" ] || return
for ONETRY in $TRY_PARTS;do
ONE_PART="$(echo -n "$ONETRY" | cut -f 1 -d '|')"
[ "$PDEBUG" ] && echo "4: ONE_PART=$ONE_PART"
ensure_mounted "$ONE_PART" "/mnt/pdrv"
if [ "$ONE_MP" ];then
if [ "$LOOK_SAVE" -a "$SAVEPART" = "" ];then
set_fs_linux "$ONE_FS"
find_save_file "$ONE_MP" "$ONE_PART" "$ONE_FS"
if [ "$PUP_SAVES" ];then
SAVEPART="$ONE_PART"
[ "$PDEBUG" ] && echo "5: ONE_PART=$ONE_PART filename=${PSUBDIR}/${DISTRO_FILE_PREFIX}save"
fi
fi
if [ "$LOOK_PUP" ];then
find_drv_file "$P_BP_FN" "$P_DEF_FN" ""
if [ "$ONE_FN" ];then
PDRV="$ONE_PART,$ONE_FS,$ONE_FN"
P_MP="$ONE_MP"
P_PART="$ONE_PART"
[ "$PDEBUG" ] && echo "5: ONE_PART=$ONE_PART PSUBDIR=$PSUBDIR P_BP_FN=$P_BP_FN P_DEF_FN=$P_DEF_FN"
break;
fi
fi
umount $ONE_MP
fi
done
}
get_part_info() {
probepart -hr > /tmp/probepart.log
probedisk > /tmp/probedisk.log
sed 's%|.*%% ; s%.*/%%' /tmp/probedisk.log > /tmp/ALLDRVS0
HAVE_PARTS="$(cat /tmp/probepart.log | grep -E "$KFILESYSTEMS" | cut -f 1-2 -d '|' | sed -e 's%/dev/%%')"
[ "$PDEBUG" ] && echo "$HAVE_PARTS" > /tmp/HAVE_PARTS
}
wait_for_dev() {
echo -n "$(printf "$L_WAITING_FOR_DEV" "$WAITDEV")" > /dev/console
for NUM in $(seq 1 $WAITDEV);do
sleep 1
echo -en "\\033[1;33m.\\033[0;39m" >/dev/console #yellow dot
done
get_part_info
echo "" > /dev/console
}
umount_unneeded() {
[ "${ISO_LOOP}" ] && umount -d ${ISO_LOOP} # /sbin/isoboot &&&
MTD_PARTS="$(mount | cut -f1 -d' ' | grep '^/dev' | grep -v loop | cut -f3 -d'/')"
for ONE_PART in $MTD_PARTS;do
[ "$(echo -n "$KEEPMOUNTED" | grep "$ONE_PART")" ] || umount /dev/$ONE_PART
done
}
check_resize_part() { #must be fast, no partitions can be mounted, can't work out pupmode at this stage
DEVICE=/dev/mmcblk0 # sd card only for now
fdisk -l $DEVICE | grep -qm1 "using GPT" && return # bale out if GPT
grep "$DEVICE" /tmp/probedisk.log | grep -q 'card' || return
FS=`grep "$DEVICE" /tmp/probepart.log | tail -n1 | cut -f 2 -d '|'`
case $FS in
ext*|f2fs)
echo "$FS : checking if it needs resizing"
;;
*)
return
;;
esac
DEVICE_SIZE=`fdisk -l $DEVICE | grep -om1 '[KMG]*B,.*bytes' | cut -f 2 -d ' '`
DEVICE_SIZE=$(($DEVICE_SIZE / 1024)) # kb
ACT_SIZE=0
grep 'mmcblk0p' /proc/partitions | while read EACH_PART ; do
PART_SIZE=`echo $EACH_PART | rev | cut -f 2 -d ' ' |rev` # kb
ACT_SIZE=$(($PART_SIZE + $ACT_SIZE ))
echo -n $ACT_SIZE > /tmp/actualsizekb
done
USED_SIZE=`cat /tmp/actualsizekb`
DIFF_SIZE=$(($DEVICE_SIZE - $USED_SIZE))
if [ $DIFF_SIZE -lt 10000 ] ; then # ~10 MB, can do it later
return
else
/sbin/resize_part $FS
check_status $?
fi
}
fatal_error() {
# "$1" - message - ex: puppy_tahr_6.0.5.sfs not found
# "$2" - pre-status-message - ex: Finding puppy
KEEPMOUNTED=""
umount_unneeded
[ "${2}" ] && echo -n "${2}" > /dev/console
check_status -critical 1 "$1"
}
remount_overlay() {
OPTS=`grep '^unionfs /pup_new overlay' /proc/mounts | awk '{print $4}'`
if [ -n "$OPTS" ]; then
umount -l /pup_new
else
mkdir /mnt/tmpfs/pup_work
OPTS="lowerdir=,upperdir=/mnt/tmpfs/pup_rw,workdir=/mnt/tmpfs/pup_work,xino=on,metacopy=off"
fi
NEWOPTS=`echo "$OPTS" | sed -E "$@"`
echo "mount -t overlay -o ${NEWOPTS} unionfs /pup_new" #debug
mount -t overlay -o ${NEWOPTS} unionfs /pup_new
STATUS=$?
if [ $STATUS -ne 0 ]; then
echo "mount -t overlay -o ${OPTS} unionfs /pup_new" #debug
mount -t overlay -o ${OPTS} unionfs /pup_new
fi
return $STATUS
}
#=============================================================
# MAIN
#=============================================================
clear #clear the screen.
[ "$ZBOOTMENU" ] && . /sbin/init-bootmenu
echo -en "\\033[0;34m***\\033[0;37m ${DISTRO_NAME} ${DISTRO_VERSION}"
echo -en "\\033[0;34m -\\033[0;37m Linux ${KERNELVER} "
echo -en "\\033[0;31m[\\033[0;37m`uname -m`\\033[0;31m]"
echo -e "\\033[0;34m ***\\033[0;39m"
[ "$LOGLEVEL" -eq 7 ] && set -x
[ "$LOGLEVEL" -le 3 -o "$LOGLEVEL" -eq 7 ] && exec 1>/tmp/bootinit.log 2>&1 #remove o/p from console. v2.22 loglevel added.
[ ! -f /bin/resize2fs ] && touch /tmp/no_resize2fs
# sets PLANG, PKEYS, VFAT_OUT_PARAM, FONTMAP, KMAP, CODEPAGE
[ -f /sbin/set_plang ] && . /sbin/set_plang
#pmedia= usbflash|usbhd|usbcd|ataflash|atahd|atacd|atazip|scsihd|scsicd|cd
[ $pmedia ] && PMEDIA=$pmedia #boot parameter, broad category of boot media. ex: cd.
[ $psubdir ] && PSUBDIR=$psubdir #boot parameter, directory for puppy files. ex: puppy220
[ $psavemark ] && PSAVEMARK=$psavemark #100913 partition number that has/will-have save-file.
[ $PSUBDIR ] && [ "${PSUBDIR:0:1}" != "/" ] && PSUBDIR="/${PSUBDIR}" #add leading /.
[ $pdev1 ] && PDRV=$pdev1 #boot parameter, partition have booted off. ex: hda3
#100915 requested by technosaurus (formats get changed further down)...
[ $pdrv ] && PDRV=$pdrv #format partition:<path><filename> ex: sda2:/slacko/puppy_slacko_6.3.0.sfs
[ $pupsfs ] && PDRV=$pupsfs
[ $zdrv ] && ZDRV=$zdrv #ex: sda2:/slacko/zdrv_slacko_6.3.0.sfs
[ $fdrv ] && FDRV=$fdrv
[ $adrv ] && ADRV=$adrv
[ $ydrv ] && YDRV=$ydrv
[ $bdrv ] && BDRV=$bdrv
#<partition>:<filename>, for savefile/savefolder. <partition> can be a name or Label or UUID
[ $psave ] && PSAVE=$psave #ex: sdb4:/puppy/tahr/tahrsave or smark or 49baa82d-8c69:tahrsave
#list of kernel modules to load, ex: pimod=hid-logitech-dj.ko,kernel/drivers/hid/hid-multitouch.ko
[ $pimod ] && PIMOD=$pimod
#wireless credentials passed to main system
[ $pwireless ] && PWIRELESS=$pwireless # ex: pwireless=myssid:mypassword
if [ $waitdev ];then
WAITDEV=$waitdev
else
WAITDEV=5
fi
#[ $pdebug ] && PDEBUG=$pdebug
PDEBUG=1
TOTAL_SIZEK_SFS_RAM=0
RDSH=""
if [ "$pfix" ];then
for ONEFIX in $(echo -n "$pfix" | tr ',' ' ')
do
case $ONEFIX in
ram) PRAMONLY="yes";; #run in ram only (do not load ${DISTRO_FILE_PREFIX}save).
rdsh) RDSH="yes";; #exit to shell in initial ramdisk.
xorgwizard) PXORGWIZARD="yes";;#force xorgwizard for this session
nox) PNOX="yes";; #do not start X.
clean) PCLEAN="yes";; #force version upgrade and cleanup.
copy) PCOPY="yes";; #copy .sfs files into ram.
nocopy) PNOCOPY="yes";; #do not copy .sfs files into ram (default is copy if enough ram).
fsck) PFSCK="yes";; #do a fsck of ${DISTRO_FILE_PREFIX}save file.
fsckp) PFSCKP="yes";; #do fsck before first mount of ext partitions
[0-9]*) PIGNORELAST=$ONEFIX;; #blacklist last $ONEFIX folders (multisession).
*) echo "pfix=$ONEFIX is not a known boot parameter";;
esac
done
fi
export PFSCK # read by /sbin/load_ext_file
[ "$PRAMONLY" != "yes" ] && [ -f /BOOT_SPECS ] && . /BOOT_SPECS
[ "$TZ" ] && export TZ
hwclock -l -s
ISO_LOOP=''
if [ -f /sbin/isoboot ] ; then
. /sbin/isoboot # optional, can remove all occurrences of "isoboot" from this script
fi
if [ "$PDRV" = '' ]; then
if [ "$ISO_LOOP" = '' ]; then
[ "$GRUB_ROOT" ] && PDRV=$GRUB_ROOT
fi
fi
[ "$PDEBUG" ] && echo "0: PMEDIA=$PMEDIA PDRV=$PDRV PSUBDIR=$PSUBDIR pfix=$pfix"
#100915 technosaurus recommendation (see above)...
[ "$PDRV" ] && { decode_spec "$PDRV"; P_BP_ID="$ONE_BP_ID"; P_BP_FN="$ONE_BP_FN"; PDRV=""; }
[ "$ZDRV" ] && { decode_spec "$ZDRV"; Z_BP_ID="$ONE_BP_ID"; Z_BP_FN="$ONE_BP_FN"; ZDRV=""; }
[ "$FDRV" ] && { decode_spec "$FDRV"; F_BP_ID="$ONE_BP_ID"; F_BP_FN="$ONE_BP_FN"; FDRV=""; }
[ "$ADRV" ] && { decode_spec "$ADRV"; A_BP_ID="$ONE_BP_ID"; A_BP_FN="$ONE_BP_FN"; ADRV=""; }
[ "$YDRV" ] && { decode_spec "$YDRV"; Y_BP_ID="$ONE_BP_ID"; Y_BP_FN="$ONE_BP_FN"; YDRV=""; }
[ "$BDRV" ] && { decode_spec "$BDRV"; B_BP_ID="$ONE_BP_ID"; B_BP_FN="$ONE_BP_FN"; BDRV=""; }
[ "$PSAVE" ] && { decode_spec "$PSAVE"; SAVE_BP_ID="$ONE_BP_ID"; SAVE_BP_FN="$ONE_BP_FN"; }
SAVE_BP_DIR=""
[ "$SAVE_BP_FN" ] && [ "${SAVE_BP_FN:$((${#SAVE_BP_FN} - 1))}" = "/" ] && SAVE_BP_DIR="$SAVE_BP_FN" #last char
#first look inside initrd...
#unset x_DEF_FN so that find_onepupdrv() won't look for it
[ -f /${P_DEF_FN} ] && { PDRV="rootfs,rootfs,/$P_DEF_FN"; P_DEF_FN=""; }
[ -f /${Z_DEF_FN} ] && { ZDRV="rootfs,rootfs,/$Z_DEF_FN"; Z_DEF_FN=""; }
[ -f /${F_DEF_FN} ] && { FDRV="rootfs,rootfs,/$F_DEF_FN"; F_DEF_FN=""; }
[ -f /${A_DEF_FN} ] && { ADRV="rootfs,rootfs,/$A_DEF_FN"; A_DEF_FN=""; }
[ -f /${Y_DEF_FN} ] && { YDRV="rootfs,rootfs,/$Y_DEF_FN"; Y_DEF_FN=""; }
[ -f /${B_DEF_FN} ] && { BDRV="rootfs,rootfs,/$B_DEF_FN"; B_DEF_FN=""; }
#setup wireless
[ "$PWIRELESS" ] && echo -e "SSID=${PWIRELESS%:*}\nPSWD=${PWIRELESS#*:}" > /tmp/wireless.conf
get_part_info
PUP_SAVES=""
KEEPMOUNTED=""
FSCKDPARTS=""
[ "$PDEBUG" ] && echo "1: PDRV=$PDRV P_BP_ID=$P_BP_ID P_BP_FN=$P_BP_FN"
#establish PDRV
P_PART=""; LOOK_PUP=""; LOOK_SAVE=""
if [ "$P_BP_ID" ];then #specified as parameter
decode_id "$P_BP_ID"
[ "$ONE_PART" ] && { P_PART="$ONE_PART"; P_BP_ID=""; }
find_onepupdrv "$P_PART" "$P_BP_FN" "$P_DEF_FN" "p" ""
[ "$ONE_FN" ] && { PDRV="$ONE_PART,$ONE_FS,$ONE_FN"; P_MP="$ONE_MP"; }
[ "$PDEBUG" ] && echo "2: ONE_PART=$ONE_PART ONE_FN=$ONE_FN ONE_MP=$ONE_MP"
elif [ "$PDRV" = "" ];then #not specified anywhere
#determine what to search for
[ "$PMEDIA" = "cd" ] && LOOK_SAVE="yes"
[ "$SAVE_BP_ID" -o "$PSAVEMARK" ] && LOOK_SAVE=""
LOOK_PUP=yes
[ "$PDEBUG" ] && echo "2: LOOK_PUP=$LOOK_PUP LOOK_SAVE=$LOOK_SAVE PMEDIA=$PMEDIA"
fi
if [ "$LOOK_PUP" -o "$LOOK_SAVE" ];then #something to search for
search_func
NUM=0
while [ "$LOOK_PUP" -a "$P_PART" = "" ] || [ "$LOOK_SAVE" -a "$SAVEPART" = "" ];do
[ $NUM -ge $WAITDEV ] && break
printf "${L_WAITING_FOR_DEV}\n" "$WAITDEV" "$NUM" "$WAITDEV" > /dev/console
sleep 1
get_part_info
if [ "${PMEDIA:0:3}" = "usb" ] ; then
USBDRVS="$(find /sys/block -maxdepth 1 -name 'sd*' -o -name 'sr*' | xargs -n 1 readlink 2>/dev/null | grep '/usb[0-9]' | rev | cut -f 1 -d '/' | rev | tr '\n' '|')"
[ "$PDEBUG" ] && echo "2: USBDRVS=$USBDRVS -> ${USBDRVS%|}"
if [ "$USBDRVS" ] ; then
search_func "${USBDRVS%|}"
else
search_func
fi
else
search_func
fi
NUM=$(($NUM + 1))
done
fi
[ "$P_BP_ID" ] && { log_part_id "$P_BP_ID"; ONE_PART="$P_BP_ID"; }
[ "$PDEBUG" ] && echo "6: ONE_PART=$ONE_PART ONE_TRY_FN=$ONE_TRY_FN PDRV=$PDRV"
if [ "$PDRV" = "" ];then
[ "$ONE_TRY_FN" ] || ONE_TRY_FN="$PSUBDIR/$P_DEF_FN"
fatal_error "$ONE_PART $ONE_TRY_FN not found." "Finding puppy main sfs file."
fi
check_resize_part
grep -v '^sr' /tmp/ALLDRVS0 > /tmp/ATADRIVES0
ATAOPTICALDRIVES="$(grep '^sr' /tmp/ALLDRVS0 | tr '\n' ' ')"
#establish SAVEPART
decode_other_ids
if [ "$P_PART" ];then