You are not logged in.
Installing hotfix-update-xpi-signing-intermediate.xpi did not work for me, neither did setting xpinstall.signatures.required=false in about:config. Also, making extensions.json read-only or immutable was only partly successful--my addons are enabled every time firefox starts, but get switched to disabled in the middle of every browsing session. I'm on ASCII running an AppImage of more recent version of Firefox than what's in ASCII repository, so don't know if my experience is predictive/generalizable.
At any rate, in the end I just decided to jump ship. Chromium has all the plugins I use. I mitigated my unease of using a browser made by Google by turning off all the "call-home" settings and running chromium in a sandbox by using firejail, either via $ firejail chromium or # ln -s /usr/bin/firejail /usr/local/bin/chromium.
I found that all the info on firejail in Arch Linux's wiki is applicable to Devuan:
https://wiki.archlinux.org/index.php/Firejail
I forgot to mention that the scripts assumes you are using a UTF-8 locale. The script just won't work if it finds itself in a non-UTF-8 environment. Here is a quick tutorial on locales:
To see your current locale, run locale
To see locales that are ready to use on your machine, run locale -a
If you want to switch to a locale that is not ready to use on your machine, you have to generate it:
manually edit /etc/locale.gen and uncomment the locale you want, then run locale-gen as root
To change your locale, put the one you want in /etc/default/locale (for example, LANG=en_US.UTF-8) then reboot.
I like using my own custom "hotstrings" for invoking Unicode characters (e.g., cx for ĉ, a' for á, c,, for ç) so I decided to create a python3 script that does this easily for me. Thought I'd post my solution here in case it is useful to anyone.
To use the script you need to install a few dependencies (some packages and two python3 modules). Run these two commands in a terminal to get all the dependencies:
$ sudo apt install python3 python3-pip x11-xserver-utils procps libnotify-bin xclip yad
$ pip3 install pynput Xlib --user
After that, all you need is the script and a config file.
Here is the script:
#!/usr/bin/env python3
# klavaro 2.0
# Copyright (c) 2019 Bruno "GNUser" Dantas <klavaro@dantas.airpost.net>
# This is free software, released under the terms of the ISC license:
# Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby
# granted, provided that the above copyright notice and this permission notice appear in all copies.
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE
# FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
from pynput import keyboard
from pynput import mouse
keyboard0 = keyboard.Controller()
mouse0 = mouse.Controller()
import os
import sys
import time
def log_it(keystroke):
"""High level function that logs keystroke, checks if last keystrokes
match a hotsring/trigger, replaces trigger with corresponding Unicode character"""
global mappings
global last_strokes
del last_strokes[0]
last_strokes.append(keystroke)
last_strokes_str = ''.join(last_strokes)
#print("last strokes = " + last_strokes_str) # for debugging
for trigger in mappings.keys():
if last_strokes_str.endswith(trigger):
character = mappings[trigger]
backspaces = len(trigger)
#print("replacing " + trigger + " with " + character) # for debugging
while backspaces > 0:
keyboard0.press(keyboard.Key.backspace)
keyboard0.release(keyboard.Key.backspace)
backspaces -= 1
os.system('''xclip -o -selection clipboard | xclip -selection secondary''') # save clipboard contents to secondary
os.system('''printf %s | xclip -selection clipboard''' % character) # feed unicode character to clipboard
keyboard0.press(keyboard.Key.ctrl) # press Ctrl+v to paste from clipboard
keyboard0.press('v')
keyboard0.release('v')
keyboard0.release(keyboard.Key.ctrl)
time.sleep(0.5) # don't restore clipboard too quickly (some applications, e.g. qterminal, need a moment to react to Ctrl+v)
os.system('''xclip -o -selection secondary | xclip -selection clipboard''') # restore clipboard contents from secondary
def on_press(key):
"""Keylogger runs this function on each keyboard event"""
global capslock_in_effect
output = str(key)
if output == 'Key.caps_lock': # if capslock pressed, toggle capslock state
capslock_in_effect = not capslock_in_effect
if not output.startswith('Key'): # pynput calls special keys 'Key.foo'
output = output[1:-1] # remove quotes around alphanumeric key names
if capslock_in_effect:
output = output.swapcase()
# .swapcase and not .upper because pressing Shift during CapsLock should log a lowercase letter
if not output.startswith('Key.shift'): # log all keystrokes except shift (e.g., so that a~ is logged without an intervening Shift)
if output.startswith('Key.'): # log special keystrokes as a space
output=' '
log_it(output)
def on_click(x, y, button, pressed):
"""Keylogger runs this function on each mouse event"""
button = str(button)
if pressed and button == 'Button.left': # log left clicks as a space
log_it(' ')
def start():
# 1. Build mappings from klavaro.conf
global mappings
mappings = {}
abspath=os.path.realpath(sys.argv[0])
dirname=os.path.dirname(abspath)
with open('%s/klavaro.conf' % dirname) as f:
for line in f:
(trigger, character) = line.split()
mappings[trigger] = character
# 2. Initialize an empty list to hold last few keystrokes
global last_strokes
last_strokes = [ '' ] * 5
# 3. Create taskbar icon
os.system('''yad --notification --image=keyboard --text="Klavaro" --no-middle --menu="Exit!klavaro stop!application-exit" --listen & echo $! >/tmp/klavaro-icon-pid''')
# 4. Get initial CapsLock state
global capslock_in_effect
exit_code = os.system('''xset q | grep -q 'Caps Lock:[[:space:]]*on' ''')
if exit_code == 0:
capslock_in_effect = True
else:
capslock_in_effect = False
# 5. Finally, start keylogger
with mouse.Listener(on_click=on_click) as listener:
with keyboard.Listener(on_press=on_press) as listener:
listener.join()
#####
def stop():
os.system('''kill $(cat /tmp/klavaro-icon-pid); rm /tmp/klavaro-icon-pid''')
os.system('''pkill -f klavaro''')
#####
if sys.argv[1] == "start":
try:
os.stat('/tmp/klavaro-icon-pid')
except:
start()
else:
os.system('''notify-send -i dialog-warning -t 2000 "Klavaro" "Klavaro is already running"''')
sys.exit()
elif sys.argv[1] == "stop":
stop()
Here is my config file, which lists my hotstrings and corresponding Unicode characters (modify* it to suit your needs):
A` À
a` à
A' Á
a' á
A^ Â
a^ â
A~ Ã
a~ ã
A:: Ä
a:: ä
E` È
e` è
E' É
e' é
E^ Ê
e^ ê
E~ Ẽ
e~ ẽ
E:: Ë
e:: ë
I` Ì
i` ì
I' Í
i' í
I^ Î
i^ î
I~ Ĩ
i~ ĩ
I:: Ï
i:: ï
O` Ò
o` ò
O' Ó
o' ó
O^ Ô
o^ ô
O~ Õ
o~ õ
O:: Ö
o:: ö
U` Ù
u` ù
U' Ú
u' ú
U^ Û
u^ û
U~ Ũ
u~ ũ
U:: Ü
u:: ü
C,, Ç
c,, ç
Cx Ĉ
CX Ĉ
cx ĉ
Gx Ĝ
GX Ĝ
gx ĝ
Hx Ĥ
HX Ĥ
hx ĥ
Jx Ĵ
JX Ĵ
jx ĵ
Sx Ŝ
SX Ŝ
sx ŝ
Ux Ŭ
UX Ŭ
ux ŭ
To use the script, save it as klavaro (it means "keyboard" in Esperanto), make it executable, and put it somewhere in your PATH. Save the config file as klavaro.conf and put it in the same directory as the script.
To start the script:
$ klavaro start &
To end the script:
$ klavaro stop
While the script is running, hotstrings will magically be converted to their corresponding Unicode character in any application that supports Control+v to paste from clipboard. (For the magic to happen in a terminal emulator, you may need to go to emulator's settings and change the paste shortcut from Shift+Control+v to Control+v.)
The script is tested and working (hard and on a daily basis) on Devuan ASCII and OpenBSD 6.4, but should work on any Unix-like OS. I love this script so much, I wish I had cooked it up years ago. Hopefully others will also find it useful
-------------------------------
How it works
Script waits for you to type one of the hotstrings. When you do, the script very quickly does the following:
1. Presses appropriate number of backspaces to erase the hotstring
2. Saves current clipboard** contents
3. Puts Unicode character in clipboard
4. Pastes Unicode character at cursor position
5. Restores clipboard contents
-------------------------------
Footnotes
* Adding new Unicode characters to klavaro.conf may seem like a "chicken and the egg" problem, but it isn't hard. First, find the code point for the character you want here (for example, the code for ĉ is 0109). Then, open klavaro.conf in a GUI text editor that supports the Shift+Control+u method of inserting Unicode characters (pluma, gedit, and geany support this, among many others). For my example, pressing Shift+Control+u, then typing 0109, then pressing Enter creates ĉ. Easy peasy!
** Using the clipboard was a workaround due to the fact that all the "typing" utilities I explored (xdotool, xvkbd, pynput) either had no Unicode support or only partial support. The X clipboard, on the other hand, can handle everything.
@freenet_bro: You're welcome, glad I could help. It was also good to make the script more general and less complicated.
@freenet_bro: There are several ways to run the mac-spoofer script (either version) at boot, as root, before connecting to the internet. The two most obvious ones are via cron or via init.
Option 1: Via cron
Open up a terminal and run this command as root: EDITOR=nano crontab -e then add these two lines to the bottom of the file:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
@reboot /path/to/mac-spoofer
Reboot and enjoy.
Option 2: Via init
There are four steps required, freenet_bro: Put the script in the /etc/init.d directory, make it executable, add LSB headers to top of script, install script links in the /etc/rc?.d directories. You missed the last two steps.
Here is what the script looks like with LSB headers (if you use a network manager other than network-manager, adjust the X-Start-Before line accordingly):
#!/bin/sh
### BEGIN INIT INFO
# Provides: mac-spoofer
# Required-Start: $network
# Required-Stop:
# Should-Start:
# Should-Stop:
# X-Start-Before: network-manager
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: simple mac-spoofer
# Description: spoof mac address before connecting to internet
### END INIT INFO
iface=wlan0
fakemac_file=/etc/fakemac-$(date +%j)
if [ -e "$fakemac_file" ]; then # we already have a fakemac file for today
true
else # remove old fakemac file and create a new one
rm -f /etc/fakemac*
real_mac=$(ifconfig $iface | grep ether | awk '{print $2}')
vendor_bits=$(echo $real_mac | cut -d ':' -f 1-3)
random_dec1=$(shuf --input-range=0-255 -n 1); random_hex1=$(printf "%02x" $random_dec1)
random_dec2=$(shuf --input-range=0-255 -n 1); random_hex2=$(printf "%02x" $random_dec2)
random_dec3=$(shuf --input-range=0-255 -n 1); random_hex3=$(printf "%02x" $random_dec3)
fakemac=$(printf "%s:%s:%s:%s" $vendor_bits $random_hex1 $random_hex2 $random_hex3)
printf "$fakemac" >$fakemac_file
fi
# apply fake mac
ip link set $iface address $(cat $fakemac_file)
To install the script links, open up a terminal and type this as root (assuming you named the script mac-spoofer):
update-rc.d mac-spoofer defaults
Reboot and enjoy.
I revised the scripts so that they have no special dependencies--all the utilities the scripts need are part of a standard *nix installation.
Use this version of the script to generate a random MAC address at each boot:
#!/bin/sh
iface=wlan0
# create fake mac, preserving vendor bits:
real_mac=$(ifconfig $iface | grep ether | awk '{print $2}')
vendor_bits=$(echo $real_mac | cut -d ':' -f 1-3)
random_dec1=$(shuf --input-range=0-255 -n 1); random_hex1=$(printf "%02x" $random_dec1)
random_dec2=$(shuf --input-range=0-255 -n 1); random_hex2=$(printf "%02x" $random_dec2)
random_dec3=$(shuf --input-range=0-255 -n 1); random_hex3=$(printf "%02x" $random_dec3)
fakemac=$(printf "%s:%s:%s:%s" $vendor_bits $random_hex1 $random_hex2 $random_hex3)
# apply fake mac
ip link set $iface address $fakemac
Use this version of the script if you want to keep a fake MAC address for a whole day, regardless of how many times you reboot:
#!/bin/sh
iface=wlan0
fakemac_file=/etc/fakemac-$(date +%j)
if [ -e "$fakemac_file" ]; then # we already have a fakemac file for today
true
else # remove old fakemac file and create a new one
rm -f /etc/fakemac*
real_mac=$(ifconfig $iface | grep ether | awk '{print $2}')
vendor_bits=$(echo $real_mac | cut -d ':' -f 1-3)
random_dec1=$(shuf --input-range=0-255 -n 1); random_hex1=$(printf "%02x" $random_dec1)
random_dec2=$(shuf --input-range=0-255 -n 1); random_hex2=$(printf "%02x" $random_dec2)
random_dec3=$(shuf --input-range=0-255 -n 1); random_hex3=$(printf "%02x" $random_dec3)
fakemac=$(printf "%s:%s:%s:%s" $vendor_bits $random_hex1 $random_hex2 $random_hex3)
printf "$fakemac" >$fakemac_file
fi
# apply fake mac
ip link set $iface address $(cat $fakemac_file)
BTW, notice that the scripts preserve the first 3 bytes of the MAC address, fake only the last 3 bytes. The point of this is that the first 3 bytes identify the network device's vendor/manufacturer. You don't want the vendor bytes to be random: Doing so would make your MAC address obviously fake and you would stand out. Not what we want.
@siva: Simplicity and total customizability. Why install a package when a simple shell script will do?
@freenet_bro: See posts #7 and #8.
At long last, I figured out how to disable the lid switch at kernel level.
bruno@thinkpad:~378$ cat /proc/acpi/wakeup
Device S-state Status Sysfs node
HDEF S4 *disabled pci:0000:00:1b.0
...
SLPB S3 *enabled platform:PNP0C0E:00
LID S3 *enabled platform:PNP0C0D:00
Note that the node for LID is PNP0C0D:00
Running this command at boot will disable the lid switch at the kernel level:
echo 'PNP0C0D:00' | sudo tee /sys/bus/acpi/drivers/button/unbind
Now lid switch is totally disabled--closing and opening the lid has no effect whatsoever and I can no longer trigger the graphics bug I described in my first post
Hello, cynicfm. I don't use any network manager.
To connect to a wireless network that does not require a WiFi password (e.g., my workplace) I use this command:
sudo ifconfig wlan0 up && sudo iwconfig wlan0 essid WorkSSIDGoesHere && sudo dhclient
To connect to a wireless network that has a WiFi password (e.g., my home) I use this command:
sudo ifconfig wlan0 up && sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf -D nl80211 && sudo dhclient
Where /etc/wpa_supplicant.conf contains this:
network={
ssid="HomeSSIDGoesHere"
psk="myPasswoRd"
}
I imagine that if NetworkManager or connman is running, it will interfere with the above. Hope that helps.
Hello, Pedro. Welcome! I'm Bruno from New Jersey, USA. I'm a medical doctor (pathologist) and telling computers what to do makes me happy. I dual boot Devuan ASCII and OpenBSD. I love the UNIX philosophy and am especially fond of shell scripting.
Thanks, golinux. I did some research and, indeed, PyPI has fewer safeguards than a linux distro repo. So probably a good idea not to run pip as sudo/superuser.
Here is a paranoid solution that avoids running pip as superuser and also avoids running youtube-dl as superuser:
$ sudo apt remove youtube-dl
$ pip install youtube-dl
$ sudo ln -s $HOME/.local/bin/youtube-dl /usr/local/bin/youtube-dl
now use youtube-dl as regular user
In this solution, user keeps youtube-dl updated with $ pip install --upgrade youtube-dl and neither pip nor youtube-dl ever run with root privileges.
Once you've installed youtube-dl from a .deb package, you can update it to newest version with this command:
sudo pip install --upgrade youtube-dl
No need to recompile or hunt down a newer package.
I have an old HP all-on-one printer/scanner, too. My Devuan and OpenBSD boxes see the HP device (and the HP device sees them) all the time, but when actually trying to scan I get I/O errors if dbus isn't running. I don't like dbus because I find it difficult to understand, so I only turn it on when I have to scan.
Is your Devuan ASCII installation running dbus? If not, try scanning with dbus running and see if it helps.
I'm forced to use Windows at work, so ended up getting used to AutoHotkey for GUI automation. I recreated my favorite ahk functions for my GNU/Linux boxes and called it "penguin-ahk". I made this for my own use so it is not full-featured, but it does everything I need. It is GPL'd, so feel free to use it as-is or as a springboard for your own solution. I just ask that if you modify it for distribution, that you share the improvements with me.
Here it is: penguin-ahk. man penguin-ahk will show you what it does and how to use it.
Yes, this is perfect. It doesn't display the string at notification area by default, but it allows specifying x and y coordinates of where to display the string.
Thank you very much for this, KatolaZ. Exactly what I needed!
I don't agree on the motivations though: the only way to not need a contingency plan is to do whatever is possible to make the current plan work :-)
Totally with you there, KatolaZ. I will do everything within my power to help Devuan. It is my favorite OS and I want it to thrive. I just think it's good to have a contingency plan because some things are much bigger than us and well beyond our control.
GNU/Linux is changing, and not for the better. Think systemd, linux development process caving to political correctness, Microsoft infiltrating the Linux Foundation, Debian considering dropping SysVinit support. There is much to be worried about. This video is funny but also quite depressing:
https://www.reddit.com/r/linux/comments … s_forever/
Devuan is my favorite OS and I hope it lives forever, but if Debian and/or the linux kernel implode...then what? Until recently I never even considered BSD but lately I've been dual booting Devuan and OpenBSD and must say I am pleasantly surprised: The OpenBSD userspace feels much more comfortable and familiar to a GNU/Linux user than I had expected.
Some reasons a Devuan user would like OpenBSD:
1. Its developers are fanatically committed to the UNIX philosophy of each piece of software doing one thing well
2. Its developers have a strong stance on free software (they tolerate non-free software only for firmware running in peripherals--no non-free software is allowed in the kernel or anywhere in the base system). With minimal attention (e.g., making sure your wireless card does not require proprietary firmware), your OpenBSD installation can consist of 100% free software. (BTW Libreboot, which I have in my system, can handle booting OpenBSD: https://libreboot.org/docs/bsd/openbsd.html)
3. OpenBSD maintains its own kernel, init, X server, and repository of third-party packages. It is therefore fairly immune to poor outside decisions.
4. Their third-party packages are ported directly from upstream, without an intervening parent distro
5. The base installation is minimalistic: Kernel, init, X, networking stack, and administrative tools are all part of the OS, so you start out with 0 (!) packages. (My OpenBSD + MATE + everything-I-could-possibly-want-in-a-laptop installation has a total of 70 manually-installed packages, grand total of 385 packages including manually installed plus dependencies.)
6. Scrupulous attention to code correctness and documentation
If you want to read more, this is a nice overview: https://www.cambus.net/why-openbsd/
I just wanted to put OpenBSD on your radar. Again, I am faithful to (and have faith in) Devuan, but it is good to have a backup plan in case Devuan's underlying technologies (Debian and the linux kernel) have a total meltdown.
[P.S. If you decide to install OpenBSD to give it a try, I would strongly recommend installing it to a non-production machine or, if to your production machine, to a second harddrive. The installer is quite spartan and it took me a few tries, some reading, and two accidental wipes of my hard drive before a successful install. Fortunately I am paranoid about backups, so no real harm done except for the slight inconvenience of having to restore my Devuan partition and my personal data. Now that I know how to use it, I must say their installer is a marvel of simplicity.]
I bumped into this today. It turns out that the behavior I described with yad is a "feature" and not a bug.
Q: When I do yad --notification --image="myicon.png"
the icon shows up in the tray too small (about 2/3 the correct height) and about half of it is repeated on the right hand side.
...
Is this a bug?A: no, this is not a bug. before yad 0.40 notification icons which
specifies by absolute filename automatically scales to 16 pixels sizein the release 0.40.0 i add --icon-size option for costom icon sizes
so please update to the latest version or use icon name instead of
filenames.
this workaround must works in older versionsyad -- notification --image="myicon" --image-path="$(pwd)"
I need a recommendation for a command-line utility that will show text in notification area. I am familiar with and love yad, but it can only put icons--not text--in notification area/system tray. I'm also familiar with notify-send, but this utility shows pop-up notifications, which is not what I need.
One of my shell scripts needs to show a string in the notification area, and the string needs to stay there until it is updated (similar to what time/date panel applet does). I've searched the interwebs ad nauseam but am still empty-handed.
Any ideas? I just need utility name, not a how-to.
Yes, partclone needs to run in live environment because you cannot clone a running partition.
refractasnapshot is a totally different approach with opposite requirement: it must be run while booted in your source installation.
Ron, I use refractasnapshot -> bootable USB to create installer for other people. To backup/restore my own system for my own use (on same or different computer) I use partclone. It is much easier to recreate a system by cloning than via an installer. BTW, partclone supports ext4 and does not backup empty space.
To create a backup, boot into any live USB on your source machine and plugin a storage device. Then, while in the live environment, create your backup (this example assumes the partition containing your Devuan installation is /dev/sda1):
sudo apt install partclone
sudo partclone.extfs -c -s /dev/sda1 -o /media/ron/some-storage-device/devuan_backup.partclone
Now you have a backup for your day of need. When that day comes:
To restore the backup on same or different computer, boot into any live USB on that computer and plugin the storage device containing the backup. If a target partition does not yet exist, use GParted or similar partitioning tool to create it (it must be of same size or larger than the source partition). Here is the command to write the backup to the target partition (it assumes your target partition also happens to be /dev/sda1):
sudo apt install partclone
sudo partclone.extfs -r -s /media/ron/some_storage_device/devuan_backup.partclone -o /dev/sda1
I've been using partclone on at least a monthly basis for years and it has never let me down. I actually keep the (tiny) partclone.extfs executable on my storage device, which eliminates the need for the installation steps in my guide above.
I also have a local mirror and don't give a hoot if it's "old". To stop apt's whining about the mirror's release file being out of date, create /etc/apt/apt.conf.d/10-unlimited-ttl on the machines that use your mirror. File should contain nothing but this:
Acquire::Check-Valid-Until "0";
What a knotty mess. One wouldn't think that uninstalling xfce4 would leave things such as vlc and libreoffice orphaned.
I'm guessing that you inherited the XFCE desktop environment from whatever install media you used (maybe even the official Devuan installer). The million dollar question is how XFCE was installed in that media. I wouldn't know the answer to that, even if I knew which installer you used. But we can work backwards based on a premise: XFCE was most likely installed using a metapackage (e.g., task-xfce-desktop) that pulled in another metapackage (e.g., xfce4). Once we're dealing with metapackages of metapackages, a lot of stuff gets dragged in as dependencies.
Try running aptitude why vlc and aptitude why libreoffice and repeat with a few other packages in your list of "automatically installed but no longer required" that are clearly not a part of XFCE. You'll probably find a non-xfce metapackage that brought in these applications as dependencies. Manually install that metapackage then uninstall xfce4. Not a quick and easy solution, but I think it would do the trick.
EDIT: The suggestion in rolfie's thread (installing task-mate-desktop) sounds quite promising.
I made small improvements that allow the script to be used without any alteration for any app
For any app foo, just create /usr/local/bin/foo with this in it:
#!/bin/sh
# This is a wrapper script that immediately maximizes the target application
# after its window appears. Script should be /usr/local/bin/foo where foo is
# the name of the target application.
app_name="$(basename "$0")"
app_path="$(which -a "$app_name" | tail -n 1)"
"$app_path" "$@" &
app_pid=$!
# wait for app to have a window
while true; do
wmctrl -lp | awk '{print $3}' | grep $app_pid && break
sleep 0.1
done
# get windowid of app
app_windowid=$(wmctrl -lp | awk "\$3 == $app_pid { print \$1 }")
# maximize app's window
wmctrl -ir $app_windowid -b add,maximized_vert,maximized_horz
Don't forget to make the script executable. All the script needs to work is its own name.
All wireless dongles from ThinkPenguin and Technoethical would work out of the box with Devuan because they run on libre firmware, which is included by default in any Debian/Devuan linux kernel. Both companies are great. The dongles are listed on each company's website as well as on the Free Software Foundation's "Respects Your Freedom" page (http://fsf.org/ryf). There are tiny ultra-portable dongles (less expensive) as well as bigger ones with bigger antennas for increased range (more expensive).
All things being equal, go with whichever company is closer to you for shorter transit/faster delivery. ThinkPenguin is in the United States (New Hampshire) and Technoethical is in Europe (Romania).