We switch from `subprocess.run` to manually handling a `Popen` object so
we can decide whether a returncode of 1 is fine or now depending on the
output we see. Since we want live output during the download, we cannot
just capture all the output. Instead, we have to regularly print
whatever we captured. Therefore, we need a `Popen` object and need to
call `communicate()` with a timeout on it.
When this scanner is plugged in, we want to start `scanimage` in batch
mode with button support, scanning into a pre-defined directory. Since
plug and unplug might happen multiple times a day and batch mode
overwrites files with the same name, we use date and time to define
directory and filename.
There can be cases where we want to support more than "bind" events -
e.g. "remove". Therefore, we rewrite how things work in the spirit of
the STLs `SimpleHTTPRequestHandler`: any "handle_{action}" method of a
`KnownDevice` subclass allows the class to receive events for that
action.
To not use `getattr()` on every `KnownDevice` on every event, we use
`__init_subclass__()` to build a list of `KnownDevice` registered for
each `action`.
We're using a `libbluray2` wrapper by the same person that also built
`pydvdread`. At the same time, we dump supporting to parse `mpv` output,
because that was too unreliable anyways and keeping it just means more
maintenance overhead.
To provide a better overview, we've split up the DVD and Blu-ray
functionality into own modules
This is the latest version having new commands and support for dvdread
to reach chapters, because the mpv output was unreliable (iirc it forgot
to output the last chapter) and slower and harder to parse.
Instead of my custom-baked implementation, that doesn't support
file system ACLs and is quite slow, we switch to `fuidshift` from the
`lxd-tools` Debian package.
I previously thought that handling symlinks would not be necessary and
also not possible. Then, I found out about the `--no-dereference` option
for `chown` ...
lxc-create will pass "--mapped-uid" and "--mapped-gid" into the
template, if there's an "lxc.idmap" option in the config file. We now
support getting these parameters as options.
Since an "lxc.idmap" option in the config makes lxc-create already
change the userns, we cannot support it. Therefore, we error out if we
see these options. Instead, we write the "lxc.idmap" options ourselves
based on the "--uidmap" and "--gidmap" options passed by the user.
This script can be used as LXC template to install a Debian into a
directory using `mmdebstrap`. It's intended use is to create a container
filesystem with appropriate uids/gids for use in an unprivileged
container. The script assumes that it runs as root and only changes the
userns to install Debian.
I've used this script to remap files' uids/gids of containers created
without a custom userns into their new range. It's inferior to
`fuidshift` from the `lxc` project in that it doesn't handle ACLs and is
quite slow - probably because it calls a binary for every file.
By default, it runs in debug mode only printing the chown command
instead of executing it. You need to edit the file to use it.
It also only works with LVs (logical volumes from LVM), mounting them
automatically.
This command runs in the background and listens for udev bind events,
comparing the attributes of those events to known implemented devices.
If any match, we call their handle() method. The same handle() method is
called on startup if the presence of the device is detected via the
check_available() method.
Currently implemented devices are my Logitech G930 headset and my TEX
Shinobi keyboard.
This command's main purpose is to get run regularly via cron and play (a
list of) files possibly repeated to a specific PulseAudio device.
Additonally, it can just play a command or start as an HTTP server
providing an interface to play local files, stop the current playback
and show the current status.
Actual playback is done via ffmpeg and paplay.
This script can be used to switch the pulseaudio sink of an application
to the next sink in the list of sinks. The sink is found by querying the
currently focused window from i3 and retrieving the PID via _NET_WM_PID
attribute using xprop. If that PID doesn't directly have sink attached,
the script searches for children of this PID having a sink and switches
those. This is useful to switch e.g. an mpv running inside a terminal.
This is a script to copy files onto an USB stick or an MP3 player in
sorted order so stupd mp3 players or radios that play files in the order
they were added to the directory instead of by sorted filename still
play the files in the right order.