diff --git a/README.md b/README.md index 817de3c..ccf0f76 100644 --- a/README.md +++ b/README.md @@ -7,14 +7,16 @@ sensible defaults. ## ✨ Features -- 🖥️ **Easy NetBSD VM setup**: Launch NetBSD virtual machines with a single command +- 🖥️ **Easy NetBSD VM setup**: Launch NetBSD virtual machines with a single + command - 📥 **Automatic ISO download**: Downloads NetBSD ISO images from official CDN - 🏷️ **Version-aware**: Specify NetBSD versions and automatically construct download URLs - 🔄 **Flexible input**: Support for local ISO files, URLs, or version numbers -- ⚙️ **Configurable VM settings**: Customize CPU, memory, cores, and disk options -- ⚡ **KVM acceleration**: Automatically enables hardware virtualization for better - performance +- ⚙️ **Configurable VM settings**: Customize CPU, memory, cores, and disk + options +- ⚡ **KVM acceleration**: Automatically enables hardware virtualization for + better performance - 🌐 **Network forwarding**: SSH access via port 2222 on the host - 💻 **Serial console**: No GUI required - works entirely in terminal @@ -99,14 +101,15 @@ netbsd-up --drive vm-disk.img --disk-format qcow2 ## 🛠️ Command Line Options -| Option | Short | Description | Default | -| --------------- | ----- | ------------------------------ | -------------- | -| `--output` | `-o` | Output path for downloaded ISO | Auto-generated | -| `--cpu` | `-c` | CPU type to emulate | `host` | -| `--cpus` | `-C` | Number of CPU cores | `2` | -| `--memory` | `-m` | Amount of VM memory | `2G` | -| `--drive` | `-d` | Path to VM disk image | None | -| `--disk-format` | | Disk image format | `raw` | +| Option | Short | Description | Default | +| --------------- | ----- | ------------------------------------------------------------ | -------------- | +| `--output` | `-o` | Output path for downloaded ISO | Auto-generated | +| `--cpu` | `-c` | CPU type to emulate | `host` | +| `--cpus` | `-C` | Number of CPU cores | `2` | +| `--memory` | `-m` | Amount of VM memory | `2G` | +| `--drive` | `-d` | Path to VM disk image | None | +| `--disk-format` | | Disk image format | `raw` | +| `--bridge` | `-b` | Name of the network bridge to use for networking (e.g., br0) | None | ## 📚 Examples @@ -167,9 +170,11 @@ release ISO. - **🌐 Network**: User-mode with SSH forwarding ## 📄 License + See [LICENSE](LICENSE) file for details. ## Contributing 🤝 + Contributions are welcome! Please feel free to submit issues and pull requests. > [!NOTE] diff --git a/deno.json b/deno.json index e87a893..2633a6b 100644 --- a/deno.json +++ b/deno.json @@ -4,8 +4,14 @@ }, "imports": { "@cliffy/command": "jsr:@cliffy/command@^1.0.0-rc.8", + "@cliffy/table": "jsr:@cliffy/table@^1.0.0-rc.8", + "@db/sqlite": "jsr:@db/sqlite@^0.12.0", + "@paralleldrive/cuid2": "npm:@paralleldrive/cuid2@^3.0.4", + "@soapbox/kysely-deno-sqlite": "jsr:@soapbox/kysely-deno-sqlite@^2.2.0", "@std/assert": "jsr:@std/assert@1", "chalk": "npm:chalk@^5.6.2", - "lodash": "npm:lodash@^4.17.21" + "kysely": "npm:kysely@^0.28.8", + "lodash": "npm:lodash@^4.17.21", + "moniker": "npm:moniker@^0.1.2" } } diff --git a/deno.lock b/deno.lock index fa6c3a3..2c45da2 100644 --- a/deno.lock +++ b/deno.lock @@ -5,12 +5,29 @@ "jsr:@cliffy/flags@1.0.0-rc.8": "1.0.0-rc.8", "jsr:@cliffy/internal@1.0.0-rc.8": "1.0.0-rc.8", "jsr:@cliffy/table@1.0.0-rc.8": "1.0.0-rc.8", + "jsr:@cliffy/table@^1.0.0-rc.8": "1.0.0-rc.8", + "jsr:@db/sqlite@0.12": "0.12.0", + "jsr:@denosaurs/plug@1": "1.1.0", + "jsr:@soapbox/kysely-deno-sqlite@^2.2.0": "2.2.0", + "jsr:@std/assert@0.217": "0.217.0", "jsr:@std/assert@1": "1.0.15", + "jsr:@std/encoding@1": "1.0.10", + "jsr:@std/fmt@1": "1.0.8", "jsr:@std/fmt@~1.0.2": "1.0.8", + "jsr:@std/fs@1": "1.0.19", + "jsr:@std/internal@^1.0.10": "1.0.12", "jsr:@std/internal@^1.0.12": "1.0.12", + "jsr:@std/internal@^1.0.9": "1.0.12", + "jsr:@std/path@0.217": "0.217.0", + "jsr:@std/path@1": "1.1.2", + "jsr:@std/path@^1.1.1": "1.1.2", "jsr:@std/text@~1.0.7": "1.0.16", + "npm:@paralleldrive/cuid2@^3.0.4": "3.0.4", "npm:chalk@^5.6.2": "5.6.2", - "npm:lodash@^4.17.21": "4.17.21" + "npm:kysely@~0.27.2": "0.27.6", + "npm:kysely@~0.28.8": "0.28.8", + "npm:lodash@^4.17.21": "4.17.21", + "npm:moniker@~0.1.2": "0.1.2" }, "jsr": { "@cliffy/command@1.0.0-rc.8": { @@ -18,8 +35,8 @@ "dependencies": [ "jsr:@cliffy/flags", "jsr:@cliffy/internal", - "jsr:@cliffy/table", - "jsr:@std/fmt", + "jsr:@cliffy/table@1.0.0-rc.8", + "jsr:@std/fmt@~1.0.2", "jsr:@std/text" ] }, @@ -35,39 +52,119 @@ "@cliffy/table@1.0.0-rc.8": { "integrity": "8bbcdc2ba5e0061b4b13810a24e6f5c6ab19c09f0cce9eb691ccd76c7c6c9db5", "dependencies": [ - "jsr:@std/fmt" + "jsr:@std/fmt@~1.0.2" ] }, + "@db/sqlite@0.12.0": { + "integrity": "dd1ef7f621ad50fc1e073a1c3609c4470bd51edc0994139c5bf9851de7a6d85f", + "dependencies": [ + "jsr:@denosaurs/plug", + "jsr:@std/path@0.217" + ] + }, + "@denosaurs/plug@1.1.0": { + "integrity": "eb2f0b7546c7bca2000d8b0282c54d50d91cf6d75cb26a80df25a6de8c4bc044", + "dependencies": [ + "jsr:@std/encoding", + "jsr:@std/fmt@1", + "jsr:@std/fs", + "jsr:@std/path@1" + ] + }, + "@soapbox/kysely-deno-sqlite@2.2.0": { + "integrity": "668ec94600bc4b4d7bd618dd7ca65d4ef30ee61c46ffcb379b6f45203c08517a", + "dependencies": [ + "npm:kysely@~0.27.2" + ] + }, + "@std/assert@0.217.0": { + "integrity": "c98e279362ca6982d5285c3b89517b757c1e3477ee9f14eb2fdf80a45aaa9642" + }, "@std/assert@1.0.15": { "integrity": "d64018e951dbdfab9777335ecdb000c0b4e3df036984083be219ce5941e4703b", "dependencies": [ - "jsr:@std/internal" + "jsr:@std/internal@^1.0.12" ] }, + "@std/encoding@1.0.10": { + "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" + }, "@std/fmt@1.0.8": { "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" }, + "@std/fs@1.0.19": { + "integrity": "051968c2b1eae4d2ea9f79a08a3845740ef6af10356aff43d3e2ef11ed09fb06", + "dependencies": [ + "jsr:@std/internal@^1.0.9", + "jsr:@std/path@^1.1.1" + ] + }, "@std/internal@1.0.12": { "integrity": "972a634fd5bc34b242024402972cd5143eac68d8dffaca5eaa4dba30ce17b027" }, + "@std/path@0.217.0": { + "integrity": "1217cc25534bca9a2f672d7fe7c6f356e4027df400c0e85c0ef3e4343bc67d11", + "dependencies": [ + "jsr:@std/assert@0.217" + ] + }, + "@std/path@1.1.2": { + "integrity": "c0b13b97dfe06546d5e16bf3966b1cadf92e1cc83e56ba5476ad8b498d9e3038", + "dependencies": [ + "jsr:@std/internal@^1.0.10" + ] + }, "@std/text@1.0.16": { "integrity": "ddb9853b75119a2473857d691cf1ec02ad90793a2e8b4a4ac49d7354281a0cf8" } }, "npm": { + "@noble/hashes@2.0.1": { + "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==" + }, + "@paralleldrive/cuid2@3.0.4": { + "integrity": "sha512-sM6M2PWrByOEpN2QYAdulhEbSZmChwj0e52u4hpwB7u4PznFiNAavtE6m7O8tWUlzX+jT2eKKtc5/ZgX+IHrtg==", + "dependencies": [ + "@noble/hashes", + "bignumber.js", + "error-causes" + ], + "bin": true + }, + "bignumber.js@9.3.1": { + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==" + }, "chalk@5.6.2": { "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" }, + "error-causes@3.0.2": { + "integrity": "sha512-i0B8zq1dHL6mM85FGoxaJnVtx6LD5nL2v0hlpGdntg5FOSyzQ46c9lmz5qx0xRS2+PWHGOHcYxGIBC5Le2dRMw==" + }, + "kysely@0.27.6": { + "integrity": "sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ==" + }, + "kysely@0.28.8": { + "integrity": "sha512-QUOgl5ZrS9IRuhq5FvOKFSsD/3+IA6MLE81/bOOTRA/YQpKDza2sFdN5g6JCB9BOpqMJDGefLCQ9F12hRS13TA==" + }, "lodash@4.17.21": { "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "moniker@0.1.2": { + "integrity": "sha512-Uj9iV0QYr6281G+o0TvqhKwHHWB2Q/qUTT4LPQ3qDGc0r8cbMuqQjRXPZuVZ+gcL7APx+iQgE8lcfWPrj1LsLA==" } }, "workspace": { "dependencies": [ "jsr:@cliffy/command@^1.0.0-rc.8", + "jsr:@cliffy/table@^1.0.0-rc.8", + "jsr:@db/sqlite@0.12", + "jsr:@soapbox/kysely-deno-sqlite@^2.2.0", "jsr:@std/assert@1", + "npm:@paralleldrive/cuid2@^3.0.4", "npm:chalk@^5.6.2", - "npm:lodash@^4.17.21" + "npm:kysely@~0.28.8", + "npm:lodash@^4.17.21", + "npm:moniker@~0.1.2" ] } }