diff --git a/.bin/Scripts/build-ufd b/.bin/Scripts/build-ufd new file mode 100755 index 00000000..a3508beb --- /dev/null +++ b/.bin/Scripts/build-ufd @@ -0,0 +1,201 @@ +#!/bin/bash +# +## Wizard Kit: UFD Build Tool + +DEST_DEV="$1" +DEST_PARTITION="${DEST_DEV}1" +MAIN_PY="/usr/local/bin/settings/main.py" +WD=$(pwd) +EXTRA_DIR="${WD}/Extras" +MAIN_KIT="$(dirname $(find $WD -type d -name '.bin') 2>/dev/null)" +LINUX_ISO="$(find $WD -type f -iname '*Linux*iso' | head -1)" +WINPE_ISO="$(find $WD -type f -iname '*WinPE*iso' | head -1)" +if [ "$2" == "--silent" ]; then + SILENT="True" +fi + +# COLORS +CLEAR="\e[0m" +RED="\e[31m" +GREEN="\e[32m" +YELLOW="\e[33m" +BLUE="\e[34m" + +# Functions +function ask() { + if [ "$SILENT" == "True" ]; then + echo -e "$1 Yes ${BLUE}(Silent)${CLEAR}" + return 0 + fi + while :; do + read -p "$1 " -r answer + if echo "$answer" | egrep -iq '^(y|yes|sure)$'; then + return 0 + elif echo "$answer" | egrep -iq '^(n|no|nope)$'; then + return 1 + fi + done +} + +die () { + echo "$0:" "$@" >&2 + echo "" + read -p "Press Enter to exit... " -r + exit 1 +} + +# Load main.py settings +if [ ! -f "$MAIN_PY" ]; then + echo -e "${RED}ERROR${CLEAR}: $MAIN_PY not found." + die "Aborted." +fi +while read line; do + if echo "$line" | egrep -q "^\w+='"; then + line="$(echo "$line" | sed -r 's/[\r\n]+//')" + eval "$line" + fi +done < "$MAIN_PY" +if [ -z ${KIT_NAME_FULL+x} ]; then + # KIT_NAME_FULL is not set, assume main.py missing or malformatted + echo -e "${RED}ERROR${CLEAR}: failed to load settings from $MAIN_PY" + die "Aborted." +fi +UFD_LABEL="${KIT_NAME_SHORT}_LINUX" + +# Check if root +if [[ "$EUID" -ne 0 ]]; then + echo -e "${RED}ERROR${CLEAR}: This script must be run as root." + die "Aborted." +fi + +# Check if in tmux +if ! tmux list-session | grep -q "build-ufd"; then + # Reload in tmux + tmux new-session -s "build-ufd" "$0" $* + exit 0 +fi + +# Header +echo -e "${GREEN}$KIT_NAME_FULL${CLEAR}: UFD Build Tool" +echo "" + +# Dest and Sources Check +abort="False" +if [ ! -b "$DEST_DEV" ]; then + echo -e "${RED}ERROR${CLEAR}: Device $DEST_DEV not found." + abort="True" +fi +if [ ! -f "$LINUX_ISO" ]; then + echo -e "${RED}ERROR${CLEAR}: Linux ISO not found." + abort="True" +fi +if [ ! -f "$WINPE_ISO" ]; then + echo -e "${RED}ERROR${CLEAR}: WinPE ISO not found." + abort="True" +fi +if [ ! -d "$MAIN_KIT" ]; then + echo -e "${RED}ERROR${CLEAR}: Wizard Kit directory not found." + abort="True" +fi +if [ ! -d "$EXTRA_DIR" ]; then + # Warn but don't abort + echo -e "${YELLOW}WARNING${CLEAR}: $EXTRA_DIR not found." + echo "" + EXTRA_DIR='__None__' +fi +if [ "$abort" == "True" ]; then + echo "" + die "Aborted." +fi + +# Display Job Settings +echo -e "${BLUE}Sources${CLEAR}" +echo "Main Kit: $MAIN_KIT" +echo "Linux ISO: $LINUX_ISO" +echo "WinPE ISO: $WINPE_ISO" +echo "Extras: $EXTRA_DIR" +echo "" +echo -e "${BLUE}Destination${CLEAR}" +lsblk -n -o NAME,LABEL,SIZE,MODEL,SERIAL $DEST_DEV + +# Ask before starting job +echo "" +if ask "Is the above information correct?"; then + echo "" + echo -e "${YELLOW}SAFETY CHECK${CLEAR}" + echo "All data will be DELETED from the disk and partition(s) listed above." + echo -e "This is irreversible and will lead to ${RED}DATA LOSS.${CLEAR}" + if ! ask "Asking again to confirm, is this correct?"; then + die "Aborted." + fi +else + die "Aborted." +fi + +# Start Build +echo "" +echo -e "${GREEN}Building Kit${CLEAR}" + +# Format +echo "Formatting drive..." +parted "$DEST_DEV" -s -- mklabel msdos mkpart primary fat32 1MiB -1s +parted "$DEST_DEV" set 1 boot on +mkfs.vfat -F 32 -n "$UFD_LABEL" "$DEST_PARTITION" >/dev/null 2>&1 + +# Mount sources and dest +echo "Mounting sources and destination..." +mkdir /mnt/{Dest,Linux,WinPE} -p +mount $DEST_PARTITION /mnt +mount "$LINUX_ISO" /mnt/Linux -r +mount "$WINPE_ISO" /mnt/WinPE -r + +# Copy files +echo "Copying Linux files..." +tmux split-window -l 15 cp -Lrv /mnt/Linux/* /mnt/ + +echo "Copying WinPE files..." +tmux split-window -l 15 cp -Lrv /mnt/WinPE/{Boot,bootmgr{,.efi},en-us,sources} /mnt/ +tmux split-window -l 15 cp -Lrv /mnt/WinPE/EFI/Microsoft /mnt/EFI/ +tmux split-window -l 15 cp -Lrv /mnt/WinPE/EFI/Boot/* /mnt/EFI/Microsoft/ +tmux split-window -l 15 cp -Lrv /mnt/WinPE/{Boot/{BCD,boot.sdi},bootmgr} /mnt/sources/ + +echo "Copying Main Kit..." +tmux split-window -l 15 cp -Lrv "$MAIN_KIT" /mnt/ +if [ "$EXTRA_DIR" != "__None__" ]; then + echo "Copying Extra files..." + tmux split-window -l 15 cp -Lrv "$EXTRA_DIR"/* /mnt/ +fi + +# Install syslinux +echo "Copying Syslinux files..." +tmux split-window -l 15 cp -Lrv /usr/lib/syslinux/bios/*.c32 /mnt/arch/boot/syslinux/ +syslinux --install -d /arch/boot/syslinux/ $DEST_PARTITION >/dev/null 2>&1 + +echo "Unmounting destination..." +umount /mnt +sync + +echo "Installing Syslinux MBR..." +dd bs=440 count=1 if=/usr/lib/syslinux/bios/mbr.bin of=$DEST_DEV >/dev/null 2>&1 +sync + +# Cleanup +echo "Hiding boot files..." +echo "drive s: file=\"$DEST_PARTITION\"" > /root/.mtoolsrc +echo 'mtools_skip_check=1' >> /root/.mtoolsrc +for item in BOOT{,MGR,MGR.EFI} EFI EN-US ISOLINUX LOADER SOURCES SYSLINUX.CFG; do + yes | mattrib +h S:/$item >/dev/null 2>&1 +done +sync + +# Unmount Sources +echo "Unmounting sources..." +umount /mnt/* -R + +# Done +echo "" +echo "Done." +echo "" +read -p "Press Enter to exit..." -r +exit 0 + diff --git a/.bin/Scripts/functions/hw_diags.py b/.bin/Scripts/functions/hw_diags.py index 8b2c164e..99a6a3ed 100644 --- a/.bin/Scripts/functions/hw_diags.py +++ b/.bin/Scripts/functions/hw_diags.py @@ -410,10 +410,18 @@ def scan_disks(): json_data = json.loads(result.stdout.decode()) devs = {} for d in json_data.get('blockdevices', []): - if d['type'] == 'disk' and d['hotplug'] == '0': - devs[d['name']] = {'lsblk': d} - TESTS['NVMe/SMART']['Status'][d['name']] = 'Pending' - TESTS['badblocks']['Status'][d['name']] = 'Pending' + if d['type'] == 'disk': + if d['hotplug'] == '0': + devs[d['name']] = {'lsblk': d} + TESTS['NVMe/SMART']['Status'][d['name']] = 'Pending' + TESTS['badblocks']['Status'][d['name']] = 'Pending' + else: + # Skip WizardKit devices + wk_label = '{}_LINUX'.format(KIT_NAME_SHORT) + if wk_label not in [c.get('label', '') for c in d['children']]: + devs[d['name']] = {'lsblk': d} + TESTS['NVMe/SMART']['Status'][d['name']] = 'Pending' + TESTS['badblocks']['Status'][d['name']] = 'Pending' for dev, data in devs.items(): # Get SMART attributes diff --git a/.bin/Scripts/hw-sensors b/.bin/Scripts/hw-sensors index bfaddc7e..2a1a46e0 100755 --- a/.bin/Scripts/hw-sensors +++ b/.bin/Scripts/hw-sensors @@ -51,7 +51,7 @@ def color_temp(temp): color = COLORS['CLEAR'] return '{color}{prefix}{temp:2.0f}°C{CLEAR}'.format( color = color, - prefix = '+' if temp>0 else '-', + prefix = '-' if temp < 0 else '', temp = temp, **COLORS) @@ -61,12 +61,9 @@ def get_feature_string(chip, feature): skipname = len(feature.name)+1 # skip common prefix data = {} - if feature.type == sensors.feature.INTRUSION: - vals = [sensors.get_value(chip, sf.number) for sf in sfs] - # short path for INTRUSION to demonstrate type usage - status = "alarm" if int(vals[0]) == 1 else "normal" - print_standard(' {:18} {}'.format(label, status)) - return + if feature.type != sensors.feature.TEMP: + # Skip non-temperature sensors + return None for sf in sfs: name = sf.name[skipname:].decode("utf-8").strip() @@ -81,7 +78,7 @@ def get_feature_string(chip, feature): data[name] = ' {}°C'.format(val) else: data[name] = '{}{:2.0f}°C'.format( - '+' if temp>0 else '-', + '-' if temp < 0 else '', temp) else: data[name] = color_temp(val) @@ -94,7 +91,7 @@ def get_feature_string(chip, feature): list_data.append('{}: {}'.format(item, data.pop(item))) list_data.extend( ['{}: {}'.format(k, v) for k, v in sorted(data.items())]) - data_str = '{:18} {} ({})'.format( + data_str = '{:18} {} {}'.format( label, main_temp, ', '.join(list_data)) else: list_data.extend(sorted(data.items())) @@ -119,10 +116,13 @@ if __name__ == '__main__': chip_name = '{} ({})'.format( sensors.chip_snprintf_name(chip), sensors.get_adapter_name(chip.bus)) - chip_temps[chip_name] = [chip_name] - for feature in sensors.FeatureIterator(chip): - chip_temps[chip_name].append(get_feature_string(chip, feature)) - chip_temps[chip_name].append('') + chip_feats = [get_feature_string(chip, feature) + for feature in sensors.FeatureIterator(chip)] + # Strip empty/None items + chip_feats = [f for f in chip_feats if f] + + if chip_feats: + chip_temps[chip_name] = [chip_name, *chip_feats, ''] # Sort chips sensor_temps = [] diff --git a/.bin/Scripts/settings/launchers.py b/.bin/Scripts/settings/launchers.py index f3e6b0a2..7d52cd51 100644 --- a/.bin/Scripts/settings/launchers.py +++ b/.bin/Scripts/settings/launchers.py @@ -441,6 +441,12 @@ LAUNCHERS = { }, }, r'Misc': { + 'Cleanup CBS Temp Files': { + 'L_TYPE': 'PyScript', + 'L_PATH': 'Scripts', + 'L_ITEM': 'cbs_fix.py', + 'L_ELEV': 'True', + }, 'ConEmu (as ADMIN)': { 'L_TYPE': 'Executable', 'L_PATH': 'ConEmu', diff --git a/.linux_items/include/airootfs/etc/skel/.config/i3status/config b/.linux_items/include/airootfs/etc/skel/.config/i3status/config index d783b408..d36294a4 100644 --- a/.linux_items/include/airootfs/etc/skel/.config/i3status/config +++ b/.linux_items/include/airootfs/etc/skel/.config/i3status/config @@ -21,7 +21,7 @@ order += "tztime local" #order += "tztime utc" cpu_usage { - format = ". %usage" + format = " %usage" max_threshold = 90 #format_above_threshold = " %usage" degraded_threshold = 75 @@ -29,19 +29,19 @@ cpu_usage { } wireless _first_ { - format_up = ". (%quality at %essid) %ip" - format_down = ". Down" + format_up = " (%quality at %essid) %ip" + format_down = " Down" } ethernet _first_ { # if you use %speed, i3status requires root privileges - format_up = ". %ip" - format_down = ". Down" + format_up = " %ip" + format_down = " Down" } battery all { integer_battery_capacity = true - format = "%status. %percentage" + format = "%status %percentage" format_down = "" status_chr = "" status_bat = "" @@ -53,7 +53,7 @@ battery all { } volume master { - format = ". %volume" + format = " %volume" format_muted = " muted" device = "pulse" } diff --git a/.linux_items/packages/aur b/.linux_items/packages/aur index dd625627..ee0aa3b7 100644 --- a/.linux_items/packages/aur +++ b/.linux_items/packages/aur @@ -10,5 +10,5 @@ papirus-icon-theme pasystray smartmontools-svn testdisk-wip -ttf-font-awesome +ttf-font-awesome-4 wd719x-firmware diff --git a/.linux_items/packages/live b/.linux_items/packages/live index efc1e1d8..892b0bf2 100644 --- a/.linux_items/packages/live +++ b/.linux_items/packages/live @@ -50,6 +50,7 @@ networkmanager nvme-cli oblogout openbox-patched +otf-font-awesome-4 p7zip papirus-icon-theme pasystray @@ -75,7 +76,7 @@ tint2 tk tmux tree -ttf-font-awesome +ttf-font-awesome-4 ttf-inconsolata udevil udisks2 diff --git a/Build Kit.cmd b/Build Kit.cmd index d50b9209..45d444bc 100644 --- a/Build Kit.cmd +++ b/Build Kit.cmd @@ -22,7 +22,7 @@ attrib +h OUT_KIT\.cbin >nul 2>&1 rem Rewrite main.py using PowerShell to have CRLF/`r`n lineendings set "script=OUT_KIT\.bin\Scripts\borrowed\set-eol.ps1" set "main=OUT_KIT\.bin\Scripts\settings\main.py" -powershell -executionpolicy bypass -noprofile -file %script% -lineEndings win -file %main% || goto ErrorUnknown +powershell -executionpolicy bypass -noprofile -file %script% -lineEnding win -file %main% || goto ErrorUnknown :Launch set "script=OUT_KIT\.bin\Scripts\build_kit.ps1"