mirror of
https://github.com/1j01/textual-paint.git
synced 2024-12-22 22:31:43 +03:00
327 lines
11 KiB
Bash
327 lines
11 KiB
Bash
|
# 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.
|
||
|
|
||
|
lang=$1
|
||
|
target_os_iso=$2
|
||
|
vm_name="Win98-${lang}"
|
||
|
already_got_image=false
|
||
|
if [ ! "$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
|
||
|
if [ "$lang" = "he" ]; then
|
||
|
echo "Select 2. Start Localized Windows 98 Setup from CD ROM"
|
||
|
xdotool key --clearmodifiers --delay 20 2
|
||
|
else
|
||
|
echo "Select 1. Start Windows 98 Setup from CD ROM"
|
||
|
xdotool key --clearmodifiers --delay 20 1
|
||
|
fi
|
||
|
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"
|
||
|
# computer has restarted at this point, so switch the language input again
|
||
|
xdotool key --clearmodifiers --delay 20 alt+shift
|
||
|
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.
|
||
|
# Actually, applied this (alt+shift) to the earlier input.
|
||
|
# The computer has not restarted since typing the User name,
|
||
|
# so don't switch language inputs again.
|
||
|
echo "Enter product key (B8MFR - CFTGQ - C9PBW - VHG3J - 3R3YW)"
|
||
|
sleep 0.5
|
||
|
xdotool type --delay 20 "B8MFRCFTGQC9PBWVHG3J3R3YW"
|
||
|
|
||
|
# One liner to enter a key in case you need to try several keys or retype the key:
|
||
|
# xdotool search --sync --name "Win98-ja \[Running\] - Oracle VM VirtualBox" windowactivate --sync type --delay 20 "K4HVDQ9TJ96CRX9C9G68RQ2D3"
|
||
|
# xdotool search --sync --name " \[Running\] - Oracle VM VirtualBox" windowactivate --sync type --delay 20 "B8MFRCFTGQC9PBWVHG3J3R3YW"
|
||
|
|
||
|
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!"
|