Commit graph

4,605 commits

Author SHA1 Message Date
3360ec86cb
lib.FileContext: Add URI manipulation methods
Add .schema_from_uri(), .split_uri(), .id() to define some
standardish way to dissect an URI the same way FileContext does.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-23 15:27:38 +02:00
efe047fa50
lib.ExecContext: Strip unnecessary args from __init__()
Code beautification: __init__() doesn't use the arguments it grabs by
name from its parameter list, use *args and **kwargs instead.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-23 15:26:42 +02:00
d70454b32a
lib.ProcFilterGpg: Add module
Add a ProcFilter implementation for decrypting GPG blobs. It needs an
ExecContext passed to __init__() in order to run /usr/bin/gpg.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-23 15:25:57 +02:00
411bfd41ca
lib.ProcFilter: Add module
Add the ProcFilter module, containing the following classes:

  - ProcFilter:

    Abstract base class defining a run(data: bytes) -> Result method,
    allowing to do arbitrary data manipulation in subclasses.

  - ProcFilterIdenty

    A ProcFilter specialization which passes through the input
    unchanged.

  - ProcPipeline

    A container for multiple chained ProcFilter classes

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-23 15:23:27 +02:00
9eda1c890e Release 1.0.0-211@suse-tumbleweed/x86_64
All checks were successful
Test repo on all supported platforms / CI (push) Successful in 4m4s
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-21 23:24:44 +00:00
ef9e9d8a5c Release 1.0.0-211@kali-rolling/amd64
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-21 23:10:08 +00:00
386ba30451 Start version: 1.0.0-211
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-21 23:09:12 +00:00
32c3477102
cmds.secrets.lib.DistroContext.list_template_files(): List more
Default to Distro's idea of relevant packages if no packages are
specified on the command line.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-21 21:52:10 +02:00
655b17bfec
cmds.secrets.lib.DistroContext: packages -> pkg_names
Cosmetics: The "packages" parameter to some DistroContext's methods
has a confusing name in same contexts, notably when mixed with a list
of Package instances, so rename it to "pkg_names".

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-21 21:52:10 +02:00
1646aaeb59
cmds.distro.CmdSelect: Use select(filter)
Ditch the CmdSelect.filter_packages(), because Distro.select() now
supports filtering out of the box.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-21 21:52:10 +02:00
fc6af091eb
lib.Distro.select(): Add filter parameter
Add an optional "filter: PackageFilter|None" parameter to .select(),
and if it's not None, call a new version of ._select() with it.

._select() is not abstract anylonger. Its default implementation
filters the results of ._select_by_name(), can be reimplemented by
deriving classes for better performance, but doesn't have to.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-21 21:52:10 +02:00
4e1ec7eaf6
lib.Distro._select() -> _select_by_name()
Rename ._select() to _select_by_name() in Distro and its subclasses.
Don't rename .select() itself, because it's going to be a broader
interface supporting more select criteria than just package names.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-21 21:52:09 +02:00
4e2b15e586
App: Support --pkg-filter / JW_DEFAULT_PKG_FILTER
Add global --pkg-filter argument, defaulting to
JW_DEFAULT_PKG_FILTER. If it's specified, instantiate a
PackageFilterString from it, and initialize App's Distro instance
with it.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-21 21:52:09 +02:00
dcdf69890c
lib.Distro.default_pkg_filter: Add property
Add a default_pkg_filter parameter to Distro's constructor defaulting
to None, and expose it via the .default_pkg_filter property. As of
this commit, no code in jw-pkg does anything meaningful with it.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-21 21:52:09 +02:00
33ff46e7b3
lib.PackageFilter: Add module
Add a package filter abstraction designed to replace the package
filter string tossed around various functions througout jw-pkg.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-21 21:52:09 +02:00
dacea3a104
App: Cosmetics: Replace double by single quotes
Replace " by ' where applicable for consistency.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-21 21:52:09 +02:00
3f66e061a6
lib.Package: Cosmetics: Fix log message typo
Fix typo in log message.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-21 21:52:09 +02:00
d14f1645c1
lib.ExecContext._chmod(): Fix broken mode string
Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-21 21:52:09 +02:00
b44879c517
lib.FileContext.file_exists(): Fix missing await
file_exists and _stat() in file_exists() are async, need to be
awaited, but aren't. Fix that.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-21 21:52:09 +02:00
21ff616db1 Release 1.0.0-210@kali-rolling/amd64
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-19 19:55:19 +00:00
67331fd15b Release 1.0.0-210@suse-tumbleweed/x86_64
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-19 19:20:46 +00:00
eb27127b16 Start version: 1.0.0-210
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-19 19:19:58 +00:00
8210baa683 lib.ec.ssh.AsyncSSH: Code beautification
- Remove _run_on_conn() because it doesn't add any value

  - Add verbose try-except block around connect()

  - Add try-except block around failing close

  - Prefix private member variables with "__"

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-19 21:09:51 +02:00
baf09e32eb lib.ec.ssh.AsyncSSH: Re-use connection
Commit a19679fec reverted the first attempt to make AsyncSSH reuse
one connection during an instance lifetime. That failed because a lot
of distribution-specific properties were filled in a new event loop
thread started by AsyncRunner, and AsyncSSH didn't like that.

The last commit provided the needed properties as members of the
Distro class. This commit is the second part of the solution: Keep
one connection around as a class member and reuse it on every _run()
invocation.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-19 21:08:04 +02:00
aa7275f426 App.distro_xxx: Move properties to Distro.xxx
Commit a19679fec reverted the first attempt to make AsyncSSH reuse
one connection during an instance lifetime. That failed because a lot
of distribution-specific properties were filled in a new event loop
thread started by AsyncRunner, and AsyncSSH didn't like that.

