You are not logged in.
Ow shit, yes, I didn't even think of that, thanks;-)
Offline
FWIW, The musicbase bash script has been completed. Thanks for the feedback.
If you use kid3-qt, it may be helpful. The utility allows you to customize headers and format codes to build a database from the console with one go, a feature kid3-cli was lacking.
https://github.com/Harpo3/musicbase
Last edited by zpg443 (2021-10-25 17:49:21)
Offline
Continuing with music library utilities...
addplayedframe.sh
A kid3-based utility to add a custom TXXX frame for writing LastPlayedDate data directly to tags.
Generates and applies a random LastPlayedDate for each tag, with TIMEVAL either sql or epoch time.
Usage: addplayedframe.sh [option] DIRPATH TIMEVAL
This utility may be of use for those writing scripts to build smart playlists. The lastplayed data could be used, together with POPM rating and artist fields, to script playlists. Working on more along these lines to simplify the process for kid3 users with large libraries.
https://github.com/Harpo3/addplayedframe
removebypopm.sh
A musicbase utility to generate filtered output based on POPM rating values
Uses awk to filter music library tracks by POPM field when POPM is
included in the input database. Output is a data-separated-values
(DSV) file with carat "^" (or other specified) delimiter.
https://github.com/Harpo3/removebypopm
playedagefilter.sh
A musicbase utility to generate filtered output based on last played values
Uses awk to filter rated tracks FILE based on last-played-date and outputs to a database file of
not-recently-played tracks, which can then be used by other tools for playlist creation. Used
when POPM and last-played data are included in the input database.
https://github.com/Harpo3/playedagefilter
Last edited by zpg443 (2021-10-31 18:33:51)
Offline
kdiff.py - Check whether your running kernel is equal to the installed kernel.
#! /usr/bin/env python3
"""Check whether the running kernel equals the installed kernel package."""
from argparse import ArgumentParser, Namespace
from logging import INFO, WARNING, basicConfig, getLogger
from subprocess import check_output
from sys import exit # pylint: disable=W0622
from typing import NamedTuple, Optional
__all__ = ['Kernel', 'get_running_kernel', 'get_installed_kernel', 'main']
LOGGER = getLogger('kdiff')
class Kernel(NamedTuple):
"""Representation of kernel flavor and version."""
major: int
minor: int
micro: int
revision: str
patch: Optional[str] = None
flavor: Optional[str] = None
class Suffix(NamedTuple):
"""Representation of kernel version suffixes."""
revision: str
patch: Optional[str] = None
flavor: Optional[str] = None
def get_suffix(suffix: list[str]) -> Suffix:
"""Returns revision, patch and flavor."""
try:
patch, revision, flavor = suffix
except ValueError:
revision, flavor = suffix
patch = None
if revision.startswith('arch'):
revision, patch, flavor = flavor, revision, None
return Suffix(revision, patch, flavor)
def get_running_kernel() -> Kernel:
"""Returns the running kernel."""
text = check_output(['/usr/bin/uname', '-r'], text=True)
version, *suffix = text.strip().split('-')
return Kernel(*map(int, version.split('.')), *get_suffix(suffix))
def get_installed_kernel(flavor: Optional[str] = None) -> Kernel:
"""Returns the installed kernel."""
pkg = 'linux' if flavor is None else f'linux-{flavor}'
text = check_output(['/usr/bin/pacman', '-Q', pkg], text=True)
_, version = text.strip().split()
version, revision = version.split('-')
major, minor, micro, *patch = version.split('.')
patch = '.'.join(patch) or None
return Kernel(int(major), int(minor), int(micro), revision, patch, flavor)
def get_args(*, description: str = __doc__) -> Namespace:
"""Parses the command line arguments."""
parser = ArgumentParser(description=description)
parser.add_argument('-v', '--verbose', action='store_true',
help='enable verbose output')
return parser.parse_args()
def main() -> int:
"""Returns 0 if running and installed kernel equal else 1."""
args = get_args()
basicConfig(level=INFO if args.verbose else WARNING)
running_kernel = get_running_kernel()
LOGGER.info('Running kernel: %s', running_kernel)
installed_kernel = get_installed_kernel(running_kernel.flavor)
LOGGER.info('Installed kernel: %s', installed_kernel)
return int(running_kernel != installed_kernel)
if __name__ == '__main__':
exit(main())
Inofficial first vice president of the Rust Evangelism Strike Force
Offline
In bash:
[[ $(uname -r | cut -d- -f3 --complement) == "$(pacman -Q "$1" | cut -d' ' -f2)" ]]
Last edited by Alad (2021-11-19 14:40:13)
Mods are just community members who have the occasionally necessary option to move threads around and edit posts. -- Trilby
Offline
Flavor…
pacman -Qs linux | grep "$(uname -r | sed 's/\([^-]*-[^-]*\)-\(.*\)/linux-\2 \1/g')"
Online
@Alad, @seth
Both your solutions do not work with either linux, linux-lts or linux-zen.
0 ✓ neumann@ThinkCentre ~ $ uname -r; pacman -Q linux
5.15.2-arch1-1
linux 5.15.2.arch1-1
0 ✓ neumann@ThinkCentre ~ $ pacman -Qs linux | grep "$(uname -r | sed 's/\([^-]*-[^-]*\)-\(.*\)/linux-\2 \1/g')"
1 ✗ neumann@ThinkCentre ~ $ ./kdiff.py
0 ✓ neumann@ThinkCentre ~ $
0 ✓ srv ~ $ uname -r; pacman -Q linux-lts
5.10.79-1-lts
linux-lts 5.10.79-1
0 ✓ srv ~ $ pacman -Qs linux | grep "$(uname -r | sed 's/\([^-]*-[^-]*\)-\(.*\)/linux-\2 \1/g')"
local/linux-lts 5.10.79-1
0 ✓ srv ~ $ ./kdiff.py
0 ✓ srv ~ $
0 ✓ gerd ~ $ uname -r; pacman -Q linux-zen
5.15.2-zen1-1-zen
linux-zen 5.15.2.zen1-1
0 ✓ gerd ~ $ pacman -Qs linux | grep "$(uname -r | sed 's/\([^-]*-[^-]*\)-\(.*\)/linux-\2 \1/g')"
.1 ✗ gerd ~ $ ./kdiff.py
0 ✓ gerd ~ $
Last edited by schard (2021-11-19 16:05:16)
Inofficial first vice president of the Rust Evangelism Strike Force
Offline
Correctshun:
pacman -Qs linux | grep "$(uname -r | sed 's/\([^-]*-[^-]*\)\(-.*\)/linux\2 \1/g')"
Edit: 'key the zen suffix needs more sophistication.
Last edited by seth (2021-11-19 16:07:21)
Online
Correctshun:
pacman -Qs linux | grep "$(uname -r | sed 's/\([^-]*-[^-]*\)\(-.*\)/linux\2 \1/g')"
Edit: 'key the zen suffix needs more sophistication.
Nope. Only working on linux-lts now.
Inofficial first vice president of the Rust Evangelism Strike Force
Offline
Well, yours doesn't work if the kernel has no patch version (e.g. 5.15.arch).
#!/bin/bash
{ IFS='-' read -r pkgname flavor
read -r pkgver
} < <(pacman -Q "$1" | xargs -n1)
{ read -r version
read -r suffix
} < <(pcregrep -o -e '(\d{1}\.\d{1,2}(?:\.\d{1,3})?)' -e '((?<=\.)\w+)?-\d' <<< "$pkgver")
[[ $(uname -r) == "$version-${suffix/-/}${flavor:+-$flavor}" ]]
This was fun, but I'm not sure on the utility. In support requests you give people two commands, uname -r and pacman -Q, not obscure regex or a 50 line Python script.
I guess if you wanted to check it at boot every time...
Last edited by Alad (2021-11-19 18:04:39)
Mods are just community members who have the occasionally necessary option to move threads around and edit posts. -- Trilby
Offline
find /var/lib/pacman/local/ -name "linux*-$(uname -r | tr - ?)"
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Nice, but I get no results from that find command... it seems the "flavor" is appended instead of prepended.
Mods are just community members who have the occasionally necessary option to move threads around and edit posts. -- Trilby
Offline
If you get no results, it means the running kernel doesn't match what's installed. What do you mean by "flavor"? If you mean lts/zen/etc, then the asterisk in the find glob covers those.
Perhaps revisions would be needed - but to me it seems much better to convert all the "." and "-" characters into a single common symbol rather than trying to figure out how to convert just some of them in the package version number.
Last edited by Trilby (2021-11-19 20:18:53)
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
If you mean lts/zen/etc, then the asterisk in the find glob covers those.
No, it doesn't. The problem is (see schard's post) that lts is placed after linux in the package name, but after the kernel version in the uname output. So you'd need some grouping and swap it around, e.g. with sed.
Last edited by Alad (2021-11-19 23:11:46)
Mods are just community members who have the occasionally necessary option to move threads around and edit posts. -- Trilby
Offline
I regret, what I started here.
I will adjust my script for versions without micro version over the weekend.
Inofficial first vice president of the Rust Evangelism Strike Force
Offline
You also have to make some hard assumptions about the structure and in particular what glyphs are permissable in patch and flavor tokens…
Tokenizing the stuff and matching the tokens w/o order:
werewastingourlives="$(uname -r | tr '.-' '\n' | sort | tr '\n' ' ')"
while read line; do echo $line | tr ' .-' '\n' | sort | tr '\n' ' ' | grep $werewastingourlives && echo werewastingourlives; done < <(pacman -Qs linux | sed '/local\/linux/!d;s%local/linux-%%')
Drawback: runing kernel 4.5 while having 5.4 installed…
Online
Thanks guys, your lines made me review mine and you gave me some cluess...
Works for 'linux - linux-lts - linux-hardened & linux-zen', at least. It's not a oneliner
I couldn't get 'yours' to work :-(
nr() {
core=$(uname -r | awk -F '-' '$0=$NF')
[[ "${core}" = [0-9] ]] && kernel='linux' && core='' || kernel="linux-${core}"
[ "$(pacman -Qi "${kernel}" | awk '/Version/{print $3}' | tr '.' '-')" \
!= "$(uname -r | sed "s|-${core}*$||" | tr '.' '-')" ] && echo reboot
}
Offline
Ok then, how about a much simpler python-inspired approach of just trying to do something that assumes the running kernel files are present and handling the error / exception as it arises:
modprobe -n ext4 >/dev/null 2>&1 || echo reboot needed
Last edited by Trilby (2021-11-20 03:26:13)
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
@Trilby, nice one.. and works too!
Using so few resources is nice when polling when it's running on a bar.
Offline
Behold!
My wonderful "copy the output of cat" script, because I'm that lazy...
#!/bin/sh
cat "$1" | xclip -selection clipboard -i
Offline
https://porkmail.org/era/unix/award.html#cat
SYNOPSIS
xclip [OPTION] [FILE]...
Online
And even if it wasn't for the above-note, why use cat at all? That is definitely a most useless use of cat (in contrast to the avatar). Don't cat to a pipe to another process, just use '<'.
Perhaps you'd want an alias to cover "-selection clipboard" ... I didn't realize xclip didn't have short options. That's another reason to prefer xsel:
xsel -ib < $1
Of course, -b is the default, so just:
xsel -i < $1
Last edited by Trilby (2021-11-24 21:06:07)
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
without -b xsel copies to primary clipboard, -b is needed, -i can be skipped.
Arch is home!
https://github.com/Docbroke
Offline
I really like this pacman "mini interface" using fzf (not my idea, just made it look more fancy):
To find and/or install new packages or get quick info about them (a '*' indicates that they're already installed) you can use this shell function:
,i() { echo '\e[1;37m[pacman] \e[1;32mInstall new packages (TAB to select, ENTER to install)\e[0m'; pacman -Sl | awk '{print $2($4=="" ? "" : " *")}' | fzf --multi --preview='pacman -Si {1}' --reverse --info=inline --height='80%' --color='hl:148,hl+:154,pointer:032,marker:010,bg+:237,gutter:008' --prompt='> ' --pointer='▶' --marker='✓' --bind '?:toggle-preview' --bind 'ctrl-a:select-all' | xargs -ro sudo pacman -S --needed }
Some of these fzf options aren't actually in the alias I use but instead in $FZF_DEFAULT_OPTS, but I added them here.
You can make a very similar alias for removing packages as well (ideally using red color instead of green).
I also have 2 more aliases for the AUR using "paru -a". I like keeping the AUR operations separate.
int pi = 3;
Offline
M6x, fyi, your script in post #3601 could just be the following:
#!/bin/sh
lsblk -ndo PATH,MODEL,SERIAL /dev/block/*\:0
printf \\n
lsblk -o NAME,FSTYPE,SIZE,FSAVAIL,TYPE,HOTPLUG,MOUNTPOINT
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline