From 10a70e519287b4d5e0b3c67c786b9c0a49d8e440 Mon Sep 17 00:00:00 2001
From: Alan Mason <1923621+2Shirt@users.noreply.github.com>
Date: Wed, 6 Dec 2017 17:44:12 -0800
Subject: [PATCH] 2016-04: Retroactive Updates
* Added HFS+ to udevil's allowed types.
* Added mediainfo to meet photorec-sort requirements
* Removed git
* Switched out Chromium for Midori
* Size reduction test
* hw-diags now tests USB drives (except ARCH drives)
* mount-all-volumes no longer opens the file browser
Bugfix: mount-backup-shares should now work.
---
archlive/airootfs/etc/hostname | 2 +-
.../etc/lightdm/lightdm-gtk-greeter.conf | 64 +++
archlive/airootfs/etc/lightdm/lightdm.conf | 163 ++++++
archlive/airootfs/etc/skel/.Xresources | 35 ++
archlive/airootfs/etc/skel/.bash_logout | 3 +
archlive/airootfs/etc/skel/.bash_profile | 5 +
archlive/airootfs/etc/skel/.bashrc | 9 +
.../etc/skel/.config/autostart/Conky.desktop | 12 +
.../autostart/urxvt-default-res.desktop | 12 +
.../etc/skel/.config/autostart/wifi.desktop | 12 +
.../etc/skel/.config/xfce4/helpers.rc | 3 +-
.../.config/xfce4/panel/whiskermenu-18.rc | 4 +-
.../xfce-perchannel-xml/xfce4-desktop.xml | 2 +-
.../xfce4-keyboard-shortcuts.xml | 5 +-
.../xfce-perchannel-xml/xfce4-panel.xml | 11 +-
archlive/airootfs/etc/skel/.conky_start | 2 +-
archlive/airootfs/etc/skel/.conkyrc | 16 +-
archlive/airootfs/etc/skel/.dmrc | 3 +
.../skel/.local/share/keyrings/login.keyring | Bin 0 -> 105 bytes
.../skel/.local/share/keyrings/user.keystore | Bin 0 -> 207 bytes
archlive/airootfs/etc/skel/.tmux.conf | 1 +
archlive/airootfs/etc/skel/.urxvt_default_res | 11 +
archlive/airootfs/etc/skel/.wifi | 5 +
archlive/airootfs/etc/skel/.xinitrc | 23 -
archlive/airootfs/etc/skel/.zlogin | 1 -
archlive/airootfs/etc/skel/.zsh_aliases | 17 +-
archlive/airootfs/etc/skel/.zshrc | 2 +-
...bus-org.freedesktop.NetworkManager.service | 1 +
...dbus-org.freedesktop.nm-dispatcher.service | 1 +
.../systemd/system/display-manager.service | 1 +
.../getty.target.wants/getty@tty1.service | 1 +
.../NetworkManager.service | 1 +
.../multi-user.target.wants/remote-fs.target | 1 +
archlive/airootfs/etc/udevil/udevil.conf | 336 ++++++++++++
archlive/airootfs/root/customize_airootfs.sh | 16 +-
archlive/airootfs/usr/local/bin/hw-diags | 86 ++++
.../airootfs/usr/local/bin/hw-diags-audio | 11 +
.../airootfs/usr/local/bin/hw-diags-badblocks | 25 +
.../airootfs/usr/local/bin/hw-diags-inner | 483 ++++++++++++++++++
.../airootfs/usr/local/bin/hw-diags-prime95 | 20 +
.../airootfs/usr/local/bin/hw-diags-progress | 10 +
.../airootfs/usr/local/bin/hw-diags-sensors | 43 ++
.../airootfs/usr/local/bin/mount-all-volumes | 14 +
.../usr/local/bin/mount-backup-shares | 10 +
archlive/airootfs/usr/local/bin/msword-search | 30 ++
.../applications/Hardware Diagnostics.desktop | 2 +-
.../usr/share/applications/SpeedTest.desktop | 2 +-
archlive/packages.both | 36 +-
48 files changed, 1491 insertions(+), 62 deletions(-)
create mode 100644 archlive/airootfs/etc/lightdm/lightdm-gtk-greeter.conf
create mode 100644 archlive/airootfs/etc/lightdm/lightdm.conf
create mode 100644 archlive/airootfs/etc/skel/.Xresources
create mode 100644 archlive/airootfs/etc/skel/.bash_logout
create mode 100644 archlive/airootfs/etc/skel/.bash_profile
create mode 100644 archlive/airootfs/etc/skel/.bashrc
create mode 100644 archlive/airootfs/etc/skel/.config/autostart/Conky.desktop
create mode 100644 archlive/airootfs/etc/skel/.config/autostart/urxvt-default-res.desktop
create mode 100644 archlive/airootfs/etc/skel/.config/autostart/wifi.desktop
create mode 100644 archlive/airootfs/etc/skel/.dmrc
create mode 100644 archlive/airootfs/etc/skel/.local/share/keyrings/login.keyring
create mode 100644 archlive/airootfs/etc/skel/.local/share/keyrings/user.keystore
create mode 100644 archlive/airootfs/etc/skel/.tmux.conf
create mode 100644 archlive/airootfs/etc/skel/.urxvt_default_res
create mode 100644 archlive/airootfs/etc/skel/.wifi
delete mode 100644 archlive/airootfs/etc/skel/.zlogin
create mode 100644 archlive/airootfs/etc/systemd/system/dbus-org.freedesktop.NetworkManager.service
create mode 100644 archlive/airootfs/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service
create mode 100644 archlive/airootfs/etc/systemd/system/display-manager.service
create mode 100644 archlive/airootfs/etc/systemd/system/getty.target.wants/getty@tty1.service
create mode 100644 archlive/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service
create mode 100644 archlive/airootfs/etc/systemd/system/multi-user.target.wants/remote-fs.target
create mode 100644 archlive/airootfs/etc/udevil/udevil.conf
create mode 100644 archlive/airootfs/usr/local/bin/hw-diags
create mode 100644 archlive/airootfs/usr/local/bin/hw-diags-audio
create mode 100644 archlive/airootfs/usr/local/bin/hw-diags-badblocks
create mode 100644 archlive/airootfs/usr/local/bin/hw-diags-inner
create mode 100644 archlive/airootfs/usr/local/bin/hw-diags-prime95
create mode 100644 archlive/airootfs/usr/local/bin/hw-diags-progress
create mode 100644 archlive/airootfs/usr/local/bin/hw-diags-sensors
create mode 100644 archlive/airootfs/usr/local/bin/mount-all-volumes
create mode 100644 archlive/airootfs/usr/local/bin/mount-backup-shares
create mode 100644 archlive/airootfs/usr/local/bin/msword-search
diff --git a/archlive/airootfs/etc/hostname b/archlive/airootfs/etc/hostname
index 2dbe21eb..5e647960 100644
--- a/archlive/airootfs/etc/hostname
+++ b/archlive/airootfs/etc/hostname
@@ -1 +1 @@
-archiso
+arch-wk
diff --git a/archlive/airootfs/etc/lightdm/lightdm-gtk-greeter.conf b/archlive/airootfs/etc/lightdm/lightdm-gtk-greeter.conf
new file mode 100644
index 00000000..ac30a13a
--- /dev/null
+++ b/archlive/airootfs/etc/lightdm/lightdm-gtk-greeter.conf
@@ -0,0 +1,64 @@
+# LightDM GTK+ Configuration
+# Available configuration options listed below.
+#
+# Appearance:
+# theme-name = GTK+ theme to use
+# icon-theme-name = Icon theme to use
+# background = Background file to use, either an image path or a color (e.g. #772953)
+# user-background = false|true ("true" by default) Display user background (if available)
+# transition-duration = Length of time (in milliseconds) to transition between background images ("500" by default)
+# transition-type = ease-in-out|linear|none ("ease-in-out" by default)
+#
+# Fonts:
+# font-name = Font to use
+# xft-antialias = false|true Whether to antialias Xft fonts
+# xft-dpi = Resolution for Xft in dots per inch (e.g. 96)
+# xft-hintstyle = none|slight|medium|hintfull What degree of hinting to use
+# xft-rgba = none|rgb|bgr|vrgb|vbgr Type of subpixel antialiasing
+#
+# Login window:
+# active-monitor = Monitor to display greeter window (name or number). Use #cursor value to display greeter at monitor with cursor. Can be a semicolon separated list
+# position = x y ("50% 50%" by default) Login window position
+# default-user-image = Image used as default user icon, path or #icon-name
+# hide-user-image = false|true ("false" by default)
+#
+# Panel:
+# panel-position = top|bottom ("top" by default)
+# clock-format = strftime-format string, e.g. %H:%M
+# indicators = semi-colon ";" separated list of allowed indicator modules. Built-in indicators include "~a11y", "~language", "~session", "~power", "~clock", "~host", "~spacer". Unity indicators can be represented by short name (e.g. "sound", "power"), service file name, or absolute path
+#
+# Accessibility:
+# a11y-states = states of accessibility features: "name" - save state on exit, "-name" - disabled at start (default value for unlisted), "+name" - enabled at start. Allowed names: contrast, font, keyboard, reader.
+# keyboard = command to launch on-screen keyboard (e.g. "onboard")
+# keyboard-position = x y[;width height] ("50%,center -0;50% 25%" by default) Works only for "onboard"
+# reader = command to launch screen reader (e.g. "orca")
+#
+# Security:
+# allow-debugging = false|true ("false" by default)
+# screensaver-timeout = Timeout (in seconds) until the screen blanks when the greeter is called as lockscreen
+#
+# Template for per-monitor configuration:
+# [monitor: name]
+# background = overrides default value
+# user-background = overrides default value
+# laptop = false|true ("false" by default) Marks monitor as laptop display
+# transition-duration = overrides default value
+#
+[greeter]
+background=/usr/share/wallpaper/wallhaven-105688.png
+#user-background=
+theme-name=Numix
+icon-theme-name=Numix-Circle-Light
+font-name=Noto-Sans
+#xft-antialias=
+#xft-dpi=
+#xft-hintstyle=
+#xft-rgba=
+hide-user-image=true
+#indicators=
+clock-format=%H:%M
+#keyboard=
+#reader=
+#position=50%,center 100%,bottom
+position=5% 45%,center
+#screensaver-timeout=
diff --git a/archlive/airootfs/etc/lightdm/lightdm.conf b/archlive/airootfs/etc/lightdm/lightdm.conf
new file mode 100644
index 00000000..2281dff8
--- /dev/null
+++ b/archlive/airootfs/etc/lightdm/lightdm.conf
@@ -0,0 +1,163 @@
+#
+# General configuration
+#
+# start-default-seat = True to always start one seat if none are defined in the configuration
+# greeter-user = User to run greeter as
+# minimum-display-number = Minimum display number to use for X servers
+# minimum-vt = First VT to run displays on
+# lock-memory = True to prevent memory from being paged to disk
+# user-authority-in-system-dir = True if session authority should be in the system location
+# guest-account-script = Script to be run to setup guest account
+# logind-check-graphical = True to on start seats that are marked as graphical by logind
+# log-directory = Directory to log information to
+# run-directory = Directory to put running state in
+# cache-directory = Directory to cache to
+# sessions-directory = Directory to find sessions
+# remote-sessions-directory = Directory to find remote sessions
+# greeters-directory = Directory to find greeters
+# backup-logs = True to move add a .old suffix to old log files when opening new ones
+#
+[LightDM]
+#start-default-seat=true
+#greeter-user=lightdm
+#minimum-display-number=0
+#minimum-vt=7 # Setting this to a value < 7 implies security issues, see FS#46799
+#lock-memory=true
+#user-authority-in-system-dir=false
+#guest-account-script=guest-account
+#logind-check-graphical=false
+#log-directory=/var/log/lightdm
+run-directory=/run/lightdm
+#cache-directory=/var/cache/lightdm
+#sessions-directory=/usr/share/lightdm/sessions:/usr/share/xsessions:/usr/share/wayland-sessions
+#remote-sessions-directory=/usr/share/lightdm/remote-sessions
+#greeters-directory=/usr/share/lightdm/greeters:/usr/share/xgreeters
+#backup-logs=true
+
+#
+# Seat configuration
+#
+# Seat configuration is matched against the seat name glob in the section, for example:
+# [Seat:*] matches all seats and is applied first.
+# [Seat:seat0] matches the seat named "seat0".
+# [Seat:seat-thin-client*] matches all seats that have names that start with "seat-thin-client".
+#
+# type = Seat type (xlocal, xremote, unity)
+# pam-service = PAM service to use for login
+# pam-autologin-service = PAM service to use for autologin
+# pam-greeter-service = PAM service to use for greeters
+# xserver-command = X server command to run (can also contain arguments e.g. X -special-option)
+# xmir-command = Xmir server command to run (can also contain arguments e.g. Xmir -special-option)
+# xserver-config = Config file to pass to X server
+# xserver-layout = Layout to pass to X server
+# xserver-allow-tcp = True if TCP/IP connections are allowed to this X server
+# xserver-share = True if the X server is shared for both greeter and session
+# xserver-hostname = Hostname of X server (only for type=xremote)
+# xserver-display-number = Display number of X server (only for type=xremote)
+# xdmcp-manager = XDMCP manager to connect to (implies xserver-allow-tcp=true)
+# xdmcp-port = XDMCP UDP/IP port to communicate on
+# xdmcp-key = Authentication key to use for XDM-AUTHENTICATION-1 (stored in keys.conf)
+# unity-compositor-command = Unity compositor command to run (can also contain arguments e.g. unity-system-compositor -special-option)
+# unity-compositor-timeout = Number of seconds to wait for compositor to start
+# greeter-session = Session to load for greeter
+# greeter-hide-users = True to hide the user list
+# greeter-allow-guest = True if the greeter should show a guest login option
+# greeter-show-manual-login = True if the greeter should offer a manual login option
+# greeter-show-remote-login = True if the greeter should offer a remote login option
+# user-session = Session to load for users
+# allow-user-switching = True if allowed to switch users
+# allow-guest = True if guest login is allowed
+# guest-session = Session to load for guests (overrides user-session)
+# session-wrapper = Wrapper script to run session with
+# greeter-wrapper = Wrapper script to run greeter with
+# guest-wrapper = Wrapper script to run guest sessions with
+# display-setup-script = Script to run when starting a greeter session (runs as root)
+# display-stopped-script = Script to run after stopping the display server (runs as root)
+# greeter-setup-script = Script to run when starting a greeter (runs as root)
+# session-setup-script = Script to run when starting a user session (runs as root)
+# session-cleanup-script = Script to run when quitting a user session (runs as root)
+# autologin-guest = True to log in as guest by default
+# autologin-user = User to log in with by default (overrides autologin-guest)
+# autologin-user-timeout = Number of seconds to wait before loading default user
+# autologin-session = Session to load for automatic login (overrides user-session)
+# autologin-in-background = True if autologin session should not be immediately activated
+# exit-on-failure = True if the daemon should exit if this seat fails
+#
+[Seat:*]
+#type=xlocal
+pam-service=lightdm
+pam-autologin-service=lightdm-autologin
+#pam-greeter-service=lightdm-greeter
+#xserver-command=X
+#xmir-command=Xmir
+#xserver-config=
+#xserver-layout=
+#xserver-allow-tcp=false
+#xserver-share=true
+#xserver-hostname=
+#xserver-display-number=
+#xdmcp-manager=
+#xdmcp-port=177
+#xdmcp-key=
+#unity-compositor-command=unity-system-compositor
+#unity-compositor-timeout=60
+#greeter-session=example-gtk-gnome
+#greeter-hide-users=false
+#greeter-allow-guest=true
+#greeter-show-manual-login=false
+#greeter-show-remote-login=true
+#user-session=default
+#allow-user-switching=true
+#allow-guest=true
+#guest-session=
+session-wrapper=/etc/lightdm/Xsession
+#greeter-wrapper=
+#guest-wrapper=
+#display-setup-script=
+#display-stopped-script=
+#greeter-setup-script=
+#session-setup-script=
+#session-cleanup-script=
+#autologin-guest=false
+autologin-user=wktech
+autologin-user-timeout=0
+#autologin-in-background=false
+#autologin-session=
+#exit-on-failure=false
+
+#
+# XDMCP Server configuration
+#
+# enabled = True if XDMCP connections should be allowed
+# port = UDP/IP port to listen for connections on
+# listen-address = Host/address to listen for XDMCP connections (use all addresses if not present)
+# key = Authentication key to use for XDM-AUTHENTICATION-1 or blank to not use authentication (stored in keys.conf)
+#
+# The authentication key is a 56 bit DES key specified in hex as 0xnnnnnnnnnnnnnn. Alternatively
+# it can be a word and the first 7 characters are used as the key.
+#
+[XDMCPServer]
+#enabled=false
+#port=177
+#listen-address=
+#key=
+
+#
+# VNC Server configuration
+#
+# enabled = True if VNC connections should be allowed
+# command = Command to run Xvnc server with
+# port = TCP/IP port to listen for connections on
+# listen-address = Host/address to listen for VNC connections (use all addresses if not present)
+# width = Width of display to use
+# height = Height of display to use
+# depth = Color depth of display to use
+#
+[VNCServer]
+#enabled=false
+#command=Xvnc
+#port=5900
+#listen-address=
+#width=1024
+#height=768
+#depth=8
diff --git a/archlive/airootfs/etc/skel/.Xresources b/archlive/airootfs/etc/skel/.Xresources
new file mode 100644
index 00000000..5a39a77c
--- /dev/null
+++ b/archlive/airootfs/etc/skel/.Xresources
@@ -0,0 +1,35 @@
+URxvt*font: xft:Inconsolata:size=11
+
+URxvt*geometry: 128x32+24+24
+
+URxvt*scrollBar_right: True
+URxvt*scrollstyle: plain
+
+URxvt*shading: 30
+URxvt*transparent: true
+
+! Base16 Isotope
+! Scheme: Jan T. Sott
+!! Modified by 2Shirt
+
+*.foreground: #d0d0d0
+*.background: #000000
+*.cursorColor: #d0d0d0
+
+*.color0: #000000
+*.color1: #ff0000
+*.color2: #33ff00
+*.color3: #ffd000
+*.color4: #0066ff
+*.color5: #cc00ff
+*.color6: #00ffff
+*.color7: #d0d0d0
+
+*.color8: #808080
+*.color9: #ff9900
+*.color10: #404040
+*.color11: #606060
+*.color12: #c0c0c0
+*.color13: #e0e0e0
+*.color14: #3300ff
+*.color15: #ffffff
diff --git a/archlive/airootfs/etc/skel/.bash_logout b/archlive/airootfs/etc/skel/.bash_logout
new file mode 100644
index 00000000..0e4e4f18
--- /dev/null
+++ b/archlive/airootfs/etc/skel/.bash_logout
@@ -0,0 +1,3 @@
+#
+# ~/.bash_logout
+#
diff --git a/archlive/airootfs/etc/skel/.bash_profile b/archlive/airootfs/etc/skel/.bash_profile
new file mode 100644
index 00000000..5545f007
--- /dev/null
+++ b/archlive/airootfs/etc/skel/.bash_profile
@@ -0,0 +1,5 @@
+#
+# ~/.bash_profile
+#
+
+[[ -f ~/.bashrc ]] && . ~/.bashrc
diff --git a/archlive/airootfs/etc/skel/.bashrc b/archlive/airootfs/etc/skel/.bashrc
new file mode 100644
index 00000000..a355b0cd
--- /dev/null
+++ b/archlive/airootfs/etc/skel/.bashrc
@@ -0,0 +1,9 @@
+#
+# ~/.bashrc
+#
+
+# If not running interactively, don't do anything
+[[ $- != *i* ]] && return
+
+alias ls='ls --color=auto'
+PS1='[\u@\h \W]\$ '
diff --git a/archlive/airootfs/etc/skel/.config/autostart/Conky.desktop b/archlive/airootfs/etc/skel/.config/autostart/Conky.desktop
new file mode 100644
index 00000000..56eb2051
--- /dev/null
+++ b/archlive/airootfs/etc/skel/.config/autostart/Conky.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=0.9.4
+Type=Application
+Name=Conky
+Comment=Conky
+Exec=/home/wktech/.conky_start
+OnlyShowIn=XFCE;
+StartupNotify=false
+Terminal=false
+Hidden=false
+
diff --git a/archlive/airootfs/etc/skel/.config/autostart/urxvt-default-res.desktop b/archlive/airootfs/etc/skel/.config/autostart/urxvt-default-res.desktop
new file mode 100644
index 00000000..7ee94394
--- /dev/null
+++ b/archlive/airootfs/etc/skel/.config/autostart/urxvt-default-res.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=0.9.4
+Type=Application
+Name=urxvt-Resolution
+Comment=urxvt-Resolution
+Exec=/home/wktech/.urxvt_default_res
+OnlyShowIn=XFCE;
+StartupNotify=false
+Terminal=false
+Hidden=false
+
diff --git a/archlive/airootfs/etc/skel/.config/autostart/wifi.desktop b/archlive/airootfs/etc/skel/.config/autostart/wifi.desktop
new file mode 100644
index 00000000..2459b12d
--- /dev/null
+++ b/archlive/airootfs/etc/skel/.config/autostart/wifi.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=0.9.4
+Type=Application
+Name=WiFi
+Comment=WiFi
+Exec=/home/wktech/.wifi
+OnlyShowIn=XFCE;
+StartupNotify=false
+Terminal=false
+Hidden=false
+
diff --git a/archlive/airootfs/etc/skel/.config/xfce4/helpers.rc b/archlive/airootfs/etc/skel/.config/xfce4/helpers.rc
index 149d8b72..889c575f 100644
--- a/archlive/airootfs/etc/skel/.config/xfce4/helpers.rc
+++ b/archlive/airootfs/etc/skel/.config/xfce4/helpers.rc
@@ -1,2 +1,3 @@
-WebBrowser=chromium
+WebBrowser=midori
+TerminalEmulator=urxvt
diff --git a/archlive/airootfs/etc/skel/.config/xfce4/panel/whiskermenu-18.rc b/archlive/airootfs/etc/skel/.config/xfce4/panel/whiskermenu-18.rc
index efcae705..00f15a7d 100644
--- a/archlive/airootfs/etc/skel/.config/xfce4/panel/whiskermenu-18.rc
+++ b/archlive/airootfs/etc/skel/.config/xfce4/panel/whiskermenu-18.rc
@@ -1,5 +1,5 @@
-favorites=exo-file-manager.desktop,gparted.desktop,gsmartcontrol.desktop,truecrypt.desktop,exo-web-browser.desktop
-recent=xfce4-settings-editor.desktop,xfce-session-settings.desktop,xfce-workspaces-settings.desktop,gsmartcontrol.desktop,gparted.desktop,gksu-properties.desktop,xfce-keyboard-settings.desktop,xfce-backdrop-settings.desktop,truecrypt.desktop,exo-web-browser.desktop
+favorites=exo-file-manager.desktop,hwdiags.desktop,gparted.desktop,gsmartcontrol.desktop,truecrypt.desktop,speedtest.desktop,exo-web-browser.desktop
+recent=exo-web-browser.desktop
button-title=Applications
button-icon=desktop-environment-xfce
button-single-row=false
diff --git a/archlive/airootfs/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml b/archlive/airootfs/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml
index 91600493..0337f6f7 100644
--- a/archlive/airootfs/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml
+++ b/archlive/airootfs/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml
@@ -7,7 +7,7 @@
-
+
diff --git a/archlive/airootfs/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml b/archlive/airootfs/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml
index 76dc6bac..f52b0e10 100644
--- a/archlive/airootfs/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml
+++ b/archlive/airootfs/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml
@@ -46,7 +46,10 @@
-
+
+
+
+
diff --git a/archlive/airootfs/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml b/archlive/airootfs/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml
index dc424b47..bd7b830d 100644
--- a/archlive/airootfs/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml
+++ b/archlive/airootfs/etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml
@@ -13,8 +13,9 @@
-
+
+
@@ -40,7 +41,13 @@
-
+
+
+
+
+
+
+
diff --git a/archlive/airootfs/etc/skel/.conky_start b/archlive/airootfs/etc/skel/.conky_start
index 95add4d0..811f7722 100644
--- a/archlive/airootfs/etc/skel/.conky_start
+++ b/archlive/airootfs/etc/skel/.conky_start
@@ -1,3 +1,3 @@
#!/bin/bash
-sleep 2s && conky
+sleep 3s && conky
diff --git a/archlive/airootfs/etc/skel/.conkyrc b/archlive/airootfs/etc/skel/.conkyrc
index 796c3aee..9dafc71e 100644
--- a/archlive/airootfs/etc/skel/.conkyrc
+++ b/archlive/airootfs/etc/skel/.conkyrc
@@ -152,10 +152,12 @@ Down: ${downspeed}${goto 115}Up:${alignr}${upspeed}
${alignc}S H O R T C U T K E Y S
${hr}
-[Win] + d${alignr}HW Diagnostics
-[Win] + f${alignr}File Manager
-[Win] + h${alignr}Task Manager
-[Win] + r${alignr}Run Dialog
-[Win] + t${alignr}Terminal
-[Win] + w${alignr}Web Browser
-[Win] + x${alignr}Logout
+[Super] + d${alignr}HW Diagnostics
+[Super] + f${alignr}File Manager
+[Super] + h${alignr}Task Manager
+[Super] + m${alignr}Mount Volumes
+[Super] + r${alignr}Run Dialog
+[Super] + s${alignr}SMART Check
+[Super] + t${alignr}Terminal
+[Super] + w${alignr}Web Browser
+[Super] + x${alignr}Logout
diff --git a/archlive/airootfs/etc/skel/.dmrc b/archlive/airootfs/etc/skel/.dmrc
new file mode 100644
index 00000000..9cd11917
--- /dev/null
+++ b/archlive/airootfs/etc/skel/.dmrc
@@ -0,0 +1,3 @@
+[Desktop]
+Language=en_US.utf8
+Session=xfce
diff --git a/archlive/airootfs/etc/skel/.local/share/keyrings/login.keyring b/archlive/airootfs/etc/skel/.local/share/keyrings/login.keyring
new file mode 100644
index 0000000000000000000000000000000000000000..f312a94ad16406050b8f4aabc3475fdb6e7eb201
GIT binary patch
literal 105
zcmZ?I%g;^qPOU7;%uDCuW#D3f09K#;^vpac2TX-CR$W2xx#Of2-*j_W1-wCsp|Aw@
UH!c68^t?QyhyTHO_4XnO0NoH2jQ{`u
literal 0
HcmV?d00001
diff --git a/archlive/airootfs/etc/skel/.local/share/keyrings/user.keystore b/archlive/airootfs/etc/skel/.local/share/keyrings/user.keystore
new file mode 100644
index 0000000000000000000000000000000000000000..2d8eee8d47066034e55dbe3c2bd664d776592f12
GIT binary patch
literal 207
zcmZ?I%g;?!@J_8P%FIhw2rkJlN>wo8;$;8=9#5ADBM<`!asz_GKx}45*I*#U7VP0@
zWNOC1z`6&><9KVEapCuwjaPwe2d9rOt7fTZ=^x*;`GDF3e#OLao4<#94ILVu<|n%z
zVObLyu)=n&hR/dev/null | grep '*' | sed -r 's/^\s+([0-9]+)x.*/\1/')"
+XHEIGHT="$(xrandr 2>/dev/null | grep '*' | sed -r 's/^\s+[0-9]+x([0-9]+).*/\1/')"
+
+WIDTH="$(echo "${XWIDTH}*96/1024" | bc)"
+HEIGHT="$(echo "${XHEIGHT}*32/768" | bc)"
+
+sed -i -r "s/96x32/${WIDTH}x${HEIGHT}/" ~/.Xresources
+xrdb -merge ~/.Xresources
+
diff --git a/archlive/airootfs/etc/skel/.wifi b/archlive/airootfs/etc/skel/.wifi
new file mode 100644
index 00000000..859c57b5
--- /dev/null
+++ b/archlive/airootfs/etc/skel/.wifi
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+sleep 1s
+nmcli dev wifi con "SomeWiFi" password "Abracadabra"
+
diff --git a/archlive/airootfs/etc/skel/.xinitrc b/archlive/airootfs/etc/skel/.xinitrc
index 5958cc9f..f7420078 100644
--- a/archlive/airootfs/etc/skel/.xinitrc
+++ b/archlive/airootfs/etc/skel/.xinitrc
@@ -6,35 +6,15 @@ sysresources=/etc/X11/xinit/.Xresources
sysmodmap=/etc/X11/xinit/.Xmodmap
# merge in defaults and keymaps
-
if [ -f $sysresources ]; then
-
-
-
-
-
-
-
xrdb -merge $sysresources
-
fi
-
if [ -f $sysmodmap ]; then
xmodmap $sysmodmap
fi
-
if [ -f "$userresources" ]; then
-
-
-
-
-
-
-
xrdb -merge "$userresources"
-
fi
-
if [ -f "$usermodmap" ]; then
xmodmap "$usermodmap"
fi
@@ -43,8 +23,5 @@ fi
eval $(/usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh)
export SSH_AUTH_SOCK
-# Start Openbox
-#exec openbox-session
-
# Start Xfce4
exec startxfce4
diff --git a/archlive/airootfs/etc/skel/.zlogin b/archlive/airootfs/etc/skel/.zlogin
deleted file mode 100644
index 70b70593..00000000
--- a/archlive/airootfs/etc/skel/.zlogin
+++ /dev/null
@@ -1 +0,0 @@
-[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec startx
diff --git a/archlive/airootfs/etc/skel/.zsh_aliases b/archlive/airootfs/etc/skel/.zsh_aliases
index b7dc9bbc..417a3e84 100644
--- a/archlive/airootfs/etc/skel/.zsh_aliases
+++ b/archlive/airootfs/etc/skel/.zsh_aliases
@@ -6,18 +6,19 @@ alias 7z5='7z a -t7z -mx=5'
alias 7z7='7z a -t7z -mx=7'
alias 7z9='7z a -t7z -mx=9'
alias du='du -sch --apparent-size'
+alias fidentify="/usr/bin/fidentify-wip$(getconf LONG_BIT)"
alias fix-perms='find -type d -exec chmod 755 "{}" \; && find -type f -exec chmod 644 "{}" \;'
alias less='less -S'
alias mkdir='mkdir -p'
alias mount='sudo mount'
alias mv='mv -nv'
-alias photorec='sudo photorec'
-alias q='clear && ls -lh'
-alias q1='clear && ls -1'
-alias q1a='clear && ls -1A'
-alias qa='clear && ls -lAh'
-alias qs='clear && ls'
-alias qsa='clear && ls -A'
+alias photorec="sudo /usr/bin/photorec-wip$(getconf LONG_BIT)"
+alias q1='clear && sudo ls -1'
+alias q1a='clear && sudo ls -1A'
+alias q='clear && sudo ls -lh'
+alias qa='clear && sudo ls -lAh'
+alias qs='clear && sudo ls'
+alias qsa='clear && sudo ls -A'
alias rm='rm -v'
alias rmdirs='find -depth -mindepth 1 -type d -exec rmdir "{}" --ignore-fail-on-non-empty \;'
alias rs='rsync -avhPS --stats --exclude-from="$HOME/.rsync_exclusions"'
@@ -26,6 +27,6 @@ alias sdu='sudo du -sch --apparent-size'
alias srmdirs='find -depth -mindepth 1 -type d -exec sudo rmdir "{}" --ignore-fail-on-non-empty \;'
alias srs='sudo rsync -avhPS --stats --exclude-from="$HOME/.rsync_exclusions"'
alias srsz='sudo rsync -avhzPS --stats --exclude-from="$HOME/.rsync_exclusions"'
-alias testdisk='sudo testdisk'
+alias testdisk="sudo /usr/bin/testdisk-wip$(getconf LONG_BIT)"
alias umount='sudo umount'
alias unmount='sudo umount'
diff --git a/archlive/airootfs/etc/skel/.zshrc b/archlive/airootfs/etc/skel/.zshrc
index 1779863e..d4a35296 100644
--- a/archlive/airootfs/etc/skel/.zshrc
+++ b/archlive/airootfs/etc/skel/.zshrc
@@ -15,7 +15,7 @@ ZSH_THEME="lean"
# HYPHEN_INSENSITIVE="true"
# Uncomment the following line to disable bi-weekly auto-update checks.
-# DISABLE_AUTO_UPDATE="true"
+DISABLE_AUTO_UPDATE="true"
# Uncomment the following line to change how often to auto-update (in days).
# export UPDATE_ZSH_DAYS=13
diff --git a/archlive/airootfs/etc/systemd/system/dbus-org.freedesktop.NetworkManager.service b/archlive/airootfs/etc/systemd/system/dbus-org.freedesktop.NetworkManager.service
new file mode 100644
index 00000000..e874a9b3
--- /dev/null
+++ b/archlive/airootfs/etc/systemd/system/dbus-org.freedesktop.NetworkManager.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/NetworkManager.service
\ No newline at end of file
diff --git a/archlive/airootfs/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service b/archlive/airootfs/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service
new file mode 100644
index 00000000..a7e5cd4e
--- /dev/null
+++ b/archlive/airootfs/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/NetworkManager-dispatcher.service
\ No newline at end of file
diff --git a/archlive/airootfs/etc/systemd/system/display-manager.service b/archlive/airootfs/etc/systemd/system/display-manager.service
new file mode 100644
index 00000000..5595cea3
--- /dev/null
+++ b/archlive/airootfs/etc/systemd/system/display-manager.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/lightdm.service
\ No newline at end of file
diff --git a/archlive/airootfs/etc/systemd/system/getty.target.wants/getty@tty1.service b/archlive/airootfs/etc/systemd/system/getty.target.wants/getty@tty1.service
new file mode 100644
index 00000000..7bfe0808
--- /dev/null
+++ b/archlive/airootfs/etc/systemd/system/getty.target.wants/getty@tty1.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/getty@.service
\ No newline at end of file
diff --git a/archlive/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service b/archlive/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service
new file mode 100644
index 00000000..e874a9b3
--- /dev/null
+++ b/archlive/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/NetworkManager.service
\ No newline at end of file
diff --git a/archlive/airootfs/etc/systemd/system/multi-user.target.wants/remote-fs.target b/archlive/airootfs/etc/systemd/system/multi-user.target.wants/remote-fs.target
new file mode 100644
index 00000000..2bc8b1cc
--- /dev/null
+++ b/archlive/airootfs/etc/systemd/system/multi-user.target.wants/remote-fs.target
@@ -0,0 +1 @@
+/usr/lib/systemd/system/remote-fs.target
\ No newline at end of file
diff --git a/archlive/airootfs/etc/udevil/udevil.conf b/archlive/airootfs/etc/udevil/udevil.conf
new file mode 100644
index 00000000..92f37043
--- /dev/null
+++ b/archlive/airootfs/etc/udevil/udevil.conf
@@ -0,0 +1,336 @@
+##############################################################################
+#
+# udevil configuration file /etc/udevil/udevil.conf
+#
+# This file controls what devices, networks, and files users may mount and
+# unmount via udevil (set suid).
+#
+# IMPORTANT: IT IS POSSIBLE TO CREATE SERIOUS SECURITY PROBLEMS IF THIS FILE
+# IS MISCONFIGURED - EDIT WITH CARE
+#
+# Note: For greater control for specific users, including root, copy this
+# file to /etc/udevil/udevil-user-USERNAME.conf replacing USERNAME with the
+# desired username (eg /etc/udevil/udevil-user-jim.conf).
+#
+# Format:
+# OPTION = VALUE[, VALUE, ...]
+#
+# DO NOT USE QUOTES except literally
+# Lines beginning with # are ignored
+#
+##############################################################################
+
+
+# To log all uses of udevil, set log_file to a file path:
+# log_file = /var/log/udevil.log
+
+# Approximate number of days to retain log entries (0=forever, max=60):
+log_keep_days = 10
+
+
+# allowed_types determines what fstypes can be passed by a user to the u/mount
+# program, what device filesystems may be un/mounted implicitly, and what
+# network filesystems may be un/mounted.
+# It may also include the 'file' keyword, indicating that the user is allowed
+# to mount files (eg an ISO file). The $KNOWN_FILESYSTEMS variable may
+# be included to include common local filesystems as well as those listed in
+# /etc/filesystems and /proc/filesystems.
+# allowed_types_USERNAME, if present, is used to override allowed_types for
+# the specific user 'USERNAME'. For example, to allow user 'jim' to mount
+# only vfat filesystems, add:
+# allowed_types_jim = vfat
+# Setting allowed_types = * does NOT allow all types, as this is a security
+# risk, but does allow all recognized types.
+# allowed_types = $KNOWN_FILESYSTEMS, file, cifs, smbfs, nfs, curlftpfs, ftpfs, sshfs, davfs, tmpfs, ramfs
+allowed_types = $KNOWN_FILESYSTEMS, file, cifs, smbfs, nfs, hfsplus
+
+
+# allowed_users is a list of users permitted to mount and unmount with udevil.
+# Wildcards (* or ?) may be used in the usernames. To allow all users,
+# specify "allowed_users=*". UIDs may be included using the form UID=1000.
+# For example: allowed_users = carl, UID=1000, pre*
+# Also note that permission to execute udevil may be limited to users belonging
+# to the group that owns /usr/bin/udevil, such as 'plugdev' or 'storage',
+# depending on installation.
+# allowed_users_FSTYPE, if present, is used to override allowed_users when
+# mounting or unmounting a specific fstype (eg nfs, ext3, file).
+# Note that when mounting a file, fstype will always be 'file' regardless of
+# the internal fstype of the file.
+# For example, to allow only user 'bob' to mount nfs shares, add:
+# allowed_users_nfs = bob
+# The root user is NOT automatically allowed to use udevil in some cases unless
+# listed here (except for unmounting anything or mounting fstab devices).
+allowed_users = *
+
+
+# allowed_groups is a list of groups permitted to mount and unmount with
+# udevil. The user MUST belong to at least one of these groups. Wildcards
+# or GIDs may NOT be used in group names, but a single * may be used to allow
+# all groups.
+# Also note that permission to execute udevil may be limited to users belonging
+# to the group that owns /usr/bin/udevil, such as 'plugdev' or 'storage',
+# depending on installation.
+# allowed_groups_FSTYPE, if present, is used to override allowed_groups when
+# mounting or unmounting a specific fstype (eg nfs, ext3, file). For example,
+# to allow only members of the 'network' group to mount smb and nfs shares,
+# use both of these lines:
+# allowed_groups_smbfs = network
+# allowed_groups_nfs = network
+# The root user is NOT automatically allowed to use udevil in some cases unless
+# listed here (except for unmounting anything or mounting fstab devices).
+allowed_groups = *
+
+
+# allowed_media_dirs specifies the media directories in which user mount points
+# may be located. The first directory which exists and does not contain a
+# wildcard will be used as the default media directory (normally /media or
+# /media/$USER).
+# The $USER variable, if included, will be replaced with the username of the
+# user running udevil. Wildcards may also be used in any directory EXCEPT the
+# default. Wildcards will not match a /, except a /** suffix for recursion.
+# allowed_media_dirs_FSTYPE, if present, is used to override allowed_media_dirs
+# when mounting or unmounting a specific fstype (eg ext2, nfs). For example,
+# to cause /media/network to be used as the default media directory for
+# nfs and ftpfs mounts, use these two lines:
+# allowed_media_dirs_nfs = /media/network, /media, /media/$USER
+# allowed_media_dirs_ftpfs = /media/network, /media, /media/$USER
+# NOTE: If you want only the user who mounted a device to have access to it
+# and be allowed to unmount it, specify /media/$USER as the first
+# allowed media directory (only /media/$USER is created on demand).
+# IMPORTANT: If an allowed file is mounted to a media directory, the user may
+# be permitted to unmount its associated loop device even though internal.
+# INCLUDING /MNT HERE IS NOT RECOMMENDED. ALL ALLOWED MEDIA DIRECTORIES
+# SHOULD BE OWNED AND WRITABLE ONLY BY ROOT.
+allowed_media_dirs = /media, /media/$USER, /run/media/$USER
+
+
+# allowed_devices is the first criteria for what block devices users may mount
+# or unmount. If a device is not listed in allowed_devices, it cannot be
+# un/mounted (unless in fstab). However, even if a device is listed, other
+# factors may prevent its use. For example, access to system internal devices
+# will be denied to normal users even if they are included in allowed_devices.
+# allowed_devices_FSTYPE, if present, is used to override allowed_devices when
+# mounting or unmounting a specific fstype (eg ext3, ntfs). For example, to
+# prevent all block devices containing an ext4 filesystem from being
+# un/mounted use:
+# allowed_devices_ext4 =
+# Note: Wildcards may be used, but a wildcard will never match a /, except
+# for "allowed_devices=*" which allows any device. The recommended setting is
+# allowed_devices = /dev/*
+# WARNING: ALLOWING USERS TO MOUNT DEVICES OUTSIDE OF /dev CAN CAUSE SERIOUS
+# SECURITY PROBLEMS. DO NOT ALLOW DEVICES IN /dev/shm
+allowed_devices = /dev/*
+
+
+# allowed_internal_devices causes udevil to treat any listed block devices as
+# removable, thus allowing normal users to un/mount them (providing they are
+# also listed in allowed_devices).
+# allowed_internal_devices_FSTYPE, if present, is used to override
+# allowed_internal_devices when mounting or unmounting a specific fstype
+# (eg ext3, ntfs). For example, to allow block devices containing a vfat
+# filesystem to be un/mounted even if they are system internal devices, use:
+# allowed_internal_devices_vfat = /dev/sdb*
+# Some removable esata drives look like internal drives to udevil. To avoid
+# this problem, they can be treated as removable with this setting.
+# WARNING: SETTING A SYSTEM DEVICE HERE CAN CAUSE SERIOUS SECURITY PROBLEMS.
+allowed_internal_devices = /dev/*
+
+
+# allowed_internal_uuids and allowed_internal_uuids_FSTYPE work similarly to
+# allowed_internal_devices, except that UUIDs are specified instead of devices.
+# For example, to allow un/mounting of an internal filesystem based on UUID:
+# allowed_internal_uuids = cc0c4489-8def-1e5b-a304-ab87c3cb626c0
+# WARNING: SETTING A SYSTEM DEVICE HERE CAN CAUSE SERIOUS SECURITY PROBLEMS.
+# allowed_internal_uuids =
+
+
+# forbidden_devices is used to prevent block devices from being un/mounted
+# even if other settings would allow them (except devices in fstab).
+# forbidden_devices_FSTYPE, if present, is used to override
+# forbidden_devices when mounting or unmounting a specific fstype
+# (eg ext3, ntfs). For example, to prevent device /dev/sdd1 from being
+# mounted when it contains an ntfs filesystem, use:
+# forbidden_devices_ntfs = /dev/sdd1
+# NOTE: device node paths are canonicalized before being tested, so forbidding
+# a link to a device will have no effect.
+forbidden_devices =
+
+
+# allowed_networks determines what hosts may be un/mounted by udevil users when
+# using nfs, cifs, smbfs, curlftpfs, ftpfs, or sshfs. Hosts may be specified
+# using a hostname (eg myserver.com) or IP address (192.168.1.100).
+# Wildcards may be used in hostnames and IP addresses, but CIDR notation
+# (192.168.1.0/16) is NOT supported. IP v6 is supported. For example:
+# allowed_networks = 127.0.0.1, 192.168.1.*, 10.0.0.*, localmachine, *.okay.com
+# Or, to prevent un/mounting of any network shares, set:
+# allowed_networks =
+# allowed_networks_FSTYPE, if present, is used to override allowed_networks
+# when mounting or unmounting a specific network fstype (eg nfs, cifs, sshfs,
+# curlftpfs). For example, to limit nfs and samba shares to only local
+# networks, use these two lines:
+# allowed_networks_nfs = 192.168.1.*, 10.0.0.*
+# allowed_networks_cifs = 192.168.1.*, 10.0.0.*
+allowed_networks = *
+
+
+# forbidden_networks and forbidden_networks_FSTYPE are used to specify networks
+# that are never allowed, even if other settings allow them (except fstab).
+# NO REVERSE LOOKUP IS PERFORMED, so including bad.com will only have an effect
+# if the user uses that hostname. IP lookup is always performed, so forbidding
+# an IP address will also forbid all corresponding hostnames.
+forbidden_networks =
+
+
+# allowed_files is used to determine what files in what directories may be
+# un/mounted. A user must also have read permission on a file to mount it.
+# Note: Wildcards may be used, but a wildcard will never match a /, except
+# for "allowed_files=*" which allows any file, and a /** suffix, which matches
+# all files recursively.
+# For example, to allow only files in the /share directory to be mounted, use:
+# allowed_files = /share/*
+# To allow all files in the /share directory AND all subdirectories use:
+# allowed_files = /share/**
+# NOTE: Specifying allowed_files_FSTYPE will NOT work because the fstype of
+# files is always 'file'.
+allowed_files = *
+
+
+# forbidden_files is used to specify files that are never allowed, even if
+# other settings allow them (except fstab). Specify a full path.
+# Note: Wildcards may be used, but a wildcard will never match a /, except
+# for "forbidden_files = *", or a /** suffix, which matches all recursively.
+# NOTE: file paths are canonicalized before being tested, so forbidding
+# a link to a file will have no effect.
+forbidden_files =
+
+
+# default_options specifies what options are always included when performing
+# a mount, in addition to any options the user may specify.
+# Note: When a device is present in /etc/fstab, and the user does not specify
+# a mount point, the device is mounted with normal user permissions using
+# the fstab entry, without these options.
+# default_options_FSTYPE, if present, is used to override default_options
+# when mounting a specific fstype (eg ext2, nfs).
+# The variables $USER, $UID, and $GID are changed to the user's username, UID,
+# and GID.
+# FOR GOOD SECURITY, default_options SHOULD ALWAYS INCLUDE: nosuid,noexec,nodev
+# WARNING: OPTIONS PRESENT OR MISSING CAN CAUSE SERIOUS SECURITY PROBLEMS.
+default_options = nosuid, noexec, nodev, noatime
+default_options_file = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID, ro
+# mount iso9660 with 'ro' to prevent mount read-only warning
+default_options_iso9660 = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID, ro, utf8
+default_options_udf = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID
+default_options_vfat = nosuid, noexec, nodev, noatime, fmask=0133, dmask=0022, uid=$UID, gid=$GID, utf8
+default_options_exfat = nosuid, noexec, nodev, noatime, umask=0077, uid=$UID, gid=$GID, iocharset=utf8, namecase=0, nonempty
+default_options_hfsplus = nosuid, noexec, nodev, ro, uid=$UID, gid=$GID
+default_options_msdos = nosuid, noexec, nodev, noatime, fmask=0133, dmask=0022, uid=$UID, gid=$GID
+default_options_umsdos = nosuid, noexec, nodev, noatime, fmask=0133, dmask=0022, uid=$UID, gid=$GID
+default_options_ntfs = nosuid, noexec, nodev, noatime, fmask=0133, uid=$UID, gid=$GID, utf8
+default_options_cifs = nosuid, noexec, nodev, uid=$UID, gid=$GID
+default_options_smbfs = nosuid, noexec, nodev, uid=$UID, gid=$GID
+default_options_sshfs = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID, nonempty, allow_other
+default_options_curlftpfs = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID, nonempty, allow_other
+default_options_ftpfs = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID
+default_options_davfs = nosuid, noexec, nodev, uid=$UID, gid=$GID
+default_options_tmpfs = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID
+default_options_ramfs = nosuid, noexec, nodev, noatime, uid=$UID, gid=$GID
+
+
+# allowed_options determines all options that a user may specify when mounting.
+# All the options used in default_options above must be included here too, or
+# they will be rejected. If the user attempts to use an option not included
+# here, an error will result. Wildcards may be used.
+# allowed_options_FSTYPE, if present, is used to override allowed_options
+# when mounting a specific fstype (eg ext2, nfs).
+# The variables $USER, $UID, and $GID are changed to the user's username, UID,
+# and GID.
+# If you want to forbid remounts, remove 'remount' from here.
+# WARNING: OPTIONS HERE CAN CAUSE SERIOUS SECURITY PROBLEMS - CHOOSE CAREFULLY
+allowed_options = nosuid, noexec, nodev, noatime, fmask=0133, dmask=0022, uid=$UID, gid=$GID, ro, rw, sync, flush, iocharset=*, utf8, remount
+allowed_options_nfs = nosuid, noexec, nodev, noatime, ro, rw, sync, remount, port=*, rsize=*, wsize=*, hard, proto=*, timeo=*, retrans=*
+allowed_options_cifs = nosuid, noexec, nodev, ro, rw, remount, port=*, user=*, username=*, pass=*, password=*, guest, domain=*, uid=$UID, gid=$GID, credentials=*
+allowed_options_smbfs = nosuid, noexec, nodev, ro, rw, remount, port=*, user=*, username=*, pass=*, password=*, guest, domain=*, uid=$UID, gid=$GID, credentials=*
+allowed_options_sshfs = nosuid, noexec, nodev, noatime, ro, rw, uid=$UID, gid=$GID, nonempty, allow_other, idmap=user, BatchMode=yes, port=*
+allowed_options_curlftpfs = nosuid, noexec, nodev, noatime, ro, rw, uid=$UID, gid=$GID, nonempty, allow_other, user=*
+allowed_options_ftpfs = nosuid, noexec, nodev, noatime, ro, rw, port=*, user=*, pass=*, root=*, uid=$UID, gid=$GID
+allowed_options_exfat = nosuid, noexec, nodev, noatime, fmask=0133, dmask=0022, uid=$UID, gid=$GID, umask=0077, namecase=*, ro, rw, sync, flush, iocharset=*, remount, nonempty
+
+
+# mount_point_mode, if present and set to a non-empty value, will cause udevil
+# to set the mode (permissions) on the moint point after mounting If not
+# specified or if left empty, the mode is not changed. Mode must be octal
+# starting with a zero (0755).
+# mount_point_mode_FSTYPE, if present, is used to override mount_point_mode
+# when mounting a specific fstype (eg ext2, nfs).
+# NOT SETTING A MODE CAN HAVE SECURITY IMPLICATIONS FOR SOME FSTYPES
+mount_point_mode = 0755
+# don't set a mode for some types:
+mount_point_mode_sshfs =
+mount_point_mode_curlftpfs =
+mount_point_mode_ftpfs =
+
+
+# Use the settings below to change the default locations of programs used by
+# udevil, or (advanced topic) to redirect commands to your scripts.
+# When substituting scripts, make sure they are root-owned and accept the
+# options used by udevil (for example, the mount_program must accept --fake,
+# -o, -v, and other options valid to mount.)
+# Be sure to specify the full path and include NO OPTIONS or other arguments.
+# These programs may also be specified as configure options when building
+# udevil.
+# THESE PROGRAMS ARE RUN AS ROOT
+# mount_program = /bin/mount
+# umount_program = /bin/umount
+# losetup_program = /sbin/losetup
+# setfacl_program = /usr/bin/setfacl
+
+
+# validate_exec specifies a program or script which provides additional
+# validation of a mount or unmount command, beyond the checks performed by
+# udevil. The program is run as a normal user (if root runs udevil,
+# validate_exec will NOT be run). The program is NOT run if the user is
+# mounting a device without root priviledges (a device in fstab).
+# The program is passed the username, a printable description of what is
+# happening, and the entire udevil command line as the first three arguments.
+# The program must return an exit status of 0 to allow the mount or unmount
+# to proceed. If it returns non-zero, the user will be denied permission.
+# For example, validate_exec might specify a script which notifies you
+# of the command being run, or performs additional steps to authenticate the
+# user.
+# Specify a full path to the program, with NO options or arguments.
+# validate_exec =
+
+
+# validate_rootexec works similarly to validate_exec, except that the program
+# is run as root. validate_rootexec will also be run if the root user runs
+# udevil. If both validate_exec and validate_rootexec are specified,
+# validate_rootexec will run first, followed by validate_exec.
+# The program must return an exit status of 0 to allow the mount or unmount
+# to proceed. If it returns non-zero, the user will be denied permission.
+# Unless you are familiar with writing root scripts, it is recommended that
+# rootexec settings NOT be used, as it is easy to inadvertently open exploits.
+# THIS PROGRAM IS ALWAYS RUN AS ROOT, even if the user running udevil is not.
+# validate_rootexec =
+
+
+# success_exec is run after a successful mount, remount, or unmount. The
+# program is run as a normal user (if root runs udevil, success_exec
+# will NOT be run).
+# The program is passed the username, a printable description of what action
+# was taken, and the entire udevil command line as the first three arguments.
+# The program's exit status is ignored.
+# For example, success_exec might run a script which informs you of what action
+# was taken, and might perform further actions.
+# Specify a full path to the program, with NO options or arguments.
+# success_exec =
+
+
+# success_rootexec works similarly to success_exec, except that the program is
+# run as root. success_rootexec will also be run if the root user runs udevil.
+# If both success_exec and success_rootexec are specified, success_rootexec
+# will run first, followed by success_exec.
+# Unless you are familiar with writing root scripts, it is recommended that
+# rootexec settings NOT be used, as it is easy to inadvertently open exploits.
+# THIS PROGRAM IS ALWAYS RUN AS ROOT, even if the user running udevil is not.
+# success_rootexec =
+
diff --git a/archlive/airootfs/root/customize_airootfs.sh b/archlive/airootfs/root/customize_airootfs.sh
index 07bf9bc7..022df645 100644
--- a/archlive/airootfs/root/customize_airootfs.sh
+++ b/archlive/airootfs/root/customize_airootfs.sh
@@ -14,18 +14,18 @@ ln -sf /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
# root user settings
usermod -s /usr/bin/zsh root
cp -aT /etc/skel/ /root/
-rm /root/.zlogin
chmod 700 /root
+echo "root:Abracadabra" | chpasswd
+
+# Add autologin group
+groupadd -r autologin
# Add wktech user
-useradd -m -s /bin/zsh -G wheel -U wktech
+useradd -m -s /bin/zsh -G autologin,storage,wheel -U wktech
echo "wktech:Abracadabra" | chpasswd
# Enable sudo for %wheel
-echo '%wheel ALL=(ALL) ALL' >> /etc/sudoers
-
-# Enable firewall
-ufw enable
+echo '%wheel ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
# Set pacman mirrorlist
echo 'Server = http://arch.localmsp.org/arch/$repo/os/$arch' > /etc/pacman.d/mirrorlist
@@ -44,5 +44,5 @@ sed -i 's/#\(HandleLidSwitch=\)suspend/\1ignore/' /etc/systemd/logind.conf
# Startup settings (from archiso)
systemctl enable pacman-init.service choose-mirror.service
-systemctl enable NetworkManager.service
-systemctl set-default multi-user.target
+#systemctl set-default multi-user.target
+systemctl set-default graphical.target
diff --git a/archlive/airootfs/usr/local/bin/hw-diags b/archlive/airootfs/usr/local/bin/hw-diags
new file mode 100644
index 00000000..af422a7d
--- /dev/null
+++ b/archlive/airootfs/usr/local/bin/hw-diags
@@ -0,0 +1,86 @@
+#!/bin/bash
+#
+## WK HW diagnostics - Launcher
+
+MODE="$1"
+
+# Ensure a proper mode is selected
+while :; do
+ if [[ "$MODE" =~ ^(all|cpu|drives|foh|smart|badblocks)$ ]]; then
+ break
+ else
+ clear
+ echo "Hardware Diagnostics"
+ echo "────────────────────"
+ echo "0: Quick drive test"
+ echo "1: All tests"
+ echo "2: Prime95"
+ echo "3: SMART & badblocks"
+ echo "4: SMART"
+ echo "5: badblocks"
+ echo "────────────────────"
+ if [[ -n $DISPLAY ]]; then
+ echo "6: Graphics Test - FurMark"
+ echo "7: Graphics Test - Piano"
+ echo "8: Graphics Test - Volplosion"
+ fi
+ echo "A: Speaker Test"
+ if [[ -n $DISPLAY ]]; then
+ echo "K: Keyboard Test"
+ fi
+ echo "────────────────────"
+ echo ""
+ echo "Q: Quit"
+ echo ""
+ read -r -p "Please make a selection: " MODE
+
+ # Check input
+ case $MODE in
+ 0)
+ MODE=foh
+ break;;
+ 1)
+ MODE=all
+ break;;
+ 2)
+ MODE=cpu
+ break;;
+ 3)
+ MODE=drives
+ break;;
+ 4)
+ MODE=smart
+ break;;
+ 5)
+ MODE=badblocks
+ break;;
+ 6)
+ if [[ -n $DISPLAY ]]; then
+ gputest /fullscreen /test=fur
+ fi
+ ;;
+ 7)
+ if [[ -n $DISPLAY ]]; then
+ gputest /fullscreen /test=pixmark_piano
+ fi
+ ;;
+ 8)
+ if [[ -n $DISPLAY ]]; then
+ gputest /fullscreen /test=pixmark_volplosion
+ fi
+ ;;
+ a|A|audio|Audio)
+ hw-diags-audio;;
+ k|K|keyboard|Keyboard)
+ if [[ -n $DISPLAY ]]; then
+ xev
+ fi
+ ;;
+ q|Q|quit|Quit)
+ exit 1;;
+ esac
+ fi
+done
+
+# Start tmux
+tmux new-session -s 'hw-session' -n 'hw-window' "hw-diags-inner $MODE"
diff --git a/archlive/airootfs/usr/local/bin/hw-diags-audio b/archlive/airootfs/usr/local/bin/hw-diags-audio
new file mode 100644
index 00000000..eb6feef9
--- /dev/null
+++ b/archlive/airootfs/usr/local/bin/hw-diags-audio
@@ -0,0 +1,11 @@
+#!/bin/bash
+#
+## WK HW diagnostics - Audio (Stereo)
+
+# Unmute and set volume
+amixer -q set "Master" 80% unmute
+amixer -q set "PCM" 90% unmute
+
+speaker-test -c 2 -l 1 -t pink
+# speaker-test -c 2 -l 1 -t sine
+speaker-test -c 2 -l 1 -t wav
diff --git a/archlive/airootfs/usr/local/bin/hw-diags-badblocks b/archlive/airootfs/usr/local/bin/hw-diags-badblocks
new file mode 100644
index 00000000..8b5d75dc
--- /dev/null
+++ b/archlive/airootfs/usr/local/bin/hw-diags-badblocks
@@ -0,0 +1,25 @@
+#!/bin/bash
+#
+## WK HW diagnostics - badblocks
+
+function usage {
+ echo "Usage: $0 log-dir device"
+ echo " e.g. $0 /var/tmp/hw-diags/9001 /dev/sda"
+}
+
+# Bail early
+if [ ! -d "$1" ]; then
+ usage
+ exit 1
+fi
+if [ ! -b "$2" ]; then
+ usage
+ exit 1
+fi
+
+# Run Badblocks
+sudo badblocks -sv -e 1 "$2"
+tmux capture-pane
+tmux save-buffer "$1/bb_tmp.out"
+grep -Ev '^$' "$1/bb_tmp.out" > "$1/${2##*/}_badblocks.log"
+rm "$1/bb_tmp.out"
diff --git a/archlive/airootfs/usr/local/bin/hw-diags-inner b/archlive/airootfs/usr/local/bin/hw-diags-inner
new file mode 100644
index 00000000..28b4d600
--- /dev/null
+++ b/archlive/airootfs/usr/local/bin/hw-diags-inner
@@ -0,0 +1,483 @@
+#!/bin/bash
+#
+## WK HW Diagnostics - Main script
+
+# Setup tmux
+# tmux set remain-on-exit on
+tmux set status off
+
+# Get TICKET#
+TICKET=""
+while [[ "$TICKET" == "" ]]; do
+ if [[ "$1" == "foh" ]]; then
+ TICKET="foh-consult"
+ else
+ echo -n "Please enter the Service Order #: "
+ read -r _ticket
+ if echo "$_ticket" | grep -Eq '^[0-9]+\S*$'; then
+ TICKET="$_ticket"
+ fi
+ fi
+done
+
+# Init
+DIAG_DATE="$(date "+%F_%H%M")"
+DIAG_SERVER_AVAIL="False"
+DIAG_SERVER="10.0.0.10"
+DIAG_DEST="/srv/Diagnostics/${TICKET}/${DIAG_DATE}"
+DIAG_USER="wkdiag"
+TMP_DIR="/var/tmp/hw-diags/${TICKET}/${DIAG_DATE}"
+ERRORS="False"
+ERROR_IMG="$TMP_DIR/error.jpg"
+PASSED_IMG="$TMP_DIR/passed.jpg"
+TEST_CPU="False"
+TEST_OVER="False"
+TEST_SMART="False"
+TEST_BADBLOCKS="False"
+SKIP_SHORT_TEST="False"
+LOG="$TMP_DIR/hw-diags.log"
+OUT="$TMP_DIR/hw-diags.out"
+
+# Get list of drives to test (excluding any ARCH drives)
+## Some code borrowed from stackoverflow.com/a/10020397
+ARCH_DRIVES=($(ls -l /dev/disk/by-label | grep -iE 'ARCH.*[hs]d[a-z]' | sed -r 's#.*/([hs]d[a-z])[0-9]+#\1#' | sort | uniq))
+DRIVES=($(inxi -Dxx -c 0 | grep -E "ID-[0-9]+" | sed -r 's#.*/dev/([hs]d[a-z]).*#\1#' | sort))
+for d in "${ARCH_DRIVES[@]}"; do
+ DRIVES=(${DRIVES[@]//*$d*})
+done
+
+# Test connection to DIAG_SERVER
+if ip a | grep -q '192.168.1' && \
+ ping -c 1 -q $DIAG_SERVER >/dev/null 2>&1; then
+ DIAG_SERVER_AVAIL="True"
+ ssh $DIAG_USER@$DIAG_SERVER mkdir -p "$DIAG_DEST"
+fi
+
+# Setup Env
+mkdir "$TMP_DIR" -p 2>/dev/null
+pushd "$TMP_DIR" >/dev/null
+touch "$OUT"
+rm local.txt results.txt 2>/dev/null
+
+# Functions
+CLEAR="\e[0m"
+RED="\e[31m"
+GREEN="\e[32m"
+YELLOW="\e[33m"
+BLUE="\e[34m"
+function update_progress {
+ echo "HW Diagnostics" > "$LOG"
+ echo "${BLUE}HW Diagnostics${CLEAR}" > "$OUT"
+ echo "───────────────" >> "$LOG"
+ echo "───────────────" >> "$OUT"
+
+ if [[ "$TEST_CPU" == "True" ]]; then
+ echo "" >> "$LOG"
+ echo "" >> "$OUT"
+ if [[ "$cpu_result" == "CS" ]]; then
+ echo "Prime95 CS" >> "$LOG"
+ echo "${BLUE}Prime95${CLEAR} ${GREEN}CS${CLEAR}" >> "$OUT"
+ elif [[ "$cpu_result" == "Working" ]]; then
+ echo "Prime95 Working" >> "$LOG"
+ echo "${BLUE}Prime95${CLEAR} ${YELLOW}Working${CLEAR}" >> "$OUT"
+ elif [[ "$cpu_result" == "Unknown" ]]; then
+ echo "Prime95 Unknown" >> "$LOG"
+ echo "${BLUE}Prime95${CLEAR} ${YELLOW}Unknown${CLEAR}" >> "$OUT"
+ else
+ echo "Prime95 NS" >> "$LOG"
+ echo "${BLUE}Prime95${CLEAR} ${RED}NS${CLEAR}" >> "$OUT"
+ fi
+ fi
+
+ if [[ "$TEST_SMART" == "True" ]]; then
+ echo "" >> "$LOG"
+ echo "" >> "$OUT"
+ if [[ "$SKIP_SHORT_TEST" == "True" ]]; then
+ echo "SMART (Quick)" >> "$LOG"
+ echo "${BLUE}SMART${CLEAR} ${YELLOW}(Quick)${CLEAR}" >> "$OUT"
+ else
+ echo "SMART" >> "$LOG"
+ echo "${BLUE}SMART${CLEAR}" >> "$OUT"
+ fi
+ for d in "${DRIVES[@]}"; do
+ d_tmp="${d##*/}_smart_result"
+ eval "d_tmp=\$$d_tmp"
+ if [[ "$d_tmp" == "CS" ]]; then
+ echo "${d##*/} CS" >> "$LOG"
+ echo "${d##*/} ${GREEN}CS${CLEAR}" >> "$OUT"
+ elif [[ "$d_tmp" == "Working" ]]; then
+ echo "${d##*/} Working" >> "$LOG"
+ echo "${d##*/} ${YELLOW}Working${CLEAR}" >> "$OUT"
+ elif [[ "$d_tmp" == "Unknown" ]]; then
+ echo "${d##*/} Unknown" >> "$LOG"
+ echo "${d##*/} ${YELLOW}Unknown${CLEAR}" >> "$OUT"
+ elif [[ "$d_tmp" == "NS" ]]; then
+ echo "${d##*/} NS" >> "$LOG"
+ echo "${d##*/} ${RED}NS${CLEAR}" >> "$OUT"
+ else
+ echo "${d##*/}" >> "$LOG"
+ echo "${d##*/}" >> "$OUT"
+ fi
+ done
+ fi
+
+ if [[ "$TEST_BADBLOCKS" == "True" ]]; then
+ echo "" >> "$LOG"
+ echo "" >> "$OUT"
+ echo "Badblocks" >> "$LOG"
+ echo "${BLUE}Badblocks${CLEAR}" >> "$OUT"
+ for d in "${DRIVES[@]}"; do
+ d_tmp="${d##*/}_badblocks_result"
+ eval "d_tmp=\$$d_tmp"
+ if [[ "$d_tmp" == "CS" ]]; then
+ echo "${d##*/} CS" >> "$LOG"
+ echo "${d##*/} ${GREEN}CS${CLEAR}" >> "$OUT"
+ elif [[ "$d_tmp" == "Working" ]]; then
+ echo "${d##*/} Working" >> "$LOG"
+ echo "${d##*/} ${YELLOW}Working${CLEAR}" >> "$OUT"
+ elif [[ "$d_tmp" == "Skipped" ]]; then
+ echo "${d##*/} Skipped" >> "$LOG"
+ echo "${d##*/} ${RED}Skipped${CLEAR}" >> "$OUT"
+ elif [[ "$d_tmp" == "NS" ]]; then
+ echo "${d##*/} NS" >> "$LOG"
+ echo "${d##*/} ${RED}NS${CLEAR}" >> "$OUT"
+ else
+ echo "${d##*/}" >> "$LOG"
+ echo "${d##*/}" >> "$OUT"
+ fi
+ done
+ fi
+
+ if [[ "$TEST_OVER" == "True" ]]; then
+ echo "" >> "$LOG"
+ echo "" >> "$OUT"
+ echo "───────────────" >> "$LOG"
+ echo "───────────────" >> "$OUT"
+
+ if [[ "$ERRORS" == "True" ]]; then
+ echo "HW: Error(s)" >> "$LOG"
+ echo "${RED}HW: Error(s)${CLEAR}" >> "$OUT"
+ else
+ echo "HW: Passed" >> "$LOG"
+ echo "${GREEN}HW: Passed${CLEAR}" >> "$OUT"
+ fi
+ fi
+
+ # Update Server
+ if [[ "$DIAG_SERVER_AVAIL" == "True" ]]; then
+ rsync -aqz "$TMP_DIR/" $DIAG_USER@$DIAG_SERVER:"$DIAG_DEST/" --exclude '*.out'
+ fi
+}
+
+# Select Tests
+case "$1" in
+ all)
+ TEST_CPU="True"
+ TEST_SMART="True"
+ TEST_BADBLOCKS="True"
+ ;;
+ cpu)
+ TEST_CPU="True"
+ TEST_SMART="False"
+ TEST_BADBLOCKS="False"
+ ;;
+ drives)
+ TEST_CPU="False"
+ TEST_SMART="True"
+ TEST_BADBLOCKS="True"
+ ;;
+ foh)
+ TEST_CPU="False"
+ TEST_SMART="True"
+ TEST_BADBLOCKS="False"
+ SKIP_SHORT_TEST="True"
+ ;;
+ smart)
+ TEST_CPU="False"
+ TEST_SMART="True"
+ TEST_BADBLOCKS="False"
+ ;;
+ badblocks)
+ TEST_CPU="False"
+ TEST_SMART="False"
+ TEST_BADBLOCKS="True"
+ ;;
+esac
+
+if [[ "$TEST_CPU" == "False" ]] && \
+ [[ "$TEST_SMART" == "False" ]] && \
+ [[ "$TEST_BADBLOCKS" == "False" ]]; then
+ echo -e "${YELLOW}Aborting HW diagnostics${CLEAR}"
+ exit 1
+fi
+
+# Configure display
+tmux split-window -d -h -l 16 "hw-diags-progress $OUT"
+update_progress
+
+# CPU
+if [[ "$TEST_CPU" == "True" ]]; then
+ clear
+ CPU_ERRORS="False"
+ cpu_result="Working"
+ update_progress
+ (sleep 10m && killall -s INT "mprime$(getconf LONG_BIT)" >>/dev/null 2>&1) &
+ (sleep 10m && killall "hw-diags-sensors" >>/dev/null 2>&1) &
+ tmux split-window -d -v -l 10 "hw-diags-prime95 $TMP_DIR"
+ hw-diags-sensors "$TMP_DIR" 2>/dev/null
+ sleep 1s
+ # tmux kill-pane -t 1
+ if [[ -f "results.txt" ]]; then
+ mv -nv results.txt "prime-results.txt"
+ if grep -q -iE '(error|fail)' "prime-results.txt"; then
+ cpu_result="NS"
+ CPU_ERRORS="True"
+ else
+ cpu_result="CS"
+ fi
+ elif [[ -f "prime.log" ]]; then
+ if grep -i 'completed' "prime.log" | grep -q -iv '0 errors, 0 warnings'; then
+ cpu_result="NS"
+ CPU_ERRORS="True"
+ else
+ cpu_result="CS"
+ fi
+ else
+ CPU_ERRORS="True"
+ cpu_result="Unknown"
+ fi
+
+ update_progress
+
+ if [[ "$CPU_ERRORS" == "True" ]]; then
+ ERRORS="True"
+ fi
+fi
+
+# SMART
+if [[ "$TEST_SMART" == "True" ]]; then
+ clear
+ SMART_ERRORS="False"
+ echo "Checking SMART status..."
+ for d in "${DRIVES[@]}"; do
+ tmp_device="${d##*/}"
+ eval "${tmp_device}_smart_result=Working"
+ inxi -Dxx | grep "/dev/${tmp_device}" | sed -r "s#.*/dev/${tmp_device} (.*)# \1#" > "${tmp_device}_report.out"
+ inxi -Dxxc 0 | grep "/dev/${tmp_device}" | sed -r "s#.*/dev/${tmp_device} (.*)# \1#" > "${tmp_device}_report.log"
+ update_progress
+
+ # Attempt to enable SMART reporting
+ if sudo smartctl -s on "/dev/${tmp_device}" | grep -q 'device lacks SMART capability'; then
+ SMART_ERRORS="True"
+ eval "${tmp_device}_smart_result=Unknown"
+ echo " ${RED}ERROR: device lacks SMART capability${CLEAR}" >> "${tmp_device}_report.out"
+ echo " ERROR: device lacks SMART capability" >> "${tmp_device}_report.log"
+ sleep 1s
+ fi
+
+ # Save current SMART values
+ sudo smartctl --all "/dev/${tmp_device}" >> "${tmp_device}-smart.log"
+ sudo smartctl -l error "/dev/${tmp_device}" >> "${tmp_device}-smart-err.log"
+
+ # Check specific SMART results
+ sudo smartctl -A "/dev/${tmp_device}" | grep -E '^\s*(5|9|184|197|198)\s' >> "${tmp_device}-smart-attributes.log"
+
+ # 5 - Reallocated Sectors
+ if grep -qE '^\s*5\s' "${tmp_device}-smart-attributes.log"; then
+ line="$(grep -E '^\s*5\s' "${tmp_device}-smart-attributes.log")"
+ value=$(echo "$line" | sed -r 's/.*\s([0-9]+).*/\1/')
+ echo " Reallocated Sectors: $value" >> "${tmp_device}_report.log"
+ if [[ "$value" -gt 0 ]]; then
+ SMART_ERRORS="True"
+ echo " ${RED}Reallocated Sectors: $value${CLEAR}" >> "${tmp_device}_report.out"
+ else
+ echo " ${GREEN}Reallocated Sectors: $value${CLEAR}" >> "${tmp_device}_report.out"
+ fi
+ fi
+
+ # 9 - Power-on Hours (Warn, but don't prevent badblock scan)
+ if grep -qE '^\s*9\s' "${tmp_device}-smart-attributes.log"; then
+ line="$(grep -E '^\s*9\s' "${tmp_device}-smart-attributes.log")"
+ value=$(echo "$line" | sed -r 's/.*\s([0-9]+).*/\1/')
+ echo " Power-on Hours: $value" >> "${tmp_device}_report.log"
+ if [[ "$value" -gt 18000 ]]; then
+ #SMART_ERRORS="True"
+ echo " ${RED}Power-on Hours: $value (VERY OLD)${CLEAR}" >> "${tmp_device}_report.out"
+ elif [[ "$value" -gt 12000 ]]; then
+ echo " ${YELLOW}Power-on Hours: $value${CLEAR}" >> "${tmp_device}_report.out"
+ else
+ echo " ${GREEN}Power-on Hours: $value${CLEAR}" >> "${tmp_device}_report.out"
+ fi
+ fi
+
+ # 184 - End-to-End Errors
+ if grep -qE '^\s*184\s' "${tmp_device}-smart-attributes.log"; then
+ line="$(grep -E '^\s*184\s' "${tmp_device}-smart-attributes.log")"
+ value=$(echo "$line" | sed -r 's/.*\s([0-9]+).*/\1/')
+ echo " End-to-End Errors: $value" >> "${tmp_device}_report.log"
+ if [[ "$value" -gt 0 ]]; then
+ SMART_ERRORS="True"
+ echo " ${RED}End-to-End Errors: $value${CLEAR}" >> "${tmp_device}_report.out"
+ else
+ echo " ${GREEN}End-to-End Errors: $value${CLEAR}" >> "${tmp_device}_report.out"
+ fi
+ fi
+
+ # 197 - Current Pending Sectors
+ if grep -qE '^\s*197\s' "${tmp_device}-smart-attributes.log"; then
+ line="$(grep -E '^\s*197\s' "${tmp_device}-smart-attributes.log")"
+ value=$(echo "$line" | sed -r 's/.*\s([0-9]+).*/\1/')
+ echo " Current Pending Sectors: $value" >> "${tmp_device}_report.log"
+ if [[ "$value" -gt 0 ]]; then
+ SMART_ERRORS="True"
+ echo " ${RED}Current Pending Sectors: $value${CLEAR}" >> "${tmp_device}_report.out"
+ else
+ echo " ${GREEN}Current Pending Sectors: $value${CLEAR}" >> "${tmp_device}_report.out"
+ fi
+ fi
+
+ # 198 - Offline Uncorrectable
+ if grep -qE '^\s*198\s' "${tmp_device}-smart-attributes.log"; then
+ line="$(grep -E '^\s*198\s' "${tmp_device}-smart-attributes.log")"
+ value=$(echo "$line" | sed -r 's/.*\s([0-9]+).*/\1/')
+ echo " Offline Uncorrectable: $value" >> "${tmp_device}_report.log"
+ if [[ "$value" -gt 0 ]]; then
+ SMART_ERRORS="True"
+ echo " ${RED}Offline Uncorrectable: $value${CLEAR}" >> "${tmp_device}_report.out"
+ else
+ echo " ${GREEN}Offline Uncorrectable: $value${CLEAR}" >> "${tmp_device}_report.out"
+ fi
+ fi
+
+ if [[ "$SMART_ERRORS" == "False" ]] && [[ "$SKIP_SHORT_TEST" == "False" ]]; then
+ if sudo smartctl -c "/dev/${tmp_device}" >>/dev/null 2>&1; then
+ # Determine short-test polling time
+ wait_time=$(sudo smartctl -c "/dev/${tmp_device}" | grep -i 'polling time' | head -1 | sed -r 's/.*\( *([0-9]+)\).*/\1/')
+ wait_time=$(( wait_time + 5))
+
+ # Run short self-test
+ echo " Running SMART short self-test ($wait_time minutes)..."
+ sudo smartctl -t short "/dev/${tmp_device}" >/dev/null
+ sleep ${wait_time}m
+ sudo smartctl -l selftest "/dev/${tmp_device}" >> "${tmp_device}-smart-tests.log"
+ if grep '^#' "${tmp_device}-smart-tests.log" | head -1 | grep -iq 'completed without error'; then
+ echo " ${GREEN}Self-test: passed${CLEAR}" >> "${tmp_device}_report.out"
+ echo " Self-test: passed" >> "${tmp_device}_report.log"
+ else
+ echo " ${RED}Self-test: failed${CLEAR}" >> "${tmp_device}_report.out"
+ echo " Self-test: failed" >> "${tmp_device}_report.log"
+ SMART_ERRORS="True"
+ fi
+ else
+ echo " ${RED}ERROR: Unable to run SMART self-test.${CLEAR}" >> "${tmp_device}_report.out"
+ echo " ERROR: Unable to run SMART self-test." >> "${tmp_device}_report.log"
+ fi
+ fi
+
+ if [[ "$SMART_ERRORS" == "False" ]]; then
+ eval "${tmp_device}_smart_result=CS"
+ else
+ ERRORS="True"
+ tmp_if="${tmp_device}_smart_result"
+ eval "tmp_if=\$$tmp_if"
+ if [[ "$tmp_if" != "Unknown" ]]; then
+ eval "${tmp_device}_smart_result=NS"
+ fi
+ fi
+
+ update_progress
+ done
+fi
+
+# Badblocks
+if [[ "$TEST_BADBLOCKS" == "True" ]]; then
+ clear
+ for d in "${DRIVES[@]}"; do
+ # Get SMART results
+ tmp_device="${d##*/}"
+ d_smart="${tmp_device}_smart_result"
+ eval "d_smart=\$$d_smart"
+
+ # Check SMART results
+ if [[ "$d_smart" == "NS" ]]; then
+ echo -e "${RED}Skipping drive: $tmp_device${CLEAR}"
+ eval "${tmp_device}_badblocks_result=Skipped"
+ else
+ eval "${tmp_device}_badblocks_result=Working"
+ update_progress
+ echo "Testing drive: ${tmp_device}"
+
+ # Split and run
+ tmux split-window -d -v -l 7 "hw-diags-badblocks $TMP_DIR /dev/${tmp_device}"
+
+ # Wait until done
+ sleep 2s
+ while pgrep -G 0 -U 0 -f "badblocks.*${tmp_device}" >/dev/null 2>&1; do
+ sleep 1s;
+ done
+ sleep 2s
+
+ # Check log
+ if grep -q '0/0/0 errors' "${tmp_device}_badblocks.log"; then
+ eval "${tmp_device}_badblocks_result=CS"
+ else
+ eval "${tmp_device}_badblocks_result=NS"
+ fi
+ update_progress
+ fi
+ done
+fi
+
+# Result Screen
+TEST_OVER="True"
+update_progress
+clear
+echo "─── RESULTS ───"
+if [[ "$TEST_CPU" == "True" ]]; then
+ echo -e "${BLUE}CPU:${CLEAR}"
+ if [[ -f "results.txt" ]]; then
+ echo "results.txt"
+ if grep -q -iE '(error|fail)' "prime-results.txt"; then
+ echo -e "${RED}$(grep -q -iE '(error|fail)' "prime-results.txt" | sed -r 's/^/ /' | tail -4)${CLEAR}"
+ else
+ sed -r 's/^/ /' "prime-results.txt" 2>/dev/null | tail -4
+ fi
+ echo ""
+ fi
+ if [[ -f "prime.log" ]]; then
+ echo "prime.log"
+ if grep -i 'completed' "prime.log" | grep -q -iv '0 errors, 0 warnings'; then
+ echo -e "${RED}$(grep -i 'completed' "prime.log" | grep -iv '0 errors, 0 warnings' | sed -r 's/^/ /' | tail -4)${CLEAR}"
+ else
+ grep -i 'completed' "prime.log" | grep -i '0 errors, 0 warnings' | sed -r 's/^.*(Worker #[0-9]+).*(Torture.*)/ \1 \2/' | tail -4
+ fi
+ fi
+fi
+if [[ "$TEST_SMART" == "True" ]] || \
+ [[ "$TEST_BADBLOCKS" == "True" ]]; then
+ for d in "${DRIVES[@]}"; do
+ echo -e "${BLUE}Drive $d:${CLEAR}"
+ if [[ -f "${d##*/}_report.out" ]]; then
+ echo -e "$(cat "${d##*/}_report.out" 2>/dev/null)"
+ fi
+ if [[ -f "${d##*/}_badblocks.log" ]]; then
+ grep 'Pass completed, ' "${d##*/}_badblocks.log" 2>/dev/null | sed -r 's/^Pass completed, / /' 2>/dev/null
+ fi
+ echo ""
+ done
+fi
+
+# System info dump
+sudo inxi -CDdGlMmNopRsc 0 | grep -Ev '(/dev/ram|No RAID devices|Display Server|multisession)' > "system_info.txt"
+
+# Cleanup
+mkdir "$HOME/Tickets/$TICKET" -p 2>/dev/null
+rsync -aS "$TMP_DIR" "$HOME/Tickets/"
+popd >/dev/null
+cd "$HOME/Tickets" && tar czf "${TICKET}.tgz" "$TICKET"
+
+# End
+echo -n "Press Enter to exit..."
+read -r
+killall hw-diags-progress >>/dev/null 2>&1
+exit 0
diff --git a/archlive/airootfs/usr/local/bin/hw-diags-prime95 b/archlive/airootfs/usr/local/bin/hw-diags-prime95
new file mode 100644
index 00000000..191639e5
--- /dev/null
+++ b/archlive/airootfs/usr/local/bin/hw-diags-prime95
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+## WK HW diagnostics - Prime95
+
+# Find executable
+MPRIME="/usr/bin/mprime$(getconf LONG_BIT)"
+
+function usage {
+ echo "Usage: $0 log-dir"
+ echo " e.g. $0 /var/tmp/hw-diags/9001"
+}
+
+# Bail early
+if [ ! -d "$1" ]; then
+ usage
+ exit 1
+fi
+
+# Run Prime95
+$MPRIME -t | grep -iv --line-buffered 'stress.txt' | tee -a "$1/prime.log"
diff --git a/archlive/airootfs/usr/local/bin/hw-diags-progress b/archlive/airootfs/usr/local/bin/hw-diags-progress
new file mode 100644
index 00000000..83505276
--- /dev/null
+++ b/archlive/airootfs/usr/local/bin/hw-diags-progress
@@ -0,0 +1,10 @@
+#!/bin/bash
+#
+## WK HW diagnostics - Progress
+
+# Loop forever
+while :; do
+ clear
+ echo -e "$(cat "$1")"
+ sleep 1s
+done
diff --git a/archlive/airootfs/usr/local/bin/hw-diags-sensors b/archlive/airootfs/usr/local/bin/hw-diags-sensors
new file mode 100644
index 00000000..66cddcc0
--- /dev/null
+++ b/archlive/airootfs/usr/local/bin/hw-diags-sensors
@@ -0,0 +1,43 @@
+#!/bin/bash
+#
+## WK HW diagnostics - Sensors
+
+LOG_DIR="$1"
+
+function usage {
+ echo "Usage: $0 log-dir"
+ echo " e.g. $0 /var/tmp/hw-diags/9001"
+}
+
+# Bail early
+if [ ! -d "$LOG_DIR" ]; then
+ usage
+ exit 1
+fi
+
+# Run Sensor loop
+if sensors >/dev/null 2>&1; then
+ while :; do
+ sensors -A | grep -E -i -v '(N/A|RPM|\d+\s+V\s+|^\s*$)' > "$LOG_DIR/sensors.out" 2>/dev/null
+
+ # Colorize
+ # Blue: All temps (superseeded by other colors below)
+ sed -i -r 's#(\+[0-9]+\.[0-9].C)#\\e[34m\1\\e[0m#g' "$LOG_DIR/sensors.out" >/dev/null 2>&1
+ # Green >= 60* C
+ sed -i -r 's#(\+6[0-9]\.[0-9].C)#\\e[32m\1\\e[0m#g' "$LOG_DIR/sensors.out" >/dev/null 2>&1
+ # Yellow >= 70* C
+ sed -i -r 's#(\+7[0-9]\.[0-9].C)#\\e[33m\1\\e[0m#g' "$LOG_DIR/sensors.out" >/dev/null 2>&1
+ # Orange >= 80* C
+ sed -i -r 's#(\+(8[0-9]|9[0-4])\.[0-9].C)#\\e[31\;1m\1\\e[0m#g' "$LOG_DIR/sensors.out" >/dev/null 2>&1
+ # Red >= 95* C
+ sed -i -r 's#(\+(9[5-9]|1[0-9][0-9])\.[0-9].C)#\\e[31m\1\\e[0m#g' "$LOG_DIR/sensors.out" >/dev/null 2>&1
+
+ # Output data
+ clear
+ echo -e "$(cat "$LOG_DIR/sensors.out")"
+ sleep 1s
+ done
+else
+ echo -e "\e[33mNo sensors found!\nPlease monitor temperatures manually\e[0m"
+ sleep 1h
+fi
diff --git a/archlive/airootfs/usr/local/bin/mount-all-volumes b/archlive/airootfs/usr/local/bin/mount-all-volumes
new file mode 100644
index 00000000..fe50a427
--- /dev/null
+++ b/archlive/airootfs/usr/local/bin/mount-all-volumes
@@ -0,0 +1,14 @@
+#!/bin/bash
+#
+## Mount all volumes read-only
+
+echo "Mounting all volumes"
+regex="/dev/((h|s)d[a-z]|md)[0-9]+"
+for v in $(inxi -Do | grep -E "$regex" | sed -r "s#.*($regex).*#\1#"); do
+ echo -n " $v: "
+ if udevil mount -o ro $v >>/dev/null 2>&1; then
+ echo "Mounted."
+ else
+ echo "Failed to mount."
+ fi
+done
diff --git a/archlive/airootfs/usr/local/bin/mount-backup-shares b/archlive/airootfs/usr/local/bin/mount-backup-shares
new file mode 100644
index 00000000..be313995
--- /dev/null
+++ b/archlive/airootfs/usr/local/bin/mount-backup-shares
@@ -0,0 +1,10 @@
+#!/bin/bash
+#
+## Mount NAS backup shares
+
+echo "Mounting NAS backup shares"
+sudo mkdir /Backups/ServerOne
+sudo mount //10.0.0.10/Backups /Backups/ServerOne -o username=backup,password=Abracadabra
+sudo mkdir /Backups/ServerTwo
+sudo mount //10.0.0.11/Backups /Backups/ServerTwo -o username=backup,password=Abracadabra
+
diff --git a/archlive/airootfs/usr/local/bin/msword-search b/archlive/airootfs/usr/local/bin/msword-search
new file mode 100644
index 00000000..bc7d4aa5
--- /dev/null
+++ b/archlive/airootfs/usr/local/bin/msword-search
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+IFS=$'\n'
+for s in $*; do
+ REGEX="$s"
+ REGEX=$(echo "$REGEX" | sed -r 's/\s+/\\s\*/g')
+
+ # Word Doc
+ for d in *doc; do
+ if antiword "$d" | grep -iqsP "($REGEX)"; then
+ echo "Possible match: $d"
+ echo "$d" >> msword.tmp
+ fi
+ done
+
+ # Word Docx
+ for d in *docx; do
+ if unzip -p "$d" word/document.xml | grep -iqsP "($REGEX)"; then
+ echo "Possible match: $d"
+ echo "$d" >> msword.tmp
+ fi
+ done
+
+done
+
+# Cleanup results
+if [[ -f msword.tmp ]]; then
+ sort -u msword.tmp >> msword-matches.txt
+fi
+
diff --git a/archlive/airootfs/usr/share/applications/Hardware Diagnostics.desktop b/archlive/airootfs/usr/share/applications/Hardware Diagnostics.desktop
index 8f6a5233..02995642 100644
--- a/archlive/airootfs/usr/share/applications/Hardware Diagnostics.desktop
+++ b/archlive/airootfs/usr/share/applications/Hardware Diagnostics.desktop
@@ -3,7 +3,7 @@ Version=1.0
Type=Application
Name=Hardware Diagnostics
Comment=
-Exec=xfce4-terminal -T "Hardware Diagnostics" -H -I xcos -x hw-diags
+Exec=urxvt -title "Hardware Diagnostics" -hold -e hw-diags
Icon=xcos
Path=
Terminal=false
diff --git a/archlive/airootfs/usr/share/applications/SpeedTest.desktop b/archlive/airootfs/usr/share/applications/SpeedTest.desktop
index eeb2e9be..cea5f356 100644
--- a/archlive/airootfs/usr/share/applications/SpeedTest.desktop
+++ b/archlive/airootfs/usr/share/applications/SpeedTest.desktop
@@ -3,7 +3,7 @@ Version=1.0
Type=Application
Name=SpeedTest
Comment=
-Exec=xfce4-terminal -T SpeedTest -H -I network-workgroup -x speedtest
+Exec=urxvt -titile SpeedTest -hold -e speedtest
Icon=network-workgroup
Path=
Terminal=false
diff --git a/archlive/packages.both b/archlive/packages.both
index f77bca10..5db6acf4 100644
--- a/archlive/packages.both
+++ b/archlive/packages.both
@@ -1,22 +1,30 @@
arch-install-scripts
+alsa-utils
+antiword
b43-fwcutter
btrfs-progs
-chromium
+chntpw
clonezilla
+conky
crda
+curl
darkhttpd
ddrescue
dhclient
dialog
+dmidecode
dmraid
dnsmasq
dnsutils
+dos2unix
dosfstools
elinks
ethtool
+exfat-utils
f2fs-tools
+ffmpeg
fsarchiver
-git
+gcc-libs
gnome-keyring
gnu-netcat
gparted
@@ -25,14 +33,28 @@ grub
gsmartcontrol
gtk-engine-murrine
hdparm
+hfsprogs
+htop
+inxi
ipw2100-fw
ipw2200-fw
iw
lftp
librsvg
+lightdm
+lightdm-gtk-greeter
linux-atm
+lm_sensors
mc
+mdadm
+mediainfo
+mesa
+midori
+mkvtoolnix-cli
+mpv
mtools
+mupdf
+ncdu
network-manager-applet
networkmanager
nfs-utils
@@ -51,10 +73,13 @@ parted
partimage
ppp
pptpclient
+pygtk
+python2
refind-efi
rfkill
rp-pppoe
rsync
+rxvt-unicode
smartmontools
speedtest-cli
speedtouch
@@ -62,10 +87,12 @@ sudo
tcpdump
terminus-font
testdisk
+tk
tmux
truecrypt
ttf-inconsolata
-ufw
+udevil
+udisks2
usb_modeswitch
vim
vpnc
@@ -74,6 +101,7 @@ wireless_tools
wpa_actiond
wpa_supplicant
wvdial
+xf86-input-synaptics
xf86-video-amdgpu
xf86-video-ati
xf86-video-intel
@@ -84,6 +112,8 @@ xfce4-goodies
xl2tpd
xorg-server
xorg-server-utils
+xorg-xdpyinfo
+xorg-xev
xorg-xinit
zd1211-firmware
zsh