Merge branch 'dev' of https://github.com/2Shirt/WizardKit into dev
This commit is contained in:
commit
8f4ec41359
8 changed files with 243 additions and 27 deletions
201
.bin/Scripts/build-ufd
Executable file
201
.bin/Scripts/build-ufd
Executable file
|
|
@ -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
|
||||||
|
|
||||||
|
|
@ -410,10 +410,18 @@ def scan_disks():
|
||||||
json_data = json.loads(result.stdout.decode())
|
json_data = json.loads(result.stdout.decode())
|
||||||
devs = {}
|
devs = {}
|
||||||
for d in json_data.get('blockdevices', []):
|
for d in json_data.get('blockdevices', []):
|
||||||
if d['type'] == 'disk' and d['hotplug'] == '0':
|
if d['type'] == 'disk':
|
||||||
devs[d['name']] = {'lsblk': d}
|
if d['hotplug'] == '0':
|
||||||
TESTS['NVMe/SMART']['Status'][d['name']] = 'Pending'
|
devs[d['name']] = {'lsblk': d}
|
||||||
TESTS['badblocks']['Status'][d['name']] = 'Pending'
|
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():
|
for dev, data in devs.items():
|
||||||
# Get SMART attributes
|
# Get SMART attributes
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ def color_temp(temp):
|
||||||
color = COLORS['CLEAR']
|
color = COLORS['CLEAR']
|
||||||
return '{color}{prefix}{temp:2.0f}°C{CLEAR}'.format(
|
return '{color}{prefix}{temp:2.0f}°C{CLEAR}'.format(
|
||||||
color = color,
|
color = color,
|
||||||
prefix = '+' if temp>0 else '-',
|
prefix = '-' if temp < 0 else '',
|
||||||
temp = temp,
|
temp = temp,
|
||||||
**COLORS)
|
**COLORS)
|
||||||
|
|
||||||
|
|
@ -61,12 +61,9 @@ def get_feature_string(chip, feature):
|
||||||
skipname = len(feature.name)+1 # skip common prefix
|
skipname = len(feature.name)+1 # skip common prefix
|
||||||
data = {}
|
data = {}
|
||||||
|
|
||||||
if feature.type == sensors.feature.INTRUSION:
|
if feature.type != sensors.feature.TEMP:
|
||||||
vals = [sensors.get_value(chip, sf.number) for sf in sfs]
|
# Skip non-temperature sensors
|
||||||
# short path for INTRUSION to demonstrate type usage
|
return None
|
||||||
status = "alarm" if int(vals[0]) == 1 else "normal"
|
|
||||||
print_standard(' {:18} {}'.format(label, status))
|
|
||||||
return
|
|
||||||
|
|
||||||
for sf in sfs:
|
for sf in sfs:
|
||||||
name = sf.name[skipname:].decode("utf-8").strip()
|
name = sf.name[skipname:].decode("utf-8").strip()
|
||||||
|
|
@ -81,7 +78,7 @@ def get_feature_string(chip, feature):
|
||||||
data[name] = ' {}°C'.format(val)
|
data[name] = ' {}°C'.format(val)
|
||||||
else:
|
else:
|
||||||
data[name] = '{}{:2.0f}°C'.format(
|
data[name] = '{}{:2.0f}°C'.format(
|
||||||
'+' if temp>0 else '-',
|
'-' if temp < 0 else '',
|
||||||
temp)
|
temp)
|
||||||
else:
|
else:
|
||||||
data[name] = color_temp(val)
|
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.append('{}: {}'.format(item, data.pop(item)))
|
||||||
list_data.extend(
|
list_data.extend(
|
||||||
['{}: {}'.format(k, v) for k, v in sorted(data.items())])
|
['{}: {}'.format(k, v) for k, v in sorted(data.items())])
|
||||||
data_str = '{:18} {} ({})'.format(
|
data_str = '{:18} {} {}'.format(
|
||||||
label, main_temp, ', '.join(list_data))
|
label, main_temp, ', '.join(list_data))
|
||||||
else:
|
else:
|
||||||
list_data.extend(sorted(data.items()))
|
list_data.extend(sorted(data.items()))
|
||||||
|
|
@ -119,10 +116,13 @@ if __name__ == '__main__':
|
||||||
chip_name = '{} ({})'.format(
|
chip_name = '{} ({})'.format(
|
||||||
sensors.chip_snprintf_name(chip),
|
sensors.chip_snprintf_name(chip),
|
||||||
sensors.get_adapter_name(chip.bus))
|
sensors.get_adapter_name(chip.bus))
|
||||||
chip_temps[chip_name] = [chip_name]
|
chip_feats = [get_feature_string(chip, feature)
|
||||||
for feature in sensors.FeatureIterator(chip):
|
for feature in sensors.FeatureIterator(chip)]
|
||||||
chip_temps[chip_name].append(get_feature_string(chip, feature))
|
# Strip empty/None items
|
||||||
chip_temps[chip_name].append('')
|
chip_feats = [f for f in chip_feats if f]
|
||||||
|
|
||||||
|
if chip_feats:
|
||||||
|
chip_temps[chip_name] = [chip_name, *chip_feats, '']
|
||||||
|
|
||||||
# Sort chips
|
# Sort chips
|
||||||
sensor_temps = []
|
sensor_temps = []
|
||||||
|
|
|
||||||
|
|
@ -441,6 +441,12 @@ LAUNCHERS = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
r'Misc': {
|
r'Misc': {
|
||||||
|
'Cleanup CBS Temp Files': {
|
||||||
|
'L_TYPE': 'PyScript',
|
||||||
|
'L_PATH': 'Scripts',
|
||||||
|
'L_ITEM': 'cbs_fix.py',
|
||||||
|
'L_ELEV': 'True',
|
||||||
|
},
|
||||||
'ConEmu (as ADMIN)': {
|
'ConEmu (as ADMIN)': {
|
||||||
'L_TYPE': 'Executable',
|
'L_TYPE': 'Executable',
|
||||||
'L_PATH': 'ConEmu',
|
'L_PATH': 'ConEmu',
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ order += "tztime local"
|
||||||
#order += "tztime utc"
|
#order += "tztime utc"
|
||||||
|
|
||||||
cpu_usage {
|
cpu_usage {
|
||||||
format = ". %usage"
|
format = " %usage"
|
||||||
max_threshold = 90
|
max_threshold = 90
|
||||||
#format_above_threshold = " %usage"
|
#format_above_threshold = " %usage"
|
||||||
degraded_threshold = 75
|
degraded_threshold = 75
|
||||||
|
|
@ -29,19 +29,19 @@ cpu_usage {
|
||||||
}
|
}
|
||||||
|
|
||||||
wireless _first_ {
|
wireless _first_ {
|
||||||
format_up = ". (%quality at %essid) %ip"
|
format_up = " (%quality at %essid) %ip"
|
||||||
format_down = ". Down"
|
format_down = " Down"
|
||||||
}
|
}
|
||||||
|
|
||||||
ethernet _first_ {
|
ethernet _first_ {
|
||||||
# if you use %speed, i3status requires root privileges
|
# if you use %speed, i3status requires root privileges
|
||||||
format_up = ". %ip"
|
format_up = " %ip"
|
||||||
format_down = ". Down"
|
format_down = " Down"
|
||||||
}
|
}
|
||||||
|
|
||||||
battery all {
|
battery all {
|
||||||
integer_battery_capacity = true
|
integer_battery_capacity = true
|
||||||
format = "%status. %percentage"
|
format = "%status %percentage"
|
||||||
format_down = ""
|
format_down = ""
|
||||||
status_chr = ""
|
status_chr = ""
|
||||||
status_bat = ""
|
status_bat = ""
|
||||||
|
|
@ -53,7 +53,7 @@ battery all {
|
||||||
}
|
}
|
||||||
|
|
||||||
volume master {
|
volume master {
|
||||||
format = ". %volume"
|
format = " %volume"
|
||||||
format_muted = " muted"
|
format_muted = " muted"
|
||||||
device = "pulse"
|
device = "pulse"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,5 +10,5 @@ papirus-icon-theme
|
||||||
pasystray
|
pasystray
|
||||||
smartmontools-svn
|
smartmontools-svn
|
||||||
testdisk-wip
|
testdisk-wip
|
||||||
ttf-font-awesome
|
ttf-font-awesome-4
|
||||||
wd719x-firmware
|
wd719x-firmware
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ networkmanager
|
||||||
nvme-cli
|
nvme-cli
|
||||||
oblogout
|
oblogout
|
||||||
openbox-patched
|
openbox-patched
|
||||||
|
otf-font-awesome-4
|
||||||
p7zip
|
p7zip
|
||||||
papirus-icon-theme
|
papirus-icon-theme
|
||||||
pasystray
|
pasystray
|
||||||
|
|
@ -75,7 +76,7 @@ tint2
|
||||||
tk
|
tk
|
||||||
tmux
|
tmux
|
||||||
tree
|
tree
|
||||||
ttf-font-awesome
|
ttf-font-awesome-4
|
||||||
ttf-inconsolata
|
ttf-inconsolata
|
||||||
udevil
|
udevil
|
||||||
udisks2
|
udisks2
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ attrib +h OUT_KIT\.cbin >nul 2>&1
|
||||||
rem Rewrite main.py using PowerShell to have CRLF/`r`n lineendings
|
rem Rewrite main.py using PowerShell to have CRLF/`r`n lineendings
|
||||||
set "script=OUT_KIT\.bin\Scripts\borrowed\set-eol.ps1"
|
set "script=OUT_KIT\.bin\Scripts\borrowed\set-eol.ps1"
|
||||||
set "main=OUT_KIT\.bin\Scripts\settings\main.py"
|
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
|
:Launch
|
||||||
set "script=OUT_KIT\.bin\Scripts\build_kit.ps1"
|
set "script=OUT_KIT\.bin\Scripts\build_kit.ps1"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue