2
0
mirror of https://github.com/mbusb/multibootusb synced 2024-11-18 15:25:46 +00:00
multibootusb/scripts/update_cfg_file.py
mbusb 38f28e15c4 Prepare for version 8.7.0 and other improvements
1. Version upgraded to 8.7.0
2. Updated changelog for version 8.7.0
3. Auto convert multibootusb file ending to Linux using dos2unix during packaging
4. Re-enable log message
5. Avoid crashing due to existence of syslinux.cfg
2017-04-29 18:11:11 +05:30

431 lines
26 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Name: update_cfg_file.py
# Purpose: Module to manipulate distro specific and main config files.
# Authors: Sundar
# Licence: This file is a part of multibootusb package. You can redistribute it or modify
# under the terms of GNU General Public License, v.2 or above
import os
import re
import shutil
from .usb import *
from .gen import *
from .iso import *
from . import config
from . import grub
from . import menus
def update_distro_cfg_files(iso_link, usb_disk, distro, persistence=0):
"""
Main function to modify/update distro specific strings on distro config files.
:return:
"""
usb_details = details(usb_disk)
usb_mount = usb_details['mount_point']
usb_uuid = usb_details['uuid']
usb_label = usb_details['label']
patch = None
iso_cfg_ext_dir = os.path.join(multibootusb_host_dir(), "iso_cfg_ext_dir")
if isolinux_bin_exist(config.image_path):
isolinux_path = os.path.join(iso_cfg_ext_dir, isolinux_bin_path(iso_link)[1:])
config.status_text = "Updating config files..."
install_dir = os.path.join(usb_mount, "multibootusb", iso_basename(iso_link))
log('Updating distro specific config files...')
for dirpath, dirnames, filenames in os.walk(install_dir):
for f in filenames:
if f.endswith(".cfg") or f.endswith('.CFG') or f.endswith('.lst') or f.endswith('.conf'):
cfg_file = os.path.join(dirpath, f)
try:
string = open(cfg_file, errors='ignore').read()
except IOError:
log("Unable to read ", cfg_file)
else:
if not distro == "generic":
replace_text = r'\1/multibootusb/' + iso_basename(iso_link) + '/'
string = re.sub(r'([ \t =,])/', replace_text, string)
string = re.sub(r'linuxefi', 'linux', string)
string = re.sub(r'initrdefi', 'initrd', string)
if distro == "ubuntu":
string = re.sub(r'boot=casper',
'boot=casper cdrom-detect/try-usb=true floppy.allowed_drive_mask=0 ignore_uuid '
'ignore_bootid root=UUID=' + usb_uuid + ' live-media-path=/multibootusb/'
+ iso_basename(iso_link) + '/casper', string)
string = re.sub(r'ui gfxboot', '#ui gfxboot', string)
if not persistence == 0:
string = re.sub(r'boot=casper', 'boot=casper persistent persistent-path=/multibootusb/' +
iso_basename(iso_link) + "/", string)
elif distro == "debian" or distro == "debian-install":
string = re.sub(r'boot=live', 'boot=live ignore_bootid live-media-path=/multibootusb/' +
iso_basename(iso_link) + '/live', string)
if not persistence == 0:
string = re.sub(r'boot=live', 'boot=live persistent persistent-path=/multibootusb/' +
iso_basename(iso_link) + "/", string)
elif distro == 'grml':
string = re.sub(r'live-media-path=', 'ignore_bootid live-media-path=', string)
elif distro == "ubuntu-server":
string = re.sub(r'file',
'cdrom-detect/try-usb=true floppy.allowed_drive_mask=0 ignore_uuid ignore_bootid root=UUID=' +
usb_uuid + ' file', string)
elif distro == "fedora":
string = re.sub(r'root=\S*', 'root=live:UUID=' + usb_uuid, string)
if re.search(r'liveimg', string, re.I):
string = re.sub(r'liveimg', 'liveimg live_dir=/multibootusb/' +
iso_basename(iso_link) + '/LiveOS', string)
elif re.search(r'rd.live.image', string, re.I):
string = re.sub(r'rd.live.image', 'rd.live.image rd.live.dir=/multibootusb/' +
iso_basename(iso_link) + '/LiveOS', string)
elif re.search(r'Solus', string, re.I):
string = re.sub(r'initrd=', 'rd.live.dir=/multibootusb/' + iso_basename(iso_link) +
'/LiveOS initrd=', string)
if not persistence == 0:
if re.search(r'liveimg', string, re.I):
string = re.sub(r'liveimg', 'liveimg overlay=UUID=' + usb_uuid, string)
elif re.search(r'rd.live.image', string, re.I):
string = re.sub(r'rd.live.image', 'rd.live.image rw rd.live.overlay=UUID=' + usb_uuid, string)
string = re.sub(r' ro ', '', string)
elif distro == 'kaspersky':
if not os.path.exists(os.path.join(usb_mount, 'multibootusb', iso_basename(iso_link), 'kaspersky.cfg')):
shutil.copyfile(resource_path(os.path.join('data', 'multibootusb', 'syslinux.cfg')),
os.path.join(usb_mount, 'multibootusb', iso_basename(iso_link), 'kaspersky.cfg'))
config_string = kaspersky_config('kaspersky')
config_string = config_string.replace('$INSTALL_DIR', '/multibootusb/' + iso_basename(iso_link))
config_string = re.sub(r'root=live:UUID=', 'root=live:UUID=' + usb_uuid, config_string)
with open(os.path.join(usb_mount, 'multibootusb', iso_basename(iso_link), 'kaspersky.cfg'), "a") as f:
f.write(config_string)
elif distro == "parted-magic":
if re.search(r'append', string, re.I):
string = re.sub(r'append', 'append directory=/multibootusb/' + iso_basename(iso_link), string,
flags=re.I)
string = re.sub(r'initrd=', 'directory=/multibootusb/' + iso_basename(iso_link) + '/ initrd=',
string)
elif distro == "ubcd":
string = re.sub(r'iso_filename=\S*', 'directory=/multibootusb/' + iso_basename(iso_link),
string, flags=re.I)
elif distro == 'f4ubcd':
if not 'multibootusb' in string:
string = re.sub(r'/HBCD', '/multibootusb/' + iso_basename(iso_link) + '/HBCD', string)
if not 'multibootusb' in string:
string = re.sub(r'/F4UBCD', '/multibootusb/' + iso_basename(iso_link) + '/F4UBCD', string)
elif distro == "ipcop":
string = re.sub(r'ipcopboot=cdrom\S*', 'ipcopboot=usb', string)
elif distro == "puppy":
if 'pmedia=cd' in string:
string = re.sub(r'pmedia=cd\S*',
'pmedia=usbflash psubok=TRUE psubdir=/multibootusb/' + iso_basename(iso_link) + '/',
string)
elif 'rootfstype' in string:
string = re.sub(r'rootfstype',
'pmedia=usbflash psubok=TRUE psubdir=/multibootusb/' + iso_basename(iso_link) + '/ rootfstype',
string)
elif distro == "slax":
string = re.sub(r'initrd=',
r'from=/multibootusb/' + iso_basename(iso_link) + '/slax fromusb initrd=', string)
elif distro == "finnix":
string = re.sub(r'initrd=',
r'finnixdir=/multibootusb/' + iso_basename(iso_link) + '/finnix initrd=', string)
elif distro == "knoppix":
string = re.sub(r'initrd=', 'knoppix_dir=/multibootusb/' + iso_basename(iso_link) + '/KNOPPIX initrd=', string)
elif distro == "gentoo":
string = re.sub(r'append ',
'append real_root=' + usb_disk + ' slowusb subdir=/multibootusb/' +
iso_basename(iso_link) + '/ ', string, flags=re.I)
elif distro == "systemrescuecd":
rows = []
subdir = '/multibootusb/' + iso_basename(iso_link)
for line in string.splitlines(True):
addline = True
if re.match(r'append.*--.*', line, flags=re.I):
line = re.sub(r'(append)(.*)--(.*)', r'\1\2subdir=' + subdir + r' --\3 subdir=' + subdir,
line, flags=re.I)
elif re.match(r'append', line, flags=re.I):
line = re.sub(r'(append)', r'\1 subdir=' + subdir, line, flags=re.I)
elif re.match(r'label rescue(32|64)_1', line, flags=re.I):
rows.append(line)
rows.append('append subdir=%s\n' % (subdir,))
addline = False
if addline:
rows.append(line)
string = ''.join(rows)
elif distro == "arch" or distro == "chakra":
string = re.sub(r'isolabel=\S*',
'isodevice=/dev/disk/by-uuid/' + usb_uuid, string, flags=re.I)
string = re.sub(r'isobasedir=',
'isobasedir=/multibootusb/' + iso_basename(iso_link) + '/', string, flags=re.I)
string = re.sub(r'ui gfxboot', '# ui gfxboot', string) # Bug in the isolinux package
if 'manjaro' in string:
if not os.path.exists(os.path.join(usb_mount, '.miso')):
with open(os.path.join(usb_mount, '.miso'), "w") as f:
f.write('')
elif distro == "kaos":
string = re.sub(r'kdeosisolabel=\S*',
'kdeosisodevice=/dev/disk/by-uuid/' + usb_uuid, string, flags=re.I)
string = re.sub(r'append',
'append kdeosisobasedir=/multibootusb/' + iso_basename(iso_link) + '/kdeos/', string, flags=re.I)
string = re.sub(r'ui gfxboot', '# ui gfxboot', string) # Bug in the isolinux package
elif distro == "suse" or distro == "opensuse":
if re.search(r'opensuse_12', string, re.I):
string = re.sub(r'append',
'append loader=syslinux isofrom_system=/dev/disk/by-uuid/' + usb_uuid + ":/" +
iso_name(iso_link), string, flags=re.I)
else:
string = re.sub(r'append',
'append loader=syslinux isofrom_device=/dev/disk/by-uuid/' + usb_uuid +
' isofrom_system=/multibootusb/' + iso_basename(iso_link) + '/' + iso_name(iso_link),
string, flags=re.I)
elif distro == 'opensuse-install':
string = re.sub(r'splash=silent', 'splash=silent install=hd:/dev/disk/by-uuid/'
+ config.usb_uuid + '/multibootusb/' + iso_basename(iso_link), string)
elif distro == "pclinuxos":
string = re.sub(r'livecd=',
'fromusb livecd=' + '/multibootusb/' + iso_basename(iso_link) + '/',
string)
string = re.sub(r'prompt', '#prompt', string)
string = re.sub(r'ui gfxboot.com', '#ui gfxboot.com', string)
string = re.sub(r'timeout', '#timeout', string)
elif distro == "wifislax":
string = re.sub(r'vmlinuz',
'vmlinuz from=multibootusb/' + iso_basename(iso_link) + ' noauto', string)
string = re.sub(r'vmlinuz2',
'vmlinuz2 from=multibootusb/' + iso_basename(iso_link) + ' noauto', string)
elif distro == "porteus":
string = re.sub(r'APPEND',
'APPEND from=/multibootusb/' + iso_basename(iso_link) + ' noauto', string)
string = re.sub(r'vmlinuz2',
'vmlinuz2 from=multibootusb/' + iso_basename(iso_link) + ' noauto', string)
elif distro == "hbcd":
if not 'multibootusb' in string:
string = re.sub(r'/HBCD', '/multibootusb/' + iso_basename(iso_link) + '/HBCD', string)
elif distro == "zenwalk":
string = re.sub(r'initrd=',
'from=/multibootusb/' + iso_basename(iso_link) + '/' + iso_name(iso_link) + ' initrd=',
string)
elif distro == "mageialive":
string = re.sub(r'LABEL=\S*', 'LABEL=' + usb_label, string)
elif distro == "antix":
string = re.sub(r'APPEND', 'image_dir=/multibootusb/' + iso_basename(iso_link), string)
elif distro == "solydx":
string = re.sub(r'live-media-path=', 'live-media-path=/multibootusb/' + iso_basename(iso_link),
string)
elif distro == "salix-live":
string = re.sub(r'iso_path', '/multibootusb/' + iso_basename(iso_link) + '/' + iso_name(iso_link),
string)
string = re.sub(r'initrd', 'fromiso=/multibootusb/' + iso_basename(iso_link) + '/' +
iso_name(iso_link) + ' initrd', string)
elif distro == 'alt-linux':
string = re.sub(r':cdrom', ':disk', string)
elif distro == 'fsecure':
string = re.sub(r'APPEND ramdisk_size', 'APPEND noprompt ' + 'knoppix_dir=/multibootusb/' + iso_basename(iso_link)
+ '/KNOPPIX ramdisk_size', string)
config_file = open(cfg_file, "w")
config_file.write(string)
config_file.close()
update_mbusb_cfg_file(iso_link, usb_uuid, usb_mount, distro)
grub.mbusb_update_grub_cfg()
# Ensure that isolinux.cfg file is copied as syslinux.cfg to boot correctly.
for dirpath, dirnames, filenames in os.walk(install_dir):
for f in filenames:
if f.lower().endswith("isolinux.cfg"):
if not os.path.exists(os.path.join(dirpath, "syslinux.cfg")):
try:
shutil.copyfile(os.path.join(dirpath, f), os.path.join(dirpath, "syslinux.cfg"))
except Exception as e:
log('Copying isolinux to syslinux failed...')
log(e)
else:
continue
# Assertain if the entry is made..
sys_cfg_file = os.path.join(config.usb_mount, "multibootusb", "syslinux.cfg")
if gen.check_text_in_file(sys_cfg_file, iso_basename(config.image_path)):
log('Updated entry in syslinux.cfg...')
else:
log('Unable to update entry in syslinux.cfg...')
# Check if bootx64.efi is replaced by distro
efi_grub_img = os.path.join(config.usb_mount, 'EFI', 'BOOT', 'bootx64.efi')
if not os.path.exists(efi_grub_img):
gen.log('EFI image does not exist. Copying now...')
shutil.copy2(resource_path(os.path.join("data", "EFI", "BOOT", "bootx64.efi")),
os.path.join(config.usb_mount, 'EFI', 'BOOT'))
elif not gen.grub_efi_exist(efi_grub_img) is True:
gen.log('EFI image overwritten by distro install. Replacing it now...')
shutil.copy2(resource_path(os.path.join("data", "EFI", "BOOT", "bootx64.efi")),
os.path.join(config.usb_mount, 'EFI', 'BOOT'))
else:
gen.log('multibootusb EFI image already exist. Not copying...')
def update_mbusb_cfg_file(iso_link, usb_uuid, usb_mount, distro):
"""
Update main multibootusb suslinux.cfg file after distro is installed.
:return:
"""
log('Updating multibootusb config file...')
sys_cfg_file = os.path.join(usb_mount, "multibootusb", "syslinux.cfg")
install_dir = os.path.join(usb_mount, "multibootusb", iso_basename(iso_link))
if os.path.exists(sys_cfg_file):
if distro == "hbcd":
if os.path.exists(os.path.join(usb_mount, "multibootusb", "menu.lst")):
_config_file = os.path.join(usb_mount, "multibootusb", "menu.lst")
config_file = open(_config_file,"w")
string = re.sub(r'/HBCD', '/multibootusb/' + iso_basename(iso_link) + '/HBCD', _config_file)
config_file.write(string)
config_file.close()
with open(sys_cfg_file, "a") as f:
f.write("#start " + iso_basename(config.image_path) + "\n")
f.write("LABEL " + iso_basename(config.image_path) + "\n")
f.write("MENU LABEL " + iso_basename(config.image_path) + "\n")
f.write("BOOT " + '/multibootusb/' + iso_basename(iso_link) + '/' + isolinux_bin_dir(iso_link).replace("\\", "/") + '/' + distro + '.bs' + "\n")
f.write("#end " + iso_basename(config.image_path) + "\n")
elif distro == "Windows":
if os.path.exists(sys_cfg_file):
config_file = open(sys_cfg_file, "a")
config_file.write("#start " + iso_basename(iso_link) + "\n")
config_file.write("LABEL " + iso_basename(iso_link) + "\n")
config_file.write("MENU LABEL " + iso_basename(iso_link) + "\n")
config_file.write("KERNEL chain.c32 hd0 1 ntldr=/bootmgr" + "\n")
config_file.write("#end " + iso_basename(iso_link) + "\n")
config_file.close()
elif distro == 'f4ubcd':
if os.path.exists(sys_cfg_file):
config_file = open(sys_cfg_file, "a")
config_file.write("#start " + iso_basename(iso_link) + "\n")
config_file.write("LABEL " + iso_basename(iso_link) + "\n")
config_file.write("MENU LABEL " + iso_basename(iso_link) + "\n")
config_file.write("KERNEL grub.exe" + "\n")
config_file.write('APPEND --config-file=/multibootusb/' + iso_basename(config.image_path) + '/menu.lst' + "\n")
config_file.write("#end " + iso_basename(iso_link) + "\n")
config_file.close()
elif distro == 'kaspersky':
if os.path.exists(sys_cfg_file):
config_file = open(sys_cfg_file, "a")
config_file.write("#start " + iso_basename(iso_link) + "\n")
config_file.write("LABEL " + iso_basename(iso_link) + "\n")
config_file.write("MENU LABEL " + iso_basename(iso_link) + "\n")
config_file.write("CONFIG " + '/multibootusb/' + iso_basename(config.image_path) + '/kaspersky.cfg' + "\n")
config_file.write("#end " + iso_basename(iso_link) + "\n")
config_file.close()
elif distro == 'grub4dos':
update_menu_lst()
elif distro == 'grub4dos_iso':
update_grub4dos_iso_menu()
else:
config_file = open(sys_cfg_file, "a")
config_file.write("#start " + iso_basename(iso_link) + "\n")
config_file.write("LABEL " + iso_basename(iso_link) + "\n")
config_file.write("MENU LABEL " + iso_basename(iso_link) + "\n")
if distro == "salix-live":
if os.path.exists(os.path.join(config.usb_mount, 'multibootusb', iso_basename(iso_link), 'boot', 'grub2-linux.img')):
config_file.write(
"LINUX " + '/multibootusb/' + iso_basename(iso_link) + '/boot/grub2-linux.img' + "\n")
else:
config_file.write("BOOT " + '/multibootusb/' + iso_basename(iso_link) + '/' + isolinux_bin_dir(iso_link).replace("\\", "/") + '/' + distro + '.bs' + "\n")
elif distro == "pclinuxos":
config_file.write("kernel " + '/multibootusb/' + iso_basename(iso_link) + '/isolinux/vmlinuz' + "\n")
config_file.write("append livecd=livecd root=/dev/rd/3 acpi=on vga=788 keyb=us vmalloc=256M nokmsboot "
"fromusb root=UUID=" + usb_uuid + " bootfromiso=/multibootusb/" +
iso_basename(iso_link) + "/" + iso_name(iso_link) + " initrd=/multibootusb/"
+ iso_basename(iso_link) + '/isolinux/initrd.gz' + "\n")
elif distro == "memtest":
config_file.write("kernel " + '/multibootusb/' + iso_basename(iso_link) + '/BOOT/MEMTEST.IMG\n')
elif distro == "sgrubd2" or config.distro == 'raw_iso':
config_file.write("LINUX memdisk\n")
config_file.write("INITRD " + "/multibootusb/" + iso_basename(iso_link) + '/' + iso_name(iso_link) + '\n')
config_file.write("APPEND iso\n")
elif distro == 'ReactOS':
config_file.write("COM32 mboot.c32" + '\n')
config_file.write("APPEND /loader/setupldr.sys" + '\n')
elif distro == 'pc-unlocker':
config_file.write("kernel ../ldntldr" + '\n')
config_file.write("append initrd=../ntldr" + '\n')
elif distro == 'pc-tool':
config_file.write(menus.pc_tool_config(syslinux=True, grub=False))
elif distro == 'grub2only':
config_file.write(menus.grub2only())
else:
if isolinux_bin_exist(config.image_path) is True:
if distro == "generic":
distro_syslinux_install_dir = isolinux_bin_dir(iso_link)
if not isolinux_bin_dir(iso_link) == "/":
distro_sys_install_bs = os.path.join(usb_mount, isolinux_bin_dir(iso_link)) + '/' + distro + '.bs'
else:
distro_sys_install_bs = '/' + distro + '.bs'
else:
distro_syslinux_install_dir = install_dir
distro_syslinux_install_dir = distro_syslinux_install_dir.replace(usb_mount, '')
distro_sys_install_bs = distro_syslinux_install_dir + '/' + isolinux_bin_dir(iso_link) + '/' + distro + '.bs'
distro_sys_install_bs = "/" + distro_sys_install_bs.replace("\\", "/") # Windows path issue.
if config.syslinux_version == '3':
config_file.write("CONFIG /multibootusb/" + iso_basename(iso_link) + '/' + isolinux_bin_dir(iso_link).replace("\\", "/") + '/isolinux.cfg\n')
config_file.write("APPEND /multibootusb/" + iso_basename(iso_link) + '/' + isolinux_bin_dir(iso_link).replace("\\", "/") + '\n')
else:
config_file.write("BOOT " + distro_sys_install_bs.replace("//", "/") + "\n")
config_file.write("#end " + iso_basename(iso_link) + "\n")
config_file.close()
def kaspersky_config(distro):
if distro == 'kaspersky':
return """
menu label Kaspersky Rescue Disk
kernel $INSTALL_DIR/boot/rescue
append root=live:UUID= live_dir=$INSTALL_DIR/rescue/LiveOS/ subdir=$INSTALL_DIR/rescue/LiveOS/ looptype=squashfs rootfstype=auto vga=791 init=/linuxrc loop=$INSTALL_DIR/rescue/LiveOS/squashfs.img initrd=$INSTALL_DIR/boot/rescue.igz lang=en udev liveimg splash quiet doscsi nomodeset
label text
menu label Kaspersky Rescue Disk - Text Mode
kernel $INSTALL_DIR/boot/rescue
append root=live:UUID= live_dir=$INSTALL_DIR/rescue/LiveOS/ subdir=$INSTALL_DIR/rescue/LiveOS/ rootfstype=auto vga=791 init=/linuxrc loop=/multiboot/rescue/LiveOS/squashfs.img initrd=$INSTALL_DIR/boot/rescue.igz SLUG_lang=en udev liveimg quiet nox shell noresume doscsi nomodeset
label hwinfo
menu label Kaspersky Hardware Info
kernel $INSTALL_DIR/boot/rescue
append root=live:UUID= live_dir=$INSTALL_DIR/rescue/LiveOS/ subdir=$INSTALL_DIR/rescue/LiveOS/ rootfstype=auto vga=791 init=/linuxrc loop=$INSTALL_DIR/rescue/LiveOS/squashfs.img initrd=$INSTALL_DIR/boot/rescue.igz SLUG_lang=en udev liveimg quiet softlevel=boot nox hwinfo noresume doscsi nomodeset """
def update_menu_lst():
sys_cfg_file = os.path.join(config.usb_mount, "multibootusb", "syslinux.cfg")
install_dir = os.path.join(config.usb_mount, "multibootusb", iso_basename(config.image_path))
menu_lst = iso_menu_lst_path(config.image_path).replace("\\", "/")
with open(sys_cfg_file, "a") as f:
f.write("#start " + iso_basename(config.image_path) + "\n")
f.write("LABEL " + iso_basename(config.image_path) + "\n")
f.write("MENU LABEL " + iso_basename(config.image_path) + "\n")
f.write("KERNEL grub.exe" + "\n")
f.write('APPEND --config-file=/' + menu_lst + "\n")
f.write("#end " + iso_basename(config.image_path) + "\n")
def update_grub4dos_iso_menu():
sys_cfg_file = os.path.join(config.usb_mount, "multibootusb", "syslinux.cfg")
install_dir = os.path.join(config.usb_mount, "multibootusb", iso_basename(config.image_path))
menu_lst_file = os.path.join(install_dir, 'menu.lst')
with open(menu_lst_file, "w") as f:
f.write("title Boot " + iso_name(config.image_path) + "\n")
f.write("find --set-root --ignore-floppies --ignore-cd /multibootusb/" + iso_basename(config.image_path) + '/'
+ iso_name(config.image_path) + "\n")
f.write("map --heads=0 --sectors-per-track=0 /multibootusb/" + iso_basename(config.image_path)
+ '/' + iso_name(config.image_path) + ' (hd32)' + "\n")
f.write("map --hook" + "\n")
f.write("chainloader (hd32)")
with open(sys_cfg_file, "a") as f:
f.write("#start " + iso_basename(config.image_path) + "\n")
f.write("LABEL " + iso_basename(config.image_path) + "\n")
f.write("MENU LABEL " + iso_basename(config.image_path) + "\n")
f.write("KERNEL grub.exe" + "\n")
f.write('APPEND --config-file=/multibootusb/' + iso_basename(config.image_path) + '/' + iso_name(config.image_path) + "\n")
f.write("#end " + iso_basename(config.image_path) + "\n")