Add script to create and install Win98 into new VirtualBox VMs
parent
876ae2ec30
commit
a9e09395a1
|
@ -0,0 +1,317 @@
|
|||
# This is a script to automate creating a VirtualBox VM and setting up Windows 98 within it
|
||||
# in order to grab files from numerous localized versions of Windows 98 to gather up strings
|
||||
# and jumpstart localization of jspaint.
|
||||
# A better idea would have been to use an unattended answer file (msbatch.inf).
|
||||
# I knew there would be sysadmin type ways of doing this, but I went this route I guess because I thought it was cool.
|
||||
# It's a lot of work tho, and way less reliable.
|
||||
|
||||
target_lang=$1
|
||||
target_os_iso=$2
|
||||
vm_name="Win98-${target_lang}"
|
||||
already_got_image=false
|
||||
if [ ! "$target_lang" ] || [ ! "$target_os_iso" ]; then
|
||||
echo "Two arguments required: a target language code (e.g. en), and a path to an iso file."
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -f "$target_os_iso" ]; then
|
||||
echo "File \"$target_os_iso\" does not exist!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
window_id=
|
||||
wait_for_window(){
|
||||
local window_name=$1
|
||||
echo "Waiting for \"$window_name\" window"
|
||||
# "--sync" in this case means wait for results before exiting
|
||||
window_id=`xdotool search --sync --onlyvisible --name "$window_name"`
|
||||
echo "Found \"$window_name\" window"
|
||||
xdotool search --name "$window_name" windowactivate --sync
|
||||
}
|
||||
|
||||
wait_for_window "Oracle VM VirtualBox Manager"
|
||||
sleep 1
|
||||
if [ "$already_got_image" != true ]; then
|
||||
echo "Let's make a VM..."
|
||||
xdotool key --clearmodifiers --delay 20 ctrl+n
|
||||
wait_for_window "Create Virtual Machine"
|
||||
xdotool type --delay 20 "$vm_name"
|
||||
sleep 1
|
||||
echo "Create!"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
echo "Create hard disk"
|
||||
echo "Select Size slider"
|
||||
sleep 0.5
|
||||
xdotool key --clearmodifiers --delay 20 alt+s
|
||||
echo "Set it to lowest possible, to get MB units"
|
||||
sleep 0.5
|
||||
xdotool key --clearmodifiers --delay 20 Home
|
||||
echo "Select Size text input"
|
||||
sleep 0.5
|
||||
xdotool key --clearmodifiers --delay 20 Tab
|
||||
sleep 0.5
|
||||
echo "Set size to 300 MB"
|
||||
xdotool type --delay 20 "300"
|
||||
sleep 1
|
||||
echo "Choose fixed size hard disk image"
|
||||
xdotool key --clearmodifiers --delay 20 alt+f
|
||||
sleep 0.5
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
# echo "Waiting for VM to be created (sometimes it's fast, sometimes it takes a while)"
|
||||
# TODO: wait for popup windows to close instead of doing a fixed sleep
|
||||
# sleep 20
|
||||
echo "Waiting for VM to be created (popups to close)"
|
||||
xdotool search --name "Oracle VM VirtualBox Manager" windowactivate --sync
|
||||
fi
|
||||
|
||||
sleep 2
|
||||
echo "Launch the VM!"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 5
|
||||
|
||||
boot_into_setup(){
|
||||
echo "Select 2. Boot From CD ROM"
|
||||
# typing a 2 in this particular screen is INCREDIBLY FINNICKY
|
||||
# maybe the key is down and up too fast and I need to find how to separately trigger press and release
|
||||
# xdotool key --delay 200 222222222222222222222222
|
||||
# xdotool search --sync --name "$vm_name \[Running\] - Oracle VM VirtualBox" windowactivate --sync key --clearmodifiers --delay 20 2
|
||||
# could try xdotool type
|
||||
# Down + Return works tho
|
||||
xdotool key --clearmodifiers --delay 20 Down
|
||||
sleep 0.5
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 2
|
||||
echo "Select 1. Start Windows 98 Setup from CD ROM"
|
||||
xdotool key --clearmodifiers --delay 20 1
|
||||
sleep 0.5
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
}
|
||||
|
||||
if [ "$already_got_image" != true ]; then
|
||||
wait_for_window "Select start-up disk"
|
||||
echo "Select iso file..."
|
||||
xdotool key --clearmodifiers --delay 20 Tab
|
||||
sleep 1
|
||||
xdotool key --clearmodifiers --delay 20 space
|
||||
sleep 4
|
||||
# there is no way to add a new iso via the keyboard
|
||||
wait_for_window "Optical Disk Selector"
|
||||
xdotool mousemove --window "$window_id" 25 50
|
||||
sleep 0.5
|
||||
xdotool click 1
|
||||
wait_for_window "Please choose a virtual optical disk"
|
||||
xdotool key --clearmodifiers --delay 20 ctrl+l
|
||||
sleep 0.5
|
||||
xdotool type --delay 20 "${target_os_iso}"
|
||||
sleep 2
|
||||
echo "Open"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 2
|
||||
echo "Choose"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 2
|
||||
echo "Start"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 2
|
||||
fi
|
||||
|
||||
sleep 2
|
||||
wait_for_window "$vm_name \[Running\] - Oracle VM VirtualBox"
|
||||
boot_into_setup
|
||||
sleep 9
|
||||
|
||||
echo "Welcome to Setup - Set up Windows now"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 2
|
||||
echo "No, do not use large disk support"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 2
|
||||
echo "Setup will restart your computer now - Continue"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 3
|
||||
boot_into_setup
|
||||
sleep 9
|
||||
echo "Setup is now going to perform a routine check on your system. - Continue"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 8
|
||||
echo "Welcome to Windows 98 Setup. (GUI) - Continue"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 8
|
||||
echo "Select Directory (C:\\Windows\\) - Next"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 5
|
||||
echo "Setup Options (Typical) - Next"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 5
|
||||
echo "Windows Components (Install the most common components (Recommended) - Next"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
|
||||
sleep 5
|
||||
echo "Computer name"
|
||||
xdotool key --clearmodifiers --delay 20 alt+shift # switch language input
|
||||
sleep 0.5
|
||||
xdotool type --delay 20 "VM"
|
||||
sleep 0.5
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 5
|
||||
echo "Establishing Your Location - Next"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 1
|
||||
echo "Start Copying Files - Next"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
|
||||
echo "(It should be copying files.)"
|
||||
sleep 20
|
||||
echo "(This might take a while...)"
|
||||
sleep 100
|
||||
echo "(It better be almost done, or already done...)"
|
||||
sleep 10
|
||||
|
||||
# make sure you haven't wandered off
|
||||
wait_for_window "$vm_name \[Running\] - Oracle VM VirtualBox"
|
||||
sleep 2
|
||||
|
||||
echo "Username"
|
||||
xdotool key --clearmodifiers --delay 20 alt+shift # switch language input
|
||||
sleep 0.5
|
||||
xdotool type --delay 20 "User"
|
||||
sleep 0.5
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 1
|
||||
echo "Accept agreement"
|
||||
xdotool key --clearmodifiers --delay 20 Tab
|
||||
sleep 1
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 1
|
||||
echo "Product key"
|
||||
# Attempt 1: Type the key directly
|
||||
# Doesn't work with non-English language because it types e.g. Cyrillic instead
|
||||
# xdotool type --delay 20 "B8MFRCFTGQC9PBWVHG3J3R3YW"
|
||||
# but there's a built-in special keyboard for entering the product key, so we can use that
|
||||
|
||||
# Attempt 2: Tab thru the on-screen keyboard to enter the product key like a combination lock.
|
||||
# Doesn't work because pressing a button focuses an input, and tabbing to the buttons means focusing either the first or last input which will then recieve the text when buttons are pressed.
|
||||
# It's not meant to be used via the keyboard.
|
||||
|
||||
# echo "Enable product key on-screen keyboard"
|
||||
# sleep 1
|
||||
# xdotool key --delay 20 Tab
|
||||
# sleep 0.02
|
||||
# xdotool key --delay 20 Tab
|
||||
# sleep 0.02
|
||||
# xdotool key --delay 20 Tab
|
||||
# sleep 0.02
|
||||
# xdotool key --delay 20 Tab
|
||||
# sleep 0.02
|
||||
# xdotool key --delay 20 Tab
|
||||
# sleep 0.02
|
||||
# xdotool key --delay 20 space
|
||||
# sleep 1
|
||||
# xdotool key --delay 20 space
|
||||
# sleep 1
|
||||
# xdotool key --delay 20 Return
|
||||
# sleep 1
|
||||
|
||||
# JavaScript code to generate shell code for tabbing:
|
||||
# (()=> {
|
||||
# let buttons = "BCDFGHJKMPQRTVWXY2346789";
|
||||
# let tab_index = -5;
|
||||
# let product_key = "B8MFR - CFTGQ - C9PBW - VHG3J - 3R3YW".replace(/[\s-]/g, "");
|
||||
# let tab_indexes = product_key.split("").map((char)=> buttons.indexOf(char));
|
||||
# let shell_code = `echo "Enter product key (${product_key})"\n`;
|
||||
# for (let i=0; i<tab_indexes.length; i++) {
|
||||
# while (tab_indexes[i] < tab_index) {
|
||||
# tab_index -= 1;
|
||||
# shell_code += "xdotool key --delay 20 shift+Tab\n";
|
||||
# }
|
||||
# while (tab_indexes[i] > tab_index) {
|
||||
# tab_index += 1;
|
||||
# shell_code += "xdotool key --delay 20 Tab\n";
|
||||
# }
|
||||
# shell_code += "xdotool key --delay 20 space\n";
|
||||
# }
|
||||
# return shell_code
|
||||
# })();
|
||||
|
||||
# Attempt 3: click buttons with the mouse.
|
||||
# Doesn't work because of how VirtualBox takes control of the mouse.
|
||||
# It works fine with just mosuemove and not click, but with click,
|
||||
# xdotool gets confused and clicks in the wrong spots.
|
||||
# This behavior can be altered but afaik not fixed by using mousedown/mouseup instead of click.
|
||||
|
||||
# echo "Enable product key on-screen keyboard"
|
||||
# sleep 1
|
||||
# xdotool key --delay 20 Tab
|
||||
# sleep 0.02
|
||||
# xdotool key --delay 20 Tab
|
||||
# sleep 0.02
|
||||
# xdotool key --delay 20 Tab
|
||||
# sleep 0.02
|
||||
# xdotool key --delay 20 Tab
|
||||
# sleep 0.02
|
||||
# xdotool key --delay 20 Tab
|
||||
# sleep 0.02
|
||||
# xdotool key --delay 20 space
|
||||
# sleep 1
|
||||
# xdotool key --delay 20 space
|
||||
# sleep 1
|
||||
# xdotool key --delay 20 Return
|
||||
# sleep 1
|
||||
|
||||
# JavaScript code to generate shell code for mouse clicking:
|
||||
# (()=> {
|
||||
# let button_rows = [
|
||||
# ["B", "C", "D", "F", "G", "H", "J", "K", "M", "P", "Q", "R"],
|
||||
# ["T", "V", "W", "X", "Y", "2", "3", "4", "6", "7", "8", "9"],
|
||||
# ];
|
||||
# // let product_key = "B8MFR - CFTGQ - C9PBW - VHG3J - 3R3YW".replace(/[\s-]/g, "");
|
||||
# let product_key = "BCDFGHJKMPQRTVWXY2346789"; // for testing
|
||||
# let shell_code = `echo "Enter product key (${product_key})"\n`;
|
||||
# for (let i=0; i<product_key.length; i++) {
|
||||
# for (let y=0; y<button_rows.length; y++) {
|
||||
# let x = button_rows[y].indexOf(product_key[i]);
|
||||
# if (x !== -1) {
|
||||
# let mx = 230 + x * 26;
|
||||
# let my = 270 + y * 24;
|
||||
# shell_code += `
|
||||
# xdotool mousemove --window $window_id ${mx} ${my}
|
||||
# sleep 0.5
|
||||
# xdotool click 1`;
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
# return shell_code
|
||||
# })();
|
||||
|
||||
# Other ideas:
|
||||
# - Use an unattended answers file (msbatch.inf) instead of all this scripting
|
||||
# - Use a different program for desktop automation in order to send clicks properly
|
||||
# - Be sure to test clicking in the VM before converting any of this script!
|
||||
# - See if there's a setting or keyboard shortcut to switch keyboard layouts within Windows 98 setup
|
||||
|
||||
# echo ""
|
||||
# echo "Can't enter product key. You have to do the most tedious part yourself."
|
||||
# echo ""
|
||||
# echo "Product key: B8MFR - CFTGQ - C9PBW - VHG3J - 3R3YW"
|
||||
# echo ""
|
||||
# exit
|
||||
|
||||
# Attempt 4.
|
||||
# Switch language inputs before typing normally.
|
||||
echo "Enter product key (B8MFR - CFTGQ - C9PBW - VHG3J - 3R3YW)"
|
||||
xdotool key --clearmodifiers --delay 20 alt+shift
|
||||
sleep 0.5
|
||||
xdotool type --delay 20 "B8MFRCFTGQC9PBWVHG3J3R3YW"
|
||||
|
||||
# One liner to enter a key in case you need to try several keys:
|
||||
# xdotool search --sync --name "Win98-ja \[Running\] - Oracle VM VirtualBox" windowactivate --sync type --delay 20 "K4HVDQ9TJ96CRX9C9G68RQ2D3"
|
||||
|
||||
sleep 0.5
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 1
|
||||
echo "Finish (almost done, just Time Zone left after this...)"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 200
|
||||
echo "Time Zone"
|
||||
xdotool key --clearmodifiers --delay 20 Return
|
||||
sleep 1
|
||||
echo "All done here! Did it work? I hope it worked!"
|
Loading…
Reference in New Issue