hugpy-browser 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hugpy_browser-0.1.0/PKG-INFO +73 -0
- hugpy_browser-0.1.0/README.md +65 -0
- hugpy_browser-0.1.0/pyproject.toml +26 -0
- hugpy_browser-0.1.0/setup.cfg +4 -0
- hugpy_browser-0.1.0/src/hugpy_browser/__init__.py +57 -0
- hugpy_browser-0.1.0/src/hugpy_browser/assets/base-inactive.xml +185 -0
- hugpy_browser-0.1.0/src/hugpy_browser/assets/clone.xml +218 -0
- hugpy_browser-0.1.0/src/hugpy_browser/assets/hugpy-browser-lab.xml +155 -0
- hugpy_browser-0.1.0/src/hugpy_browser/assets/precision.html +73 -0
- hugpy_browser-0.1.0/src/hugpy_browser/assets/prep_guest.sh +91 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/__init__.py +0 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/chat-1920x1080.json +409 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/chat-1920x1080.png +0 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/chat.html +73 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/dash-1920x1080.json +589 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/dash-1920x1080.png +0 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/dash.html +95 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/editor-1920x1080.json +439 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/editor-1920x1080.png +0 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/editor.html +82 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/shop-1920x1080.json +589 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/shop-1920x1080.png +0 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/shop.html +104 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/signin-1920x1080.json +349 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/signin-1920x1080.png +0 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data/signin.html +74 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/chat-1920x1080.json +449 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/chat-1920x1080.png +0 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/chat.html +73 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/dash-1920x1080.json +647 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/dash-1920x1080.png +0 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/dash.html +95 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/editor-1920x1080.json +482 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/editor-1920x1080.png +0 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/editor.html +82 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/shop-1920x1080.json +647 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/shop-1920x1080.png +0 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/shop.html +104 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/signin-1920x1080.json +383 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/signin-1920x1080.png +0 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/signin.html +74 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/evalrun.py +150 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/final_table.py +34 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/make_bench.py +403 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/offline.py +117 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/pipelines.py +118 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/rescore.py +36 -0
- hugpy_browser-0.1.0/src/hugpy_browser/bench/vlclient.py +77 -0
- hugpy_browser-0.1.0/src/hugpy_browser/cli.py +47 -0
- hugpy_browser-0.1.0/src/hugpy_browser/docs/final_numbers.md +18 -0
- hugpy_browser-0.1.0/src/hugpy_browser/docs/guide.md +389 -0
- hugpy_browser-0.1.0/src/hugpy_browser/docs/measure.md +94 -0
- hugpy_browser-0.1.0/src/hugpy_browser/e2e/__init__.py +0 -0
- hugpy_browser-0.1.0/src/hugpy_browser/e2e/cleanup_e2e.sh +13 -0
- hugpy_browser-0.1.0/src/hugpy_browser/e2e/e2e_desktop.py +291 -0
- hugpy_browser-0.1.0/src/hugpy_browser/e2e/e2e_vm.py +232 -0
- hugpy_browser-0.1.0/src/hugpy_browser/e2e/lab_prepare.sh +97 -0
- hugpy_browser-0.1.0/src/hugpy_browser.egg-info/PKG-INFO +73 -0
- hugpy_browser-0.1.0/src/hugpy_browser.egg-info/SOURCES.txt +61 -0
- hugpy_browser-0.1.0/src/hugpy_browser.egg-info/dependency_links.txt +1 -0
- hugpy_browser-0.1.0/src/hugpy_browser.egg-info/entry_points.txt +2 -0
- hugpy_browser-0.1.0/src/hugpy_browser.egg-info/requires.txt +1 -0
- hugpy_browser-0.1.0/src/hugpy_browser.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: hugpy-browser
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Screen-driven browser control for bots (no WebDriver): one package consolidating the browser-perfect engine front door, benchmark kit, lab-VM assets and the operator guide. The engine itself ships in abstract-toolserver (browser_* tools).
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
Requires-Dist: abstract-toolserver>=0.0.70
|
|
8
|
+
|
|
9
|
+
# hugpy-browser
|
|
10
|
+
|
|
11
|
+
Screen-driven browser control for bots — **no Selenium, no WebDriver, no debugging
|
|
12
|
+
port**. The tools look at the screen and move the real pointer, so a site sees an
|
|
13
|
+
ordinary user's browser. Measured: pointer error **0 px** on VM and desktop;
|
|
14
|
+
description aims **11/12 on target, 1 px median error** (Qwen2.5-VL-7B).
|
|
15
|
+
|
|
16
|
+
This package is the **one place** for the browser-perfect work. The engine itself
|
|
17
|
+
(the `browser_*` tools: `browser_go/look/click/type/move/drag/scroll/wait/read/shot/
|
|
18
|
+
locate/surfaces/lab`) ships inside [`abstract-toolserver`](https://pypi.org/project/abstract-toolserver/)
|
|
19
|
+
(>= 0.0.70, a dependency of this package) and runs in any toolserver — on ae that is
|
|
20
|
+
the `7004_hugpy_toolserver` service. What this package adds around it:
|
|
21
|
+
|
|
22
|
+
| piece | where |
|
|
23
|
+
|---|---|
|
|
24
|
+
| engine re-exports | `hugpy_browser.browser / .aim / .surfaces / .labcheck / .vl` |
|
|
25
|
+
| operator guide | `hugpy-browser guide` (same text as toolserver `instructions/hugpy/hugpy-browser`) |
|
|
26
|
+
| measured numbers | `hugpy-browser numbers` (`docs/final_numbers.md`) |
|
|
27
|
+
| re-measurement kit | `hugpy_browser/bench/` — `evalrun.py`, `pipelines.py`, `vlclient.py`, `rescore.py`, `final_table.py`, and the 233-target synthetic set (`data/`, `data2/`) |
|
|
28
|
+
| end-to-end scripts | `hugpy_browser/e2e/` — `e2e_desktop.py`, `e2e_vm.py`, `lab_prepare.sh`, `cleanup_e2e.sh` |
|
|
29
|
+
| lab-VM assets | `hugpy_browser/assets/` — `precision.html`, `hugpy-browser-lab.xml`, `clone.xml`, `base-inactive.xml`, `prep_guest.sh` |
|
|
30
|
+
|
|
31
|
+
## Install
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
pip install hugpy-browser
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Quickstart (through a toolserver)
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
browser_surfaces() # where can I drive?
|
|
41
|
+
browser_go(url="https://example.com", on="vm:<name>")
|
|
42
|
+
browser_look() # the screen as text items
|
|
43
|
+
browser_click(text="Sign in") # exact visible words
|
|
44
|
+
browser_type(text="me@example.com", into_text="Email")
|
|
45
|
+
browser_wait(text="Welcome", timeout=20)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Aim four ways: `text=` (OCR, exact visible words), `target=` (vision-model
|
|
49
|
+
description, confirmed on a magnified crop), `cell="J2.D5"` (labelled grid, for a
|
|
50
|
+
bot that reads images itself), or `x=, y=`. Every click is verified: before/after
|
|
51
|
+
frames, diff regions, a verdict (`changed_at_click | changed_elsewhere | no_change`).
|
|
52
|
+
|
|
53
|
+
For a repeatable environment: `browser_lab(action="start")` boots an ephemeral
|
|
54
|
+
clone of the `hugpy-browser-lab` image (Firefox on a precision test page);
|
|
55
|
+
`browser_lab(action="check")` runs the 17-check self-test and reports the measured
|
|
56
|
+
pointer error. `hugpy-browser assets` prints the directory with the libvirt XML and
|
|
57
|
+
guest-prep script to rebuild that image anywhere.
|
|
58
|
+
|
|
59
|
+
## CLI
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
hugpy-browser where # the map: engine, service, lab, docs, backups
|
|
63
|
+
hugpy-browser guide # the full operator guide
|
|
64
|
+
hugpy-browser numbers # the measured benchmark results
|
|
65
|
+
hugpy-browser assets # path to precision.html + lab VM assets
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Re-measuring
|
|
69
|
+
|
|
70
|
+
See `docs/measure.md` and `bench/`: `evalrun.py` drives the aim pipelines over the
|
|
71
|
+
synthetic target set (`data/` 233 targets; `data2/` row/card targets); `vlclient.py`
|
|
72
|
+
points at any OpenAI-style vision endpoint (`VL_BASE`). Results of record are in
|
|
73
|
+
`docs/final_numbers.md`.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# hugpy-browser
|
|
2
|
+
|
|
3
|
+
Screen-driven browser control for bots — **no Selenium, no WebDriver, no debugging
|
|
4
|
+
port**. The tools look at the screen and move the real pointer, so a site sees an
|
|
5
|
+
ordinary user's browser. Measured: pointer error **0 px** on VM and desktop;
|
|
6
|
+
description aims **11/12 on target, 1 px median error** (Qwen2.5-VL-7B).
|
|
7
|
+
|
|
8
|
+
This package is the **one place** for the browser-perfect work. The engine itself
|
|
9
|
+
(the `browser_*` tools: `browser_go/look/click/type/move/drag/scroll/wait/read/shot/
|
|
10
|
+
locate/surfaces/lab`) ships inside [`abstract-toolserver`](https://pypi.org/project/abstract-toolserver/)
|
|
11
|
+
(>= 0.0.70, a dependency of this package) and runs in any toolserver — on ae that is
|
|
12
|
+
the `7004_hugpy_toolserver` service. What this package adds around it:
|
|
13
|
+
|
|
14
|
+
| piece | where |
|
|
15
|
+
|---|---|
|
|
16
|
+
| engine re-exports | `hugpy_browser.browser / .aim / .surfaces / .labcheck / .vl` |
|
|
17
|
+
| operator guide | `hugpy-browser guide` (same text as toolserver `instructions/hugpy/hugpy-browser`) |
|
|
18
|
+
| measured numbers | `hugpy-browser numbers` (`docs/final_numbers.md`) |
|
|
19
|
+
| re-measurement kit | `hugpy_browser/bench/` — `evalrun.py`, `pipelines.py`, `vlclient.py`, `rescore.py`, `final_table.py`, and the 233-target synthetic set (`data/`, `data2/`) |
|
|
20
|
+
| end-to-end scripts | `hugpy_browser/e2e/` — `e2e_desktop.py`, `e2e_vm.py`, `lab_prepare.sh`, `cleanup_e2e.sh` |
|
|
21
|
+
| lab-VM assets | `hugpy_browser/assets/` — `precision.html`, `hugpy-browser-lab.xml`, `clone.xml`, `base-inactive.xml`, `prep_guest.sh` |
|
|
22
|
+
|
|
23
|
+
## Install
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
pip install hugpy-browser
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Quickstart (through a toolserver)
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
browser_surfaces() # where can I drive?
|
|
33
|
+
browser_go(url="https://example.com", on="vm:<name>")
|
|
34
|
+
browser_look() # the screen as text items
|
|
35
|
+
browser_click(text="Sign in") # exact visible words
|
|
36
|
+
browser_type(text="me@example.com", into_text="Email")
|
|
37
|
+
browser_wait(text="Welcome", timeout=20)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Aim four ways: `text=` (OCR, exact visible words), `target=` (vision-model
|
|
41
|
+
description, confirmed on a magnified crop), `cell="J2.D5"` (labelled grid, for a
|
|
42
|
+
bot that reads images itself), or `x=, y=`. Every click is verified: before/after
|
|
43
|
+
frames, diff regions, a verdict (`changed_at_click | changed_elsewhere | no_change`).
|
|
44
|
+
|
|
45
|
+
For a repeatable environment: `browser_lab(action="start")` boots an ephemeral
|
|
46
|
+
clone of the `hugpy-browser-lab` image (Firefox on a precision test page);
|
|
47
|
+
`browser_lab(action="check")` runs the 17-check self-test and reports the measured
|
|
48
|
+
pointer error. `hugpy-browser assets` prints the directory with the libvirt XML and
|
|
49
|
+
guest-prep script to rebuild that image anywhere.
|
|
50
|
+
|
|
51
|
+
## CLI
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
hugpy-browser where # the map: engine, service, lab, docs, backups
|
|
55
|
+
hugpy-browser guide # the full operator guide
|
|
56
|
+
hugpy-browser numbers # the measured benchmark results
|
|
57
|
+
hugpy-browser assets # path to precision.html + lab VM assets
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Re-measuring
|
|
61
|
+
|
|
62
|
+
See `docs/measure.md` and `bench/`: `evalrun.py` drives the aim pipelines over the
|
|
63
|
+
synthetic target set (`data/` 233 targets; `data2/` row/card targets); `vlclient.py`
|
|
64
|
+
points at any OpenAI-style vision endpoint (`VL_BASE`). Results of record are in
|
|
65
|
+
`docs/final_numbers.md`.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "hugpy-browser"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Screen-driven browser control for bots (no WebDriver): one package consolidating the browser-perfect engine front door, benchmark kit, lab-VM assets and the operator guide. The engine itself ships in abstract-toolserver (browser_* tools)."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
dependencies = ["abstract-toolserver>=0.0.70"]
|
|
12
|
+
|
|
13
|
+
[project.scripts]
|
|
14
|
+
hugpy-browser = "hugpy_browser.cli:main"
|
|
15
|
+
|
|
16
|
+
[tool.setuptools.packages.find]
|
|
17
|
+
where = ["src"]
|
|
18
|
+
|
|
19
|
+
[tool.setuptools.package-data]
|
|
20
|
+
hugpy_browser = [
|
|
21
|
+
"docs/*.md",
|
|
22
|
+
"assets/*",
|
|
23
|
+
"bench/data/*",
|
|
24
|
+
"bench/data2/*",
|
|
25
|
+
"e2e/*.sh",
|
|
26
|
+
]
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""hugpy-browser — screen-driven browser control for bots, consolidated.
|
|
2
|
+
|
|
3
|
+
The ENGINE (the toolserver's ``browser_*`` tools: aim by text / vision target /
|
|
4
|
+
grid cell, verified clicks, surfaces, the lab) lives in ``abstract_toolserver``
|
|
5
|
+
and is served by the toolserver (port 7004 on ae). This package is the single
|
|
6
|
+
front door around it:
|
|
7
|
+
|
|
8
|
+
* lazy re-exports of the engine modules (``hugpy_browser.browser`` etc.),
|
|
9
|
+
* the operator guide and measured benchmark numbers (``docs/``),
|
|
10
|
+
* the re-measurement kit (``bench/``: evalrun, pipelines, vlclient, the
|
|
11
|
+
233-target synthetic data set),
|
|
12
|
+
* the end-to-end scripts and lab-VM assets (``e2e/``, ``assets/``:
|
|
13
|
+
precision.html, hugpy-browser-lab libvirt XML, guest prep),
|
|
14
|
+
* a small CLI: ``hugpy-browser where|guide|numbers|assets``.
|
|
15
|
+
|
|
16
|
+
Install: ``pip install hugpy-browser`` (pulls abstract-toolserver >= 0.0.70).
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from importlib import import_module, resources
|
|
20
|
+
|
|
21
|
+
__version__ = "0.1.0"
|
|
22
|
+
|
|
23
|
+
#: engine modules re-exported from abstract_toolserver (imported on first use,
|
|
24
|
+
#: so the docs/CLI work even where the engine's own deps are absent)
|
|
25
|
+
ENGINE = {
|
|
26
|
+
"browser": "abstract_toolserver.browser",
|
|
27
|
+
"aim": "abstract_toolserver.aim",
|
|
28
|
+
"surfaces": "abstract_toolserver.surfaces",
|
|
29
|
+
"labcheck": "abstract_toolserver.labcheck",
|
|
30
|
+
"vl": "abstract_toolserver.vl",
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def __getattr__(name):
|
|
35
|
+
target = ENGINE.get(name)
|
|
36
|
+
if target is None:
|
|
37
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
38
|
+
return import_module(target)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _doc(name):
|
|
42
|
+
return (resources.files(__name__) / "docs" / name).read_text(encoding="utf-8")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def guide():
|
|
46
|
+
"""The full operator guide (also at toolserver instructions/hugpy/hugpy-browser)."""
|
|
47
|
+
return _doc("guide.md")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def numbers():
|
|
51
|
+
"""The measured benchmark numbers (0.0.64 -> 0.0.70)."""
|
|
52
|
+
return _doc("final_numbers.md")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def asset_dir():
|
|
56
|
+
"""Directory holding precision.html and the lab-VM libvirt assets."""
|
|
57
|
+
return str(resources.files(__name__) / "assets")
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
<domain type='kvm'>
|
|
2
|
+
<name>ubuntu-desktop</name>
|
|
3
|
+
<uuid>e2517c6e-3855-4f15-84d7-dd4573c94c69</uuid>
|
|
4
|
+
<metadata>
|
|
5
|
+
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
|
|
6
|
+
<libosinfo:os id="http://ubuntu.com/ubuntu/22.04"/>
|
|
7
|
+
</libosinfo:libosinfo>
|
|
8
|
+
</metadata>
|
|
9
|
+
<memory unit='KiB'>33554432</memory>
|
|
10
|
+
<currentMemory unit='KiB'>33554432</currentMemory>
|
|
11
|
+
<vcpu placement='static'>8</vcpu>
|
|
12
|
+
<os>
|
|
13
|
+
<type arch='x86_64' machine='pc-q35-noble'>hvm</type>
|
|
14
|
+
</os>
|
|
15
|
+
<features>
|
|
16
|
+
<acpi/>
|
|
17
|
+
<apic/>
|
|
18
|
+
<vmport state='off'/>
|
|
19
|
+
</features>
|
|
20
|
+
<cpu mode='host-passthrough' check='none' migratable='on'/>
|
|
21
|
+
<clock offset='utc'>
|
|
22
|
+
<timer name='rtc' tickpolicy='catchup'/>
|
|
23
|
+
<timer name='pit' tickpolicy='delay'/>
|
|
24
|
+
<timer name='hpet' present='no'/>
|
|
25
|
+
</clock>
|
|
26
|
+
<on_poweroff>destroy</on_poweroff>
|
|
27
|
+
<on_reboot>restart</on_reboot>
|
|
28
|
+
<on_crash>destroy</on_crash>
|
|
29
|
+
<pm>
|
|
30
|
+
<suspend-to-mem enabled='no'/>
|
|
31
|
+
<suspend-to-disk enabled='no'/>
|
|
32
|
+
</pm>
|
|
33
|
+
<devices>
|
|
34
|
+
<emulator>/usr/bin/qemu-system-x86_64</emulator>
|
|
35
|
+
<disk type='file' device='disk'>
|
|
36
|
+
<driver name='qemu' type='qcow2' discard='unmap'/>
|
|
37
|
+
<source file='/mnt/nvmes/2T_samsung_990/990_general/vms/images/ubuntu-desktop.qcow2'/>
|
|
38
|
+
<target dev='vda' bus='virtio'/>
|
|
39
|
+
<boot order='1'/>
|
|
40
|
+
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
|
|
41
|
+
</disk>
|
|
42
|
+
<disk type='file' device='cdrom'>
|
|
43
|
+
<driver name='qemu' type='raw'/>
|
|
44
|
+
<target dev='sda' bus='sata'/>
|
|
45
|
+
<readonly/>
|
|
46
|
+
<boot order='2'/>
|
|
47
|
+
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
|
|
48
|
+
</disk>
|
|
49
|
+
<controller type='usb' index='0' model='qemu-xhci' ports='15'>
|
|
50
|
+
<address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
|
|
51
|
+
</controller>
|
|
52
|
+
<controller type='pci' index='0' model='pcie-root'/>
|
|
53
|
+
<controller type='pci' index='1' model='pcie-root-port'>
|
|
54
|
+
<model name='pcie-root-port'/>
|
|
55
|
+
<target chassis='1' port='0x10'/>
|
|
56
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
|
|
57
|
+
</controller>
|
|
58
|
+
<controller type='pci' index='2' model='pcie-root-port'>
|
|
59
|
+
<model name='pcie-root-port'/>
|
|
60
|
+
<target chassis='2' port='0x11'/>
|
|
61
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
|
|
62
|
+
</controller>
|
|
63
|
+
<controller type='pci' index='3' model='pcie-root-port'>
|
|
64
|
+
<model name='pcie-root-port'/>
|
|
65
|
+
<target chassis='3' port='0x12'/>
|
|
66
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
|
|
67
|
+
</controller>
|
|
68
|
+
<controller type='pci' index='4' model='pcie-root-port'>
|
|
69
|
+
<model name='pcie-root-port'/>
|
|
70
|
+
<target chassis='4' port='0x13'/>
|
|
71
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
|
|
72
|
+
</controller>
|
|
73
|
+
<controller type='pci' index='5' model='pcie-root-port'>
|
|
74
|
+
<model name='pcie-root-port'/>
|
|
75
|
+
<target chassis='5' port='0x14'/>
|
|
76
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
|
|
77
|
+
</controller>
|
|
78
|
+
<controller type='pci' index='6' model='pcie-root-port'>
|
|
79
|
+
<model name='pcie-root-port'/>
|
|
80
|
+
<target chassis='6' port='0x15'/>
|
|
81
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
|
|
82
|
+
</controller>
|
|
83
|
+
<controller type='pci' index='7' model='pcie-root-port'>
|
|
84
|
+
<model name='pcie-root-port'/>
|
|
85
|
+
<target chassis='7' port='0x16'/>
|
|
86
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x6'/>
|
|
87
|
+
</controller>
|
|
88
|
+
<controller type='pci' index='8' model='pcie-root-port'>
|
|
89
|
+
<model name='pcie-root-port'/>
|
|
90
|
+
<target chassis='8' port='0x17'/>
|
|
91
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x7'/>
|
|
92
|
+
</controller>
|
|
93
|
+
<controller type='pci' index='9' model='pcie-root-port'>
|
|
94
|
+
<model name='pcie-root-port'/>
|
|
95
|
+
<target chassis='9' port='0x18'/>
|
|
96
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/>
|
|
97
|
+
</controller>
|
|
98
|
+
<controller type='pci' index='10' model='pcie-root-port'>
|
|
99
|
+
<model name='pcie-root-port'/>
|
|
100
|
+
<target chassis='10' port='0x19'/>
|
|
101
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/>
|
|
102
|
+
</controller>
|
|
103
|
+
<controller type='pci' index='11' model='pcie-root-port'>
|
|
104
|
+
<model name='pcie-root-port'/>
|
|
105
|
+
<target chassis='11' port='0x1a'/>
|
|
106
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x2'/>
|
|
107
|
+
</controller>
|
|
108
|
+
<controller type='pci' index='12' model='pcie-root-port'>
|
|
109
|
+
<model name='pcie-root-port'/>
|
|
110
|
+
<target chassis='12' port='0x1b'/>
|
|
111
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x3'/>
|
|
112
|
+
</controller>
|
|
113
|
+
<controller type='pci' index='13' model='pcie-root-port'>
|
|
114
|
+
<model name='pcie-root-port'/>
|
|
115
|
+
<target chassis='13' port='0x1c'/>
|
|
116
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x4'/>
|
|
117
|
+
</controller>
|
|
118
|
+
<controller type='pci' index='14' model='pcie-root-port'>
|
|
119
|
+
<model name='pcie-root-port'/>
|
|
120
|
+
<target chassis='14' port='0x1d'/>
|
|
121
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x5'/>
|
|
122
|
+
</controller>
|
|
123
|
+
<controller type='sata' index='0'>
|
|
124
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
|
|
125
|
+
</controller>
|
|
126
|
+
<controller type='virtio-serial' index='0'>
|
|
127
|
+
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
|
|
128
|
+
</controller>
|
|
129
|
+
<interface type='network'>
|
|
130
|
+
<mac address='52:54:00:da:4d:84'/>
|
|
131
|
+
<source network='default'/>
|
|
132
|
+
<model type='virtio'/>
|
|
133
|
+
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
|
|
134
|
+
</interface>
|
|
135
|
+
<serial type='pty'>
|
|
136
|
+
<target type='isa-serial' port='0'>
|
|
137
|
+
<model name='isa-serial'/>
|
|
138
|
+
</target>
|
|
139
|
+
</serial>
|
|
140
|
+
<console type='pty'>
|
|
141
|
+
<target type='serial' port='0'/>
|
|
142
|
+
</console>
|
|
143
|
+
<channel type='unix'>
|
|
144
|
+
<target type='virtio' name='org.qemu.guest_agent.0'/>
|
|
145
|
+
<address type='virtio-serial' controller='0' bus='0' port='1'/>
|
|
146
|
+
</channel>
|
|
147
|
+
<channel type='spicevmc'>
|
|
148
|
+
<target type='virtio' name='com.redhat.spice.0'/>
|
|
149
|
+
<address type='virtio-serial' controller='0' bus='0' port='2'/>
|
|
150
|
+
</channel>
|
|
151
|
+
<input type='tablet' bus='usb'>
|
|
152
|
+
<address type='usb' bus='0' port='1'/>
|
|
153
|
+
</input>
|
|
154
|
+
<input type='mouse' bus='ps2'/>
|
|
155
|
+
<input type='keyboard' bus='ps2'/>
|
|
156
|
+
<graphics type='spice' autoport='yes' listen='0.0.0.0'>
|
|
157
|
+
<listen type='address' address='0.0.0.0'/>
|
|
158
|
+
<image compression='auto_glz'/>
|
|
159
|
+
<jpeg compression='auto'/>
|
|
160
|
+
<zlib compression='auto'/>
|
|
161
|
+
<playback compression='on'/>
|
|
162
|
+
<streaming mode='filter'/>
|
|
163
|
+
</graphics>
|
|
164
|
+
<audio id='1' type='spice'/>
|
|
165
|
+
<video>
|
|
166
|
+
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
|
|
167
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
|
|
168
|
+
</video>
|
|
169
|
+
<redirdev bus='usb' type='spicevmc'>
|
|
170
|
+
<address type='usb' bus='0' port='2'/>
|
|
171
|
+
</redirdev>
|
|
172
|
+
<redirdev bus='usb' type='spicevmc'>
|
|
173
|
+
<address type='usb' bus='0' port='3'/>
|
|
174
|
+
</redirdev>
|
|
175
|
+
<watchdog model='itco' action='reset'/>
|
|
176
|
+
<memballoon model='virtio'>
|
|
177
|
+
<address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
|
|
178
|
+
</memballoon>
|
|
179
|
+
<rng model='virtio'>
|
|
180
|
+
<backend model='random'>/dev/urandom</backend>
|
|
181
|
+
<address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
|
|
182
|
+
</rng>
|
|
183
|
+
</devices>
|
|
184
|
+
</domain>
|
|
185
|
+
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
<domain type='kvm' id='6'>
|
|
2
|
+
<name>ubuntu-desktop-eph-80bf20</name>
|
|
3
|
+
<uuid>0c6c6072-aa2e-4da8-8a38-04dba7db26cd</uuid>
|
|
4
|
+
<description>ephemeral test clone of ubuntu-desktop (abstract_toolserver)</description>
|
|
5
|
+
<metadata xmlns:ns0="http://libosinfo.org/xmlns/libvirt/domain/1.0" xmlns:tsvm="https://toolserver.hugpy.ai/xmlns/vm-ephemeral/1">
|
|
6
|
+
<ns0:libosinfo>
|
|
7
|
+
<ns0:os id="http://ubuntu.com/ubuntu/22.04"/>
|
|
8
|
+
</ns0:libosinfo>
|
|
9
|
+
<tsvm:ephemeral>{"base": "ubuntu-desktop", "by": "abstract_toolserver", "created": 1791311281, "eph_dir": "/mnt/nvmes/2T_samsung_990/990_general/vms/images/ephemeral", "files": ["/mnt/nvmes/2T_samsung_990/990_general/vms/images/ephemeral/ubuntu-desktop-eph-80bf20__vda.qcow2"], "golden": ["/mnt/nvmes/2T_samsung_990/990_general/vms/images/ephemeral/bases/ubuntu-desktop__vda.qcow2"]}</tsvm:ephemeral>
|
|
10
|
+
</metadata>
|
|
11
|
+
<memory unit='KiB'>4194304</memory>
|
|
12
|
+
<currentMemory unit='KiB'>4194304</currentMemory>
|
|
13
|
+
<vcpu placement='static'>4</vcpu>
|
|
14
|
+
<resource>
|
|
15
|
+
<partition>/machine</partition>
|
|
16
|
+
</resource>
|
|
17
|
+
<os>
|
|
18
|
+
<type arch='x86_64' machine='pc-q35-noble'>hvm</type>
|
|
19
|
+
</os>
|
|
20
|
+
<features>
|
|
21
|
+
<acpi/>
|
|
22
|
+
<apic/>
|
|
23
|
+
<vmport state='off'/>
|
|
24
|
+
</features>
|
|
25
|
+
<cpu mode='host-passthrough' check='none' migratable='on'/>
|
|
26
|
+
<clock offset='utc'>
|
|
27
|
+
<timer name='rtc' tickpolicy='catchup'/>
|
|
28
|
+
<timer name='pit' tickpolicy='delay'/>
|
|
29
|
+
<timer name='hpet' present='no'/>
|
|
30
|
+
</clock>
|
|
31
|
+
<on_poweroff>destroy</on_poweroff>
|
|
32
|
+
<on_reboot>restart</on_reboot>
|
|
33
|
+
<on_crash>destroy</on_crash>
|
|
34
|
+
<pm>
|
|
35
|
+
<suspend-to-mem enabled='no'/>
|
|
36
|
+
<suspend-to-disk enabled='no'/>
|
|
37
|
+
</pm>
|
|
38
|
+
<devices>
|
|
39
|
+
<emulator>/usr/bin/qemu-system-x86_64</emulator>
|
|
40
|
+
<disk type='file' device='disk'>
|
|
41
|
+
<driver name='qemu' type='qcow2' discard='unmap'/>
|
|
42
|
+
<source file='/mnt/nvmes/2T_samsung_990/990_general/vms/images/ephemeral/ubuntu-desktop-eph-80bf20__vda.qcow2' index='1'/>
|
|
43
|
+
<backingStore type='file' index='2'>
|
|
44
|
+
<format type='qcow2'/>
|
|
45
|
+
<source file='/mnt/nvmes/2T_samsung_990/990_general/vms/images/ephemeral/bases/ubuntu-desktop__vda.qcow2'/>
|
|
46
|
+
<backingStore/>
|
|
47
|
+
</backingStore>
|
|
48
|
+
<target dev='vda' bus='virtio'/>
|
|
49
|
+
<boot order='1'/>
|
|
50
|
+
<alias name='virtio-disk0'/>
|
|
51
|
+
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
|
|
52
|
+
</disk>
|
|
53
|
+
<controller type='usb' index='0' model='qemu-xhci' ports='15'>
|
|
54
|
+
<alias name='usb'/>
|
|
55
|
+
<address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
|
|
56
|
+
</controller>
|
|
57
|
+
<controller type='pci' index='0' model='pcie-root'>
|
|
58
|
+
<alias name='pcie.0'/>
|
|
59
|
+
</controller>
|
|
60
|
+
<controller type='pci' index='1' model='pcie-root-port'>
|
|
61
|
+
<model name='pcie-root-port'/>
|
|
62
|
+
<target chassis='1' port='0x10'/>
|
|
63
|
+
<alias name='pci.1'/>
|
|
64
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
|
|
65
|
+
</controller>
|
|
66
|
+
<controller type='pci' index='2' model='pcie-root-port'>
|
|
67
|
+
<model name='pcie-root-port'/>
|
|
68
|
+
<target chassis='2' port='0x11'/>
|
|
69
|
+
<alias name='pci.2'/>
|
|
70
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
|
|
71
|
+
</controller>
|
|
72
|
+
<controller type='pci' index='3' model='pcie-root-port'>
|
|
73
|
+
<model name='pcie-root-port'/>
|
|
74
|
+
<target chassis='3' port='0x12'/>
|
|
75
|
+
<alias name='pci.3'/>
|
|
76
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
|
|
77
|
+
</controller>
|
|
78
|
+
<controller type='pci' index='4' model='pcie-root-port'>
|
|
79
|
+
<model name='pcie-root-port'/>
|
|
80
|
+
<target chassis='4' port='0x13'/>
|
|
81
|
+
<alias name='pci.4'/>
|
|
82
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
|
|
83
|
+
</controller>
|
|
84
|
+
<controller type='pci' index='5' model='pcie-root-port'>
|
|
85
|
+
<model name='pcie-root-port'/>
|
|
86
|
+
<target chassis='5' port='0x14'/>
|
|
87
|
+
<alias name='pci.5'/>
|
|
88
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
|
|
89
|
+
</controller>
|
|
90
|
+
<controller type='pci' index='6' model='pcie-root-port'>
|
|
91
|
+
<model name='pcie-root-port'/>
|
|
92
|
+
<target chassis='6' port='0x15'/>
|
|
93
|
+
<alias name='pci.6'/>
|
|
94
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
|
|
95
|
+
</controller>
|
|
96
|
+
<controller type='pci' index='7' model='pcie-root-port'>
|
|
97
|
+
<model name='pcie-root-port'/>
|
|
98
|
+
<target chassis='7' port='0x16'/>
|
|
99
|
+
<alias name='pci.7'/>
|
|
100
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x6'/>
|
|
101
|
+
</controller>
|
|
102
|
+
<controller type='pci' index='8' model='pcie-root-port'>
|
|
103
|
+
<model name='pcie-root-port'/>
|
|
104
|
+
<target chassis='8' port='0x17'/>
|
|
105
|
+
<alias name='pci.8'/>
|
|
106
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x7'/>
|
|
107
|
+
</controller>
|
|
108
|
+
<controller type='pci' index='9' model='pcie-root-port'>
|
|
109
|
+
<model name='pcie-root-port'/>
|
|
110
|
+
<target chassis='9' port='0x18'/>
|
|
111
|
+
<alias name='pci.9'/>
|
|
112
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/>
|
|
113
|
+
</controller>
|
|
114
|
+
<controller type='pci' index='10' model='pcie-root-port'>
|
|
115
|
+
<model name='pcie-root-port'/>
|
|
116
|
+
<target chassis='10' port='0x19'/>
|
|
117
|
+
<alias name='pci.10'/>
|
|
118
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/>
|
|
119
|
+
</controller>
|
|
120
|
+
<controller type='pci' index='11' model='pcie-root-port'>
|
|
121
|
+
<model name='pcie-root-port'/>
|
|
122
|
+
<target chassis='11' port='0x1a'/>
|
|
123
|
+
<alias name='pci.11'/>
|
|
124
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x2'/>
|
|
125
|
+
</controller>
|
|
126
|
+
<controller type='pci' index='12' model='pcie-root-port'>
|
|
127
|
+
<model name='pcie-root-port'/>
|
|
128
|
+
<target chassis='12' port='0x1b'/>
|
|
129
|
+
<alias name='pci.12'/>
|
|
130
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x3'/>
|
|
131
|
+
</controller>
|
|
132
|
+
<controller type='pci' index='13' model='pcie-root-port'>
|
|
133
|
+
<model name='pcie-root-port'/>
|
|
134
|
+
<target chassis='13' port='0x1c'/>
|
|
135
|
+
<alias name='pci.13'/>
|
|
136
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x4'/>
|
|
137
|
+
</controller>
|
|
138
|
+
<controller type='pci' index='14' model='pcie-root-port'>
|
|
139
|
+
<model name='pcie-root-port'/>
|
|
140
|
+
<target chassis='14' port='0x1d'/>
|
|
141
|
+
<alias name='pci.14'/>
|
|
142
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x5'/>
|
|
143
|
+
</controller>
|
|
144
|
+
<controller type='sata' index='0'>
|
|
145
|
+
<alias name='ide'/>
|
|
146
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
|
|
147
|
+
</controller>
|
|
148
|
+
<controller type='virtio-serial' index='0'>
|
|
149
|
+
<alias name='virtio-serial0'/>
|
|
150
|
+
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
|
|
151
|
+
</controller>
|
|
152
|
+
<serial type='pty'>
|
|
153
|
+
<source path='/dev/pts/4'/>
|
|
154
|
+
<target type='isa-serial' port='0'>
|
|
155
|
+
<model name='isa-serial'/>
|
|
156
|
+
</target>
|
|
157
|
+
<alias name='serial0'/>
|
|
158
|
+
</serial>
|
|
159
|
+
<console type='pty' tty='/dev/pts/4'>
|
|
160
|
+
<source path='/dev/pts/4'/>
|
|
161
|
+
<target type='serial' port='0'/>
|
|
162
|
+
<alias name='serial0'/>
|
|
163
|
+
</console>
|
|
164
|
+
<channel type='unix'>
|
|
165
|
+
<source mode='bind' path='/run/libvirt/qemu/channel/6-ubuntu-desktop-eph-8/org.qemu.guest_agent.0'/>
|
|
166
|
+
<target type='virtio' name='org.qemu.guest_agent.0' state='connected'/>
|
|
167
|
+
<alias name='channel0'/>
|
|
168
|
+
<address type='virtio-serial' controller='0' bus='0' port='1'/>
|
|
169
|
+
</channel>
|
|
170
|
+
<channel type='spicevmc'>
|
|
171
|
+
<target type='virtio' name='com.redhat.spice.0' state='connected'/>
|
|
172
|
+
<alias name='channel1'/>
|
|
173
|
+
<address type='virtio-serial' controller='0' bus='0' port='2'/>
|
|
174
|
+
</channel>
|
|
175
|
+
<input type='tablet' bus='usb'>
|
|
176
|
+
<alias name='input0'/>
|
|
177
|
+
<address type='usb' bus='0' port='1'/>
|
|
178
|
+
</input>
|
|
179
|
+
<input type='mouse' bus='ps2'>
|
|
180
|
+
<alias name='input1'/>
|
|
181
|
+
</input>
|
|
182
|
+
<input type='keyboard' bus='ps2'>
|
|
183
|
+
<alias name='input2'/>
|
|
184
|
+
</input>
|
|
185
|
+
<graphics type='spice' port='5903' autoport='yes' listen='127.0.0.1'>
|
|
186
|
+
<listen type='address' address='127.0.0.1'/>
|
|
187
|
+
</graphics>
|
|
188
|
+
<audio id='1' type='spice'/>
|
|
189
|
+
<video>
|
|
190
|
+
<model type='virtio' heads='1' primary='yes'>
|
|
191
|
+
<resolution x='1920' y='1080'/>
|
|
192
|
+
</model>
|
|
193
|
+
<alias name='video0'/>
|
|
194
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
|
|
195
|
+
</video>
|
|
196
|
+
<watchdog model='itco' action='reset'>
|
|
197
|
+
<alias name='watchdog0'/>
|
|
198
|
+
</watchdog>
|
|
199
|
+
<memballoon model='virtio'>
|
|
200
|
+
<alias name='balloon0'/>
|
|
201
|
+
<address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
|
|
202
|
+
</memballoon>
|
|
203
|
+
<rng model='virtio'>
|
|
204
|
+
<backend model='random'>/dev/urandom</backend>
|
|
205
|
+
<alias name='rng0'/>
|
|
206
|
+
<address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
|
|
207
|
+
</rng>
|
|
208
|
+
</devices>
|
|
209
|
+
<seclabel type='dynamic' model='apparmor' relabel='yes'>
|
|
210
|
+
<label>libvirt-0c6c6072-aa2e-4da8-8a38-04dba7db26cd</label>
|
|
211
|
+
<imagelabel>libvirt-0c6c6072-aa2e-4da8-8a38-04dba7db26cd</imagelabel>
|
|
212
|
+
</seclabel>
|
|
213
|
+
<seclabel type='dynamic' model='dac' relabel='yes'>
|
|
214
|
+
<label>+64055:+994</label>
|
|
215
|
+
<imagelabel>+64055:+994</imagelabel>
|
|
216
|
+
</seclabel>
|
|
217
|
+
</domain>
|
|
218
|
+
|