A convenient CLI tool to quickly spin up DragonflyBSD virtual machines using QEMU with sensible defaults.
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #2 from tsirysndr/feat/overrides-start-vm-options

Add CLI flag parsing for overriding virtual machine configuration in start command

authored by tsiry-sandratraina.com and committed by

GitHub 3a7bacf2 9b6df59b

+60 -3
+1
deno.json
··· 8 8 }, 9 9 "imports": { 10 10 "@cliffy/command": "jsr:@cliffy/command@^1.0.0-rc.8", 11 + "@cliffy/flags": "jsr:@cliffy/flags@^1.0.0-rc.8", 11 12 "@cliffy/table": "jsr:@cliffy/table@^1.0.0-rc.8", 12 13 "@db/sqlite": "jsr:@db/sqlite@^0.12.0", 13 14 "@paralleldrive/cuid2": "npm:@paralleldrive/cuid2@^3.0.4",
+3 -1
deno.lock
··· 3 3 "specifiers": { 4 4 "jsr:@cliffy/command@^1.0.0-rc.8": "1.0.0-rc.8", 5 5 "jsr:@cliffy/flags@1.0.0-rc.8": "1.0.0-rc.8", 6 + "jsr:@cliffy/flags@^1.0.0-rc.8": "1.0.0-rc.8", 6 7 "jsr:@cliffy/internal@1.0.0-rc.8": "1.0.0-rc.8", 7 8 "jsr:@cliffy/table@1.0.0-rc.8": "1.0.0-rc.8", 8 9 "jsr:@cliffy/table@^1.0.0-rc.8": "1.0.0-rc.8", ··· 34 35 "@cliffy/command@1.0.0-rc.8": { 35 36 "integrity": "758147790797c74a707e5294cc7285df665422a13d2a483437092ffce40b5557", 36 37 "dependencies": [ 37 - "jsr:@cliffy/flags", 38 + "jsr:@cliffy/flags@1.0.0-rc.8", 38 39 "jsr:@cliffy/internal", 39 40 "jsr:@cliffy/table@1.0.0-rc.8", 40 41 "jsr:@std/fmt@~1.0.2", ··· 157 158 "workspace": { 158 159 "dependencies": [ 159 160 "jsr:@cliffy/command@^1.0.0-rc.8", 161 + "jsr:@cliffy/flags@^1.0.0-rc.8", 160 162 "jsr:@cliffy/table@^1.0.0-rc.8", 161 163 "jsr:@db/sqlite@0.12", 162 164 "jsr:@soapbox/kysely-deno-sqlite@^2.2.0",
+36 -1
main.ts
··· 133 133 }) 134 134 .command("start", "Start a virtual machine") 135 135 .arguments("<vm-name:string>") 136 - .option("--detach, -d", "Run VM in the background and print VM name") 136 + .option("-c, --cpu <type:string>", "Type of CPU to emulate", { 137 + default: "host", 138 + }) 139 + .option("-C, --cpus <number:number>", "Number of CPU cores", { 140 + default: 2, 141 + }) 142 + .option("-m, --memory <size:string>", "Amount of memory for the VM", { 143 + default: "2G", 144 + }) 145 + .option("-i, --image <path:string>", "Path to VM disk image") 146 + .option( 147 + "--disk-format <format:string>", 148 + "Disk image format (e.g., qcow2, raw)", 149 + { 150 + default: "raw", 151 + }, 152 + ) 153 + .option( 154 + "--size <size:string>", 155 + "Size of the VM disk image to create if it doesn't exist (e.g., 20G)", 156 + { 157 + default: "20G", 158 + }, 159 + ) 160 + .option( 161 + "-b, --bridge <name:string>", 162 + "Name of the network bridge to use for networking (e.g., br0)", 163 + ) 164 + .option( 165 + "-d, --detach", 166 + "Run VM in the background and print VM name", 167 + ) 168 + .option( 169 + "-p, --port-forward <mappings:string>", 170 + "Port forwarding rules in the format hostPort:guestPort (comma-separated for multiple)", 171 + ) 137 172 .action(async (options: unknown, vmName: string) => { 138 173 await start(vmName, Boolean((options as { detach: boolean }).detach)); 139 174 })
+20 -1
src/subcommands/start.ts
··· 1 + import { parseFlags } from "@cliffy/flags"; 1 2 import _ from "lodash"; 2 3 import { LOGS_DIR } from "../constants.ts"; 4 + import type { VirtualMachine } from "../db.ts"; 3 5 import { getInstanceState, updateInstanceState } from "../state.ts"; 4 6 import { setupNATNetworkArgs } from "../utils.ts"; 5 7 6 8 export default async function (name: string, detach: boolean = false) { 7 - const vm = await getInstanceState(name); 9 + let vm = await getInstanceState(name); 8 10 if (!vm) { 9 11 console.error( 10 12 `Virtual machine with name or ID ${name} not found.`, ··· 13 15 } 14 16 15 17 console.log(`Starting virtual machine ${vm.name} (ID: ${vm.id})...`); 18 + 19 + vm = mergeFlags(vm); 16 20 17 21 const qemuArgs = [ 18 22 ..._.compact([vm.bridge && "qemu-system-x86_64"]), ··· 98 102 } 99 103 } 100 104 } 105 + 106 + function mergeFlags(vm: VirtualMachine): VirtualMachine { 107 + const { flags } = parseFlags(Deno.args); 108 + return { 109 + ...vm, 110 + memory: flags.memory ? String(flags.memory) : vm.memory, 111 + cpus: flags.cpus ? Number(flags.cpus) : vm.cpus, 112 + cpu: flags.cpu ? String(flags.cpu) : vm.cpu, 113 + diskFormat: flags.diskFormat ? String(flags.diskFormat) : vm.diskFormat, 114 + portForward: flags.portForward ? String(flags.portForward) : vm.portForward, 115 + drivePath: flags.image ? String(flags.image) : vm.drivePath, 116 + bridge: flags.bridge ? String(flags.bridge) : vm.bridge, 117 + diskSize: flags.size ? String(flags.size) : vm.diskSize, 118 + }; 119 + }