Commit graph

4,640 commits

Author SHA1 Message Date
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
bbb2d16956 lib.FileContext.put(): Simplify

.put() has some commands to _run(), and it uses its own CallContext for them. Since that pattern only replicates what run() does anyway, we could just as well use run() itself with less code, so do that.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
0d6eeeadcf lib.FileContext.log_name: Beautify

Prepend the class name to .log_name. Not sure if that makes logs more legible, but we'll try it out for a while.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
4f98fd6c78 lib.FileTransfer: Rename to FileContext

Rename class FileTransfer to FileContext because that's the better name. It's the base class of ExecContext and also a context.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
2f1265b7b2 lib.ec.SSHClient: Fix return value type hints

Add proper type-hinting for port, hostname, username and password return values.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
64a5b5d429 lib.ec.Local._run(): Interpret env as mod_env

An env argument environment passed to Local._run() entirely replaces the environment. Make it modify the enviroment instead.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
9575339972 lib.ec.ssh.AsyncSSH: Declare Caps.Env

AsyncSSH's implementation already supports modifying the execution environment via env, so declare it to the base class with Caps.Env.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
f253466a3f lib.ec.ssh.Exec._run_ssh(): Fix: interactive ignored

Exec's _run_ssh() ignores its "interactive" parameter and uses the instances' default instead, fix that.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
4a8ccfb0a6 lib.ec.ssh.Exec: Honour username and port

Username and port of an Exec SSH client are not passed to the ssh executable, fix that.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
3574c0f1bf lib.ec.ssh.Exec: Support Caps.Env

Add support for modifying the execution environment via the env parameter to Exec.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
6cdcd23010 lib.ec.ssh.Exec._run_ssh(): Fix interactivity translation

cmd_input is passed as None to _run(), which is legal, but then used in a call to cmd_run(), which is a public API and, hence, illegal. InputMode.NonInteractive should be used instead, do that.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:31 +02:00
910f10b194 lib.util.run_cmd(): Remove parameter interactive

run_cmd() is a thin layer over the public ExecContext API, which falls back to using a Local instance if not other ExecContext is specified explicitly. Both the default Local context as the subsequent call to run() should have the same idea about interactivity, so allowing to specify it in two parameters ("interactive" and "cmd_input") is a bad idea. Remove "interactive".

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:43:29 +02:00
fd336ecdcf lib.ec.SSHClient: Support JW_DEFAULT_SSH_CLIENT

Allow to configure via the environment which class ssh_client() picks. Can currently be exec, asyncssh, paramiko or a comma-separated search list. The list will be tried through until a class is found that can be instantiated.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:42:32 +02:00
193b8242d7 lib.Types.LoadTypes: Support JW_LOG_LEVEL_LOAD_TYPES

Allow to configure logging of LoadTypes' decisions whether or not a class is elegible for loading. Currently, the respective log level is "off", allow to set it via JW_LOG_LEVEL_LOAD_TYPES in the environment.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-04-18 10:42:32 +02:00
e472f6eb71 Release 1.0.0-206@kali-rolling/amd64
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-17 23:10:09 +00:00
e1043db93b Release 1.0.0-206@suse-tumbleweed/x86_64
Signed-off-by: janware DevOps <devops@janware.com>
2026-04-16 18:07:55 +00:00