From 345606b8003487a66f1060f159f8830ad71d3fdc Mon Sep 17 00:00:00 2001 From: Quentin Duchemin Date: Wed, 1 May 2024 12:14:49 +0200 Subject: [PATCH] Automatic network modules in polybar When initializing the system (or later launching `~/.config/bootstrap/init_netctl ` and `~/.init_config.sh `, each interface is converted in a module and then referenced in the bottom_center variable of the bottom bar. --- .config/bootstrap/config_common | 1 + .config/bootstrap/init_netctl.sh | 44 ++++++++++++++-- .config/polybar/.env | 4 +- .config/polybar/config.d/{desk => misc.desk} | 1 - .../polybar/config.d/{laptop => misc.laptop} | 1 - .config/polybar/config_common | 20 -------- .../polybar/scripts/updates-arch-combined.sh | 4 +- .init_config.sh | 51 +++++++++---------- 8 files changed, 67 insertions(+), 59 deletions(-) rename .config/polybar/config.d/{desk => misc.desk} (93%) rename .config/polybar/config.d/{laptop => misc.laptop} (86%) diff --git a/.config/bootstrap/config_common b/.config/bootstrap/config_common index 4cb5be1..f903e43 100644 --- a/.config/bootstrap/config_common +++ b/.config/bootstrap/config_common @@ -16,6 +16,7 @@ chafa chromium cups dhcpcd +dialog docker dosfstools dkms diff --git a/.config/bootstrap/init_netctl.sh b/.config/bootstrap/init_netctl.sh index ed3295b..daa4e1c 100755 --- a/.config/bootstrap/init_netctl.sh +++ b/.config/bootstrap/init_netctl.sh @@ -1,12 +1,30 @@ #!/usr/bin/env bash -echo -e "* Auto-create wired profil and autoconnect service for netctl..." -for i in `ip -br l | awk '$1 !~ "lo|vir|wl" { print $1}'`; do +# ${1} : environment (see README.md) +module_names='' +echo -e "* Auto-create wired profil, autoconnect service for netctl and polybar module..." +for i in `ip -br l | awk '$1 !~ "lo|vir|br|wl" { print $1}'`; do echo -e "~ ${i}..." - cat <<- EOF | sudo tee /etc/netctl/${i} + module_name="network-${i}" + module_names+=" ${module_name}" + cat <<- EOF | sudo tee /etc/netctl/${i} >/dev/null Interface=${i} Connection=ethernet IP=dhcp EOF + cat <<- EOF | tee ~/.config/polybar/config.d/${i}.${1} >/dev/null + [module/${module_name}] + type = internal/network + interface = ${i} + ping-interval = 3 + label-connected = \${env:BAR_WIRED_CONNECTED} + label-disconnected = + label-disconnected-foreground = \${colors.text} + ; Consider an 'UNKNOWN' interface state as up. + ; Some devices like USB network adapters have + ; an unknown state, even when they're running + ; Default: false + unknown-as-up = true + EOF sudo systemctl enable --now netctl-ifplugd@${i} # In case some old config stays.... sudo systemctl restart netctl-ifplugd@${i} @@ -14,9 +32,25 @@ for i in `ip -br l | awk '$1 !~ "lo|vir|wl" { print $1}'`; do done echo -e "* Autoconnect to wireless profiles..." for i in `ip -br l | awk '$1 ~ "wl" { print $1}'`; do + module_name="network-${i}" + module_names+=" ${module_name}" + echo -e "~ ${i}..." + cat <<- EOF | tee ~/.config/polybar/config.d/${i}.${1} >/dev/null + [module/${module_name}] + type = internal/network + interface = ${i} + ping-interval = 3 + label-connected = \${env:BAR_WIFI_CONNECTED} + label-disconnected = + label-disconnected-foreground = \${colors.text} + EOF sudo systemctl enable --now netctl-auto@${i} done +echo -e "* Create an override polybar file to add all discovered networks..." +cat << EOF | tee ~/.config/polybar/config.d/bottom_center.${1} >/dev/null +[variables] +bottom_center = updates-arch-combined ${module_names} +EOF # https://man.archlinux.org/man/netctl.special.7 echo -e "* Ensure connections are back when PC is resumed..." -sudo systemctl enable netctl-sleep - \ No newline at end of file +sudo systemctl enable netctl-sleep \ No newline at end of file diff --git a/.config/polybar/.env b/.config/polybar/.env index 78aee2a..84dbfed 100644 --- a/.config/polybar/.env +++ b/.config/polybar/.env @@ -14,8 +14,8 @@ export MOCHA_ROSEWATER="#f2cdcd" export MOCHA_MAUVE="#ca9ee6" export MOCHA_TEAL="#81c8be" export BAR_WINDOW="%{F$MOCHA_TEXT}%title%" -export BAR_WIFI_CONNECTED="%{F$MOCHA_TEXT}%essid% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %local_ip% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %downspeed% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %upspeed%" -export BAR_WIRED_CONNECTED="%{F$MOCHA_TEXT}%ifname% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %local_ip% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %downspeed% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %upspeed%" +export BAR_WIFI_CONNECTED="%{F$MOCHA_TEXT}%essid% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %local_ip% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %downspeed% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %upspeed%" +export BAR_WIRED_CONNECTED="%{F$MOCHA_TEXT}%ifname% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %local_ip% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %downspeed% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %upspeed%" export BAR_CPU="%{F$MOCHA_MAUVE} " export BAR_TEMP_OK="%{F$MOCHA_MAUVE} %{F-} %temperature-c%" export BAR_TEMP_WARN="%{F$MOCHA_PEACH} %{F-} %temperature-c%" diff --git a/.config/polybar/config.d/desk b/.config/polybar/config.d/misc.desk similarity index 93% rename from .config/polybar/config.d/desk rename to .config/polybar/config.d/misc.desk index b07cadd..aac3942 100644 --- a/.config/polybar/config.d/desk +++ b/.config/polybar/config.d/misc.desk @@ -6,7 +6,6 @@ top_center = player-mpris ;top_center = xwindow top_right = system-usb-udev date bottom_left = i3 -bottom_center = updates-arch-combined wired-network bottom_right = temperature cpu memory filesystem-custom [module/memory] diff --git a/.config/polybar/config.d/laptop b/.config/polybar/config.d/misc.laptop similarity index 86% rename from .config/polybar/config.d/laptop rename to .config/polybar/config.d/misc.laptop index 073934a..3cafa47 100644 --- a/.config/polybar/config.d/laptop +++ b/.config/polybar/config.d/misc.laptop @@ -6,7 +6,6 @@ top_center = player-mpris ;top_center = xwindow top_right = system-usb-udev backlight pulseaudio date bottom_left = i3 -bottom_center = updates-arch-combined wired-network wireless-network bottom_right = temperature cpu memory filesystem-custom [module/memory] diff --git a/.config/polybar/config_common b/.config/polybar/config_common index aa729ec..f1c2fd9 100644 --- a/.config/polybar/config_common +++ b/.config/polybar/config_common @@ -76,26 +76,6 @@ type = internal/xwindow label = ${env:BAR_WINDOW} label-maxlen=100 -[module/wireless-network] -type = internal/network -interface-type = wireless -interval = 1 -label-connected = ${env:BAR_WIFI_CONNECTED} -label-disconnected = Wireless disconnected -label-disconnected-foreground = ${colors.text} -; Poorly documented and hackish way to have more space between some modules -label-connected-margin = 10 -label-disconnected-margin = 10 - -[module/wired-network] -type = internal/network -interface = enp8s0 -interface-type = wired -interval = 1 -label-connected = ${env:BAR_WIRED_CONNECTED} -label-disconnected = Ethernet disconnected -label-disconnected-foreground = ${colors.text} - [module/i3] type = internal/i3 format = diff --git a/.config/polybar/scripts/updates-arch-combined.sh b/.config/polybar/scripts/updates-arch-combined.sh index 940e1de..69f1cd1 100755 --- a/.config/polybar/scripts/updates-arch-combined.sh +++ b/.config/polybar/scripts/updates-arch-combined.sh @@ -1,7 +1,7 @@ #!/bin/sh - +# Wait for connection source $(dirname $0)/../.env -connect=$(ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` &> /dev/null) +connect=$(ping -q -w 1 -c 1 8.8.8.8 &> /dev/null) if [ $? -eq 0 ]; then updates_arch=$(/usr/bin/checkupdates | wc -l) # a restricts to AUR packages diff --git a/.init_config.sh b/.init_config.sh index 548b14c..f195d88 100755 --- a/.init_config.sh +++ b/.init_config.sh @@ -50,27 +50,24 @@ function check_copy() { # with an optional `$1/config.d/$2` file. This is useful for having # a common base for multiple computer, and per-computer stuff. # $1 : path of the folder -# $2 : optional current environment +# $2 : current environment # $3 : if defined, prepend $2 instead of appending function merge_config() { echo -e "\n=== Generate ${m} config file ===" - rm -f ${CONFIG}/${m}/${FINAL_CONFIG} + final_path=${CONFIG}/${m}/${FINAL_CONFIG}.${2} + rm -f ${final_path} # Copy common config - cp ${CONFIG}/${m}/${BASE_CONFIG} ${CONFIG}/${m}/${FINAL_CONFIG} - echo "${CONFIG}/${m}/${FINAL_CONFIG} created" + cp ${CONFIG}/${m}/${BASE_CONFIG} ${final_path} + echo "${final_path} created" # If there is an override folder, merge given env if [ ! -z ${2} ] && [ -d ${CONFIG}/${m}/${MERGE_CONFIG_FOLDER} ]; then for f in `find ${CONFIG}/${m}/config.d -type f -path "*${2}"`; do - final_path=${CONFIG}/${m}/${FINAL_CONFIG} if [ -z $3 ]; then echo "Found ${f}, append to regular config file" - cat "${f}" >> ${final_path} + echo -e "\n$(cat ${f})\n" >> ${final_path} else echo "Found ${f}, prepend to regular config file" - cat ${f} > /tmp/config - echo -e '\n' >> /tmp/config - cat ${final_path} >> /tmp/config - mv /tmp/config ${final_path} + echo -e "\n$(cat ${f})\n$(cat ${final_path})\n" > ${final_path} fi done fi @@ -100,7 +97,7 @@ function init_system() { sudo systemctl enable --now bluetooth sudo systemctl enable --now bluetooth-autoconnect sudo systemctl enable --now updatedb.timer - ./.config/init_netctl.sh + ~/.config/init_netctl.sh echo -e "* Ensure hardware clock is up to date..." sudo hwclock --systohc # So that "Open in Terminal" works inc Nemo @@ -156,6 +153,7 @@ CONFIG=${XDG_CONFIG_HOME:-$HOME/.config} ENV=${1} +# First thing to do, before symlinks for m in ${MERGE_DIRS}; do if [ -f "${CONFIG}/${m}/${MERGE_CONFIG_FOLDER}/above" ]; then merge_config $m ${ENV} true @@ -164,6 +162,19 @@ for m in ${MERGE_DIRS}; do fi done +echo -e "\n=== Create symlink to *.${ENV} regular files ===" +# Take all specific files and create a symlink pointing to it without the extension +# This file will be used by applications +for f in `find ${CONFIG} -type f -name "*.${ENV}"`; do + echo "${f%.*} → ${f}" + ln -sf ${f} ${f%.*} +done +# Take care of config files at home level, outside ${CONFIG} (e.g. Xresources) +for f in `find ${HOME} -maxdepth 1 -mindepth 1 -type f -name "*.${ENV}"`; do + echo "${f%.*} → ${f}" + ln -sf ${f} ${f%.*} +done + echo -e "\n=== Copy changed configuration which resides in outer directory ===" # Destination files are regular files for f in `find ${CONFIG} -type f -name ${DEST_FILENAME}`; do @@ -182,8 +193,7 @@ for f in `find ${CONFIG} -type f -name ${DEST_FILENAME}`; do filename=${config_file##*/} # Now copy to destination real_dest=${DEST}/${subfolder} - echo $real_dest - sudo mkdir -p ${real_dest} + sudo mkdir -p ${real_dest} absolute_source=`realpath "${DIR}/${config_file}"` check_copy "${absolute_source}" "sudo cp ${absolute_source} ${real_dest}" "sudo rm ${real_dest}/${filename}" done @@ -193,21 +203,6 @@ if [ ! -z "$INIT" ]; then init_system fi -if [ ! -z ${ENV} ]; then - echo -e "\n=== Create symlink to *.${ENV} regular files ===" - # Take all specific files and create a symlink pointing to it without the extension - # This file will be used by applications - for f in `find ${CONFIG} -type f -name "*.${ENV}"`; do - echo "${f%.*} → ${f}" - ln -sf ${f} ${f%.*} - done - # Take care of config files at home level, outside ${CONFIG} (e.g. Xresources) - for f in `find ${HOME} -maxdepth 1 -mindepth 1 -type f -name "*.${ENV}"`; do - echo "${f%.*} → ${f}" - ln -sf ${f} ${f%.*} - done -fi - if [ ! -z "${WM_RESTART}" ]; then echo -e "\n=== Restart graphical environment ===" # Reload i3 configuration