Skip to content

Commit 65b3804

Browse files
committed
Update validate.sh to login and execute command in QEMU
Signed-off-by: Teoh Suh Haw <suh.haw.teoh@intel.com>
1 parent 8d48168 commit 65b3804

File tree

1 file changed

+120
-34
lines changed

1 file changed

+120
-34
lines changed

validate.sh

Lines changed: 120 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@ run_qemu_boot_test() {
4444
fi
4545

4646
BIOS="/usr/share/OVMF/OVMF_CODE_4M.fd"
47-
TIMEOUT=30
48-
SUCCESS_STRING="login:"
47+
TIMEOUT=60
48+
LOGIN_SUCCESS_STRING="login:"
49+
UNAME_SUCCESS_STRING="Linux"
4950
LOGFILE="qemu_serial.log"
5051

5152
ORIGINAL_DIR=$(pwd)
@@ -84,44 +85,87 @@ run_qemu_boot_test() {
8485
#create log file ,boot image into qemu , return the pass or fail after boot sucess
8586
sudo bash -c "
8687
LOGFILE=\"$LOGFILE\"
87-
SUCCESS_STRING=\"$SUCCESS_STRING\"
88+
LOGIN_SUCCESS_STRING=\"$LOGIN_SUCCESS_STRING\"
89+
UNAME_SUCCESS_STRING=\"$UNAME_SUCCESS_STRING\"
8890
IMAGE=\"$IMAGE\"
8991
RAW_IMAGE=\"$RAW_IMAGE\"
9092
ORIGINAL_DIR=\"$ORIGINAL_DIR\"
9193
92-
touch \"\$LOGFILE\" && chmod 666 \"\$LOGFILE\"
94+
touch \"\$LOGFILE\" && chmod 666 \"\$LOGFILE\"
95+
96+
# Create a named pipe for sending commands to QEMU
97+
mkfifo qemu_input
98+
99+
# Copy OVMF vars to writable location
100+
cp /usr/share/OVMF/OVMF_VARS_4M.fd ./OVMF_VARS_4M.fd
101+
102+
# Start QEMU with proper console configuration
93103
nohup qemu-system-x86_64 \\
94104
-m 2048 \\
95105
-enable-kvm \\
96106
-cpu host \\
97107
-drive if=none,file=\"\$IMAGE\",format=raw,id=nvme0 \\
98108
-device nvme,drive=nvme0,serial=deadbeef \\
99109
-drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE_4M.fd \\
100-
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS_4M.fd \\
110+
-drive if=pflash,format=raw,file=./OVMF_VARS_4M.fd \\
101111
-nographic \\
102-
-serial mon:stdio \\
103-
> \"\$LOGFILE\" 2>&1 &
112+
-monitor none \\
113+
-serial file:\"\$LOGFILE\" \\
114+
-netdev user,id=net0 \\
115+
-device virtio-net-pci,netdev=net0 \\
116+
< qemu_input &
104117
105118
qemu_pid=\$!
106119
echo \"QEMU launched as root with PID \$qemu_pid\"
107120
echo \"Current working dir: \$(pwd)\"
108121
109-
# Wait for SUCCESS_STRING or timeout
110-
timeout=30
122+
# Wait for login prompt
123+
timeout=60
111124
elapsed=0
112-
while ! grep -q \"\$SUCCESS_STRING\" \"\$LOGFILE\" && [ \$elapsed -lt \$timeout ]; do
125+
while ! grep -q \"\$LOGIN_SUCCESS_STRING\" \"\$LOGFILE\" && [ \$elapsed -lt \$timeout ]; do
113126
sleep 1
114127
elapsed=\$((elapsed + 1))
115128
done
116-
echo \"\$elapsed\"
117-
kill \$qemu_pid
129+
130+
if grep -q \"\$LOGIN_SUCCESS_STRING\" \"\$LOGFILE\"; then
131+
echo \"Login prompt detected after \$elapsed seconds\"
132+
133+
# Send login sequence
134+
{
135+
echo \"user\"
136+
sleep 2
137+
echo \"user\"
138+
sleep 2
139+
echo \"uname -a\"
140+
sleep 2
141+
echo \"exit\"
142+
sleep 1
143+
} > qemu_input &
144+
145+
# Wait for uname output
146+
uname_timeout=30
147+
uname_elapsed=0
148+
while ! grep -q \"\$UNAME_SUCCESS_STRING\" \"\$LOGFILE\" && [ \$uname_elapsed -lt \$uname_timeout ]; do
149+
sleep 1
150+
uname_elapsed=\$((uname_elapsed + 1))
151+
done
152+
153+
echo \"Waiting completed after \$uname_elapsed seconds\"
154+
fi
155+
156+
# Clean up and kill QEMU
157+
kill \$qemu_pid 2>/dev/null || true
158+
rm -f qemu_input OVMF_VARS_4M.fd
159+
160+
echo \"=== QEMU Output ===\"
118161
cat \"\$LOGFILE\"
162+
echo \"=== End Output ===\"
119163
120-
if grep -q \"\$SUCCESS_STRING\" \"\$LOGFILE\"; then
121-
echo \"Boot success!\"
164+
if grep -q \"\$UNAME_SUCCESS_STRING\" \"\$LOGFILE\"; then
165+
echo \"Login and uname command executed successfully!\"
122166
result=0
123167
else
124-
echo \"Boot failed or timed out\"
168+
echo \"Failed to login or execute uname command\"
125169
result=1
126170
fi
127171
@@ -149,8 +193,9 @@ run_qemu_boot_test_iso() {
149193
fi
150194

151195
BIOS="/usr/share/OVMF/OVMF_CODE_4M.fd"
152-
TIMEOUT=30
153-
SUCCESS_STRING="login:"
196+
TIMEOUT=60
197+
LOGIN_SUCCESS_STRING="login:"
198+
UNAME_SUCCESS_STRING="Linux"
154199
LOGFILE="qemu_serial_iso.log"
155200

156201
ORIGINAL_DIR=$(pwd)
@@ -184,45 +229,86 @@ run_qemu_boot_test_iso() {
184229
#create log file ,boot ISO image into qemu , return the pass or fail after boot sucess
185230
sudo bash -c "
186231
LOGFILE=\"$LOGFILE\"
187-
SUCCESS_STRING=\"$SUCCESS_STRING\"
232+
LOGIN_SUCCESS_STRING=\"$LOGIN_SUCCESS_STRING\"
233+
UNAME_SUCCESS_STRING=\"$UNAME_SUCCESS_STRING\"
188234
IMAGE=\"$IMAGE\"
189-
RAW_IMAGE=\"$RAW_IMAGE\"
190235
ORIGINAL_DIR=\"$ORIGINAL_DIR\"
191236
192-
touch \"\$LOGFILE\" && chmod 666 \"\$LOGFILE\"
237+
touch \"\$LOGFILE\" && chmod 666 \"\$LOGFILE\"
238+
239+
# Create a named pipe for sending commands to QEMU
240+
mkfifo qemu_input_iso
241+
242+
# Copy OVMF vars to writable location
243+
cp /usr/share/OVMF/OVMF_VARS_4M.fd ./OVMF_VARS_4M_iso.fd
244+
245+
# Start QEMU with ISO using CD-ROM drive
193246
nohup qemu-system-x86_64 \\
194247
-m 2048 \\
195248
-enable-kvm \\
196249
-cpu host \\
197-
-drive if=none,file=\"\$IMAGE\",format=raw,id=nvme0 \\
198-
-device nvme,drive=nvme0,serial=deadbeef \\
250+
-cdrom \"\$IMAGE\" \\
199251
-drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE_4M.fd \\
200-
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS_4M.fd \\
252+
-drive if=pflash,format=raw,file=./OVMF_VARS_4M_iso.fd \\
201253
-nographic \\
202-
-serial mon:stdio \\
203-
> \"\$LOGFILE\" 2>&1 &
254+
-monitor none \\
255+
-serial file:\"\$LOGFILE\" \\
256+
-netdev user,id=net0 \\
257+
-device virtio-net-pci,netdev=net0 \\
258+
< qemu_input_iso &
204259
205260
qemu_pid=\$!
206261
echo \"QEMU launched as root with PID \$qemu_pid\"
207262
echo \"Current working dir: \$(pwd)\"
208263
209-
# Wait for SUCCESS_STRING or timeout
210-
timeout=30
264+
# Wait for login prompt
265+
timeout=60
211266
elapsed=0
212-
while ! grep -q \"\$SUCCESS_STRING\" \"\$LOGFILE\" && [ \$elapsed -lt \$timeout ]; do
267+
while ! grep -q \"\$LOGIN_SUCCESS_STRING\" \"\$LOGFILE\" && [ \$elapsed -lt \$timeout ]; do
213268
sleep 1
214269
elapsed=\$((elapsed + 1))
215270
done
216-
echo \"\$elapsed\"
217-
kill \$qemu_pid
271+
272+
if grep -q \"\$LOGIN_SUCCESS_STRING\" \"\$LOGFILE\"; then
273+
echo \"Login prompt detected after \$elapsed seconds\"
274+
275+
# Send login sequence
276+
{
277+
echo \"user\"
278+
sleep 2
279+
echo \"user\"
280+
sleep 2
281+
echo \"uname -a\"
282+
sleep 2
283+
echo \"exit\"
284+
sleep 1
285+
} > qemu_input_iso &
286+
287+
# Wait for uname output
288+
uname_timeout=30
289+
uname_elapsed=0
290+
while ! grep -q \"\$UNAME_SUCCESS_STRING\" \"\$LOGFILE\" && [ \$uname_elapsed -lt \$uname_timeout ]; do
291+
sleep 1
292+
uname_elapsed=\$((uname_elapsed + 1))
293+
done
294+
295+
echo \"Waiting completed after \$uname_elapsed seconds\"
296+
fi
297+
298+
# Clean up and kill QEMU
299+
kill \$qemu_pid 2>/dev/null || true
300+
rm -f qemu_input_iso OVMF_VARS_4M_iso.fd
301+
302+
echo \"=== QEMU ISO Output ===\"
218303
cat \"\$LOGFILE\"
304+
echo \"=== End Output ===\"
219305
220-
if grep -q \"\$SUCCESS_STRING\" \"\$LOGFILE\"; then
221-
echo \"Boot success!\"
306+
if grep -q \"\$UNAME_SUCCESS_STRING\" \"\$LOGFILE\"; then
307+
echo \"Login and uname command executed successfully!\"
222308
result=0
223309
else
224-
echo \"Boot failed or timed out\"
225-
result=0 #setting return value 0 instead of 1 until fully debugged ERRRORRR
310+
echo \"Failed to login or execute uname command\"
311+
result=1
226312
fi
227313
228314
# Return to original directory

0 commit comments

Comments
 (0)