mirror of
https://github.com/ChrisTitusTech/linutil.git
synced 2024-11-24 22:14:28 +00:00
Compare commits
8 Commits
7a9e809786
...
b39bb29ce3
Author | SHA1 | Date | |
---|---|---|---|
|
b39bb29ce3 | ||
|
8639da3855 | ||
|
17ff412595 | ||
|
95cfbe8920 | ||
|
0d4688d53e | ||
|
2badbe9ead | ||
|
a0630e0a68 | ||
|
da534df296 |
72
Cargo.lock
generated
72
Cargo.lock
generated
|
@ -242,6 +242,15 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "deranged"
|
||||||
|
version = "0.3.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
|
||||||
|
dependencies = [
|
||||||
|
"powerfmt",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "downcast-rs"
|
name = "downcast-rs"
|
||||||
version = "1.2.1"
|
version = "1.2.1"
|
||||||
|
@ -412,9 +421,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.158"
|
version = "0.2.161"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
|
checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "linutil_core"
|
name = "linutil_core"
|
||||||
|
@ -442,6 +451,7 @@ dependencies = [
|
||||||
"ratatui",
|
"ratatui",
|
||||||
"temp-dir",
|
"temp-dir",
|
||||||
"textwrap",
|
"textwrap",
|
||||||
|
"time",
|
||||||
"tree-sitter-bash",
|
"tree-sitter-bash",
|
||||||
"tree-sitter-highlight",
|
"tree-sitter-highlight",
|
||||||
"tui-term",
|
"tui-term",
|
||||||
|
@ -538,6 +548,21 @@ dependencies = [
|
||||||
"minimal-lexical",
|
"minimal-lexical",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-conv"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num_threads"
|
||||||
|
version = "0.1.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "once_cell"
|
name = "once_cell"
|
||||||
version = "1.19.0"
|
version = "1.19.0"
|
||||||
|
@ -606,6 +631,12 @@ dependencies = [
|
||||||
"winreg",
|
"winreg",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "powerfmt"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ppv-lite86"
|
name = "ppv-lite86"
|
||||||
version = "0.2.20"
|
version = "0.2.20"
|
||||||
|
@ -724,9 +755,9 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustix"
|
name = "rustix"
|
||||||
version = "0.38.37"
|
version = "0.38.38"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811"
|
checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.6.0",
|
"bitflags 2.6.0",
|
||||||
"errno",
|
"errno",
|
||||||
|
@ -991,6 +1022,39 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "time"
|
||||||
|
version = "0.3.36"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
|
||||||
|
dependencies = [
|
||||||
|
"deranged",
|
||||||
|
"itoa",
|
||||||
|
"libc",
|
||||||
|
"num-conv",
|
||||||
|
"num_threads",
|
||||||
|
"powerfmt",
|
||||||
|
"serde",
|
||||||
|
"time-core",
|
||||||
|
"time-macros",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "time-core"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "time-macros"
|
||||||
|
version = "0.2.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf"
|
||||||
|
dependencies = [
|
||||||
|
"num-conv",
|
||||||
|
"time-core",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml"
|
name = "toml"
|
||||||
version = "0.8.19"
|
version = "0.8.19"
|
||||||
|
|
|
@ -5,3 +5,8 @@ name = "Firewall Baselines (CTT)"
|
||||||
description = "Developed to ease iptables firewall configuration, UFW provides a user friendly way to create an IPv4 or IPv6 host-based firewall. This command installs UFW and configures UFW based on CTT's recommended rules. For more information visit: https://christitus.com/linux-security-mistakes"
|
description = "Developed to ease iptables firewall configuration, UFW provides a user friendly way to create an IPv4 or IPv6 host-based firewall. This command installs UFW and configures UFW based on CTT's recommended rules. For more information visit: https://christitus.com/linux-security-mistakes"
|
||||||
script = "firewall-baselines.sh"
|
script = "firewall-baselines.sh"
|
||||||
task_list = "I SS"
|
task_list = "I SS"
|
||||||
|
|
||||||
|
[[data.preconditions]]
|
||||||
|
matches = false
|
||||||
|
data = "command_exists"
|
||||||
|
values = [ "firewalld" ]
|
||||||
|
|
|
@ -8,8 +8,6 @@ multimedia() {
|
||||||
if [ -e /etc/yum.repos.d/rpmfusion-free.repo ] && [ -e /etc/yum.repos.d/rpmfusion-nonfree.repo ]; then
|
if [ -e /etc/yum.repos.d/rpmfusion-free.repo ] && [ -e /etc/yum.repos.d/rpmfusion-nonfree.repo ]; then
|
||||||
printf "%b\n" "${YELLOW}Installing Multimedia Codecs...${RC}"
|
printf "%b\n" "${YELLOW}Installing Multimedia Codecs...${RC}"
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" swap ffmpeg-free ffmpeg --allowerasing -y
|
"$ESCALATION_TOOL" "$PACKAGER" swap ffmpeg-free ffmpeg --allowerasing -y
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" update @multimedia --setopt="install_weak_deps=False" --exclude=PackageKit-gstreamer-plugin -y
|
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" update @sound-and-video -y
|
|
||||||
printf "%b\n" "${GREEN}Multimedia Codecs Installed...${RC}"
|
printf "%b\n" "${GREEN}Multimedia Codecs Installed...${RC}"
|
||||||
else
|
else
|
||||||
printf "%b\n" "${RED}RPM Fusion repositories not found. Please set up RPM Fusion first!${RC}"
|
printf "%b\n" "${RED}RPM Fusion repositories not found. Please set up RPM Fusion first!${RC}"
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
|
||||||
. ../common-script.sh
|
. ../common-script.sh
|
||||||
|
|
||||||
installDepend() {
|
installDepend() {
|
||||||
# Check for dependencies
|
DEPENDENCIES='wine dbus git'
|
||||||
DEPENDENCIES='wine dbus'
|
|
||||||
printf "%b\n" "${YELLOW}Installing dependencies...${RC}"
|
printf "%b\n" "${YELLOW}Installing dependencies...${RC}"
|
||||||
case "$PACKAGER" in
|
case "$PACKAGER" in
|
||||||
pacman)
|
pacman)
|
||||||
|
@ -25,13 +26,16 @@ installDepend() {
|
||||||
|
|
||||||
$AUR_HELPER -S --needed --noconfirm $DEPENDENCIES $DISTRO_DEPS
|
$AUR_HELPER -S --needed --noconfirm $DEPENDENCIES $DISTRO_DEPS
|
||||||
;;
|
;;
|
||||||
apt-get|nala)
|
apt-get | nala)
|
||||||
DISTRO_DEPS="libasound2-plugins:i386 libsdl2-2.0-0:i386 libdbus-1-3:i386 libsqlite3-0:i386 wine64 wine32"
|
DISTRO_DEPS="libasound2-plugins:i386 libsdl2-2.0-0:i386 libdbus-1-3:i386 libsqlite3-0:i386 wine64 wine32"
|
||||||
|
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" update
|
|
||||||
"$ESCALATION_TOOL" dpkg --add-architecture i386
|
"$ESCALATION_TOOL" dpkg --add-architecture i386
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" install -y software-properties-common
|
|
||||||
"$ESCALATION_TOOL" apt-add-repository contrib -y
|
if [ "$DTYPE" != "pop" ]; then
|
||||||
|
"$ESCALATION_TOOL" "$PACKAGER" install -y software-properties-common
|
||||||
|
"$ESCALATION_TOOL" apt-add-repository contrib -y
|
||||||
|
fi
|
||||||
|
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" update
|
"$ESCALATION_TOOL" "$PACKAGER" update
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" install -y $DEPENDENCIES $DISTRO_DEPS
|
"$ESCALATION_TOOL" "$PACKAGER" install -y $DEPENDENCIES $DISTRO_DEPS
|
||||||
;;
|
;;
|
||||||
|
@ -62,7 +66,7 @@ installAdditionalDepend() {
|
||||||
DISTRO_DEPS='steam lutris goverlay'
|
DISTRO_DEPS='steam lutris goverlay'
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm $DISTRO_DEPS
|
"$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm $DISTRO_DEPS
|
||||||
;;
|
;;
|
||||||
apt-get|nala)
|
apt-get | nala)
|
||||||
version=$(git -c 'versionsort.suffix=-' ls-remote --tags --sort='v:refname' https://github.com/lutris/lutris |
|
version=$(git -c 'versionsort.suffix=-' ls-remote --tags --sort='v:refname' https://github.com/lutris/lutris |
|
||||||
grep -v 'beta' |
|
grep -v 'beta' |
|
||||||
tail -n1 |
|
tail -n1 |
|
||||||
|
@ -72,7 +76,7 @@ installAdditionalDepend() {
|
||||||
curl -sSLo "lutris_${version_no_v}_all.deb" "https://github.com/lutris/lutris/releases/download/${version}/lutris_${version_no_v}_all.deb"
|
curl -sSLo "lutris_${version_no_v}_all.deb" "https://github.com/lutris/lutris/releases/download/${version}/lutris_${version_no_v}_all.deb"
|
||||||
|
|
||||||
printf "%b\n" "${YELLOW}Installing Lutris...${RC}"
|
printf "%b\n" "${YELLOW}Installing Lutris...${RC}"
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" install ./lutris_"${version_no_v}"_all.deb
|
"$ESCALATION_TOOL" "$PACKAGER" install -y ./lutris_"${version_no_v}"_all.deb
|
||||||
|
|
||||||
rm lutris_"${version_no_v}"_all.deb
|
rm lutris_"${version_no_v}"_all.deb
|
||||||
|
|
||||||
|
@ -91,7 +95,6 @@ installAdditionalDepend() {
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" install -y $DISTRO_DEPS
|
"$ESCALATION_TOOL" "$PACKAGER" install -y $DISTRO_DEPS
|
||||||
;;
|
;;
|
||||||
zypper)
|
zypper)
|
||||||
# Flatpak
|
|
||||||
DISTRO_DEPS='lutris'
|
DISTRO_DEPS='lutris'
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" -n install $DISTRO_DEPS
|
"$ESCALATION_TOOL" "$PACKAGER" -n install $DISTRO_DEPS
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -22,7 +22,7 @@ cleanup_system() {
|
||||||
;;
|
;;
|
||||||
pacman)
|
pacman)
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" -Sc --noconfirm
|
"$ESCALATION_TOOL" "$PACKAGER" -Sc --noconfirm
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" -Rns $(pacman -Qtdq) --noconfirm > /dev/null 2>&1
|
"$ESCALATION_TOOL" "$PACKAGER" -Rns $(pacman -Qtdq) --noconfirm > /dev/null || true
|
||||||
;;
|
;;
|
||||||
apk)
|
apk)
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" cache clean
|
"$ESCALATION_TOOL" "$PACKAGER" cache clean
|
||||||
|
|
|
@ -5,83 +5,85 @@
|
||||||
fastUpdate() {
|
fastUpdate() {
|
||||||
case "$PACKAGER" in
|
case "$PACKAGER" in
|
||||||
pacman)
|
pacman)
|
||||||
|
"$AUR_HELPER" -S --needed --noconfirm rate-mirrors-bin
|
||||||
$AUR_HELPER -S --needed --noconfirm rate-mirrors-bin
|
|
||||||
|
|
||||||
printf "%b\n" "${YELLOW}Generating a new list of mirrors using rate-mirrors. This process may take a few seconds...${RC}"
|
printf "%b\n" "${YELLOW}Generating a new list of mirrors using rate-mirrors. This process may take a few seconds...${RC}"
|
||||||
|
|
||||||
if [ -s /etc/pacman.d/mirrorlist ]; then
|
if [ -s "/etc/pacman.d/mirrorlist" ]; then
|
||||||
"$ESCALATION_TOOL" cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
|
"$ESCALATION_TOOL" cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# If for some reason DTYPE is still unknown use always arch so the rate-mirrors does not fail
|
# If for some reason DTYPE is still unknown use always arch so the rate-mirrors does not fail
|
||||||
dtype_local=${DTYPE}
|
dtype_local="$DTYPE"
|
||||||
if [ "${DTYPE}" = "unknown" ]; then
|
if [ "$dtype_local" = "unknown" ]; then
|
||||||
dtype_local="arch"
|
dtype_local="arch"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
"$ESCALATION_TOOL" rate-mirrors --top-mirrors-number-to-retest=5 --disable-comments --save /etc/pacman.d/mirrorlist --allow-root ${dtype_local}
|
if ! "$ESCALATION_TOOL" rate-mirrors --top-mirrors-number-to-retest=5 --disable-comments --save /etc/pacman.d/mirrorlist --allow-root "$dtype_local" > /dev/null || [ ! -s "/etc/pacman.d/mirrorlist" ]; then
|
||||||
if [ $? -ne 0 ] || [ ! -s /etc/pacman.d/mirrorlist ]; then
|
|
||||||
printf "%b\n" "${RED}Rate-mirrors failed, restoring backup.${RC}"
|
printf "%b\n" "${RED}Rate-mirrors failed, restoring backup.${RC}"
|
||||||
"$ESCALATION_TOOL" cp /etc/pacman.d/mirrorlist.bak /etc/pacman.d/mirrorlist
|
"$ESCALATION_TOOL" cp /etc/pacman.d/mirrorlist.bak /etc/pacman.d/mirrorlist
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
apt-get|nala)
|
apt-get|nala)
|
||||||
"$ESCALATION_TOOL" apt-get update
|
if [ "$PACKAGER" = "apt-get" ]; then
|
||||||
if ! command_exists nala; then
|
printf "%b\n" "${YELLOW}Installing nala for faster updates.${RC}"
|
||||||
"$ESCALATION_TOOL" apt-get install -y nala || { printf "%b\n" "${YELLOW}Falling back to apt-get${RC}"; PACKAGER="apt-get"; }
|
"$ESCALATION_TOOL" "$PACKAGER" update
|
||||||
|
if "$ESCALATION_TOOL" "$PACKAGER" install -y nala; then
|
||||||
|
PACKAGER="nala";
|
||||||
|
printf "%b\n" "${CYAN}Using $PACKAGER as package manager${RC}"
|
||||||
|
else
|
||||||
|
printf "%b\n" "${RED}Nala installation failed.${RC}"
|
||||||
|
printf "%b\n" "${YELLOW}Falling back to apt-get.${RC}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$PACKAGER" = "nala" ]; then
|
if [ "$PACKAGER" = "nala" ]; then
|
||||||
"$ESCALATION_TOOL" cp /etc/apt/sources.list /etc/apt/sources.list.bak
|
if [ -f "/etc/apt/sources.list.d/nala-sources.list" ]; then
|
||||||
"$ESCALATION_TOOL" nala update
|
"$ESCALATION_TOOL" cp /etc/apt/sources.list.d/nala-sources.list /etc/apt/sources.list.d/nala-sources.list.bak
|
||||||
PACKAGER="nala"
|
fi
|
||||||
|
if ! "$ESCALATION_TOOL" nala fetch --auto -y || [ ! -s "/etc/apt/sources.list.d/nala-sources.list" ]; then
|
||||||
|
printf "%b\n" "${RED}Nala fetch failed, restoring backup.${RC}"
|
||||||
|
"$ESCALATION_TOOL" cp /etc/apt/sources.list.d/nala-sources.list.bak /etc/apt/sources.list.d/nala-sources.list
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" upgrade -y
|
|
||||||
;;
|
;;
|
||||||
dnf)
|
dnf)
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" update -y
|
"$ESCALATION_TOOL" "$PACKAGER" update -y
|
||||||
;;
|
;;
|
||||||
zypper)
|
zypper)
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" ref
|
"$ESCALATION_TOOL" "$PACKAGER" ref
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" --non-interactive dup
|
|
||||||
;;
|
;;
|
||||||
apk)
|
apk)
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" update
|
"$ESCALATION_TOOL" "$PACKAGER" update
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
printf "%b\n" "${RED}Unsupported package manager: "$PACKAGER"${RC}"
|
printf "%b\n" "${RED}Unsupported package manager: ${PACKAGER}${RC}"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
updateSystem() {
|
updateSystem() {
|
||||||
printf "%b\n" "${GREEN}Updating system${RC}"
|
printf "%b\n" "${YELLOW}Updating system packages.${RC}"
|
||||||
case "$PACKAGER" in
|
case "$PACKAGER" in
|
||||||
apt-get|nala)
|
apt-get|nala)
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" update
|
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" upgrade -y
|
"$ESCALATION_TOOL" "$PACKAGER" upgrade -y
|
||||||
;;
|
;;
|
||||||
dnf)
|
dnf)
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" update -y
|
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" upgrade -y
|
"$ESCALATION_TOOL" "$PACKAGER" upgrade -y
|
||||||
;;
|
;;
|
||||||
pacman)
|
pacman)
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" -Sy --noconfirm --needed archlinux-keyring
|
"$ESCALATION_TOOL" "$PACKAGER" -Sy --noconfirm --needed archlinux-keyring
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" -Su --noconfirm
|
"$AUR_HELPER" -Su --noconfirm
|
||||||
;;
|
;;
|
||||||
zypper)
|
zypper)
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" ref
|
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" --non-interactive dup
|
"$ESCALATION_TOOL" "$PACKAGER" --non-interactive dup
|
||||||
;;
|
;;
|
||||||
apk)
|
apk)
|
||||||
"$ESCALATION_TOOL" "$PACKAGER" upgrade
|
"$ESCALATION_TOOL" "$PACKAGER" upgrade
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
printf "%b\n" "${RED}Unsupported package manager: "$PACKAGER"${RC}"
|
printf "%b\n" "${RED}Unsupported package manager: ${PACKAGER}${RC}"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
@ -89,18 +91,8 @@ updateSystem() {
|
||||||
|
|
||||||
updateFlatpaks() {
|
updateFlatpaks() {
|
||||||
if command_exists flatpak; then
|
if command_exists flatpak; then
|
||||||
printf "%b\n" "${YELLOW}Updating installed Flathub apps...${RC}"
|
printf "%b\n" "${YELLOW}Updating flatpak packages.${RC}"
|
||||||
installed_apps=$(flatpak list --app --columns=application)
|
flatpak update -y
|
||||||
|
|
||||||
if [ -z "$installed_apps" ]; then
|
|
||||||
printf "%b\n" "${RED}No Flathub apps are installed.${RC}"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
for app in $installed_apps; do
|
|
||||||
printf "%b\n" "${YELLOW}Updating $app...${RC}"
|
|
||||||
flatpak update -y "$app"
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ configureAutoCpufreq() {
|
||||||
|
|
||||||
if command_exists auto-cpufreq; then
|
if command_exists auto-cpufreq; then
|
||||||
# Check if the system has a battery to determine if it's a laptop
|
# Check if the system has a battery to determine if it's a laptop
|
||||||
if [ -d /sys/class/power_supply/BAT0 ]; then
|
if ls /sys/class/power_supply/BAT* >/dev/null 2>&1; then
|
||||||
printf "%b\n" "${GREEN}System detected as laptop. Updating auto-cpufreq for laptop...${RC}"
|
printf "%b\n" "${GREEN}System detected as laptop. Updating auto-cpufreq for laptop...${RC}"
|
||||||
"$ESCALATION_TOOL" auto-cpufreq --force powersave
|
"$ESCALATION_TOOL" auto-cpufreq --force powersave
|
||||||
else
|
else
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
### Q4 2024
|
### Q4 2024
|
||||||
- [x] Finish the foundation of the project's CLI
|
- [x] Finish the foundation of the project's CLI
|
||||||
- [x] Implement CLI arguments and configuration support
|
- [x] Implement CLI arguments and configuration support
|
||||||
- [ ] Add an option for logging script executions
|
- [x] Add an option for logging script executions
|
||||||
|
|
||||||
### Q1 2025
|
### Q1 2025
|
||||||
- [ ] GUI Brainstorming and Planning
|
- [ ] GUI Brainstorming and Planning
|
||||||
|
|
|
@ -20,6 +20,7 @@ portable-pty = "0.8.1"
|
||||||
ratatui = "0.29.0"
|
ratatui = "0.29.0"
|
||||||
tui-term = "0.2.0"
|
tui-term = "0.2.0"
|
||||||
temp-dir = "0.1.14"
|
temp-dir = "0.1.14"
|
||||||
|
time = { version = "0.3.36", features = ["local-offset", "macros", "formatting"] }
|
||||||
unicode-width = "0.2.0"
|
unicode-width = "0.2.0"
|
||||||
rand = { version = "0.8.5", optional = true }
|
rand = { version = "0.8.5", optional = true }
|
||||||
linutil_core = { path = "../core", version = "24.9.28" }
|
linutil_core = { path = "../core", version = "24.9.28" }
|
||||||
|
|
|
@ -17,11 +17,11 @@ use std::{
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
thread::JoinHandle,
|
thread::JoinHandle,
|
||||||
};
|
};
|
||||||
|
use time::{macros::format_description, OffsetDateTime};
|
||||||
use tui_term::{
|
use tui_term::{
|
||||||
vt100::{self, Screen},
|
vt100::{self, Screen},
|
||||||
widget::PseudoTerminal,
|
widget::PseudoTerminal,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct RunningCommand {
|
pub struct RunningCommand {
|
||||||
/// A buffer to save all the command output (accumulates, until the command exits)
|
/// A buffer to save all the command output (accumulates, until the command exits)
|
||||||
buffer: Arc<Mutex<Vec<u8>>>,
|
buffer: Arc<Mutex<Vec<u8>>>,
|
||||||
|
@ -37,6 +37,7 @@ pub struct RunningCommand {
|
||||||
writer: Box<dyn Write + Send>,
|
writer: Box<dyn Write + Send>,
|
||||||
/// Only set after the process has ended
|
/// Only set after the process has ended
|
||||||
status: Option<ExitStatus>,
|
status: Option<ExitStatus>,
|
||||||
|
log_path: Option<String>,
|
||||||
scroll_offset: usize,
|
scroll_offset: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,10 +80,20 @@ impl FloatContent for RunningCommand {
|
||||||
.style(Style::default()),
|
.style(Style::default()),
|
||||||
);
|
);
|
||||||
|
|
||||||
Block::default()
|
let mut block = Block::default()
|
||||||
.borders(Borders::ALL)
|
.borders(Borders::ALL)
|
||||||
.border_set(ratatui::symbols::border::ROUNDED)
|
.border_set(ratatui::symbols::border::ROUNDED)
|
||||||
.title_top(title_line.centered())
|
.title_top(title_line.centered());
|
||||||
|
|
||||||
|
if let Some(log_path) = &self.log_path {
|
||||||
|
block =
|
||||||
|
block.title_bottom(Line::from(format!(" Log saved: {} ", log_path)).centered());
|
||||||
|
} else {
|
||||||
|
block =
|
||||||
|
block.title_bottom(Line::from(" Press 'l' to save command log ").centered());
|
||||||
|
}
|
||||||
|
|
||||||
|
block
|
||||||
};
|
};
|
||||||
|
|
||||||
// Process the buffer and create the pseudo-terminal widget
|
// Process the buffer and create the pseudo-terminal widget
|
||||||
|
@ -111,6 +122,11 @@ impl FloatContent for RunningCommand {
|
||||||
KeyCode::PageDown => {
|
KeyCode::PageDown => {
|
||||||
self.scroll_offset = self.scroll_offset.saturating_sub(10);
|
self.scroll_offset = self.scroll_offset.saturating_sub(10);
|
||||||
}
|
}
|
||||||
|
KeyCode::Char('l') if self.is_finished() => {
|
||||||
|
if let Ok(log_path) = self.save_log() {
|
||||||
|
self.log_path = Some(log_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
// Pass other key events to the terminal
|
// Pass other key events to the terminal
|
||||||
_ => self.handle_passthrough_key_event(key),
|
_ => self.handle_passthrough_key_event(key),
|
||||||
}
|
}
|
||||||
|
@ -134,6 +150,7 @@ impl FloatContent for RunningCommand {
|
||||||
Shortcut::new("Close window", ["Enter", "q"]),
|
Shortcut::new("Close window", ["Enter", "q"]),
|
||||||
Shortcut::new("Scroll up", ["Page up"]),
|
Shortcut::new("Scroll up", ["Page up"]),
|
||||||
Shortcut::new("Scroll down", ["Page down"]),
|
Shortcut::new("Scroll down", ["Page down"]),
|
||||||
|
Shortcut::new("Save log", ["l"]),
|
||||||
]),
|
]),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
@ -237,6 +254,7 @@ impl RunningCommand {
|
||||||
pty_master: pair.master,
|
pty_master: pair.master,
|
||||||
writer,
|
writer,
|
||||||
status: None,
|
status: None,
|
||||||
|
log_path: None,
|
||||||
scroll_offset: 0,
|
scroll_offset: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -284,6 +302,24 @@ impl RunningCommand {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn save_log(&self) -> std::io::Result<String> {
|
||||||
|
let mut log_path = std::env::temp_dir();
|
||||||
|
let date_format = format_description!("[year]-[month]-[day]-[hour]-[minute]-[second]");
|
||||||
|
log_path.push(format!(
|
||||||
|
"linutil_log_{}.log",
|
||||||
|
OffsetDateTime::now_local()
|
||||||
|
.unwrap_or(OffsetDateTime::now_utc())
|
||||||
|
.format(&date_format)
|
||||||
|
.unwrap()
|
||||||
|
));
|
||||||
|
|
||||||
|
let mut file = std::fs::File::create(&log_path)?;
|
||||||
|
let buffer = self.buffer.lock().unwrap();
|
||||||
|
file.write_all(&buffer)?;
|
||||||
|
|
||||||
|
Ok(log_path.to_string_lossy().into_owned())
|
||||||
|
}
|
||||||
|
|
||||||
/// Convert the KeyEvent to pty key codes, and send them to the virtual terminal
|
/// Convert the KeyEvent to pty key codes, and send them to the virtual terminal
|
||||||
fn handle_passthrough_key_event(&mut self, key: &KeyEvent) {
|
fn handle_passthrough_key_event(&mut self, key: &KeyEvent) {
|
||||||
let input_bytes = match key.code {
|
let input_bytes = match key.code {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user