]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - Vlnk/VentoyVlnk.sh
Update Linux GUI type condition
[Ventoy.git] / Vlnk / VentoyVlnk.sh
1 #!/bin/sh
2
3 print_usage() {
4 echo 'Usage: sudo sh VentoyVlnk.sh CMD FILE'
5 echo ' CMD:'
6 echo ' -c FILE create vlnk for FILE'
7 echo ' -l VLNK parse vlnk file'
8 echo ' -v print verbose info'
9 echo ' -h print this help'
10 echo ''
11 }
12
13 verbose_flag=0
14
15 vlog() {
16 if [ $verbose_flag -eq 1 ]; then
17 echo "$@"
18 fi
19 }
20
21 vlnk_suffix() {
22 echo $1 | grep -E -q '.*(.vlnk.iso|.vlnk.img|.vlnk.wim|.vlnk.vhd|.vlnk.vhdx|.vlnk.efi|.vlnk.vtoy|.vlnk.dat)$'
23 }
24
25
26 uid=$(id -u)
27 if [ $uid -ne 0 ]; then
28 echo "Please use sudo or run the script as root."
29 exit 1
30 fi
31
32 #check system tools used bellow
33 for t in 'mountpoint' 'readlink' 'xzcat'; do
34 if ! which "$t" > /dev/null 2>&1; then
35 echo "$t command not found in current system!"
36 exit 1
37 fi
38 done
39
40 machine=$(uname -m)
41 if echo $machine | grep -E -q 'aarch64|arm64'; then
42 TOOLDIR=aarch64
43 elif echo $machine | grep -E -q 'x86_64|amd64'; then
44 TOOLDIR=x86_64
45 elif echo $machine | grep -E -q 'mips64'; then
46 TOOLDIR=mips64el
47 elif echo $machine | grep -E -q 'i[3-6]86'; then
48 TOOLDIR=i386
49 else
50 echo "Unsupported machine type $machine"
51 exit 1
52 fi
53
54 fullsh=$(readlink -f "$0")
55 vtoydir=${fullsh%/*}
56
57 if [ -f "$vtoydir/tool/$TOOLDIR/vlnk.xz" ]; then
58 xzcat "$vtoydir/tool/$TOOLDIR/vlnk.xz" > "$vtoydir/tool/$TOOLDIR/vlnk"
59 rm -f "$vtoydir/tool/$TOOLDIR/vlnk.xz"
60 fi
61
62 if [ -f "$vtoydir/tool/$TOOLDIR/vlnk" ]; then
63 chmod +x "$vtoydir/tool/$TOOLDIR/vlnk"
64 else
65 echo "$vtoydir/tool/$TOOLDIR/vlnk does not exist! "
66 exit 1
67 fi
68
69 PATH="$vtoydir/tool/$TOOLDIR":$PATH
70
71 VLNKCMD=vlnk
72 while [ -n "$1" ]; do
73 if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
74 print_usage
75 exit 0
76 elif [ "$1" = "-c" ]; then
77 shift
78 CMD='c'
79 IMG="$1"
80 elif [ "$1" = "-o" ]; then
81 shift
82 OUT="$1"
83 elif [ "$1" = "-l" ]; then
84 shift
85 CMD='l'
86 VLNK="$1"
87 elif [ "$1" = "-v" ]; then
88 verbose_flag=1
89 VLNKCMD="vlnk -v"
90 else
91 echo "invalid option $1"
92 exit 1
93 fi
94
95 shift
96 done
97
98 if [ "$CMD" = "c" ]; then
99 vlog "Create vlnk for $IMG"
100
101 if [ ! -f "$IMG" ]; then
102 echo "$IMG does not exist!"
103 exit 1
104 fi
105
106 if echo $IMG | grep -E -q -i '.*(.iso|.img|.wim|.vhd|.vhdx|.efi|.vtoy|.dat)$'; then
107 :
108 else
109 echo "This file is not supported for vlnk!"
110 exit 1
111 fi
112
113 if vlnk_suffix "$IMG"; then
114 echo "This is already a vlnk file!"
115 exit 1
116 fi
117
118 if $VLNKCMD -t "$IMG"; then
119 echo "This is already a vlnk file!"
120 exit 1
121 fi
122
123 FULLIMG=$(readlink -f "$IMG")
124 if [ ! -f "$FULLIMG" ]; then
125 echo "$FULLIMG does not exist!"
126 exit 1
127 fi
128 vlog "Full file path is $FULLIMG"
129
130
131 #check img file position is a valid mountpoint
132 FULLDIR=${FULLIMG%/*}
133 while [ -n "${FULLDIR}" ]; do
134 if mountpoint -q "${FULLDIR}"; then
135 break
136 fi
137 FULLDIR="${FULLDIR%/*}"
138 done
139
140 if [ -z "${FULLDIR}" ]; then
141 FULLDIR=/
142 IMGPATH="${FULLIMG}"
143 else
144 IMGPATH="${FULLIMG#$FULLDIR}"
145 fi
146
147 IMGFILE=$(basename "$IMGPATH")
148 vlog "IMGPATH=$IMGPATH IMGFILE=$IMGFILE"
149
150
151 mntdev=$(mountpoint -d "${FULLDIR}")
152 vlog "mountpoint is ${FULLDIR} dev $mntdev"
153
154 #check fs
155 if grep -q " ${FULLDIR} " /proc/mounts; then
156 DEV=$(grep " ${FULLDIR} " /proc/mounts | awk '{print $1}')
157 FS=$(grep " ${FULLDIR} " /proc/mounts | awk '{print $3}')
158 vlog "File system of $DEV is $FS"
159
160 if echo $FS | grep -E -q "ext2|ext3|ext4|exfat|vfat|fat32|fat16|fat12|ntfs|xfs|udf"; then
161 vlog "FS OK"
162 elif [ "$FS" = "fuseblk" ]; then
163 vlog "$DEV is fuseblk"
164 if hexdump -C -n 8 $DEV | grep -q "NTFS"; then
165 vlog "$DEV is NTFS OK"
166 elif hexdump -C -n 8 $DEV | grep -q "EXFAT"; then
167 vlog "$DEV is exFAT OK"
168 else
169 echo "$DEV is not supported!"
170 hexdump -C -n 8 $DEV
171 exit 1
172 fi
173 else
174 echo "$FS is not supported!"
175 exit 1
176 fi
177 else
178 echo "${FULLDIR} not found in /proc/mounts"
179 exit 1
180 fi
181
182
183 Major=$(echo $mntdev | awk -F: '{print $1}')
184 Minor=$(echo $mntdev | awk -F: '{print $2}')
185 vlog "Major=$Major Minor=$Minor"
186
187 IMGPARTITION=""
188 while read line; do
189 M1=$(echo $line | awk '{print $1}')
190 M2=$(echo $line | awk '{print $2}')
191 if [ "$Major" = "$M1" -a "$Minor" = "$M2" ]; then
192 IMGPARTITION=$(echo $line | awk '{print $4}')
193 vlog "disk partition is $IMGPARTITION"
194 break
195 fi
196 done < /proc/partitions
197
198 if [ -z "$IMGPARTITION" ]; then
199 echo "Disk partition not found for $FULLDIR"
200 grep " $FULLDIR " /proc/mounts
201 exit 1
202 fi
203
204 if [ -f "/sys/class/block/$IMGPARTITION/start" ]; then
205 PARTSTART=$(cat "/sys/class/block/$IMGPARTITION/start")
206 if echo $IMGPARTITION | grep -E -q 'mmc|nbd|nvme'; then
207 DISK=$(echo /dev/$IMGPARTITION | sed "s/^\(.*\)p[0-9][0-9]*$/\1/")
208 else
209 DISK=$(echo /dev/$IMGPARTITION | sed "s/^\(.*[^0-9]\)[0-9][0-9]*$/\1/")
210 fi
211
212 if [ ! -b $DISK ]; then
213 echo "Device $DISK not exist!"
214 exit 1
215 fi
216
217 vlog "PARTSTART=$PARTSTART DISK=$DISK"
218 else
219 if echo $IMGPARTITION | grep -q '^dm-[0-9][0-9]*'; then
220 echo "LVM/DM is not supported!"
221 fi
222 echo "/sys/class/block/$IMGPARTITION/start not exist!"
223 exit 1
224 fi
225
226
227 if [ -n "$OUT" ]; then
228 lowersuffix=$(echo ${IMG##*.} | tr 'A-Z' 'a-z')
229 OUT="${OUT}.vlnk.${lowersuffix}"
230 else
231 name=${IMGFILE%.*}
232 lowersuffix=$(echo ${IMGFILE##*.} | tr 'A-Z' 'a-z')
233 OUT="${name}.vlnk.${lowersuffix}"
234 fi
235
236 echo "Output VLNK file is $OUT"
237 [ -f "${OUT}" ] && rm -f "${OUT}"
238
239 touch "${OUT}"
240 if [ -f "${OUT}" ]; then
241 rm -f "${OUT}"
242 else
243 echo "Failed to create ${OUT}"
244 exit 1
245 fi
246
247 if $VLNKCMD -c "$IMGPATH" -d $DISK -p $PARTSTART -o "${OUT}"; then
248 echo "====== Vlnk file create success ========="
249 echo ""
250 else
251 echo "====== Vlnk file create failed ========="
252 echo ""
253 exit 1
254 fi
255 elif [ "$CMD" = "l" ]; then
256 vlog "Parse vlnk for $VLNK"
257
258 if [ ! -f "$VLNK" ]; then
259 echo "$VLNK does not exist!"
260 exit 1
261 fi
262
263 if vlnk_suffix "$VLNK"; then
264 :
265 else
266 echo "Invalid vlnk file suffix!"
267 exit 1
268 fi
269
270 if $VLNKCMD -t "$VLNK"; then
271 vlog "Vlnk data check OK"
272 else
273 echo "This is not a valid vlnk file!"
274 exit 1
275 fi
276
277 $VLNKCMD -l "$VLNK"
278 echo ""
279 else
280 echo "invalid cmd"
281 print_usage
282 exit 1
283 fi