Something went wrong. Try again.
a script to disable wifi powersaving on linux (Fedora and Arch Based distros)
Something went wrong. Try again.
7.9 kB · 279 lines · Created 4d ago Shell
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279#!/bin/bash
# WiFi Power Save Disable Script# Supports Arch Linux and Fedora# Author: Asher Payn :)
set -e
# Colors for outputRED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[1;33m'BLUE='\033[0;34m'NC='\033[0m' # No Colour
# Function to print coloured outputprint_status() { echo -e "${BLUE}[INFO]${NC} $1"}
print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"}
print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"}
print_error() { echo -e "${RED}[ERROR]${NC} $1"}
# Check if running as rootcheck_root() { if [[ $EUID -eq 0 ]]; then print_error "This script should not be run as root. Please run as a regular user." print_status "The script will use sudo when needed." exit 1 fi}
# Detect the Linux distributiondetect_distro() { if [[ -f /etc/os-release ]]; then . /etc/os-release DISTRO=$ID else print_error "Cannot detect Linux distribution" exit 1 fi case $DISTRO in arch|manjaro|cachyos|artix|endeavouros) DISTRO_TYPE="arch" print_status "Detected Arch-based distribution: $NAME" ;; fedora|centos|rhel|rocky|almalinux) DISTRO_TYPE="fedora" print_status "Detected Red Hat-based distribution: $NAME" ;; *) print_error "Unsupported distribution: $DISTRO" print_status "This script supports Arch Linux and Fedora-based distributions only." exit 1 ;; esac}
# Check if NetworkManager is runningcheck_networkmanager() { if systemctl is-active --quiet NetworkManager; then print_status "NetworkManager is running" return 0 else print_warning "NetworkManager is not running" return 1 fi}
# Get WiFi interface nameget_wifi_interface() { WIFI_INTERFACE=$(iw dev | grep Interface | head -n1 | awk '{print $2}') if [[ -z "$WIFI_INTERFACE" ]]; then print_error "No WiFi interface found" exit 1 fi print_status "Found WiFi interface: $WIFI_INTERFACE"}
# Install required packagesinstall_packages() { case $DISTRO_TYPE in arch) if ! command -v iw &> /dev/null; then print_status "Installing iw..." sudo pacman -S --needed --noconfirm iw fi ;; fedora) if ! command -v iw &> /dev/null; then print_status "Installing iw..." sudo dnf install -y iw fi ;; esac}
# Method 1: NetworkManager configurationconfigure_networkmanager() { print_status "Configuring NetworkManager to disable WiFi power save..." # Create NetworkManager conf.d directory if it doesn't exist sudo mkdir -p /etc/NetworkManager/conf.d/ # Create the configuration file sudo tee /etc/NetworkManager/conf.d/wifi-powersave-off.conf > /dev/null <<EOF[connection]wifi.powersave = 2EOF print_success "NetworkManager configuration created" # Restart NetworkManager print_status "Restarting NetworkManager..." sudo systemctl restart NetworkManager sleep 3 print_success "NetworkManager restarted"}
# Method 2: systemd service (fallback)create_systemd_service() { print_status "Creating systemd service as fallback method..." sudo tee /etc/systemd/system/wifi-powersave-off.service > /dev/null <<EOF[Unit]Description=Disable WiFi Power SaveAfter=network.targetWants=network.target
[Service]Type=oneshotExecStart=/usr/bin/iw dev ${WIFI_INTERFACE} set power_save offRemainAfterExit=yesStandardOutput=journalStandardError=journal
[Install]WantedBy=multi-user.targetEOF # Reload systemd and enable the service sudo systemctl daemon-reload sudo systemctl enable wifi-powersave-off.service print_success "Systemd service created and enabled"}
# Method 3: udev rule (additional method)create_udev_rule() { print_status "Creating udev rule for automatic power save disable..." sudo tee /etc/udev/rules.d/70-wifi-powersave-off.rules > /dev/null <<EOF# Disable WiFi power save on interface upACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan*", RUN+="/usr/bin/iw dev %k set power_save off"ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlp*", RUN+="/usr/bin/iw dev %k set power_save off"EOF # Reload udev rules sudo udevadm control --reload-rules sudo udevadm trigger print_success "Udev rule created"}
# Verify the configurationverify_configuration() { print_status "Verifying WiFi power save configuration..." sleep 5 # Wait for changes to take effect # Check current power management status if command -v iw &> /dev/null; then POWER_STATUS=$(iw dev "$WIFI_INTERFACE" get power_save 2>/dev/null || echo "")
if [[ $POWER_STATUS == *"off"* ]]; then print_success "WiFi power save is DISABLED" echo "Current status: $POWER_STATUS" elif [[ $POWER_STATUS == *"on"* ]]; then print_warning "WiFi power save is still ENABLED" echo "Current status: $POWER_STATUS" print_status "You may need to reboot or reconnect to WiFi for changes to take full effect" else print_warning "Could not determine power save status" fi else print_warning "iw not available, cannot verify status" fi}
# Create a script to manually disable power savecreate_manual_script() { print_status "Creating manual disable script..." sudo tee /usr/local/bin/disable-wifi-powersave > /dev/null <<EOF#!/bin/bash# Manual WiFi power save disable script
WIFI_INTERFACE=\$(iw dev | grep Interface | head -n1 | awk '{print \$2}')
if [[ -n "\$WIFI_INTERFACE" ]]; then echo "Disabling power save on \$WIFI_INTERFACE..." iw dev "\$WIFI_INTERFACE" set power_save off echo "Power save disabled." iw dev "\$WIFI_INTERFACE" get power_saveelse echo "No WiFi interface found" exit 1fiEOF sudo chmod +x /usr/local/bin/disable-wifi-powersave print_success "Manual script created at /usr/local/bin/disable-wifi-powersave"}
# Show final instructionsshow_final_instructions() { echo print_success "WiFi power save disable setup completed!" echo echo "What was configured:" if check_networkmanager; then echo " ✓ NetworkManager configuration (primary method)" fi echo " ✓ Systemd service (backup/redundancy method)" echo " ✓ Udev rules (automatic method)" echo " ✓ Manual script for immediate disable" echo echo "Next steps:" echo " 1. Reboot your system for all changes to take effect" echo " 2. After reboot, verify with: iw dev $WIFI_INTERFACE get power_save" echo " 3. For immediate disable (without reboot): sudo disable-wifi-powersave" echo echo "If issues persist after reboot:" echo " • Check NetworkManager status: systemctl status NetworkManager" echo " • Check systemd service: systemctl status wifi-powersave-off" echo " • Run manual script: sudo disable-wifi-powersave" echo}
# Main executionmain() { echo "=================================================" echo " WiFi Power Save Disable Script" echo " Supports Arch Linux and Fedora" echo "=================================================" echo check_root detect_distro get_wifi_interface install_packages if check_networkmanager; then configure_networkmanager print_status "Also creating systemd service for redundancy..." else print_warning "NetworkManager not available, using alternative methods" fi create_systemd_service create_udev_rule create_manual_script verify_configuration show_final_instructions}
# Run main functionmain "$@"