Replace live-installer with a more complex Python script
This commit is contained in:
parent
d6c5792138
commit
a58921681f
@ -38,7 +38,7 @@ clear
|
|||||||
while true; do
|
while true; do
|
||||||
echo ""
|
echo ""
|
||||||
echo "Welcome to windvn!"
|
echo "Welcome to windvn!"
|
||||||
echo "1: Fast install"
|
echo "1: Install"
|
||||||
echo "2: Open bash"
|
echo "2: Open bash"
|
||||||
echo "3: Reboot"
|
echo "3: Reboot"
|
||||||
echo "4: Shut down"
|
echo "4: Shut down"
|
||||||
@ -46,198 +46,7 @@ while true; do
|
|||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
if [ "$CHOICE" == "1" ]; then
|
if [ "$CHOICE" == "1" ]; then
|
||||||
(
|
/opt/wdvn/installer/main
|
||||||
set -e
|
|
||||||
YN="n"
|
|
||||||
while [ "$YN" == "n" ]; do
|
|
||||||
echo ""
|
|
||||||
lsblk -d -o PATH,SIZE
|
|
||||||
read -p "Device: " DEVICE
|
|
||||||
echo ""
|
|
||||||
lsblk "$DEVICE" -o NAME,SIZE,FSTYPE,PARTLABEL
|
|
||||||
read -p "All data on this disk will be erased! Continue? [y,n]: " YN
|
|
||||||
YN="$(echo "$YN" | tr "[:upper:]" "[:lower:]")"
|
|
||||||
if [ "$YN" != "y" ]; then
|
|
||||||
YN="n"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Ask for encryption
|
|
||||||
WDVN_ENCRYPT=""
|
|
||||||
WDVN_ENCRYPT_PASS=""
|
|
||||||
while true; do
|
|
||||||
read -p "Encrypt the disk? [y,n]: " WDVN_ENCRYPT
|
|
||||||
WDVN_ENCRYPT="$(echo "$WDVN_ENCRYPT" | tr "[:upper:]" "[:lower:]")"
|
|
||||||
if [ "$WDVN_ENCRYPT" == "y" ]; then
|
|
||||||
apt -y install cryptsetup
|
|
||||||
echo ""
|
|
||||||
loadkeys us
|
|
||||||
while true; do
|
|
||||||
read -s -p "Passphrase: " WDVN_ENCRYPT_PASS
|
|
||||||
echo ""
|
|
||||||
read -s -p "Confirm passphrase: " WDVN_ENCRYPT_PASS_CONFIRM
|
|
||||||
echo ""
|
|
||||||
if [ "$WDVN_ENCRYPT_PASS" == "$WDVN_ENCRYPT_PASS_CONFIRM" ]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
echo "Passwords don't match."
|
|
||||||
echo ""
|
|
||||||
done
|
|
||||||
service console-setup.sh restart
|
|
||||||
udevadm trigger --subsystem-match=input --action=change
|
|
||||||
service keyboard-setup.sh restart
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$WDVN_ENCRYPT" == "n" ]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Create partitions
|
|
||||||
echo "Creating partitions ..."
|
|
||||||
wipefs --all "$DEVICE"
|
|
||||||
sgdisk -n 1:2048:+1M -c 1:"BIOS boot partition" -t 1:ef02 "$DEVICE"
|
|
||||||
sgdisk -n 2::+512M -c 2:"EFI System" -t 2:ef00 "$DEVICE"
|
|
||||||
sgdisk -n 3::-0 -c 3:"Linux filesystem" -t 3:8300 "$DEVICE"
|
|
||||||
sgdisk --hybrid=1:2:3 "$DEVICE"
|
|
||||||
PART_EFI="$(echo "${DEVICE}"*2)"
|
|
||||||
PART_DATA="$(echo "${DEVICE}"*3)"
|
|
||||||
DEV_DATA="$PART_DATA"
|
|
||||||
|
|
||||||
# Additional passphrases
|
|
||||||
if [ "$WDVN_ENCRYPT" == "y" ]; then
|
|
||||||
echo "$WDVN_ENCRYPT_PASS" | cryptsetup luksFormat --type luks1 "$PART_DATA"
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
echo ""
|
|
||||||
read -p "Add another passphrase? [y,n]: " CHOICE
|
|
||||||
CHOICE="$(echo "$CHOICE" | tr "[:upper:]" "[:lower:]")"
|
|
||||||
if [ "$CHOICE" == "y" ]; then
|
|
||||||
loadkeys us
|
|
||||||
while true; do
|
|
||||||
read -s -p "Passphrase: " WDVN_ENCRYPT_PASS_ADD
|
|
||||||
echo ""
|
|
||||||
read -s -p "Confirm passphrase: " WDVN_ENCRYPT_PASS_ADD_CONFIRM
|
|
||||||
echo ""
|
|
||||||
if [ "$WDVN_ENCRYPT_PASS_ADD" == "$WDVN_ENCRYPT_PASS_ADD_CONFIRM" ]; then
|
|
||||||
echo "$WDVN_ENCRYPT_PASS
|
|
||||||
$WDVN_ENCRYPT_PASS_ADD" | cryptsetup luksAddKey "$PART_DEV"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
echo "Passwords don't match."
|
|
||||||
echo ""
|
|
||||||
done
|
|
||||||
service console-setup.sh restart
|
|
||||||
udevadm trigger --subsystem-match=input --action=change
|
|
||||||
service keyboard-setup.sh restart
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$CHOICE" == "n" ]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "$WDVN_ENCRYPT_PASS" | cryptsetup luksOpen "$PART_DATA" system
|
|
||||||
|
|
||||||
PART_DATA="/dev/mapper/system"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Format partitions
|
|
||||||
echo "Formatting partitions ..."
|
|
||||||
mkfs.fat -F32 "$PART_EFI"
|
|
||||||
mkfs.ext4 "$PART_DATA"
|
|
||||||
|
|
||||||
# Mount target partition
|
|
||||||
echo "Mounting partitions ..."
|
|
||||||
mkdir -p "/media/install"
|
|
||||||
mount "$PART_DATA" "/media/install"
|
|
||||||
mkdir -p "/media/install/efi"
|
|
||||||
mount "$PART_EFI" "/media/install/efi"
|
|
||||||
|
|
||||||
# Creating swap
|
|
||||||
echo "Creating swap ..."
|
|
||||||
dd if=/dev/zero of="/media/install/swap" bs=1M count=512 status=progress
|
|
||||||
chmod 600 "/media/install/swap"
|
|
||||||
mkswap "/media/install/swap"
|
|
||||||
swapon "/media/install/swap"
|
|
||||||
|
|
||||||
# Add files
|
|
||||||
echo "Adding files ..."
|
|
||||||
unsquashfs -f -d "/media/install" "/lib/live/mount/medium/live/filesystem.squashfs"
|
|
||||||
|
|
||||||
if [ "$WDVN_ENCRYPT" == "y" ]; then
|
|
||||||
echo "GRUB_ENABLE_CRYPTODISK=y" > "/media/install/etc/default/grub.d/cryptodisk.cfg"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Set hostname
|
|
||||||
echo "Setting hostname ..."
|
|
||||||
echo "$(head -c4 </dev/urandom|xxd -p -u)" >"/media/install/etc/hostname"
|
|
||||||
|
|
||||||
# Write fstab
|
|
||||||
UUID_PART_DATA="$(blkid -o value -s UUID "$PART_DATA")"
|
|
||||||
UUID_DEV_DATA="$(blkid -o value -s UUID "$DEV_DATA")"
|
|
||||||
|
|
||||||
echo "Writing fstab ..."
|
|
||||||
if [ "$WDVN_ENCRYPT" == "y" ]; then
|
|
||||||
echo "GRUB_CMDLINE_LINUX=\"\$GRUB_CMDLINE_LINUX cryptdevice=UUID=$UUID_DEV_DATA root=UUID=$UUID_PART_DATA\"" >> "/media/install/etc/default/grub.d/cryptodisk.cfg"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$WDVN_ENCRYPT" == "y" ]; then
|
|
||||||
echo "system UUID=$UUID_DEV_DATA none luks" >"media/install/etc/crypttab"
|
|
||||||
fi
|
|
||||||
echo "UUID=$UUID_PART_DATA / ext4 errors=remount-ro 0 1" >>"/media/install/etc/fstab"
|
|
||||||
echo "/swap none swap sw 0 0" >>"/media/install/etc/fstab"
|
|
||||||
|
|
||||||
# Copy keyboard settings
|
|
||||||
echo "Copying keyboard settings ..."
|
|
||||||
mkdir -p "/media/install/etc/default"
|
|
||||||
cp "/etc/default/keyboard" "/media/install/etc/default/keyboard"
|
|
||||||
|
|
||||||
# Remove live-specific packages
|
|
||||||
echo "Removing live-specific packages ..."
|
|
||||||
wdvn-chroot "/media/install" apt -y remove live-boot live-boot-initramfs-tools
|
|
||||||
wdvn-chroot "/media/install" apt -y autoremove
|
|
||||||
if [ "$WDVN_ENCRYPT" == "y" ]; then
|
|
||||||
wdvn-chroot "/media/install" apt -y install cryptsetup-initramfs
|
|
||||||
else
|
|
||||||
wdvn-chroot "/media/install" update-initramfs -u
|
|
||||||
fi
|
|
||||||
rm "/media/install/bin/login"
|
|
||||||
mv "/media/install/bin/login.oobe" "/media/install/bin/login"
|
|
||||||
|
|
||||||
# Install GRUB
|
|
||||||
echo "Installing grub ..."
|
|
||||||
wdvn-chroot "/media/install" grub-install --target=i386-efi --uefi-secure-boot --efi-directory="/efi" --boot-directory="/boot" "$DEVICE"
|
|
||||||
wdvn-chroot "/media/install" grub-install --target=x86_64-efi --uefi-secure-boot --efi-directory="/efi" --boot-directory="/boot" "$DEVICE"
|
|
||||||
wdvn-chroot "/media/install" grub-install --target=i386-pc --boot-directory="/boot" "$DEVICE"
|
|
||||||
wdvn-chroot "/media/install" update-grub
|
|
||||||
|
|
||||||
# Unmount
|
|
||||||
echo "Unmounting ..."
|
|
||||||
swapoff "/media/install/swap"
|
|
||||||
umount -l "/media/install/efi"
|
|
||||||
rmdir "/media/install/efi"
|
|
||||||
umount -l "/media/install"
|
|
||||||
rmdir "/media/install"
|
|
||||||
if [ "$WDVN_ENCRYPT" == "y" ]; then
|
|
||||||
cryptsetup luksClose system
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo Success. Press ENTER to quit setup.
|
|
||||||
read
|
|
||||||
)
|
|
||||||
if [ "$?" != "0" ]; then
|
|
||||||
echo "ERROR. Cleaning up ..."
|
|
||||||
swapoff "/media/install/swap"
|
|
||||||
umount -l "/media/install/efi"
|
|
||||||
umount -l "/media/install"
|
|
||||||
cryptsetup luksClose system
|
|
||||||
echo ""
|
|
||||||
echo An error occured. Press ENTER to quit setup.
|
|
||||||
read
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$CHOICE" == "2" ]; then
|
if [ "$CHOICE" == "2" ]; then
|
||||||
|
347
mods/live-installer/data/opt/wdvn/installer/main
Executable file
347
mods/live-installer/data/opt/wdvn/installer/main
Executable file
@ -0,0 +1,347 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import getpass
|
||||||
|
import time
|
||||||
|
import shutil
|
||||||
|
import random
|
||||||
|
|
||||||
|
def nerr(func,*args,**kwargs):
|
||||||
|
try:
|
||||||
|
return func(*args,**kwargs)
|
||||||
|
except:
|
||||||
|
return
|
||||||
|
|
||||||
|
def choiceYn(question,defaultPick = None):
|
||||||
|
qstring = "\n" + question + " y/n"
|
||||||
|
if defaultPick != None: qstring = qstring + " [" +defaultPick+ "]"
|
||||||
|
qstring = qstring + ": "
|
||||||
|
while True:
|
||||||
|
chinput = input(qstring)
|
||||||
|
if chinput == "" and defaultPick != None:
|
||||||
|
chinput = defaultPick
|
||||||
|
chinput = chinput.lower()
|
||||||
|
if chinput == "y": return True
|
||||||
|
if chinput == "n": return False
|
||||||
|
|
||||||
|
def choice(question,options,defaultPick = None,direction = 1):
|
||||||
|
qstring = "\n"
|
||||||
|
for option in options:
|
||||||
|
qstring = qstring + "- " + option + "\n"
|
||||||
|
qstring = qstring + question
|
||||||
|
if defaultPick != None: qstring = qstring + " [" +defaultPick+ "]"
|
||||||
|
qstring = qstring + ": "
|
||||||
|
|
||||||
|
while True:
|
||||||
|
chinput = input(qstring)
|
||||||
|
if chinput == "" and defaultPick != None:
|
||||||
|
chinput = defaultPick
|
||||||
|
if chinput in options: return chinput
|
||||||
|
|
||||||
|
def choiceInput(question,defaultPick = None):
|
||||||
|
qstring = "\n" + question
|
||||||
|
if defaultPick != None: qstring = qstring + " [" +defaultPick+ "]"
|
||||||
|
qstring = qstring + ": "
|
||||||
|
|
||||||
|
while True:
|
||||||
|
chinput = input(qstring)
|
||||||
|
if chinput == "":
|
||||||
|
if defaultPick == None: continue
|
||||||
|
return defaultPick
|
||||||
|
return chinput
|
||||||
|
|
||||||
|
def choicePass(question):
|
||||||
|
while True:
|
||||||
|
print("")
|
||||||
|
passw = getpass.getpass(question+ ": ")
|
||||||
|
passwConfirm = getpass.getpass(question+ " (repeat): ")
|
||||||
|
if passw == passwConfirm: return passw
|
||||||
|
print("Passwords don't match, try again.")
|
||||||
|
|
||||||
|
def checkProc(proc):
|
||||||
|
rtn = proc.wait()
|
||||||
|
if rtn != 0: raise Exception("Process returned error: " +str(rtn))
|
||||||
|
|
||||||
|
def call(*args,**kwargs):
|
||||||
|
proc = subprocess.Popen(*args,**kwargs)
|
||||||
|
checkProc(proc)
|
||||||
|
return
|
||||||
|
|
||||||
|
def callString(*args,**kwargs):
|
||||||
|
proc = subprocess.Popen(*args,**kwargs,stdout=subprocess.PIPE)
|
||||||
|
output = proc.stdout.read().decode("utf-8").strip("\n")
|
||||||
|
checkProc(proc)
|
||||||
|
return output
|
||||||
|
|
||||||
|
def callList(*args,**kwargs):
|
||||||
|
proc = subprocess.Popen(*args,**kwargs,stdout=subprocess.PIPE)
|
||||||
|
output = proc.stdout.read().decode("utf-8").strip("\n").split("\n")
|
||||||
|
checkProc(proc)
|
||||||
|
return output
|
||||||
|
|
||||||
|
def getDisks():
|
||||||
|
return callList(["lsblk","-ndo","PATH"])
|
||||||
|
|
||||||
|
def getPartitions():
|
||||||
|
disks = getDisks()
|
||||||
|
partitions = callList(["lsblk","-no","PATH"])
|
||||||
|
index = 0
|
||||||
|
length = len(partitions)
|
||||||
|
while index < length:
|
||||||
|
if partitions[index] in disks:
|
||||||
|
del partitions[index]
|
||||||
|
length -= 1
|
||||||
|
continue
|
||||||
|
index += 1
|
||||||
|
return partitions
|
||||||
|
|
||||||
|
def getDiskType(disk):
|
||||||
|
return callString(["blkid","-o","value","-s","PTTYPE",disk])
|
||||||
|
|
||||||
|
def getPartitionType(partition):
|
||||||
|
return callString(["blkid","-o","value","-s","TYPE",partition])
|
||||||
|
|
||||||
|
def getPartitionUUID(partition):
|
||||||
|
return callString(["blkid","-o","value","-s","UUID",partition])
|
||||||
|
|
||||||
|
def setKbLayout(kb):
|
||||||
|
call(["loadkeys",kb])
|
||||||
|
|
||||||
|
def resetKbLayout():
|
||||||
|
call(["service","console-setup.sh","restart"])
|
||||||
|
call(["udevadm","trigger","--subsystem-match=input","--action=change"])
|
||||||
|
call(["service","keyboard-setup.sh","restart"])
|
||||||
|
|
||||||
|
def ipth(path = ""):
|
||||||
|
return "/media/install/" +path
|
||||||
|
|
||||||
|
def mkdirp(path):
|
||||||
|
if not os.path.isdir(path): os.makedirs(path)
|
||||||
|
|
||||||
|
def chroot(path,cmd,*args,**kwargs):
|
||||||
|
dirs = ["dev","dev/pts","sys","proc"]
|
||||||
|
try:
|
||||||
|
for dir in dirs:
|
||||||
|
call(["mount","-o","bind","/" +dir,path + "/" +dir])
|
||||||
|
call(["chroot",path] + cmd,*args,**kwargs)
|
||||||
|
for dir in reversed(dirs):
|
||||||
|
call(["umount","-l",path + "/" +dir])
|
||||||
|
except Exception as e:
|
||||||
|
for dir in reversed(dirs):
|
||||||
|
try:
|
||||||
|
call(["umount","-l",path + "/" +dir])
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
raise e
|
||||||
|
|
||||||
|
def randhex(length):
|
||||||
|
chars = "0123456789ABCDEF"
|
||||||
|
output = ""
|
||||||
|
cLength = 0
|
||||||
|
while cLength < length:
|
||||||
|
output = output + chars[random.randrange(0,15)]
|
||||||
|
cLength += 1
|
||||||
|
return output
|
||||||
|
|
||||||
|
def main():
|
||||||
|
while choiceYn("Partition disk?"):
|
||||||
|
try:
|
||||||
|
disk = choice("Disk",getDisks())
|
||||||
|
call(["fdisk",disk])
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|
||||||
|
installPartition = choice("OS Partition",getPartitions())
|
||||||
|
formatPartition = choiceYn("Format partition?","y")
|
||||||
|
if formatPartition:
|
||||||
|
fileSystems = []
|
||||||
|
for path in os.environ["PATH"].split(":"):
|
||||||
|
if not os.path.isdir(path): continue
|
||||||
|
for root,dirs,files in os.walk(path):
|
||||||
|
for file in files:
|
||||||
|
ffile = os.path.join(root,file)
|
||||||
|
lfile = ffile.replace(path + os.path.sep,"",1)
|
||||||
|
if lfile.startswith("mkfs."): fileSystems.append(lfile.replace("mkfs.","",1))
|
||||||
|
|
||||||
|
fileSystems.sort()
|
||||||
|
defaultChoice = None
|
||||||
|
if "ext4" in fileSystems: defaultChoice = "ext4"
|
||||||
|
formatPartition = choice("File system",fileSystems,defaultChoice)
|
||||||
|
else:
|
||||||
|
formatPartition = None
|
||||||
|
|
||||||
|
if formatPartition != None:
|
||||||
|
encrypt = choiceYn("Encrypt data?")
|
||||||
|
if encrypt:
|
||||||
|
encryptionPasswords = []
|
||||||
|
setKbLayout("us")
|
||||||
|
try:
|
||||||
|
encryptionPasswords.append(choicePass("Encryption password"))
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
encrypt = False
|
||||||
|
resetKbLayout()
|
||||||
|
|
||||||
|
if encrypt:
|
||||||
|
while choiceYn("Add another password?"):
|
||||||
|
setKbLayout("us")
|
||||||
|
try:
|
||||||
|
encryptionPasswords.append(choicePass("Encryption password"))
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
resetKbLayout()
|
||||||
|
break
|
||||||
|
resetKbLayout()
|
||||||
|
|
||||||
|
installGRUB = choiceYn("Install GRUB?","y")
|
||||||
|
if installGRUB:
|
||||||
|
try:
|
||||||
|
grubDisk = choice("GRUB disk",getDisks())
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
installGRUB = False
|
||||||
|
|
||||||
|
print("")
|
||||||
|
print("The rest of this setup will continue without your input ...")
|
||||||
|
time.sleep(5)
|
||||||
|
print("")
|
||||||
|
|
||||||
|
print("> Wiping partition signature ...")
|
||||||
|
call(["wipefs","-a",installPartition])
|
||||||
|
|
||||||
|
if encrypt:
|
||||||
|
print("> Encrypting partition ...")
|
||||||
|
call(["apt","-y","install","cryptsetup"],stdout=subprocess.DEVNULL)
|
||||||
|
cryptPartition = installPartition
|
||||||
|
|
||||||
|
mainPass = encryptionPasswords.pop(0)
|
||||||
|
proc = subprocess.Popen(["cryptsetup","luksFormat","--type","luks1",cryptPartition],stdin=subprocess.PIPE)
|
||||||
|
proc.stdin.write((mainPass + "\n").encode("utf-8"))
|
||||||
|
proc.stdin.flush()
|
||||||
|
checkProc(proc)
|
||||||
|
|
||||||
|
for passw in encryptionPasswords:
|
||||||
|
print("Adding another password ...")
|
||||||
|
proc = subprocess.Popen(["cryptsetup","luksAddKey",cryptPartition],stdin=subprocess.PIPE)
|
||||||
|
proc.stdin.write((mainPass + "\n" + passw + "\n").encode("utf-8"))
|
||||||
|
proc.stdin.flush()
|
||||||
|
checkProc(proc)
|
||||||
|
|
||||||
|
print("Creating block device ...")
|
||||||
|
proc = subprocess.Popen(["cryptsetup","luksOpen",cryptPartition,"system"],stdin=subprocess.PIPE)
|
||||||
|
proc.stdin.write((mainPass + "\n").encode("utf-8"))
|
||||||
|
proc.stdin.flush()
|
||||||
|
checkProc(proc)
|
||||||
|
installPartition = "/dev/mapper/system"
|
||||||
|
|
||||||
|
if formatPartition != None:
|
||||||
|
print("> Formatting partition ...")
|
||||||
|
call(["mkfs." +formatPartition,installPartition])
|
||||||
|
|
||||||
|
print("> Grabbing partition UUIDs ...")
|
||||||
|
installPartitionUUID = getPartitionUUID(installPartition)
|
||||||
|
if encrypt: cryptPartitionUUID = getPartitionUUID(cryptPartition)
|
||||||
|
|
||||||
|
print("> Mounting main partition ...")
|
||||||
|
mkdirp(ipth())
|
||||||
|
call(["mount",installPartition,ipth()])
|
||||||
|
|
||||||
|
print("> Creating swap ...")
|
||||||
|
call(["dd","if=/dev/zero","of=" +ipth("swap"),"bs=1M","count=512","status=progress"])
|
||||||
|
call(["chmod","600",ipth("swap")])
|
||||||
|
call(["mkswap",ipth("swap")])
|
||||||
|
call(["swapon",ipth("swap")])
|
||||||
|
|
||||||
|
print("> Adding files ...")
|
||||||
|
call(["unsquashfs","-f","-d",ipth(),"/lib/live/mount/medium/live/filesystem.squashfs"])
|
||||||
|
|
||||||
|
print("Setting hostname ...")
|
||||||
|
hostname = randhex(8)
|
||||||
|
fh = open(ipth("etc/hostname"),"w")
|
||||||
|
fh.write(hostname + "\n")
|
||||||
|
fh.close()
|
||||||
|
|
||||||
|
if encrypt:
|
||||||
|
print("Writing crypto grub config ...")
|
||||||
|
fh = open(ipth("etc/default/grub.d/cryptodisk.cfg"),"w")
|
||||||
|
fh.write("GRUB_ENABLE_CRYPTODISK=y\n")
|
||||||
|
fh.write('GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX cryptdevice=UUID=' +cryptPartitionUUID+ ' root=UUID=' +installPartitionUUID+ '"\n')
|
||||||
|
fh.close()
|
||||||
|
|
||||||
|
print("Writing crypttab ...")
|
||||||
|
fh = open(ipth("etc/crypttab"),"w")
|
||||||
|
fh.write('system UUID=' +cryptPartitionUUID+ ' none luks\n')
|
||||||
|
fh.close()
|
||||||
|
|
||||||
|
print("Writing fstab ...")
|
||||||
|
fh = open(ipth("etc/fstab"),"w")
|
||||||
|
fh.write('UUID=' +installPartitionUUID+ ' / ' +getPartitionType(installPartition)+ ' defaults 0 1\n')
|
||||||
|
fh.write('/swap none swap sw 0 0\n')
|
||||||
|
fh.close()
|
||||||
|
|
||||||
|
print("Copying keyboard settings ...")
|
||||||
|
shutil.copyfile("/etc/default/keyboard",ipth("etc/default/keyboard"))
|
||||||
|
|
||||||
|
print("> Removing live-specific packages ...")
|
||||||
|
chroot(ipth(),["apt","-y","remove","live-boot","live-boot-initramfs-tools"])
|
||||||
|
chroot(ipth(),["apt","-y","autoremove"])
|
||||||
|
os.remove(ipth("bin/login"))
|
||||||
|
os.rename(ipth("bin/login.oobe"),ipth("bin/login"))
|
||||||
|
|
||||||
|
if encrypt:
|
||||||
|
print("> Installing encryption-specific packages ...")
|
||||||
|
chroot(ipth(),["apt","-y","install","cryptsetup-initramfs"])
|
||||||
|
else:
|
||||||
|
print("> Updating initramfs ...")
|
||||||
|
chroot(ipth(),["update-initramfs","-u"])
|
||||||
|
|
||||||
|
if installGRUB:
|
||||||
|
print("> Installing GRUB")
|
||||||
|
mbrInstall = True
|
||||||
|
diskType = getDiskType(grubDisk)
|
||||||
|
if diskType == "gpt":
|
||||||
|
print("Scanning GPT disk ...")
|
||||||
|
partitions = callList(["lsblk",grubDisk,"-no","PATH"])
|
||||||
|
|
||||||
|
del partitions[0]
|
||||||
|
try:
|
||||||
|
del partitions[partitions.index(installPartition)]
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if crypto:
|
||||||
|
try:
|
||||||
|
del partitions[partitions.index(cryptoPartition)]
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if len(partitions) > 0:
|
||||||
|
partType = getPartitionType(partitions[0])
|
||||||
|
if partType == "fat" or partType == "vfat":
|
||||||
|
print("Mounting ESP ...")
|
||||||
|
mkdirp(ipth("boot/efi"))
|
||||||
|
call(["mount",partitions[0],ipth("boot/efi")])
|
||||||
|
print("Installing GRUB ...")
|
||||||
|
mbrInstall = False
|
||||||
|
chroot(ipth(),["grub-install","--target=i386-efi","--uefi-secure-boot","--efi-directory=/boot/efi","--boot-directory=/boot",grubDisk])
|
||||||
|
chroot(ipth(),["grub-install","--target=x86_64-efi","--uefi-secure-boot","--efi-directory=/boot/efi","--boot-directory=/boot",grubDisk])
|
||||||
|
chroot(ipth(),["grub-install","--target=i386-pc","--boot-directory=/boot",grubDisk])
|
||||||
|
chroot(ipth(),["update-grub"])
|
||||||
|
print("Unmounting ESP ...")
|
||||||
|
call(["umount","-l",ipth("boot/efi")])
|
||||||
|
os.rmdir(ipth("boot/efi"))
|
||||||
|
|
||||||
|
if mbrInstall:
|
||||||
|
if diskType == "gpt":
|
||||||
|
print("WARNING: GPT disk unsuitable for EFI, installing BIOS payload only.")
|
||||||
|
print("Installing GRUB ...")
|
||||||
|
chroot(ipth(),["grub-install","--target=i386-pc","--boot-directory=/boot",grubDisk])
|
||||||
|
chroot(ipth(),["update-grub"])
|
||||||
|
|
||||||
|
print("> Unmounting ...")
|
||||||
|
call(["swapoff",ipth("swap")])
|
||||||
|
call(["umount",ipth()])
|
||||||
|
os.rmdir(ipth())
|
||||||
|
if encrypt: call(["cryptsetup","luksClose","system"])
|
||||||
|
|
||||||
|
print("Success. Press ENTER to quit setup.")
|
||||||
|
input()
|
||||||
|
|
||||||
|
main()
|
@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
export WDVN_PACKAGES="$WDVN_PACKAGES gdisk dosfstools squashfs-tools console-data"
|
export WDVN_PACKAGES="$WDVN_PACKAGES btrfs-progs squashfs-tools console-data python3"
|
||||||
export WDVN_REMOVE="$WDVN_REMOVE dosfstools squashfs-tools"
|
export WDVN_REMOVE="$WDVN_REMOVE squashfs-tools"
|
||||||
cp "$1/bin/login" "$1/bin/login.oobe"
|
cp "$1/bin/login" "$1/bin/login.oobe"
|
Loading…
Reference in New Issue
Block a user