Skip to content
This repository was archived by the owner on Jan 23, 2026. It is now read-only.

Commit b35e10a

Browse files
committed
Merge branch 'main' into add-hooks
2 parents 4a391ce + 8dd161a commit b35e10a

52 files changed

Lines changed: 2981 additions & 162 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.devcontainer/Dockerfile

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,5 @@ COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv
99
COPY --from=ghcr.io/astral-sh/uv:latest /uvx /bin/uvx
1010
COPY ./.python-version ./
1111

12-
RUN uv python pin "$(cat .python-version)"
13-
1412
# Install required tools for development
1513
RUN apt-get update && apt-get install -y iperf3 libusb-dev

.devcontainer/devcontainer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"dockerfile": "Dockerfile"
66
},
77
"postCreateCommand": "make sync",
8-
"postStartCommand": "uv run pre-commit install",
8+
"postStartCommand": "uv python pin 3.12 && uv run pre-commit install",
99
"remoteUser": "vscode",
1010
// Mount USB devices to devcontainer for tests
1111
"mounts": [

.github/workflows/documentation.yaml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ jobs:
4242
version: "latest"
4343

4444
- name: Install Python
45-
run: uv python install
45+
run: |
46+
uv python pin 3.12
47+
uv python install
4648
4749
- name: Setup Pages
4850
id: pages
@@ -80,7 +82,9 @@ jobs:
8082
version: "latest"
8183

8284
- name: Install Python
83-
run: uv python install
85+
run: |
86+
uv python pin 3.12
87+
uv python install
8488
8589
- name: Build the documentation for the current version (no warnings allowed)
8690
run: make sync && make docs

.python-version

Lines changed: 0 additions & 1 deletion
This file was deleted.

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ Thank you for your interest in contributing to Jumpstarter, we are an open
44
community and we welcome contributions.
55

66
For a complete contribution guide, please refer to our
7-
[documentation](https://jumpstarter.dev/contributing/).
7+
[documentation](https://jumpstarter.dev/main/contributing.html).

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,17 @@
33
[![Matrix](https://img.shields.io/matrix/jumpstarter%3Amatrix.org?color=blue)](https://matrix.to/#/#jumpstarter:matrix.org)
44
[![Etherpad](https://img.shields.io/badge/Etherpad-Notes-blue?logo=etherpad)](https://etherpad.jumpstarter.dev/pad-lister)
55
[![Community Meeting](https://img.shields.io/badge/Weekly%20Meeting-Google%20Meet-blue?logo=google-meet)](https://meet.google.com/gzd-hhbd-hpu)
6+
![GitHub Release](https://img.shields.io/github/v/release/jumpstarter-dev/jumpstarter)
7+
![PyPI - Version](https://img.shields.io/pypi/v/jumpstarter)
8+
![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/jumpstarter-dev/jumpstarter/total)
9+
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/jumpstarter-dev/jumpstarter)
10+
11+
[![E2E Tests](https://github.com/jumpstarter-dev/jumpstarter/actions/workflows/e2e.yaml/badge.svg)](https://github.com/jumpstarter-dev/jumpstarter/actions/workflows/e2e.yaml)
12+
[![Tests](https://github.com/jumpstarter-dev/jumpstarter/actions/workflows/pytest.yaml/badge.svg)](https://github.com/jumpstarter-dev/jumpstarter/actions/workflows/pytest.yaml)
13+
[![documentation](https://github.com/jumpstarter-dev/jumpstarter/actions/workflows/documentation.yaml/badge.svg)](https://github.com/jumpstarter-dev/jumpstarter/actions/workflows/documentation.yaml)<br>
14+
[![Wheels](https://github.com/jumpstarter-dev/jumpstarter/actions/workflows/publish.yaml/badge.svg)](https://github.com/jumpstarter-dev/jumpstarter/actions/workflows/publish.yaml)
15+
[![Flashing bundles](https://github.com/jumpstarter-dev/jumpstarter/actions/workflows/build_oci_bundle.yaml/badge.svg)](https://github.com/jumpstarter-dev/jumpstarter/actions/workflows/build_oci_bundle.yaml)
16+
[![Containers](https://github.com/jumpstarter-dev/jumpstarter/actions/workflows/build.yaml/badge.svg)](https://github.com/jumpstarter-dev/jumpstarter/actions/workflows/build.yaml)
617

718
A free, open source tool for automated testing on real and virtual hardware with
819
CI/CD integration. Simplify device automation with consistent rules across local

docs/source/reference/package-apis/drivers/index.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ Drivers that provide various communication interfaces:
4242
Protocol
4343
* **[TFTP](tftp.md)** (`jumpstarter-driver-tftp`) - Trivial File Transfer
4444
Protocol
45+
* **[VNC](vnc.md)** (`jumpstarter-driver-vnc`) - VNC (Virtual Network Computing) remote desktop protocol
4546

4647
### Storage and Data Drivers
4748

@@ -111,5 +112,6 @@ tmt.md
111112
tftp.md
112113
uboot.md
113114
ustreamer.md
115+
vnc.md
114116
yepkit.md
115117
```
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../../../packages/jumpstarter-driver-vnc/README.md

packages/jumpstarter-all/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ dependencies = [
3535
"jumpstarter-driver-tmt",
3636
"jumpstarter-driver-uboot",
3737
"jumpstarter-driver-ustreamer",
38+
"jumpstarter-driver-vnc",
3839
"jumpstarter-driver-yepkit",
3940
"jumpstarter-imagehash",
4041
"jumpstarter-kubernetes",

packages/jumpstarter-cli-common/jumpstarter_cli_common/oidc.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
import os
23
from dataclasses import dataclass
34
from functools import wraps
45
from typing import ClassVar
@@ -12,6 +13,8 @@
1213
from joserfc.jws import extract_compact
1314
from yarl import URL
1415

16+
from jumpstarter.config.env import JMP_OIDC_CALLBACK_PORT
17+
1518

1619
def opt_oidc(f):
1720
@click.option("--issuer", help="OIDC issuer")
@@ -20,6 +23,12 @@ def opt_oidc(f):
2023
@click.option("--username", help="OIDC username")
2124
@click.option("--password", help="OIDC password")
2225
@click.option("--connector-id", "connector_id", help="OIDC token exchange connector id (Dex specific)")
26+
@click.option("--callback-port",
27+
"callback_port",
28+
type=click.IntRange(0, 65535),
29+
default=None,
30+
help="Port for OIDC callback server (0=random port)",
31+
)
2332
@wraps(f)
2433
def wrapper(*args, **kwds):
2534
return f(*args, **kwds)
@@ -71,9 +80,21 @@ async def password_grant(self, username: str, password: str):
7180
)
7281
)
7382

74-
async def authorization_code_grant(self):
83+
async def authorization_code_grant(self, callback_port: int | None = None):
7584
config = await self.configuration()
7685

86+
# Use provided port, fall back to env var, then default to 0 (OS picks)
87+
if callback_port is not None:
88+
port = callback_port
89+
else:
90+
env_value = os.environ.get(JMP_OIDC_CALLBACK_PORT)
91+
if env_value is None:
92+
port = 0
93+
elif env_value.isdigit() and int(env_value) <= 65535:
94+
port = int(env_value)
95+
else:
96+
raise click.ClickException(f"Invalid {JMP_OIDC_CALLBACK_PORT} \"{env_value}\": must be a valid port")
97+
7798
tx, rx = create_memory_object_stream()
7899

79100
async def callback(request):
@@ -86,8 +107,12 @@ async def callback(request):
86107
runner = web.AppRunner(app, access_log=None)
87108
await runner.setup()
88109

89-
site = web.TCPSite(runner, "localhost", 0)
90-
await site.start()
110+
site = web.TCPSite(runner, "localhost", port)
111+
try:
112+
await site.start()
113+
except OSError as e:
114+
await runner.cleanup()
115+
raise click.ClickException(f"Failed to start callback server on port {port}: {e}") from None
91116

92117
redirect_uri = "http://localhost:%d/callback" % site._server.sockets[0].getsockname()[1]
93118

0 commit comments

Comments
 (0)