Compare commits

..

17 Commits

Author SHA1 Message Date
6b926dfbee New get-server-tls-cert command to fetch and optionally install public TLS certs to the system store for one-way SSL 2026-03-30 09:47:35 -06:00
d22df65e5b Added some new useful TUIs 2026-03-27 16:45:37 -06:00
d4722daf43 fix: Improved the aws generate-sso-profiles command 2026-03-13 15:19:23 -06:00
319ffef6c9 Built the new CLI 2026-03-12 14:54:30 -06:00
9d0c2985ac Updated and improved the aws generate-sso-profiles command 2026-03-12 14:53:48 -06:00
f1a44a38f6 Installed whosthere TUI for LAN discovery 2026-01-26 08:47:05 -07:00
33a0da5d29 fix: Cleaning snap package caches should use sudo 2026-01-21 09:08:56 -07:00
629d7dae6d Installed brow6el and replaced the full-browser command with brow6el since it's a much more full-featured browser 2026-01-05 15:33:01 -07:00
9ceeef156a Added in forgotten dependency requirement for brew-explorer 2025-12-03 09:47:34 -07:00
48372cd663 Installed brew-explorer 2025-12-03 09:46:47 -07:00
7e674d4026 Added USB passthrough support for mac and Linux VMs 2025-12-02 08:12:06 -07:00
f8390ab262 Added in device validation for USB passthrough 2025-12-02 07:46:14 -07:00
8d6f3e9a93 Added USB passthrough flag for the Windows VM 2025-12-02 07:45:19 -07:00
Alex Clarke
9cd07d3b4d Updated badges 2025-11-26 11:54:06 -07:00
da33f508d8 Added badges for dtools
Create release / build-release (push) Has been cancelled
2025-11-24 18:15:35 -07:00
47b3f4057b Updated single-command install 2025-11-24 18:12:35 -07:00
fa2542267e Overriding the github token directly for the release 2025-11-24 18:07:14 -07:00
26 changed files with 2526 additions and 1384 deletions
+3 -5
View File
@@ -58,11 +58,9 @@ jobs:
echo "sha=dist/$name.sha256" >> $GITHUB_OUTPUT echo "sha=dist/$name.sha256" >> $GITHUB_OUTPUT
echo "bin=dist/$bin" >> $GITHUB_OUTPUT echo "bin=dist/$bin" >> $GITHUB_OUTPUT
- name: Publish Archive and SHA - name: Publish Archive, binary and SHA
if: env.ACT != 'true' if: env.ACT != 'true'
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with: with:
files: | files: |
${{ steps.package.outputs.archive }} ${{ steps.package.outputs.archive }}
@@ -71,7 +69,7 @@ jobs:
tag_name: v${{ steps.check-tag.outputs.version }} tag_name: v${{ steps.check-tag.outputs.version }}
name: "v${{ steps.check-tag.outputs.version }}" name: "v${{ steps.check-tag.outputs.version }}"
prerelease: ${{ steps.check-tag.outputs.rc == 'true' }} prerelease: ${{ steps.check-tag.outputs.rc == 'true' }}
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.DTOOLS_GITHUB_TOKEN }}
- name: Add artifacts - name: Add artifacts
shell: bash shell: bash
@@ -84,6 +82,6 @@ jobs:
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: artifacts-v${{ env.VERSION }} name: artifacts-v${{ steps.check-tag.outputs.version }}
path: artifacts path: artifacts
overwrite: true overwrite: true
+7 -5
View File
@@ -1,4 +1,8 @@
# Devtools # Devtools
![Release](https://img.shields.io/github/v/release/Dark-Alex-17/dtools?color=%23c694ff)
**Devtools (`dtools`)** is a comprehensive CLI utility that consolidates reusable development scripts, tools, and **Devtools (`dtools`)** is a comprehensive CLI utility that consolidates reusable development scripts, tools, and
references into a single, easy-to-use interface. Built with the [Bashly](https://github.com/DannyBen/bashly) framework, it serves multiple purposes: references into a single, easy-to-use interface. Built with the [Bashly](https://github.com/DannyBen/bashly) framework, it serves multiple purposes:
@@ -24,13 +28,11 @@ For any and all issues, don't hesitate to create a bug report or feature request
To install the `dtools` script, run the following command: To install the `dtools` script, run the following command:
```shell ```shell
git clone git@github.com:Dark-Alex-17/devtools.git ~/.local/share/devtools && pushd ~/.local/share/devtools && make install && popd curl -fsSL https://raw.githubusercontent.com/Dark-Alex-17/dtools/refs/heads/main/scripts/install.sh | bash
``` ```
This will install the repo to `~/.local/share/devtools` and run the `make install` command to build and install the This will install `dtools` to `~/.local/bin/dtools`, and install the tab completions to your `~./bashrc`. So be sure to
script to your local bin directory (usually `~/.local/bin`). `source ~/.bashrc` to enable the completions.
This will also install the tab completions to your `~./bashrc`, so be sure to `source ~/.bashrc` to enable the completions.
Just run `dtools --help` to get started! Just run `dtools --help` to get started!
+1593 -660
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
if ! [[ -L "$HOME/.local/bin/dtools" ]]; then if ! [[ -L "$HOME/.local/bin/dtools" ]]; then
sudo ln -s "$PWD/dtools" "$HOME/.local/bin/dtools" wget -O "$HOME/.local/bin/dtools" "https://github.com/Dark-Alex-17/dtools/releases/latest/download/dtools"
fi fi
# shellcheck disable=SC2016 # shellcheck disable=SC2016
+42 -38
View File
@@ -38,42 +38,44 @@ if [[ $backup == 1 ]]; then
fi fi
login() { login() {
ssoLoggedIn=$(find "$HOME/.aws/sso/cache" -type f ! -name "botocore*" -exec jq -r '.accessToken | select(. != null)' {} \; | wc -l) sso_logged_in=$(find "$HOME/.aws/sso/cache" -type f ! -name "botocore*" -exec jq -r '.accessToken | select(. != null)' {} \; | wc -l)
if [[ $ssoLoggedIn == 0 || ! -f "$HOME"/.aws/config ]]; then if [[ $sso_logged_in == 0 || ! -f "$HOME"/.aws/config ]]; then
yellow_bold "You must first be logged into AWS with at least one profile. Logging in now..." yellow_bold "You must first be logged into AWS with at least one profile. Logging in now..."
red_bold "You will be required to finish the login process, so control will be returned to you after logging in with your browser"
[[ -f "$HOME"/.aws/config ]] || touch "$HOME"/.aws/config [[ -f "$HOME"/.aws/config ]] || touch "$HOME"/.aws/config
export AWS_PROFILE='' export AWS_PROFILE=''
export AWS_REGION='' export AWS_REGION=''
/usr/bin/expect<<-EOF export SSO_START_URL="$sso_start_url"
set force_conservative 1 export SSO_REGION="$sso_region"
/usr/bin/expect <(cat <<-'EOF'
set timeout 120 set timeout 120
match_max 100000 match_max 100000
spawn aws configure sso
expect "SSO session name (Recommended):" set sso_start_url $env(SSO_START_URL)
set sso_region $env(SSO_REGION)
spawn env TERM=dumb aws configure sso
expect -re {SSO session name \(Recommended\):\s*$}
send -- "session\r" send -- "session\r"
expect "SSO start URL"
send -- "$sso_start_url\\r" expect -re {SSO start URL \[None\]:\s*$}
expect "SSO region" send -- "$sso_start_url\r"
expect -re {SSO region \[None\]:\s*$}
send -- "$sso_region\r" send -- "$sso_region\r"
expect {
"SSO registration scopes" { expect -re {SSO registration scopes \[sso:account:access\]:\s*$}
send "sso:account:access\\r" send -- "sso:account:access\r"
exp_continue
} expect -re {.*accounts available to you\s*}
-re {(.*)accounts available to you(.*)} {
send "\\r" interact
exp_continue EOF
} ) 2>/dev/null
-re {(.*)roles available to you(.*)} {
send "\\r" green "Logged in!"
exp_continue
}
"CLI default client Region"
}
send "\r\r\r\r"
expect eof
EOF
elif ! (aws sts get-caller-identity > /dev/null 2>&1); then elif ! (aws sts get-caller-identity > /dev/null 2>&1); then
red_bold "You must be logged into AWS before running this script." red_bold "You must be logged into AWS before running this script."
yellow "Logging in via SSO. Follow the steps in the opened browser to log in." yellow "Logging in via SSO. Follow the steps in the opened browser to log in."
@@ -96,27 +98,29 @@ login() {
login login
if ! (aws sso list-accounts --profile "${profiles[0]}" --region "$aws_region" --access-token "$ACCESS_TOKEN" --output json > /dev/null 2>&1); then if ! (aws sso list-accounts --profile "${profiles[0]}" --region "$sso_region" --access-token "$ACCESS_TOKEN" --output json > /dev/null 2>&1); then
red "Unable to use existing SSO access token. Wiping tokens and generating new tokens..." red "Unable to use existing SSO access token. Wiping tokens and generating new tokens..."
rm "$HOME"/.aws/sso/cache/*.json rm "$HOME"/.aws/sso/cache/*.json
login login
fi fi
aws sso list-accounts --profile "${profiles[0]}" --region "$aws_region" --access-token "$ACCESS_TOKEN" --output json | jq '.accountList[]' -rc | while read -r account; do aws sso list-accounts --profile "${profiles[0]}" --region "$sso_region" --access-token "$ACCESS_TOKEN" --output json | jq '.accountList[]' -rc | while read -r account; do
declare accountId declare account_id
declare accountName declare account_name
accountId="$(echo "$account" | jq -rc '.accountId')" account_id="$(echo "$account" | jq -rc '.accountId')"
accountName="$(echo "$account" | jq -rc '.accountName | ascii_downcase | gsub(" "; "-")')" account_name="$(echo "$account" | jq -rc '.accountName | ascii_downcase | gsub(" "; "-")')"
aws sso list-account-roles --profile "${profiles[0]}" --region "$aws_region" --access-token "$ACCESS_TOKEN" --output json --account-id "$accountId" | jq '.roleList[].roleName' -rc | while read -r roleName; do aws sso list-account-roles --profile "${profiles[0]}" --region "$sso_region" --access-token "$ACCESS_TOKEN" --output json --account-id "$account_id" |\
jq '.roleList[].roleName' -rc |\
while read -r role_name; do
declare profileName declare profileName
profileName="$accountName-$roleName" profileName="$account_name-$role_name"
if ! (grep -q "$profileName" ~/.aws/config); then if ! (grep -q "$profileName" ~/.aws/config); then
blue "Creating profiles for account $accountName" blue "Creating profiles for account $account_name"
write-profile-to-config "$accountName-$roleName" "$sso_start_url" "$sso_region" "$accountId" "$roleName" "$aws_region" write-profile-to-config "$account_name-$role_name" "$sso_start_url" "$sso_region" "$account_id" "$role_name" "$aws_region"
fi fi
done done
done done
green_bold "Successfully generated profiles from AWS SSO!" green_bold "Successfully generated profiles from AWS SSO!"
+1 -1
View File
@@ -17,7 +17,7 @@ if (command -v snap > /dev/null 2>&1); then
LANG=en_US.UTF-8 snap list --all |\ LANG=en_US.UTF-8 snap list --all |\
awk '/disabled/{print $1, $3}' |\ awk '/disabled/{print $1, $3}' |\
while read -r snapname revision; do while read -r snapname revision; do
snap remove "$snapname" --revision="$revision" sudo snap remove "$snapname" --revision="$revision"
done done
blue_bold "Purging cached Snap versions..." blue_bold "Purging cached Snap versions..."
sudo rm -rf /var/cache/snapd/* sudo rm -rf /var/cache/snapd/*
@@ -0,0 +1,16 @@
# shellcheck disable=SC2154
declare host="${args[host]}"
declare port="${args[--port]}"
declare view_only="${args[--view-only]}"
declare output_dir="${args[--output-dir]}"
declare filename="${args[--filename]}"
if [[ "$view_only" == 1 ]]; then
openssl s_client -showcerts -connect "${host}:${port}"
else
openssl s_client -showcerts -connect "${host}:${port}" </dev/null | sed -n -e '/-.BEGIN/,/-.END/ p' | sudo tee "${output_dir}/${filename:-${host%%.*}}.pem"
fi
if dpkg -s ca-certificates > /dev/null 2>&1; then
sudo update-ca-certificates
fi
+42
View File
@@ -288,3 +288,45 @@ commands:
C-->D C-->D
C-->F C-->F
' '
- name: get-server-tls-cert
help: |-
Retrieve the TLS certificate from a server and save it to a file.
If on a debian-based system and 'ca-certificates' is installed, the certificate will be installed into the system's trust store.
dependencies:
openssl: Install with either 'sudo apt install libssl-dev' or 'brew install openssl@3'
args:
- name: host
help: Domain name or IP address
required: true
flags:
- long: --port
short: -p
help: The port to connect to
arg: port
default: '443'
validate: port_number
- long: --view-only
short: -v
help: Only print the certificate(s) to stdout
conflicts: [--output-dir, --filename]
- long: --output-dir
short: -d
help: |-
Write the certificate to a file.
Defaults to `/usr/local/share/ca-certificates`.
arg: output
completions:
- <file>
conflicts: [--view-only]
default: /usr/local/share/ca-certificates
- long: --filename
short: -f
arg: filename
help: |-
The name of the '.pem' file to save the cert to.
By default, it is 'domain.pem'
conflicts: [--view-only]
examples:
- dtools network get-server-tls-cert google.com --port 443
- dtools network get-server-tls-cert example.com --output-dir . --filename example.com
@@ -0,0 +1 @@
navi
@@ -12,3 +12,8 @@ commands:
help: Wikipedia TUI (wiki-tui) help: Wikipedia TUI (wiki-tui)
dependencies: dependencies:
wiki-tui: See 'https://wiki-tui.net/latest/' wiki-tui: See 'https://wiki-tui.net/latest/'
- name: command-lookup
help: Interactive command cheatsheet so you don't have to google all your commands (navi)
dependencies:
navi: See 'https://github.com/denisidoro/navi'
@@ -88,3 +88,8 @@ commands:
help: Fast, remote-first, multi-host TUI log viewer with timeline histogram and no central server (nerdlog) help: Fast, remote-first, multi-host TUI log viewer with timeline histogram and no central server (nerdlog)
dependencies: dependencies:
nerdlog: See 'https://github.com/dimonomid/nerdlog' nerdlog: See 'https://github.com/dimonomid/nerdlog'
- name: system-benchmark
help: Statistic benchmarking using your CLI with warmup rounds, outlier removal, and side-by-side comparison (hyperfine)
dependencies:
hyperfine: See 'https://github.com/sharkdp/hyperfine'
@@ -0,0 +1 @@
hyperfine
+1
View File
@@ -0,0 +1 @@
brew-explorer
+5
View File
@@ -105,3 +105,8 @@ commands:
help: A TUI and CLI for managing *arr servers (managarr) help: A TUI and CLI for managing *arr servers (managarr)
dependencies: dependencies:
managarr: See 'https://github.com/Dark-Alex-17/managarr' managarr: See 'https://github.com/Dark-Alex-17/managarr'
- name: brew-explorer
help: A beautiful terminal UI for exploring and managing your Homebrew packages with ease
dependencies:
brew-explorer: See 'https://github.com/cosmincatalin/brew-explorer'
@@ -0,0 +1 @@
ncdu
@@ -17,3 +17,8 @@ commands:
help: Linux kernel manager and activity monitor (kmon) help: Linux kernel manager and activity monitor (kmon)
dependencies: dependencies:
kmon: See 'https://github.com/orhun/kmon' kmon: See 'https://github.com/orhun/kmon'
- name: disk-monitor
help: Interactive disk usage navigator (ncdu)
dependencies:
ncdu: See 'https://dev.yorhel.nl/ncdu'
+1 -1
View File
@@ -1 +1 @@
docker run -it browsh/browsh brow6el
@@ -0,0 +1 @@
whosthere
@@ -44,6 +44,11 @@ commands:
gping: See 'https://github.com/orf/gping' gping: See 'https://github.com/orf/gping'
- name: full-browser - name: full-browser
help: A full-featured web browser for the terminal using Chromium (CEF) and libsixel for graphics rendering (brow6el)
dependencies:
brow6el: See 'https://codeberg.org/janantos/brow6el'
- name: text-based-browser
help: Text based browser with images (browsh) help: Text based browser with images (browsh)
dependencies: dependencies:
browsh: See 'https://www.brow.sh/' browsh: See 'https://www.brow.sh/'
@@ -82,3 +87,8 @@ commands:
help: A simple API client (Postman-like) (atac) help: A simple API client (Postman-like) (atac)
dependencies: dependencies:
atac: See 'https://atac.julien-cpsn.com/' atac: See 'https://atac.julien-cpsn.com/'
- name: lan-discovery
help: Local Area Network discovery tool with a modern Terminal User Interface (TUI) written in Go. Discover, explore, and understand your LAN in an intuitive way. Knock Knock.. who's there? (whosthere)
dependencies:
whosthere: See 'https://github.com/ramonvermeulen/whosthere'
@@ -0,0 +1 @@
docker run -it browsh/browsh
+15
View File
@@ -10,6 +10,17 @@ declare ram_size="${args[--ram-size]}"
declare cpu_cores="${args[--cpu-cores]}" declare cpu_cores="${args[--cpu-cores]}"
# shellcheck disable=SC2154 # shellcheck disable=SC2154
declare share_directory="${args[--share-directory]}" declare share_directory="${args[--share-directory]}"
# shellcheck disable=SC2154
declare usb="${args[--usb]}"
declare -a flags=()
if [[ -n "$usb" ]]; then
vendor_id="$(udevadm info --query=all --name="$usb" | grep ID_VENDOR_ID | awk -F= '{print $2}')"
product_id="$(udevadm info --query=all --name="$usb" | grep ID_MODEL_ID | awk -F= '{print $2}')"
flags+=("--device=/dev/bus/usb")
flags+=("-e")
flags+=(ARGUMENTS="-device usb-host,vendorid=0x${vendor_id},productid=0x${product_id}")
fi
if [[ -n $dist ]]; then if [[ -n $dist ]]; then
image=$dist image=$dist
@@ -47,6 +58,7 @@ if [[ "${args[--no-gui]}" == 1 ]]; then
-e "RAM_SIZE=${ram_size}G" \ -e "RAM_SIZE=${ram_size}G" \
-e "CPU_CORES=$cpu_cores" \ -e "CPU_CORES=$cpu_cores" \
-v "$share_directory:/shared" \ -v "$share_directory:/shared" \
"${flags[@]}" \
--cap-add NET_ADMIN \ --cap-add NET_ADMIN \
--stop-timeout 120 \ --stop-timeout 120 \
qemux/qemu qemux/qemu
@@ -60,6 +72,7 @@ if [[ "${args[--no-gui]}" == 1 ]]; then
-e "RAM_SIZE=${ram_size}G" \ -e "RAM_SIZE=${ram_size}G" \
-e "CPU_CORES=$cpu_cores" \ -e "CPU_CORES=$cpu_cores" \
-v "$share_directory:/shared" \ -v "$share_directory:/shared" \
"${flags[@]}" \
--cap-add NET_ADMIN \ --cap-add NET_ADMIN \
--stop-timeout 120 \ --stop-timeout 120 \
qemux/qemu qemux/qemu
@@ -78,6 +91,7 @@ else
-e "RAM_SIZE=${ram_size}G" \ -e "RAM_SIZE=${ram_size}G" \
-e "CPU_CORES=$cpu_cores" \ -e "CPU_CORES=$cpu_cores" \
-v "$share_directory:/shared" \ -v "$share_directory:/shared" \
"${flags[@]}" \
--cap-add NET_ADMIN \ --cap-add NET_ADMIN \
--stop-timeout 120 \ --stop-timeout 120 \
-d \ -d \
@@ -94,6 +108,7 @@ else
-e "RAM_SIZE=${ram_size}G" \ -e "RAM_SIZE=${ram_size}G" \
-e "CPU_CORES=$cpu_cores" \ -e "CPU_CORES=$cpu_cores" \
-v "$share_directory:/shared" \ -v "$share_directory:/shared" \
"${flags[@]}" \
--cap-add NET_ADMIN \ --cap-add NET_ADMIN \
--stop-timeout 120 \ --stop-timeout 120 \
-d \ -d \
+13
View File
@@ -10,6 +10,17 @@ declare cpu_cores="${args[--cpu-cores]}"
declare share_directory="${args[--share-directory]}" declare share_directory="${args[--share-directory]}"
# shellcheck disable=SC2154 # shellcheck disable=SC2154
declare persistent_dir_prefix="${args[--persistent-dir-prefix]:-$version}" declare persistent_dir_prefix="${args[--persistent-dir-prefix]:-$version}"
# shellcheck disable=SC2154
declare usb="${args[--usb]}"
declare -a flags=()
if [[ -n "$usb" ]]; then
vendor_id="$(udevadm info --query=all --name="$usb" | grep ID_VENDOR_ID | awk -F= '{print $2}')"
product_id="$(udevadm info --query=all --name="$usb" | grep ID_MODEL_ID | awk -F= '{print $2}')"
flags+=("--device=/dev/bus/usb")
flags+=("-e")
flags+=(ARGUMENTS="-device usb-host,vendorid=0x${vendor_id},productid=0x${product_id}")
fi
if [[ "${args[--wipe-persistent-data]}" == 1 ]]; then if [[ "${args[--wipe-persistent-data]}" == 1 ]]; then
declare persistent_data_dir="$HOME/.vm/mac/$persistent_dir_prefix" declare persistent_data_dir="$HOME/.vm/mac/$persistent_dir_prefix"
@@ -40,6 +51,7 @@ if [[ "${args[--persistent]}" == 1 ]]; then
-v "$share_directory:/shared" \ -v "$share_directory:/shared" \
--cap-add NET_ADMIN \ --cap-add NET_ADMIN \
--stop-timeout 120 \ --stop-timeout 120 \
"${flags[@]}" \
-d \ -d \
dockurr/macos) dockurr/macos)
else else
@@ -55,6 +67,7 @@ else
-v "$share_directory:/shared" \ -v "$share_directory:/shared" \
--cap-add NET_ADMIN \ --cap-add NET_ADMIN \
--stop-timeout 120 \ --stop-timeout 120 \
"${flags[@]}" \
-d \ -d \
dockurr/macos) dockurr/macos)
fi fi
+76 -58
View File
@@ -24,46 +24,52 @@ commands:
- long: --disk-size - long: --disk-size
help: The disk size of the VM's drive in GB help: The disk size of the VM's drive in GB
arg: disk_size arg: disk_size
default: "64" default: '64'
validate: integer validate: integer
- long: --ram-size - long: --ram-size
help: The RAM size of the VM's RAM in GB help: The RAM size of the VM's RAM in GB
arg: ram_size arg: ram_size
default: "4" default: '4'
validate: integer validate: integer
- long: --cpu-cores - long: --cpu-cores
help: The number of CPU cores the VM is allowed to use help: The number of CPU cores the VM is allowed to use
arg: cpu_cores arg: cpu_cores
default: "2" default: '2'
validate: integer validate: integer
- long: --share-directory - long: --share-directory
help: The directory to share with the VM (In Windows, this is the Network#host.lan machine) help: The directory to share with the VM (In Windows, this is the Network#host.lan machine)
arg: share_directory arg: share_directory
default: "." default: '.'
completions:
- <directory>
- long: --usb
help: The USB device to mount into the VM (e.g. '/dev/sde')
arg: usb
validate: device_exists
completions: completions:
- <directory> - <directory>
- long: --version - long: --version
help: The version of Windows to start help: The version of Windows to start
arg: version arg: version
default: "11" default: '11'
allowed: allowed:
- "11" - '11'
- "11l" - '11l'
- "11e" - '11e'
- "10" - '10'
- "10l" - '10l'
- "10e" - '10e'
- "8e" - '8e'
- "7e" - '7e'
- "ve" - 've'
- "xp" - 'xp'
- "2025" - '2025'
- "2022" - '2022'
- "2019" - '2019'
- "2016" - '2016'
- "2012" - '2012'
- "2008" - '2008'
- "2003" - '2003'
- name: linux - name: linux
help: Start a Linux VM that's available at http://localhost:8006 and via SSH on port 2222 help: Start a Linux VM that's available at http://localhost:8006 and via SSH on port 2222
@@ -104,50 +110,56 @@ commands:
- long: --disk-size - long: --disk-size
help: The disk size of the VM's drive in GB help: The disk size of the VM's drive in GB
arg: disk_size arg: disk_size
default: "128" default: '128'
validate: integer validate: integer
- long: --ram-size - long: --ram-size
help: The RAM size of the VM's RAM in GB help: The RAM size of the VM's RAM in GB
arg: ram_size arg: ram_size
default: "8" default: '8'
validate: integer validate: integer
- long: --cpu-cores - long: --cpu-cores
help: The number of CPU cores the VM is allowed to use help: The number of CPU cores the VM is allowed to use
arg: cpu_cores arg: cpu_cores
default: "4" default: '4'
validate: integer validate: integer
- long: --share-directory - long: --share-directory
help: The directory to share with the VM (Access by running 'mount -t 9p -o trans=virtio shared /mnt/shared' in the container) help: The directory to share with the VM (Access by running 'mount -t 9p -o trans=virtio shared /mnt/shared' in the container)
arg: share_directory arg: share_directory
default: "." default: '.'
completions:
- <directory>
- long: --usb
help: The USB device to mount into the VM (e.g. '/dev/sde')
arg: usb
validate: device_exists
completions: completions:
- <directory> - <directory>
- long: --dist - long: --dist
help: The Linux distribution to start help: The Linux distribution to start
arg: distribution arg: distribution
allowed: allowed:
- "alma" - 'alma'
- "alpine" - 'alpine'
- "arch" - 'arch'
- "cachy" - 'cachy'
- "centos" - 'centos'
- "debian" - 'debian'
- "fedora" - 'fedora'
- "gentoo" - 'gentoo'
- "kali" - 'kali'
- "kubuntu" - 'kubuntu'
- "mint" - 'mint'
- "manjaro" - 'manjaro'
- "mx" - 'mx'
- "nixos" - 'nixos'
- "suse" - 'suse'
- "oracle" - 'oracle'
- "rocky" - 'rocky'
- "slack" - 'slack'
- "tails" - 'tails'
- "ubuntu" - 'ubuntu'
- "ubuntus" - 'ubuntus'
- "xubuntu" - 'xubuntu'
conflicts: [--image-url] conflicts: [--image-url]
- long: --image-url - long: --image-url
help: |- help: |-
@@ -187,31 +199,37 @@ commands:
- long: --disk-size - long: --disk-size
help: The disk size of the VM's drive in GB help: The disk size of the VM's drive in GB
arg: disk_size arg: disk_size
default: "64" default: '64'
validate: integer validate: integer
- long: --ram-size - long: --ram-size
help: The RAM size of the VM's RAM in GB help: The RAM size of the VM's RAM in GB
arg: ram_size arg: ram_size
default: "4" default: '4'
validate: integer validate: integer
- long: --cpu-cores - long: --cpu-cores
help: The number of CPU cores the VM is allowed to use help: The number of CPU cores the VM is allowed to use
arg: cpu_cores arg: cpu_cores
default: "2" default: '2'
validate: integer validate: integer
- long: --share-directory - long: --share-directory
help: The directory to share with the VM (Access by running 'mount -S mount_9p shared' in the container; Then it's available under Finder -> Go -> Computer) help: The directory to share with the VM (Access by running 'mount -S mount_9p shared' in the container; Then it's available under Finder -> Go -> Computer)
arg: share_directory arg: share_directory
default: "." default: '.'
completions:
- <directory>
- long: --usb
help: The USB device to mount into the VM (e.g. '/dev/sde')
arg: usb
validate: device_exists
completions: completions:
- <directory> - <directory>
- long: --version - long: --version
help: The version of MacOS to start help: The version of MacOS to start
arg: version arg: version
default: "13" default: '15'
allowed: allowed:
- "15" - '15'
- "14" - '14'
- "13" - '13'
- "12" - '12'
- "11" - '11'
+13
View File
@@ -10,6 +10,17 @@ declare cpu_cores="${args[--cpu-cores]}"
declare share_directory="${args[--share-directory]}" declare share_directory="${args[--share-directory]}"
# shellcheck disable=SC2154 # shellcheck disable=SC2154
declare persistent_dir_prefix="${args[--persistent-dir-prefix]:-$version}" declare persistent_dir_prefix="${args[--persistent-dir-prefix]:-$version}"
# shellcheck disable=SC2154
declare usb="${args[--usb]}"
declare -a flags=()
if [[ -n "$usb" ]]; then
vendor_id="$(udevadm info --query=all --name="$usb" | grep ID_VENDOR_ID | awk -F= '{print $2}')"
product_id="$(udevadm info --query=all --name="$usb" | grep ID_MODEL_ID | awk -F= '{print $2}')"
flags+=("--device=/dev/bus/usb")
flags+=("-e")
flags+=(ARGUMENTS="-device usb-host,vendorid=0x${vendor_id},productid=0x${product_id}")
fi
if [[ "${args[--wipe-persistent-data]}" == 1 ]]; then if [[ "${args[--wipe-persistent-data]}" == 1 ]]; then
declare persistent_data_dir="$HOME/.vm/windows/$persistent_dir_prefix" declare persistent_data_dir="$HOME/.vm/windows/$persistent_dir_prefix"
@@ -40,6 +51,7 @@ if [[ "${args[--persistent]}" == 1 ]]; then
-v "$share_directory:/data" \ -v "$share_directory:/data" \
--cap-add NET_ADMIN \ --cap-add NET_ADMIN \
--stop-timeout 120 \ --stop-timeout 120 \
"${flags[@]}" \
-d \ -d \
dockurr/windows) dockurr/windows)
else else
@@ -55,6 +67,7 @@ else
-v "$share_directory:/data" \ -v "$share_directory:/data" \
--cap-add NET_ADMIN \ --cap-add NET_ADMIN \
--stop-timeout 120 \ --stop-timeout 120 \
"${flags[@]}" \
-d \ -d \
dockurr/windows) dockurr/windows)
fi fi
File diff suppressed because it is too large Load Diff
@@ -3,3 +3,7 @@ validate_port_number() {
red_bold "The port number provided is invalid: $1" red_bold "The port number provided is invalid: $1"
fi fi
} }
validate_device_exists () {
[[ -e /dev/sde ]] || red_bold "The specified device does not exist: $1"
}