This commit is the first part of the solution: Move those properties
from the App class to the Distro class, and load the Distro class
in an async loader. As soon as it's instantiated, it can provide all
its properties without cluttering the code with async keywords.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-19 21:00:21 +02:00
003d53b310 cmds.secrets.lib: Add missing bits
- cmds.secrets.lib.base: Add module

  - cmds.secrets.lib.util: Fix missing Attrs type

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-19 21:00:14 +02:00
c238a0d2d0 lib.ec.ssh.AsyncSSH: Replace legacy Caps.Env
AsyncSSH uses the legacy Caps.Env, replace it by Caps.ModEnv.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-19 20:59:16 +02:00
2273a50a5c Release 1.0.0-209@suse-tumbleweed/x86_64
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-19 13:42:00 +00:00
fc182eb1f5 Release 1.0.0-209@kali-rolling/amd64
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-19 12:47:11 +00:00
118fc14e94 Start version: 1.0.0-209
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-19 12:46:08 +00:00
f1898941e7 lib.ec.ssh.AsyncSSH: Code beautification
Apply some style changes:

  - Replace double by single quotes for consistency

  - Add spaces around equal signs in long parameter lists

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-19 14:36:50 +02:00
1359719f04 lib.ExecContext: Code beautification
Add spaces around equal signs in long parameter lists.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-19 14:36:50 +02:00
54aecff8e4 lib.ExecContext.run(), .sudo(): Rename env
The name of the env parameter to ExecContext.run() and .sudo() is not
descriptive enough for which environment is supposed to be modified
and how, so rename and split it up as follows:

  - .run(): env -> mod_env

  - .sudo(): env -> mod_env_sudo and mod_env_cmd

The parameters have the following meaning:

  - "mod_env*" means that the environment is modified, not replaced

  - "mod_env" and "mod_env_cmd" modify the environment "cmd" runs in

  - "mod_env_sudo" modifies the environment sudo runs in

Fix the fallout of the API change all over jw-pkg.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-19 14:36:50 +02:00
9f756222fe lib.ExecContext.username: Add property
Add the property .username, backed by the protected _username()
callback. It should return the user run()'s cmd parameter is executed
as.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-19 14:36:50 +02:00
5ea6ab0383 lib.ec.SSHClient._run(): Fix empty stderr output logging
If stderr is None, a bogus Exception is thrown in verbose mode, fix
that.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-19 14:36:50 +02:00
51054aced1 Release 1.0.0-208@suse-tumbleweed/x86_64
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-18 13:12:54 +00:00
00b52188ff Release 1.0.0-208@kali-rolling/amd64
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-18 13:00:30 +00:00
e15b1c7457 Start version: 1.0.0-208
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-18 12:59:29 +00:00
69f8393170 Release 1.0.0-207@suse-tumbleweed/x86_64
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-18 12:24:35 +00:00
2851ef8f42 lib.ec.ssh.Paramiko: Support Caps.Env
Add support for modifying the execution environment via the env
parameter to Paramiko.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 12:23:26 +00:00
9dd7c18803 Release 1.0.0-207@kali-rolling/amd64
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-18 09:26:40 +00:00
6c1df6c467 Start version: 1.0.0-207
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-18 09:25:38 +00:00
1b821f3b3f cmds.secrets: Make commands work remotely
The "secrets" class of commands currently only works on the host it's
invoked on. Use the current FileContext to allow using the existing
commands on a target host.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
3cf5b2264e lib.FileContext: Add file methods
Add the following methods, meant to do the obvious:

  unlink(self, path: str) -> None
  erase(self, path: str) -> None
  rename(self, src: str, dst: str) -> None
  mktemp(self, tmpl: str, directory: bool=False) -> None
  chown(self, path: str, owner: str|None=None, group: str|None=None) -> None
  chmod(self, path: str, mode: int) -> None
  stat(self, path: str, follow_symlinks: bool=True) -> StatResult
  file_exists(self, path: str) -> bool
  is_dir(self, path: str) -> bool

All methods are async and call their protected counterpart, which is
designed to be overridden. If possible, default implementations do
something meaningful, if not, they just raise plain
NotImplementedError.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
bc3ed1737f lib.base.StatResult: Add type
Add the basic type StatResult. It is something akin to
os.stat_result, but with user and group string members instead of
st_uid and st_gid. The latter can't be expected to be stable across
remote contexts.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
154db1ebc4 lib.ExecContext.get(): Raise FileNotFoundError
Raise FileNotFoundError from ExecContext.get() if the _run() returns
"No such File" in stderr.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
8a0770aec5 lib.ExecContext.run(): Pass LC_ALL=C by default
Pass LC_ALL="C" to _run() by default. This is necessary to be able to
parse error messages and raise FileNotFound if need be.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
fe3508036e lib.FileContext.put(): Change param mode type str -> int
Don't pass mode as a string to put(). Given the multitunde of
possible string representations for numbers, some understood by
int(string, 0) and some not, there's too much room for passing
strings which are unparseable, or worse, prone to be parsed wrongly.

However, pass mode down to _put() as a string for convenience,
because that's what most _put() implementations will need to use. If
they don't, converting to int is easy from the one defined string
format.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
64e9fbff59 lib.FileContext.put(): Swap params path and content
Swap the positions of the "path" and "content" parameters of put().
Path comes always first, in every path related function I know.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
94eee5c4bb lib.FileContext.put(): Add parameter "atomic"
Add the parameter "atomic" to put() / _put(). If instructs the
implementation to take extra precautions to make sure the operation
either succeeds or fails entirely, i.e. doesn't leave a broken target
file behind.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00