diff --git a/build/lib/scripts/wg-vps-setup b/build/lib/scripts/wireguard-vps-proxy-setup similarity index 53% rename from build/lib/scripts/wg-vps-setup rename to build/lib/scripts/wireguard-vps-proxy-setup index 6c630bb46..f9f654fe3 100755 --- a/build/lib/scripts/wg-vps-setup +++ b/build/lib/scripts/wireguard-vps-proxy-setup @@ -1,5 +1,33 @@ #!/bin/bash +# ============================================================================= +# Wireguard VPS Proxy Setup +# ============================================================================= +# +# This script automates the setup of a WireGuard VPN server on a remote VPS +# for StartOS Clearnet functionality. It handles: +# +# 1. SSH key-based authentication setup +# 2. Root access configuration (if needed) +# 3. WireGuard server installation +# 4. Configuration file generation and import +# +# Usage: +# wireguard-vps-proxy-setup [-h] [-i IP] [-u USERNAME] [-p PORT] [-k SSH_KEY] +# +# Options: +# -h Show help message +# -i VPS IP address +# -u SSH username (default: root) +# -p SSH port (default: 22) +# -k Path to custom SSH private key +# +# Example: +# wireguard-vps-proxy-setup -i 110.18.1.1 -u debian +# +# Note: This script requires root privileges and will auto-elevate if needed. +# ============================================================================= + # Colors for better output RED='\033[0;31m' GREEN='\033[0;32m' @@ -8,7 +36,7 @@ YELLOW='\033[1;33m' NC='\033[0;37m' # No Color # --- Constants --- -readonly WIREGUARD_INSTALL_URL="https://raw.githubusercontent.com/start9labs/wg-vps-setup/master/wireguard-install.sh" +readonly WIREGUARD_INSTALL_URL="https://raw.githubusercontent.com/start9labs/wireguard-vps-proxy-setup/master/wireguard-install.sh" readonly SSH_KEY_DIR="/home/start9/.ssh" readonly SSH_KEY_NAME="id_ed25519" readonly SSH_PRIVATE_KEY="$SSH_KEY_DIR/$SSH_KEY_NAME" @@ -31,7 +59,7 @@ check_root() { print_banner() { echo -e "${BLUE}" echo "================================================" - echo -e " ${NC}StartOS WireGuard VPS Setup Tool${BLUE} " + echo -e " ${NC}Wireguard VPS Proxy Setup${BLUE} " echo "================================================" echo -e "${NC}" } @@ -51,23 +79,53 @@ print_usage() { # Function to display end message display_end_message() { echo -e "\n${BLUE}------------------------------------------------------------------${NC}" - echo -e "${NC}WireGuard server setup complete!" - echo -e "${BLUE}------------------------------------------------------------------${NC}" - echo -e "\n${YELLOW}To expose your services to the Clearnet, use the following commands on your StartOS system (replace placeholders):${NC}" - echo -e "\n ${YELLOW}1. Initialize ACME (This only needs to be done once):${NC}" - echo " start-cli net acme init --provider=letsencrypt --contact=mailto:your-email@example.com" - echo -e "\n ${YELLOW}2. Expose 'hello-world' on port 80 through VPS:${NC}" - echo " start-cli package host hello-world binding ui-multi set-public 80" - echo -e "\n ${YELLOW}3. Add a domain to your 'hello-world' service:${NC}" - echo " start-cli package host hello-world address ui-multi domain add your-domain.example.com --acme=letsencrypt" - echo -e "\n ${YELLOW}Replace '${NC}your-email@example.com${YELLOW}' with your actual email address, '${NC}your-domain.example.com${YELLOW}' with your actual domain and '${NC}hello-world${YELLOW}' with your actual service id.${NC}" + echo -e "${GREEN}Wireguard VPS Proxy server setup complete!${NC}" echo -e "${BLUE}------------------------------------------------------------------${NC}" + echo -e "\n${GREEN}Clearnet functionality has been enabled via VPS (${VPS_IP})${NC}" + echo -e "\n${YELLOW}Next steps:${NC}" + echo -e "Visit https://docs.start9.com to complete the Clearnet setup" + echo -e "\n${BLUE}------------------------------------------------------------------${NC}" } # Function to validate IP address validate_ip() { local ip=$1 + # IPv4 validation if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then + # Additional IPv4 validation to ensure each octet is <= 255 + local IFS='.' + read -ra ADDR <<< "$ip" + for i in "${ADDR[@]}"; do + if [ "$i" -gt 255 ]; then + return 1 + fi + done + return 0 + # IPv6 validation + elif [[ $ip =~ ^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){6}:[0-9a-fA-F]{1,4}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){5}(:[0-9a-fA-F]{1,4}){1,2}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){4}(:[0-9a-fA-F]{1,4}){1,3}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){3}(:[0-9a-fA-F]{1,4}){1,4}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){2}(:[0-9a-fA-F]{1,4}){1,5}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1}(:[0-9a-fA-F]{1,4}){1,6}$ ]] || \ + [[ $ip =~ ^::([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$ ]] || \ + [[ $ip =~ ^[0-9a-fA-F]{1,4}::([0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,4}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,3}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,2}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,1}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1,7}:$ ]] || \ + [[ $ip =~ ^::([0-9a-fA-F]{1,4}:){0,7}[0-9a-fA-F]{1,4}$ ]] || \ + [[ $ip =~ ^[0-9a-fA-F]{1,4}::([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1,6}(:[0-9a-fA-F]{1,4}){1,1}$ ]] || \ + [[ $ip =~ ^([0-9a-fA-F]{1,4}:){1,7}:$ ]] || \ + [[ $ip =~ ^::$ ]]; then return 0 else return 1 @@ -90,6 +148,15 @@ configure_ssh_key_auth() { echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config fi + # Enable root login + if grep -q "^#PermitRootLogin" /etc/ssh/sshd_config; then + sed -i "s/^#PermitRootLogin.*/PermitRootLogin yes/" /etc/ssh/sshd_config + elif grep -q "^PermitRootLogin" /etc/ssh/sshd_config; then + sed -i "s/^PermitRootLogin.*/PermitRootLogin yes/" /etc/ssh/sshd_config + else + echo "PermitRootLogin yes" >> /etc/ssh/sshd_config + fi + # Configure AuthorizedKeysFile if needed if grep -q "^#AuthorizedKeysFile" /etc/ssh/sshd_config; then sed -i "s/^#AuthorizedKeysFile.*/AuthorizedKeysFile .ssh\/authorized_keys .ssh\/authorized_keys2/" /etc/ssh/sshd_config @@ -203,7 +270,7 @@ install_wireguard() { fi # Run the remote install script and let it complete - if ! ssh -o ConnectTimeout=60 -i "$SSH_PRIVATE_KEY" -o StrictHostKeyChecking=no -p "$SSH_PORT" -t "$SSH_USER@$VPS_IP" "bash -c 'export TERM=xterm-256color; export STARTOS_HOSTNAME=$(hostname); bash ~/wireguard-install.sh'"; then + if ! ssh -o ConnectTimeout=60 -i "$SSH_PRIVATE_KEY" -o StrictHostKeyChecking=no -p "$SSH_PORT" -t "$SSH_USER@$VPS_IP" "bash -c 'export TERM=xterm-256color; export STARTOS_HOSTNAME=clearnet; bash ~/wireguard-install.sh'"; then echo -e "${RED}WireGuard installation failed on remote server.${NC}" return 1 fi @@ -218,6 +285,74 @@ install_wireguard() { return 0 } +# Function to enable root login via SSH +enable_root_login() { + echo -e "${BLUE}Checking and configuring root SSH access...${NC}" + + # Try to modify sshd config using sudo + if ! ssh -i "$SSH_PRIVATE_KEY" -o StrictHostKeyChecking=no -p "$SSH_PORT" "$SSH_USER@$VPS_IP" ' + # Check if we can use sudo without password + if ! sudo -n true 2>/dev/null; then + echo -e "\033[1;33mNOTE: You may be prompted for your sudo password.\033[0m" + fi + + # Check if user is in sudo group + if ! groups | grep -q sudo; then + echo -e "\033[1;31mError: Your user is not in the sudo group. Root access cannot be configured.\033[0m" + exit 1 + fi + + # Backup sshd config + sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak + + # Enable root login with SSH keys only + if sudo grep -q "^PermitRootLogin" /etc/ssh/sshd_config; then + sudo sed -i "s/^PermitRootLogin.*/PermitRootLogin prohibit-password/" /etc/ssh/sshd_config + else + echo "PermitRootLogin prohibit-password" | sudo tee -a /etc/ssh/sshd_config + fi + + # Ensure password authentication is disabled + if sudo grep -q "^PasswordAuthentication" /etc/ssh/sshd_config; then + sudo sed -i "s/^PasswordAuthentication.*/PasswordAuthentication no/" /etc/ssh/sshd_config + else + echo "PasswordAuthentication no" | sudo tee -a /etc/ssh/sshd_config + fi + + # Set up root SSH directory and keys + echo -e "\033[1;33mSetting up root SSH access...\033[0m" + sudo mkdir -p /root/.ssh + sudo cp ~/.ssh/authorized_keys /root/.ssh/ + sudo chown -R root:root /root/.ssh + sudo chmod 700 /root/.ssh + sudo chmod 600 /root/.ssh/authorized_keys + + # Reload SSH service + sudo systemctl reload sshd + + # Verify the changes + if ! sudo grep -q "^PermitRootLogin prohibit-password" /etc/ssh/sshd_config; then + echo -e "\033[1;31mError: Failed to verify root login configuration.\033[0m" + exit 1 + fi + + # Test root SSH access + if ! sudo -n true 2>/dev/null; then + echo -e "\033[1;33mNOTE: Please try to log in as root now using your SSH key.\033[0m" + echo -e "\033[1;33mIf successful, run this script again without the -u parameter.\033[0m" + else + echo -e "\033[1;32mRoot SSH access has been configured successfully!\033[0m" + fi + '; then + echo -e "${RED}Failed to configure root SSH access.${NC}" + return 1 + fi + + echo -e "${GREEN}Root SSH access has been configured successfully!${NC}" + echo -e "${YELLOW}Please try to log in as root now using your SSH key. If successful, run this script again without the -u parameter.${NC}" + return 0 +} + # --- Main Script --- # Initialize variables VPS_IP="" @@ -311,27 +446,80 @@ echo -e "${GREEN}SSH key-based authentication configured successfully!${NC}" # Test SSH connection using key-based authentication echo -e "\nTesting SSH connection with key-based authentication..." -if ! ssh -q -o BatchMode=yes -o ConnectTimeout=5 -i "$SSH_PRIVATE_KEY" -o StrictHostKeyChecking=no -p "$SSH_PORT" "$SSH_USER@$VPS_IP" 'grep -q "^PubkeyAuthentication yes" /etc/ssh/sshd_config'; then - echo -e "\n${RED}SSH key-based authentication is not enabled on your VPS.${NC}" - echo -e "\n${YELLOW}Would you like this script to automatically enable SSH key authentication? (y/N):${NC} " - read -r answer +if ! ssh -q -o BatchMode=yes -o ConnectTimeout=5 -i "$SSH_PRIVATE_KEY" -o StrictHostKeyChecking=no -p "$SSH_PORT" "$SSH_USER@$VPS_IP" 'exit'; then + echo -e "${RED}SSH connection test failed. Please check your credentials and try again.${NC}" + exit 1 +fi +# If we're connecting as a non-root user, set up root access first +if [ "$SSH_USER" != "root" ]; then + echo -e "\n${YELLOW}You are connecting as a non-root user. This script needs to enable root SSH access.${NC}" + echo -e "${YELLOW}This is a one-time setup that will allow direct root login for WireGuard installation.${NC}" + echo -n -e "${YELLOW}Would you like to proceed? (y/N): ${NC}" + read -r answer + if [[ "$answer" =~ ^[Yy]$ ]]; then - configure_ssh_key_auth + if enable_root_login; then + echo -e "\n${BLUE}------------------------------------------------------------------${NC}" + echo -e "${GREEN}Root SSH access has been configured successfully!${NC}" + echo -e "${YELLOW}Please run this script again without the -u parameter to continue setup.${NC}" + echo -e "${BLUE}------------------------------------------------------------------${NC}" + exit 0 + else + echo -e "${RED}Failed to configure root SSH access. Please check your sudo privileges and try again.${NC}" + exit 1 + fi else echo -e "\n${BLUE}------------------------------------------------------------------${NC}" - echo -e "${YELLOW}To manually enable SSH key authentication:${NC}" + echo -e "${YELLOW}To manually configure SSH for root access:${NC}" echo -e "\n ${YELLOW}1. Connect to your VPS and edit sshd_config:${NC}" - echo " nano /etc/ssh/sshd_config" - echo -e "\n ${YELLOW}2. Find and uncomment or add the line:${NC}" + echo " sudo nano /etc/ssh/sshd_config" + echo -e "\n ${YELLOW}2. Find and uncomment or add these lines:${NC}" echo " PubkeyAuthentication yes" + echo " PermitRootLogin yes" + echo " AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2" echo -e "\n ${YELLOW}3. Restart the SSH service:${NC}" - echo " systemctl restart sshd" + echo " sudo systemctl restart sshd" + echo -e "\n ${YELLOW}4. Copy your SSH key to root user:${NC}" + echo " sudo mkdir -p /root/.ssh" + echo " sudo cp ~/.ssh/authorized_keys /root/.ssh/" + echo " sudo chown -R root:root /root/.ssh" + echo " sudo chmod 700 /root/.ssh" + echo " sudo chmod 600 /root/.ssh/authorized_keys" echo -e "${BLUE}------------------------------------------------------------------${NC}" - echo -e "\n${YELLOW}Please enable SSH key authentication and run this script again.${NC}" + echo -e "\n${YELLOW}After completing these steps, run this script again without the -u parameter.${NC}" exit 1 fi fi + +# Check if root login is permitted when connecting as root +if [ "$SSH_USER" = "root" ]; then + # Check for both "yes" and "prohibit-password" as valid root login settings + if ! ssh -q -o BatchMode=yes -o ConnectTimeout=5 -i "$SSH_PRIVATE_KEY" -o StrictHostKeyChecking=no -p "$SSH_PORT" "$SSH_USER@$VPS_IP" 'grep -q "^PermitRootLogin.*\(yes\|prohibit-password\)" /etc/ssh/sshd_config'; then + echo -e "\n${RED}Root SSH login is not enabled on your VPS.${NC}" + echo -e "\n${YELLOW}Would you like this script to automatically enable root SSH access? (y/N):${NC} " + read -r answer + + if [[ "$answer" =~ ^[Yy]$ ]]; then + configure_ssh_key_auth + else + echo -e "\n${BLUE}------------------------------------------------------------------${NC}" + echo -e "${YELLOW}To manually configure SSH for root access:${NC}" + echo -e "\n ${YELLOW}1. Connect to your VPS and edit sshd_config:${NC}" + echo " sudo nano /etc/ssh/sshd_config" + echo -e "\n ${YELLOW}2. Find and uncomment or add these lines:${NC}" + echo " PubkeyAuthentication yes" + echo " PermitRootLogin prohibit-password" + echo " AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2" + echo -e "\n ${YELLOW}3. Restart the SSH service:${NC}" + echo " sudo systemctl restart sshd" + echo -e "${BLUE}------------------------------------------------------------------${NC}" + echo -e "\n${YELLOW}Please enable root SSH access and run this script again.${NC}" + exit 1 + fi + fi +fi + echo -e "${GREEN}SSH connection successful with key-based authentication!${NC}" # Download the WireGuard install script locally @@ -364,4 +552,4 @@ fi # Import the configuration if ! import_wireguard_config "$CONFIG_NAME"; then echo -e "${RED}StartOS configuration import failed or skipped!${NC}" -fi +fi \ No newline at end of file diff --git a/container-runtime/src/Adapters/EffectCreator.ts b/container-runtime/src/Adapters/EffectCreator.ts index ed975f25e..e11cd9d43 100644 --- a/container-runtime/src/Adapters/EffectCreator.ts +++ b/container-runtime/src/Adapters/EffectCreator.ts @@ -193,8 +193,8 @@ export function makeEffects(context: EffectContext): Effects { T.Effects["exposeForDependents"] > }, - getContainerIp(...[]: Parameters) { - return rpcRound("get-container-ip", {}) as ReturnType< + getContainerIp(...[options]: Parameters) { + return rpcRound("get-container-ip", options) as ReturnType< T.Effects["getContainerIp"] > }, diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/polyfillEffects.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/polyfillEffects.ts index 0099bea92..88e9d7ae6 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/polyfillEffects.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/polyfillEffects.ts @@ -9,6 +9,7 @@ import { Manifest } from "./matchManifest" import { DockerProcedureContainer } from "./DockerProcedureContainer" import * as cp from "child_process" import { Effects } from "../../../Models/Effects" +import { Mounts } from "@start9labs/start-sdk/package/lib/mainFn/Mounts" export const execFile = promisify(cp.execFile) export const polyfillEffects = ( effects: Effects, @@ -111,7 +112,7 @@ export const polyfillEffects = ( effects, { imageId: manifest.main.image }, commands, - {}, + { mounts: Mounts.of() }, commands.join(" "), ) .then((x: any) => ({ @@ -168,17 +169,12 @@ export const polyfillEffects = ( { imageId: manifest.main.image }, commands, { - mounts: [ - { - mountpoint: "/drive", - options: { - type: "volume", - id: input.volumeId, - subpath: null, - readonly: false, - }, - }, - ], + mounts: Mounts.of().addVolume( + input.volumeId, + null, + "/drive", + false, + ), }, commands.join(" "), ) @@ -210,17 +206,12 @@ export const polyfillEffects = ( { imageId: manifest.main.image }, commands, { - mounts: [ - { - mountpoint: "/drive", - options: { - type: "volume", - id: input.volumeId, - subpath: null, - readonly: false, - }, - }, - ], + mounts: Mounts.of().addVolume( + input.volumeId, + null, + "/drive", + false, + ), }, commands.join(" "), ) diff --git a/core/Cargo.lock b/core/Cargo.lock index 87edff8ac..ebf98d709 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -174,9 +174,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.96" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" [[package]] name = "arbitrary" @@ -238,7 +238,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "synstructure", ] @@ -250,7 +250,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -266,7 +266,7 @@ dependencies = [ "pem", "rcgen", "ring", - "rustls 0.23.23", + "rustls 0.23.25", "rustls-pemfile 2.2.0", "serde", "serde_json", @@ -312,9 +312,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310c9bcae737a48ef5cdee3174184e6d548b292739ede61a1f955ef76a738861" +checksum = "59a194f9d963d8099596278594b3107448656ba73831c9d8c783e613ce86da64" dependencies = [ "brotli", "flate2", @@ -361,7 +361,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix", + "rustix 0.38.44", "slab", "tracing", "windows-sys 0.59.0", @@ -393,7 +393,7 @@ dependencies = [ "cfg-if", "event-listener 5.4.0", "futures-lite", - "rustix", + "rustix 0.38.44", "tracing", ] @@ -405,7 +405,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -420,7 +420,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix", + "rustix 0.38.44", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -445,7 +445,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -456,13 +456,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.86" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -488,27 +488,25 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.12.4" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd755adf9707cf671e31d944a189be3deaaeee11c8bc1d669bb8022ac90fbd0" +checksum = "19b756939cb2f8dc900aa6dcd505e6e2428e9cae7ff7b028c49e3946efa70878" dependencies = [ "aws-lc-sys", - "paste", "zeroize", ] [[package]] name = "aws-lc-sys" -version = "0.26.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9dd2e03ee80ca2822dd6ea431163d2ef259f2066a4d6ccaca6d9dcb386aa43" +checksum = "b9f7720b74ed28ca77f90769a71fd8c637a0137f6fae4ae947e1050229cff57f" dependencies = [ "bindgen", "cc", "cmake", "dunce", "fs_extra", - "paste", ] [[package]] @@ -550,7 +548,7 @@ dependencies = [ "base64 0.22.1", "bytes", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", @@ -602,7 +600,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "mime", @@ -688,9 +686,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "basic-cookies" @@ -718,7 +716,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -731,7 +729,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.98", + "syn 2.0.100", "which", ] @@ -773,9 +771,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" dependencies = [ "serde", ] @@ -823,9 +821,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.6.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675f87afced0413c9bb02843499dbbd3882a237645883f71a2b59644a6d2f753" +checksum = "389a099b34312839e16420d499a9cad9650541715937ffbdd40d36f49e77eeb3" dependencies = [ "arrayref", "arrayvec 0.7.6", @@ -896,9 +894,9 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" [[package]] name = "byteorder" @@ -914,9 +912,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "bzip2" @@ -945,9 +943,9 @@ checksum = "981520c98f422fcc584dc1a95c334e6953900b9106bc47a9839b81790009eb21" [[package]] name = "cc" -version = "1.2.16" +version = "1.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c" dependencies = [ "jobserver", "libc", @@ -1023,7 +1021,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half 2.4.1", + "half 2.5.0", ] [[package]] @@ -1058,9 +1056,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.31" +version = "4.5.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" +checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" dependencies = [ "clap_builder", "clap_derive", @@ -1068,9 +1066,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.31" +version = "4.5.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" +checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" dependencies = [ "anstream", "anstyle", @@ -1080,14 +1078,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.28" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1158,9 +1156,9 @@ dependencies = [ [[package]] name = "console" -version = "0.15.10" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ "encode_unicode", "libc", @@ -1381,12 +1379,12 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "crossterm_winapi", "futures-core", "mio", "parking_lot", - "rustix", + "rustix 0.38.44", "signal-hook", "signal-hook-mio", "winapi", @@ -1496,14 +1494,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -1511,27 +1509,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1568,7 +1566,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1605,14 +1603,14 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", "serde", @@ -1626,7 +1624,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1639,7 +1637,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1692,7 +1690,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1733,9 +1731,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feeef44e73baff3a26d371801df019877a9866a8c493d315ab00177843314f35" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" [[package]] name = "ecdsa" @@ -1803,9 +1801,9 @@ dependencies = [ [[package]] name = "either" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" dependencies = [ "serde", ] @@ -1881,7 +1879,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1902,7 +1900,7 @@ checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1924,9 +1922,9 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", @@ -1972,9 +1970,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener 5.4.0", "pin-project-lite", @@ -2025,9 +2023,9 @@ dependencies = [ [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ "rand_core 0.6.4", "subtle", @@ -2059,12 +2057,12 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", - "miniz_oxide 0.8.5", + "miniz_oxide 0.8.7", ] [[package]] @@ -2215,7 +2213,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2323,14 +2321,16 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", ] [[package]] @@ -2351,7 +2351,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8283e7331b8c93b9756e0cfdbcfb90312852f953c6faf9bf741e684cc3b6ad69" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "crc", "log", "uuid", @@ -2380,7 +2380,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.7.1", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -2398,8 +2398,8 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.2.0", - "indexmap 2.7.1", + "http 1.3.1", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -2414,9 +2414,9 @@ checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "half" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" dependencies = [ "cfg-if", "crunchy", @@ -2519,6 +2519,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +[[package]] +name = "hermit-abi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" + [[package]] name = "hex" version = "0.4.3" @@ -2611,13 +2617,13 @@ dependencies = [ [[package]] name = "hostname" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba" dependencies = [ + "cfg-if", "libc", - "match_cfg", - "winapi", + "windows", ] [[package]] @@ -2633,9 +2639,9 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -2660,27 +2666,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http 1.3.1", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", - "http 1.2.0", + "futures-core", + "http 1.3.1", "http-body 1.0.1", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -2690,9 +2696,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "hyper" @@ -2728,7 +2734,7 @@ dependencies = [ "futures-channel", "futures-util", "h2 0.4.8", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "httparse", "httpdate", @@ -2746,13 +2752,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.2.0", + "http 1.3.1", "hyper 1.6.0", "hyper-util", - "rustls 0.23.23", + "rustls 0.23.25", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.1", + "tokio-rustls 0.26.2", "tower-service", ] @@ -2786,16 +2792,17 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "hyper 1.6.0", + "libc", "pin-project-lite", "socket2", "tokio", @@ -2805,16 +2812,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core", + "windows-core 0.61.0", ] [[package]] @@ -2867,9 +2875,9 @@ dependencies = [ [[package]] name = "icu_locid_transform_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" [[package]] name = "icu_normalizer" @@ -2891,9 +2899,9 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" [[package]] name = "icu_properties" @@ -2912,9 +2920,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" [[package]] name = "icu_provider" @@ -2941,7 +2949,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2992,9 +3000,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.5" +version = "0.25.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" dependencies = [ "bytemuck", "byteorder-lite", @@ -3086,9 +3094,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -3161,11 +3169,11 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.15" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.4.0", + "hermit-abi 0.5.0", "libc", "windows-sys 0.59.0", ] @@ -3233,9 +3241,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jaq-core" @@ -3277,10 +3285,11 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.2", "libc", ] @@ -3429,9 +3438,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.170" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "libloading" @@ -3455,9 +3464,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "libc", - "redox_syscall 0.5.9", + "redox_syscall 0.5.11", ] [[package]] @@ -3489,6 +3498,12 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +[[package]] +name = "linux-raw-sys" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" + [[package]] name = "litemap" version = "0.7.5" @@ -3519,9 +3534,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" [[package]] name = "log" -version = "0.4.26" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lru-cache" @@ -3603,20 +3618,14 @@ dependencies = [ "mail-builder", "md5", "rand 0.8.5", - "rustls 0.23.23", + "rustls 0.23.25", "rustls-pki-types", "smtp-proto", "tokio", - "tokio-rustls 0.26.1", + "tokio-rustls 0.26.2", "webpki-roots 0.26.8", ] -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - [[package]] name = "matchers" version = "0.1.0" @@ -3726,9 +3735,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "ff70ce3e48ae43fa075863cef62e8b43b71a4f2382229920e0df362592919430" dependencies = [ "adler2", ] @@ -3764,7 +3773,7 @@ dependencies = [ "regex", "reqwest", "rpc-toolkit", - "rustls 0.23.23", + "rustls 0.23.25", "serde", "serde_json", "sqlx", @@ -3842,7 +3851,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cfg-if", "cfg_aliases", "libc", @@ -4016,7 +4025,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -4045,9 +4054,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.3" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "opaque-debug" @@ -4070,11 +4079,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.71" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cfg-if", "foreign-types", "libc", @@ -4091,7 +4100,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -4111,9 +4120,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.106" +version = "0.9.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" dependencies = [ "cc", "libc", @@ -4206,7 +4215,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.9", + "redox_syscall 0.5.11", "smallvec", "windows-targets 0.52.6", ] @@ -4295,20 +4304,20 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" dependencies = [ "memchr", - "thiserror 2.0.11", + "thiserror 2.0.12", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" +checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" dependencies = [ "pest", "pest_generator", @@ -4316,22 +4325,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" +checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "pest_meta" -version = "2.7.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" +checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" dependencies = [ "once_cell", "pest", @@ -4345,7 +4354,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.7.1", + "indexmap 2.9.0", ] [[package]] @@ -4365,22 +4374,22 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -4429,9 +4438,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "polling" @@ -4443,7 +4452,7 @@ dependencies = [ "concurrent-queue 2.5.0", "hermit-abi 0.4.0", "pin-project-lite", - "rustix", + "rustix 0.38.44", "tracing", "windows-sys 0.59.0", ] @@ -4462,11 +4471,11 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.7.35", + "zerocopy 0.8.24", ] [[package]] @@ -4477,12 +4486,12 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" -version = "0.2.29" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" dependencies = [ "proc-macro2", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -4510,18 +4519,18 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ "toml_edit 0.22.24", ] [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] @@ -4532,13 +4541,13 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "731e0d9356b0c25f16f33b5be79b1c57b562f141ebfcdb0ad8ac2c13a24293b4" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "chrono", "flate2", "hex", "lazy_static", "procfs-core", - "rustix", + "rustix 0.38.44", ] [[package]] @@ -4547,7 +4556,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3554923a69f4ce04c4a754260c338f505ce22642d3830e049a399fc2059a29" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "chrono", "hex", ] @@ -4560,7 +4569,7 @@ checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ "bit-set 0.8.0", "bit-vec 0.8.0", - "bitflags 2.8.0", + "bitflags 2.9.0", "lazy_static", "num-traits", "rand 0.8.5", @@ -4580,7 +4589,7 @@ checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -4603,7 +4612,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -4657,13 +4666,19 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radium" version = "0.5.3" @@ -4707,8 +4722,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.2", - "zerocopy 0.8.21", + "rand_core 0.9.3", + "zerocopy 0.8.24", ] [[package]] @@ -4738,7 +4753,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.2", + "rand_core 0.9.3", ] [[package]] @@ -4761,12 +4776,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a509b1a2ffbe92afab0e55c8fd99dea1c280e8171bd2d88682bb20bc41cbc2c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.1", - "zerocopy 0.8.21", + "getrandom 0.3.2", ] [[package]] @@ -4835,11 +4849,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -4899,9 +4913,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.12" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "base64 0.22.1", "bytes", @@ -4911,7 +4925,7 @@ dependencies = [ "futures-core", "futures-util", "h2 0.4.8", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", @@ -4960,12 +4974,11 @@ dependencies = [ [[package]] name = "resolv-conf" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +checksum = "48375394603e3dd4b2d64371f7148fd8c7baa2680e28741f2cb8d23b59e3d4c4" dependencies = [ "hostname", - "quick-error", ] [[package]] @@ -4980,9 +4993,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.11" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", @@ -5013,7 +5026,7 @@ dependencies = [ "axum 0.7.9", "clap", "futures", - "http 1.2.0", + "http 1.3.1", "http-body-util", "imbl-value 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.12.1", @@ -5033,9 +5046,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" dependencies = [ "const-oid", "digest 0.10.7", @@ -5109,10 +5122,23 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.8.0", - "errno 0.3.10", + "bitflags 2.9.0", + "errno 0.3.11", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +dependencies = [ + "bitflags 2.9.0", + "errno 0.3.11", + "libc", + "linux-raw-sys 0.9.3", "windows-sys 0.59.0", ] @@ -5144,16 +5170,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.23" +version = "0.23.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" +checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki 0.103.1", "subtle", "zeroize", ] @@ -5197,6 +5223,17 @@ name = "rustls-webpki" version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" dependencies = [ "aws-lc-rs", "ring", @@ -5206,9 +5243,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "rusty-fork" @@ -5232,16 +5269,16 @@ dependencies = [ "futures-util", "pin-project", "thingbuf", - "thiserror 2.0.11", + "thiserror 2.0.12", "unicode-segmentation", "unicode-width 0.2.0", ] [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -5297,7 +5334,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation", "core-foundation-sys", "libc", @@ -5316,18 +5353,18 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -5351,22 +5388,22 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.9.0", "itoa", "memchr", "ryu", @@ -5375,9 +5412,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" dependencies = [ "itoa", "serde", @@ -5396,13 +5433,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -5436,7 +5473,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.1", + "indexmap 2.9.0", "serde", "serde_derive", "serde_json", @@ -5453,7 +5490,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -5462,7 +5499,7 @@ version = "0.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ce6afeda22f0b55dde2c34897bce76a629587348480384231205c14b59a01f" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.9.0", "itoa", "libyml", "log", @@ -5619,9 +5656,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "smawk" @@ -5631,15 +5668,15 @@ checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "smtp-proto" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b8ad3dd187f0d4debab02ad65405a9919d6a4f7bce25bd64a258781063a53a" +checksum = "b7d3950ab75b03c52f2f13fd52aab91c9d62698b231b67240e85c3ef5301e63e" [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -5709,7 +5746,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.7.1", + "indexmap 2.9.0", "log", "memchr", "once_cell", @@ -5777,7 +5814,7 @@ checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", "base64 0.21.7", - "bitflags 2.8.0", + "bitflags 2.9.0", "byteorder", "bytes", "chrono", @@ -5820,7 +5857,7 @@ checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", "base64 0.21.7", - "bitflags 2.8.0", + "bitflags 2.9.0", "byteorder", "chrono", "crc", @@ -5898,7 +5935,7 @@ dependencies = [ "quote", "regex-syntax 0.6.29", "strsim 0.10.0", - "syn 2.0.98", + "syn 2.0.100", "unicode-width 0.1.14", ] @@ -5991,7 +6028,7 @@ dependencies = [ "helpers", "hex", "hmac", - "http 1.2.0", + "http 1.3.1", "http-body-util", "hyper 1.6.0", "hyper-util", @@ -5999,7 +6036,7 @@ dependencies = [ "imbl", "imbl-value 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "include_dir", - "indexmap 2.7.1", + "indexmap 2.9.0", "indicatif", "integer-encoding", "ipnet", @@ -6045,7 +6082,7 @@ dependencies = [ "rpassword", "rpc-toolkit", "rust-argon2", - "rustls 0.23.23", + "rustls 0.23.25", "rustls-pki-types", "rustyline-async", "semver", @@ -6066,7 +6103,7 @@ dependencies = [ "textwrap", "thiserror 1.0.69", "tokio", - "tokio-rustls 0.26.1", + "tokio-rustls 0.26.2", "tokio-socks", "tokio-stream", "tokio-tar", @@ -6100,9 +6137,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "string_cache" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938d512196766101d333398efde81bc1f37b00cb42c2f8350e5df639f040bbbe" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", "parking_lot", @@ -6152,9 +6189,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -6184,7 +6221,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -6193,7 +6230,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation", "system-configuration-sys", ] @@ -6222,20 +6259,19 @@ checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" dependencies = [ "filetime", "libc", - "xattr 1.4.0", + "xattr 1.5.0", ] [[package]] name = "tempfile" -version = "3.17.1" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if", "fastrand", - "getrandom 0.3.1", + "getrandom 0.3.2", "once_cell", - "rustix", + "rustix 1.0.5", "windows-sys 0.59.0", ] @@ -6261,13 +6297,13 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" dependencies = [ "smawk", "unicode-linebreak", - "unicode-width 0.1.14", + "unicode-width 0.2.0", ] [[package]] @@ -6291,11 +6327,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.12", ] [[package]] @@ -6306,18 +6342,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -6343,9 +6379,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.37" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -6358,15 +6394,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -6393,9 +6429,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -6408,9 +6444,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", @@ -6443,7 +6479,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -6479,11 +6515,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.23", + "rustls 0.23.25", "tokio", ] @@ -6553,9 +6589,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ "bytes", "futures-core", @@ -6603,7 +6639,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", @@ -6616,11 +6652,11 @@ version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.7.3", + "winnow 0.7.4", ] [[package]] @@ -6737,7 +6773,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -6889,7 +6925,7 @@ dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "termcolor", ] @@ -6913,7 +6949,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.2.0", + "http 1.3.1", "httparse", "log", "native-tls", @@ -6933,7 +6969,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.2.0", + "http 1.3.1", "httparse", "log", "rand 0.8.5", @@ -6959,7 +6995,7 @@ checksum = "1f718dfaf347dcb5b983bfc87608144b0bad87970aebcbea5ce44d2a30c08e63" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -7005,9 +7041,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-linebreak" @@ -7120,11 +7156,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.15.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.2", ] [[package]] @@ -7187,9 +7223,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] @@ -7222,7 +7258,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "wasm-bindgen-shared", ] @@ -7257,7 +7293,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7328,24 +7364,24 @@ dependencies = [ "either", "home", "once_cell", - "rustix", + "rustix 0.38.44", ] [[package]] name = "whoami" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" dependencies = [ - "redox_syscall 0.5.9", + "redox_syscall 0.5.11", "wasite", ] [[package]] name = "widestring" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "winapi" @@ -7378,6 +7414,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -7388,39 +7434,82 @@ dependencies = [ ] [[package]] -name = "windows-link" -version = "0.1.0" +name = "windows-core" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings 0.4.0", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" [[package]] name = "windows-registry" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result", - "windows-strings", - "windows-targets 0.52.6", + "windows-strings 0.3.1", + "windows-targets 0.53.0", ] [[package]] name = "windows-result" -version = "0.2.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" dependencies = [ - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-result", - "windows-targets 0.52.6", + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", ] [[package]] @@ -7474,13 +7563,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -7493,6 +7598,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -7505,6 +7616,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -7517,12 +7634,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -7535,6 +7664,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -7547,6 +7682,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -7559,6 +7700,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -7571,6 +7718,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.5.40" @@ -7582,9 +7735,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" dependencies = [ "memchr", ] @@ -7601,11 +7754,11 @@ dependencies = [ [[package]] name = "wit-bindgen-rt" -version = "0.33.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -7663,13 +7816,12 @@ dependencies = [ [[package]] name = "xattr" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" +checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" dependencies = [ "libc", - "linux-raw-sys", - "rustix", + "rustix 1.0.5", ] [[package]] @@ -7744,7 +7896,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "synstructure", ] @@ -7777,7 +7929,7 @@ dependencies = [ "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow 0.7.3", + "winnow 0.7.4", "xdg-home", "zbus_macros", "zbus_names", @@ -7793,7 +7945,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "zbus_names", "zvariant", "zvariant_utils", @@ -7807,7 +7959,7 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.3", + "winnow 0.7.4", "zvariant", ] @@ -7817,17 +7969,16 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "byteorder", "zerocopy-derive 0.7.35", ] [[package]] name = "zerocopy" -version = "0.8.21" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf01143b2dd5d134f11f545cf9f1431b13b749695cb33bcce051e7568f99478" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" dependencies = [ - "zerocopy-derive 0.8.21", + "zerocopy-derive 0.8.24", ] [[package]] @@ -7838,18 +7989,18 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "zerocopy-derive" -version = "0.8.21" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712c8386f4f4299382c9abee219bee7084f78fb939d88b6840fcc1320d5f6da2" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -7869,7 +8020,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "synstructure", ] @@ -7890,7 +8041,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -7912,14 +8063,14 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "zip" -version = "2.2.3" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b280484c454e74e5fff658bbf7df8fdbe7a07c6b2de4a53def232c15ef138f3a" +checksum = "1dcb24d0152526ae49b9b96c1dcf71850ca1e0b882e4e28ed898a93c41334744" dependencies = [ "aes 0.8.4", "arbitrary", @@ -7928,17 +8079,16 @@ dependencies = [ "crc32fast", "crossbeam-utils", "deflate64", - "displaydoc", "flate2", + "getrandom 0.3.2", "hmac", - "indexmap 2.7.1", + "indexmap 2.9.0", "lzma-rs", "memchr", "pbkdf2", - "rand 0.8.5", "sha1", - "thiserror 2.0.11", "time", + "xz2", "zeroize", "zopfli", "zstd", @@ -7969,18 +8119,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.3" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.14+zstd.1.5.7" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", @@ -7996,7 +8146,7 @@ dependencies = [ "enumflags2", "serde", "static_assertions", - "winnow 0.7.3", + "winnow 0.7.4", "zvariant_derive", "zvariant_utils", ] @@ -8010,7 +8160,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "zvariant_utils", ] @@ -8024,6 +8174,6 @@ dependencies = [ "quote", "serde", "static_assertions", - "syn 2.0.98", - "winnow 0.7.3", + "syn 2.0.100", + "winnow 0.7.4", ] diff --git a/core/models/src/id/mod.rs b/core/models/src/id/mod.rs index 0c313973f..16c047c8e 100644 --- a/core/models/src/id/mod.rs +++ b/core/models/src/id/mod.rs @@ -26,7 +26,7 @@ pub use service_interface::ServiceInterfaceId; pub use volume::VolumeId; lazy_static::lazy_static! { - static ref ID_REGEX: Regex = Regex::new("^[a-z]+(-[a-z0-9]+)*$").unwrap(); + static ref ID_REGEX: Regex = Regex::new("^[a-z0-9]+(-[a-z0-9]+)*$").unwrap(); pub static ref SYSTEM_ID: Id = Id(InternedString::intern("x_system")); } diff --git a/core/startos/src/auth.rs b/core/startos/src/auth.rs index 9085709ab..2bc85b7db 100644 --- a/core/startos/src/auth.rs +++ b/core/startos/src/auth.rs @@ -247,6 +247,7 @@ pub async fn login_impl( Ok(hash_token.to_login_res()) }) .await + .result } } @@ -476,6 +477,7 @@ pub async fn reset_password_impl( Ok(()) }) .await + .result } #[instrument(skip_all)] diff --git a/core/startos/src/backup/backup_bulk.rs b/core/startos/src/backup/backup_bulk.rs index 136595b67..28aee82c1 100644 --- a/core/startos/src/backup/backup_bulk.rs +++ b/core/startos/src/backup/backup_bulk.rs @@ -59,7 +59,8 @@ impl BackupStatusGuard { .as_backup_progress_mut() .ser(&None) }) - .await?; + .await + .result?; } if let Some(db) = self.0.take() { match result { @@ -124,7 +125,8 @@ impl BackupStatusGuard { }) .await } - }?; + } + .result?; } Ok(()) } @@ -141,6 +143,7 @@ impl Drop for BackupStatusGuard { .ser(&None) }) .await + .result .log_err() }); } @@ -187,7 +190,8 @@ pub async fn backup_all( db.as_public().as_server_info().as_id().de()?, )) }) - .await?, + .await + .result?, BackupStatusGuard::new(ctx.db.clone()), ); @@ -348,7 +352,8 @@ async fn perform_backup( .as_last_backup_mut() .ser(&Some(timestamp)) }) - .await?; + .await + .result?; Ok(backup_report) } diff --git a/core/startos/src/backup/target/cifs.rs b/core/startos/src/backup/target/cifs.rs index 71cbe267e..63e18d0d8 100644 --- a/core/startos/src/backup/target/cifs.rs +++ b/core/startos/src/backup/target/cifs.rs @@ -112,7 +112,8 @@ pub async fn add( db.as_private_mut().as_cifs_mut().insert(&id, &cifs)?; Ok(id) }) - .await?; + .await + .result?; Ok(KeyVal { key: BackupTargetId::Cifs { id }, value: BackupTarget::Cifs(CifsBackupTarget { @@ -176,7 +177,8 @@ pub async fn update( })? .ser(&cifs) }) - .await?; + .await + .result?; Ok(KeyVal { key: BackupTargetId::Cifs { id }, value: BackupTarget::Cifs(CifsBackupTarget { @@ -207,7 +209,8 @@ pub async fn remove(ctx: RpcContext, RemoveParams { id }: RemoveParams) -> Resul }; ctx.db .mutate(|db| db.as_private_mut().as_cifs_mut().remove(&id)) - .await?; + .await + .result?; Ok(()) } diff --git a/core/startos/src/context/rpc.rs b/core/startos/src/context/rpc.rs index 927fc36ed..116af59b7 100644 --- a/core/startos/src/context/rpc.rs +++ b/core/startos/src/context/rpc.rs @@ -62,7 +62,7 @@ pub struct RpcContextSeed { pub lxc_manager: Arc, pub open_authed_continuations: OpenAuthedContinuations>, pub rpc_continuations: RpcContinuations, - pub callbacks: ServiceCallbacks, + pub callbacks: Arc, pub wifi_manager: Arc>>, pub current_secret: Arc, pub client: Client, @@ -201,7 +201,8 @@ impl RpcContext { .ser(&true) }) .await - .unwrap() + .result + .log_err(); }) .into(), ) @@ -229,6 +230,7 @@ impl RpcContext { sync_db: watch::Sender::new(db.sequence().await), db, account: RwLock::new(account), + callbacks: net_controller.callbacks.clone(), net_controller, os_net_service, s9pk_arch: if config.multi_arch_s9pks.unwrap_or(false) { @@ -243,7 +245,6 @@ impl RpcContext { lxc_manager: Arc::new(LxcManager::new()), open_authed_continuations: OpenAuthedContinuations::new(), rpc_continuations: RpcContinuations::new(), - callbacks: Default::default(), wifi_manager: Arc::new(RwLock::new(wifi_interface.clone().map(|i| WpaCli::init(i)))), current_secret: Arc::new( Jwk::generate_ec_key(josekit::jwk::alg::ec::EcCurve::P256).map_err(|e| { @@ -327,7 +328,8 @@ impl RpcContext { } Ok(()) }) - .await?; + .await + .result?; let db = self.db.clone(); self.add_cron(async move { loop { @@ -352,6 +354,7 @@ impl RpcContext { Ok(()) }) .await + .result { tracing::error!("Error in session cleanup cron: {e}"); tracing::debug!("{e:?}"); @@ -421,7 +424,8 @@ impl RpcContext { } Ok(()) }) - .await?; + .await + .result?; check_requested_actions.complete(); Ok(()) diff --git a/core/startos/src/db/mod.rs b/core/startos/src/db/mod.rs index 135153935..6575b401b 100644 --- a/core/startos/src/db/mod.rs +++ b/core/startos/src/db/mod.rs @@ -290,7 +290,8 @@ async fn cli_apply( }; Ok::<_, Error>((value, ())) }) - .await?; + .await + .result?; } else { let method = parent_method.into_iter().chain(method).join("."); context @@ -328,6 +329,7 @@ pub async fn apply(ctx: RpcContext, ApplyParams { expr }: ApplyParams) -> Result ) }) .await + .result } pub fn put() -> ParentHandler { diff --git a/core/startos/src/db/prelude.rs b/core/startos/src/db/prelude.rs index a6883658b..30ce13b0f 100644 --- a/core/startos/src/db/prelude.rs +++ b/core/startos/src/db/prelude.rs @@ -5,7 +5,7 @@ use std::str::FromStr; use chrono::{DateTime, Utc}; pub use imbl_value::Value; use patch_db::value::InternedString; -pub use patch_db::{HasModel, PatchDb}; +pub use patch_db::{HasModel, MutateResult, PatchDb}; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; diff --git a/core/startos/src/init.rs b/core/startos/src/init.rs index f1213369f..8276600e3 100644 --- a/core/startos/src/init.rs +++ b/core/startos/src/init.rs @@ -423,7 +423,8 @@ pub async fn init( wifi.as_interface_mut().ser(&wifi_interface)?; wifi.de() }) - .await?; + .await + .result?; crate::net::wifi::synchronize_network_manager(MAIN_DATA, &wifi).await?; load_wifi.complete(); tracing::info!("Synchronized WiFi"); @@ -526,7 +527,8 @@ pub async fn init( server_info.as_status_info_mut().ser(&status_info)?; Ok(()) }) - .await?; + .await + .result?; tracing::info!("Updated server info"); update_server_info.complete(); @@ -544,7 +546,8 @@ pub async fn init( let model = d.de()?; d.ser(&model) }) - .await?; + .await + .result?; tracing::info!("Validated database"); validate_db.complete(); diff --git a/core/startos/src/install/mod.rs b/core/startos/src/install/mod.rs index ef0da2916..d7a939271 100644 --- a/core/startos/src/install/mod.rs +++ b/core/startos/src/install/mod.rs @@ -541,7 +541,8 @@ pub async fn uninstall( )), }) }) - .await?; + .await + .result?; let return_id = id.clone(); diff --git a/core/startos/src/middleware/auth.rs b/core/startos/src/middleware/auth.rs index 7c5eaa4c2..a43f22529 100644 --- a/core/startos/src/middleware/auth.rs +++ b/core/startos/src/middleware/auth.rs @@ -65,7 +65,8 @@ impl HasLoggedOutSessions { Ok(()) }) - .await?; + .await + .result?; Ok(HasLoggedOutSessions(())) } } @@ -136,7 +137,8 @@ impl HasValidSession { Ok(()) }) }) - .await?; + .await + .result?; } Ok(Self(SessionType::Session(session_token))) } diff --git a/core/startos/src/net/acme.rs b/core/startos/src/net/acme.rs index 49ec7cb40..57bcfe25e 100644 --- a/core/startos/src/net/acme.rs +++ b/core/startos/src/net/acme.rs @@ -74,7 +74,8 @@ impl<'a> async_acme::cache::AcmeCache for AcmeCertCache<'a> { .as_accounts_mut() .insert(&contacts, &Pem::new(key)) }) - .await?; + .await + .result?; Ok(()) } @@ -166,7 +167,8 @@ impl<'a> async_acme::cache::AcmeCache for AcmeCertCache<'a> { .upsert(&directory_url, || Ok(BTreeMap::new()))? .insert(&identifiers, &cert) }) - .await?; + .await + .result?; Ok(()) } @@ -259,7 +261,8 @@ pub async fn init( .as_acme_mut() .insert(&provider, &AcmeSettings { contact }) }) - .await?; + .await + .result?; Ok(()) } @@ -280,6 +283,7 @@ pub async fn remove( .as_acme_mut() .remove(&provider) }) - .await?; + .await + .result?; Ok(()) } diff --git a/core/startos/src/net/host/address.rs b/core/startos/src/net/host/address.rs index 632952c0e..973f104bd 100644 --- a/core/startos/src/net/host/address.rs +++ b/core/startos/src/net/host/address.rs @@ -202,7 +202,7 @@ pub async fn add_domain( )?; check_duplicates(db) }) - .await?; + .await.result?; Kind::sync_host(&ctx, inheritance).await?; Ok(()) @@ -224,7 +224,8 @@ pub async fn remove_domain( .as_domains_mut() .remove(&domain) }) - .await?; + .await + .result?; Kind::sync_host(&ctx, inheritance).await?; Ok(()) @@ -258,7 +259,8 @@ pub async fn add_onion( .mutate(|a| Ok(a.insert(onion)))?; check_duplicates(db) }) - .await?; + .await + .result?; Kind::sync_host(&ctx, inheritance).await?; @@ -285,7 +287,8 @@ pub async fn remove_onion( .as_onions_mut() .mutate(|a| Ok(a.remove(&onion))) }) - .await?; + .await + .result?; Kind::sync_host(&ctx, inheritance).await?; diff --git a/core/startos/src/net/host/binding.rs b/core/startos/src/net/host/binding.rs index 5b726a82d..2d27a38b2 100644 --- a/core/startos/src/net/host/binding.rs +++ b/core/startos/src/net/host/binding.rs @@ -239,6 +239,7 @@ pub async fn set_public( Ok(()) }) }) - .await?; + .await + .result?; Kind::sync_host(&ctx, inheritance).await } diff --git a/core/startos/src/net/net_controller.rs b/core/startos/src/net/net_controller.rs index 2deeacf0f..e82a97ec6 100644 --- a/core/startos/src/net/net_controller.rs +++ b/core/startos/src/net/net_controller.rs @@ -3,7 +3,7 @@ use std::net::{Ipv4Addr, SocketAddr}; use std::sync::{Arc, Weak}; use color_eyre::eyre::eyre; -use imbl::OrdMap; +use imbl::{vector, OrdMap}; use imbl_value::InternedString; use ipnet::IpNet; use models::{HostId, OptionExt, PackageId}; @@ -26,6 +26,7 @@ use crate::net::tor::TorController; use crate::net::utils::ipv6_is_local; use crate::net::vhost::{AlpnInfo, TargetInfo, VHostController}; use crate::prelude::*; +use crate::service::effects::callbacks::ServiceCallbacks; use crate::util::serde::MaybeUtf8String; use crate::HOST_IP; @@ -37,6 +38,7 @@ pub struct NetController { pub(super) dns: DnsController, pub(super) forward: LanPortForwardController, pub(super) server_hostnames: Vec>, + pub(crate) callbacks: Arc, } impl NetController { @@ -66,6 +68,7 @@ impl NetController { // LAN mDNS Some(hostname.local_domain_name()), ], + callbacks: Arc::new(ServiceCallbacks::default()), }) } @@ -80,7 +83,7 @@ impl NetController { let res = NetService::new(NetServiceData { id: Some(package), ip, - dns, + _dns: dns, controller: Arc::downgrade(self), binds: BTreeMap::new(), })?; @@ -94,7 +97,7 @@ impl NetController { let service = NetService::new(NetServiceData { id: None, ip: [127, 0, 0, 1].into(), - dns, + _dns: dns, controller: Arc::downgrade(self), binds: BTreeMap::new(), })?; @@ -131,7 +134,7 @@ struct HostBinds { pub struct NetServiceData { id: Option, ip: Ipv4Addr, - dns: Arc<()>, + _dns: Arc<()>, controller: Weak, binds: BTreeMap, } @@ -178,7 +181,8 @@ impl NetServiceData { } Ok(res) }) - .await?; + .await + .result?; let mut errors = ErrorCollection::new(); for (id, host) in hosts.0 { errors.handle(self.update(ctrl, id, host).await); @@ -206,7 +210,8 @@ impl NetServiceData { })?; host.de() }) - .await?; + .await + .result?; self.update(ctrl, HostId::default(), host).await } } @@ -578,13 +583,22 @@ impl NetServiceData { } } - ctrl.db + let res = ctrl + .db .mutate(|db| { host_for(db, self.id.as_ref(), &id)? .as_hostname_info_mut() .ser(&hostname_info) }) - .await?; + .await; + res.result?; + if let Some(pkg_id) = self.id.as_ref() { + if res.revision.is_some() { + if let Some(cbs) = ctrl.callbacks.get_host_info(&(pkg_id.clone(), id)) { + cbs.call(vector![]).await?; + } + } + } Ok(()) } @@ -639,7 +653,7 @@ impl NetService { data: Arc::new(Mutex::new(NetServiceData { id: None, ip: Ipv4Addr::new(0, 0, 0, 0), - dns: Default::default(), + _dns: Default::default(), controller: Default::default(), binds: BTreeMap::new(), })), @@ -686,7 +700,8 @@ impl NetService { db.as_private_mut().as_available_ports_mut().ser(&ports)?; Ok(host) }) - .await?; + .await + .result?; data.update(&*ctrl, id, host).await } diff --git a/core/startos/src/net/network_interface.rs b/core/startos/src/net/network_interface.rs index 6fbc519ee..c0a138d22 100644 --- a/core/startos/src/net/network_interface.rs +++ b/core/startos/src/net/network_interface.rs @@ -676,7 +676,8 @@ impl NetworkInterfaceController { .as_network_interfaces_mut() .ser(info) }) - .await?; + .await + .result?; let ntp: BTreeSet<_> = info .values() diff --git a/core/startos/src/net/tor.rs b/core/startos/src/net/tor.rs index 44e0ae5e6..4becf62f0 100644 --- a/core/startos/src/net/tor.rs +++ b/core/startos/src/net/tor.rs @@ -156,6 +156,7 @@ pub async fn generate_key(ctx: RpcContext) -> Result { .get_onion_address()) }) .await + .result } #[derive(Deserialize, Serialize, Parser)] @@ -175,7 +176,8 @@ pub async fn add_key( .as_onion_mut() .insert_key(&key) }) - .await?; + .await + .result?; Ok(key.public().get_onion_address()) } diff --git a/core/startos/src/net/vhost.rs b/core/startos/src/net/vhost.rs index f28712304..9e3d141f8 100644 --- a/core/startos/src/net/vhost.rs +++ b/core/startos/src/net/vhost.rs @@ -500,7 +500,8 @@ impl VHostServer { .as_local_certs_mut() .cert_for(&hostnames) }) - .await?; + .await + .result?; let cfg = ServerConfig::builder_with_provider(crypto_provider.clone()) .with_safe_default_protocol_versions() .with_kind(crate::ErrorKind::OpenSsl)? diff --git a/core/startos/src/net/wifi.rs b/core/startos/src/net/wifi.rs index 67eeaad82..99adc71c8 100644 --- a/core/startos/src/net/wifi.rs +++ b/core/startos/src/net/wifi.rs @@ -125,7 +125,8 @@ pub async fn set_enabled( .as_interface_mut() .ser(&iface) }) - .await?; + .await + .result?; Ok(()) } @@ -216,7 +217,8 @@ pub async fn add(ctx: RpcContext, AddParams { ssid, password }: AddParams) -> Re Ok(()) }) }) - .await?; + .await + .result?; Ok(()) } #[derive(Deserialize, Serialize, Parser, TS)] @@ -288,7 +290,8 @@ pub async fn connect(ctx: RpcContext, SsidParams { ssid }: SsidParams) -> Result })?; wifi.as_selected_mut().ser(&Some(ssid)) }) - .await?; + .await + .result?; Ok(()) } @@ -334,7 +337,8 @@ pub async fn remove(ctx: RpcContext, SsidParams { ssid }: SsidParams) -> Result< wifi.as_selected_mut() .map_mutate(|s| Ok(s.filter(|s| s == &ssid.0))) }) - .await?; + .await + .result?; Ok(()) } #[derive(serde::Serialize, serde::Deserialize)] @@ -830,6 +834,7 @@ impl WpaCli { .ser(&new_country) }) .await + .result } async fn check_active_network(&self, ssid: &Ssid) -> Result, Error> { Ok(self diff --git a/core/startos/src/notifications.rs b/core/startos/src/notifications.rs index c8ff08409..e3ddfe848 100644 --- a/core/startos/src/notifications.rs +++ b/core/startos/src/notifications.rs @@ -138,6 +138,7 @@ pub async fn list( } }) .await + .result } #[derive(Deserialize, Serialize, Parser, TS)] @@ -161,6 +162,7 @@ pub async fn remove( Ok(()) }) .await + .result } #[derive(Deserialize, Serialize, Parser, TS)] @@ -264,6 +266,7 @@ pub async fn mark_unseen( Ok(()) }) .await + .result } #[derive(Deserialize, Serialize, Parser, TS)] @@ -288,6 +291,7 @@ pub async fn create( ctx.db .mutate(|db| notify(db, package, level, title, message, ())) .await + .result } #[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize, TS)] diff --git a/core/startos/src/progress.rs b/core/startos/src/progress.rs index cc3257132..38497d6cf 100644 --- a/core/startos/src/progress.rs +++ b/core/startos/src/progress.rs @@ -294,7 +294,8 @@ impl FullProgressTracker { Ok(true) } }) - .await? + .await + .result? { break; } diff --git a/core/startos/src/registry/admin.rs b/core/startos/src/registry/admin.rs index f3cac9f7e..ffc9c3b35 100644 --- a/core/startos/src/registry/admin.rs +++ b/core/startos/src/registry/admin.rs @@ -148,6 +148,7 @@ pub async fn add_signer(ctx: RegistryContext, signer: SignerInfo) -> Result( @@ -279,6 +282,7 @@ pub async fn add_admin( Ok(()) }) .await + .result } #[derive(Debug, Deserialize, Serialize, Parser)] @@ -310,7 +314,8 @@ pub async fn cli_add_admin( db.as_admins_mut().mutate(|a| Ok(a.insert(signer)))?; Ok(()) }) - .await?; + .await + .result?; } else { ctx.call_remote::( &parent_method.into_iter().chain(method).join("."), diff --git a/core/startos/src/registry/db.rs b/core/startos/src/registry/db.rs index 8de9f8743..59a55d9fb 100644 --- a/core/startos/src/registry/db.rs +++ b/core/startos/src/registry/db.rs @@ -136,7 +136,8 @@ async fn cli_apply( (), )) }) - .await?; + .await + .result?; } else { let method = parent_method.into_iter().chain(method).join("."); context @@ -178,4 +179,5 @@ pub async fn apply( ) }) .await + .result } diff --git a/core/startos/src/registry/info.rs b/core/startos/src/registry/info.rs index 402f0891a..10efda2cb 100644 --- a/core/startos/src/registry/info.rs +++ b/core/startos/src/registry/info.rs @@ -79,6 +79,7 @@ pub async fn set_name( ctx.db .mutate(|db| db.as_index_mut().as_name_mut().ser(&Some(name))) .await + .result } #[derive(Debug, Deserialize, Serialize, TS)] @@ -95,6 +96,7 @@ pub async fn set_icon( ctx.db .mutate(|db| db.as_index_mut().as_icon_mut().ser(&Some(icon))) .await + .result } #[derive(Debug, Deserialize, Serialize, Parser, TS)] diff --git a/core/startos/src/registry/os/asset/add.rs b/core/startos/src/registry/os/asset/add.rs index d609063ea..09a6ad164 100644 --- a/core/startos/src/registry/os/asset/add.rs +++ b/core/startos/src/registry/os/asset/add.rs @@ -131,7 +131,8 @@ async fn add_asset( Err(Error::new(eyre!("UNAUTHORIZED"), ErrorKind::Authorization)) } }) - .await?; + .await + .result?; Ok(()) } diff --git a/core/startos/src/registry/os/asset/sign.rs b/core/startos/src/registry/os/asset/sign.rs index 18b603daf..a2094741b 100644 --- a/core/startos/src/registry/os/asset/sign.rs +++ b/core/startos/src/registry/os/asset/sign.rs @@ -117,6 +117,7 @@ async fn sign_asset( Ok(()) }) .await + .result } pub async fn sign_iso(ctx: RegistryContext, params: SignAssetParams) -> Result<(), Error> { diff --git a/core/startos/src/registry/os/version/mod.rs b/core/startos/src/registry/os/version/mod.rs index 8e4349ed9..12661e4e1 100644 --- a/core/startos/src/registry/os/version/mod.rs +++ b/core/startos/src/registry/os/version/mod.rs @@ -98,6 +98,7 @@ pub async fn add_version( }) }) .await + .result } #[derive(Debug, Deserialize, Serialize, Parser, TS)] @@ -122,6 +123,7 @@ pub async fn remove_version( Ok(()) }) .await + .result } #[derive(Debug, Deserialize, Serialize, Parser, TS)] diff --git a/core/startos/src/registry/os/version/signer.rs b/core/startos/src/registry/os/version/signer.rs index c72bb5ef4..c07e2fa0d 100644 --- a/core/startos/src/registry/os/version/signer.rs +++ b/core/startos/src/registry/os/version/signer.rs @@ -75,6 +75,7 @@ pub async fn add_version_signer( Ok(()) }) .await + .result } pub async fn remove_version_signer( @@ -101,6 +102,7 @@ pub async fn remove_version_signer( Ok(()) }) .await + .result } #[derive(Debug, Deserialize, Serialize, Parser, TS)] diff --git a/core/startos/src/registry/package/add.rs b/core/startos/src/registry/package/add.rs index c52f06ac0..bf3d36fd1 100644 --- a/core/startos/src/registry/package/add.rs +++ b/core/startos/src/registry/package/add.rs @@ -89,6 +89,7 @@ pub async fn add_package( } }) .await + .result } #[derive(Debug, Deserialize, Serialize, Parser)] diff --git a/core/startos/src/registry/package/category.rs b/core/startos/src/registry/package/category.rs index 97b0fb227..7afb8906b 100644 --- a/core/startos/src/registry/package/category.rs +++ b/core/startos/src/registry/package/category.rs @@ -78,7 +78,8 @@ pub async fn add_category( }, ) }) - .await?; + .await + .result?; Ok(()) } @@ -102,7 +103,8 @@ pub async fn remove_category( .as_categories_mut() .remove(&id) }) - .await?; + .await + .result?; Ok(()) } diff --git a/core/startos/src/registry/package/signer.rs b/core/startos/src/registry/package/signer.rs index 56bfc9b1c..7760bad3f 100644 --- a/core/startos/src/registry/package/signer.rs +++ b/core/startos/src/registry/package/signer.rs @@ -74,6 +74,7 @@ pub async fn add_package_signer( Ok(()) }) .await + .result } pub async fn remove_package_signer( @@ -100,6 +101,7 @@ pub async fn remove_package_signer( Ok(()) }) .await + .result } #[derive(Debug, Deserialize, Serialize, Parser, TS)] diff --git a/core/startos/src/s9pk/v2/pack.rs b/core/startos/src/s9pk/v2/pack.rs index faf163988..ce8d9e3a6 100644 --- a/core/startos/src/s9pk/v2/pack.rs +++ b/core/startos/src/s9pk/v2/pack.rs @@ -139,18 +139,20 @@ impl From for DynFileSource { #[derive(Deserialize, Serialize, Parser)] pub struct PackParams { pub path: Option, - #[arg(short = 'o', long = "output")] + #[arg(short, long)] pub output: Option, - #[arg(long = "javascript")] + #[arg(long)] pub javascript: Option, - #[arg(long = "icon")] + #[arg(long)] pub icon: Option, - #[arg(long = "license")] + #[arg(long)] pub license: Option, - #[arg(long = "instructions")] + #[arg(long)] pub instructions: Option, - #[arg(long = "assets")] + #[arg(long, conflicts_with = "no-assets")] pub assets: Option, + #[arg(long, conflicts_with = "assets")] + pub no_assets: bool, } impl PackParams { fn path(&self) -> &Path { @@ -693,14 +695,16 @@ pub async fn pack(ctx: CliContext, params: PackParams) -> Result<(), Error> { ) .await?; - let assets_dir = params.assets(); - s9pk.as_archive_mut().contents_mut().insert_path( - "assets.squashfs", - Entry::file(TmpSource::new( - tmp_dir.clone(), - PackSource::Squashfs(Arc::new(SqfsDir::new(assets_dir, tmp_dir.clone()))), - )), - )?; + if !params.no_assets { + let assets_dir = params.assets(); + s9pk.as_archive_mut().contents_mut().insert_path( + "assets.squashfs", + Entry::file(TmpSource::new( + tmp_dir.clone(), + PackSource::Squashfs(Arc::new(SqfsDir::new(assets_dir, tmp_dir.clone()))), + )), + )?; + } s9pk.load_images(tmp_dir.clone()).await?; @@ -810,8 +814,10 @@ pub async fn list_ingredients(_: CliContext, params: PackParams) -> Result for ServiceActor { } Ok(()) }) - .await?; + .await + .result?; Ok(result) } } diff --git a/core/startos/src/service/effects/action.rs b/core/startos/src/service/effects/action.rs index 5e3605679..cbab573c2 100644 --- a/core/startos/src/service/effects/action.rs +++ b/core/startos/src/service/effects/action.rs @@ -71,7 +71,8 @@ pub async fn export_action( value.insert(id, metadata); model.ser(&value) }) - .await?; + .await + .result?; Ok(()) } @@ -102,7 +103,8 @@ async fn clear_actions( .as_actions_mut() .mutate(|a| Ok(a.retain(|e, _| except.contains(e)))) }) - .await?; + .await + .result?; Ok(()) } @@ -271,7 +273,8 @@ async fn request_action( .as_requested_actions_mut() .insert(&replay_id, &ActionRequestEntry { active, request }) }) - .await?; + .await + .result?; Ok(()) } @@ -310,6 +313,7 @@ async fn clear_action_requests( })) }) }) - .await?; + .await + .result?; Ok(()) } diff --git a/core/startos/src/service/effects/callbacks.rs b/core/startos/src/service/effects/callbacks.rs index 19946672c..9f676d12e 100644 --- a/core/startos/src/service/effects/callbacks.rs +++ b/core/startos/src/service/effects/callbacks.rs @@ -8,8 +8,10 @@ use futures::future::join_all; use helpers::NonDetachingJoinHandle; use imbl::{vector, Vector}; use imbl_value::InternedString; +use lazy_static::lazy_static; use models::{HostId, PackageId, ServiceInterfaceId}; use patch_db::json_ptr::JsonPointer; +use patch_db::Revision; use serde::{Deserialize, Serialize}; use tracing::warn; use ts_rs::TS; @@ -37,6 +39,7 @@ struct ServiceCallbackMap { >, get_store: BTreeMap>>, get_status: BTreeMap>, + get_container_ip: BTreeMap>, } impl ServiceCallbacks { @@ -260,13 +263,19 @@ impl ServiceCallbacks { pub fn get_store( &self, package_id: &PackageId, - path: &JsonPointer, + revision: &Revision, ) -> Option { + lazy_static! { + static ref BASE: JsonPointer = "/private/packageStores".parse().unwrap(); + } + let for_pkg = BASE.clone().join_end(&**package_id); self.mutate(|this| { if let Some(watched) = this.get_store.get_mut(package_id) { let mut res = Vec::new(); watched.retain(|ptr, cbs| { - if ptr.starts_with(path) || path.starts_with(ptr) { + let mut full_ptr = for_pkg.clone(); + full_ptr.append(ptr); + if revision.patch.affects_path(&full_ptr) { res.append(cbs); false } else { @@ -280,6 +289,25 @@ impl ServiceCallbacks { .filter(|cb| !cb.0.is_empty()) }) } + + pub(super) fn add_get_container_ip(&self, package_id: PackageId, handler: CallbackHandler) { + self.mutate(|this| { + this.get_container_ip + .entry(package_id) + .or_default() + .push(handler) + }) + } + + #[must_use] + pub fn get_container_ip(&self, package_id: &PackageId) -> Option { + self.mutate(|this| { + this.get_container_ip + .remove(package_id) + .map(CallbackHandlers) + .filter(|cb| !cb.0.is_empty()) + }) + } } pub struct CallbackHandler { diff --git a/core/startos/src/service/effects/control.rs b/core/startos/src/service/effects/control.rs index 4b9817b77..aee3fd9db 100644 --- a/core/startos/src/service/effects/control.rs +++ b/core/startos/src/service/effects/control.rs @@ -46,6 +46,15 @@ pub async fn get_status( let context = context.deref()?; let id = package_id.unwrap_or_else(|| context.seed.id.clone()); let db = context.seed.ctx.db.peek().await; + + if let Some(callback) = callback { + let callback = callback.register(&context.seed.persistent_container); + context.seed.ctx.callbacks.add_get_status( + id.clone(), + super::callbacks::CallbackHandler::new(&context, callback), + ); + } + let status = db .as_public() .as_package_data() @@ -54,14 +63,6 @@ pub async fn get_status( .as_status() .de()?; - if let Some(callback) = callback { - let callback = callback.register(&context.seed.persistent_container); - context.seed.ctx.callbacks.add_get_status( - id, - super::callbacks::CallbackHandler::new(&context, callback), - ); - } - Ok(status) } diff --git a/core/startos/src/service/effects/dependency.rs b/core/startos/src/service/effects/dependency.rs index 7fff3b1d7..eaeab0c9f 100644 --- a/core/startos/src/service/effects/dependency.rs +++ b/core/startos/src/service/effects/dependency.rs @@ -249,6 +249,7 @@ pub async fn set_dependencies( .ser(&CurrentDependencies(deps)) }) .await + .result } pub async fn get_dependencies(context: EffectContext) -> Result, Error> { diff --git a/core/startos/src/service/effects/health.rs b/core/startos/src/service/effects/health.rs index c95dea946..26524c1f5 100644 --- a/core/startos/src/service/effects/health.rs +++ b/core/startos/src/service/effects/health.rs @@ -40,6 +40,7 @@ pub async fn set_health( Ok(()) }) }) - .await?; + .await + .result?; Ok(()) } diff --git a/core/startos/src/service/effects/mod.rs b/core/startos/src/service/effects/mod.rs index 48b901d07..43d893efc 100644 --- a/core/startos/src/service/effects/mod.rs +++ b/core/startos/src/service/effects/mod.rs @@ -192,6 +192,4 @@ pub fn handler() -> ParentHandler { "get-system-smtp", from_fn_async(system::get_system_smtp).no_cli(), ) - - // TODO Callbacks } diff --git a/core/startos/src/service/effects/net/host.rs b/core/startos/src/service/effects/net/host.rs index 570d5033d..7039942d7 100644 --- a/core/startos/src/service/effects/net/host.rs +++ b/core/startos/src/service/effects/net/host.rs @@ -27,6 +27,15 @@ pub async fn get_host_info( let db = context.seed.ctx.db.peek().await; let package_id = package_id.unwrap_or_else(|| context.seed.id.clone()); + if let Some(callback) = callback { + let callback = callback.register(&context.seed.persistent_container); + context.seed.ctx.callbacks.add_get_host_info( + package_id.clone(), + host_id.clone(), + CallbackHandler::new(&context, callback), + ); + } + let res = db .as_public() .as_package_data() @@ -35,14 +44,5 @@ pub async fn get_host_info( .map(|m| m.de()) .transpose()?; - if let Some(callback) = callback { - let callback = callback.register(&context.seed.persistent_container); - context.seed.ctx.callbacks.add_get_host_info( - package_id, - host_id, - CallbackHandler::new(&context, callback), - ); - } - Ok(res) } diff --git a/core/startos/src/service/effects/net/info.rs b/core/startos/src/service/effects/net/info.rs index 766c0015f..3b6b38e83 100644 --- a/core/startos/src/service/effects/net/info.rs +++ b/core/startos/src/service/effects/net/info.rs @@ -1,9 +1,55 @@ use std::net::Ipv4Addr; +use models::PackageId; + +use crate::service::effects::callbacks::CallbackHandler; use crate::service::effects::prelude::*; +use crate::service::rpc::CallbackId; use crate::HOST_IP; -pub async fn get_container_ip(context: EffectContext) -> Result { - let context = context.deref()?; - Ok(context.seed.persistent_container.net_service.get_ip().await) +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, TS)] +#[serde(rename_all = "camelCase")] +#[ts(export)] +pub struct GetContainerIpParams { + #[ts(optional)] + package_id: Option, + #[ts(optional)] + callback: Option, +} + +pub async fn get_container_ip( + context: EffectContext, + GetContainerIpParams { + package_id, + callback, + }: GetContainerIpParams, +) -> Result, Error> { + let context = context.deref()?; + + if let Some(package_id) = package_id.filter(|id| id != &context.seed.id) { + if let Some(callback) = callback { + // ip is static for the lifetime of the container, so callback unnecessary for self + let callback = callback.register(&context.seed.persistent_container); + context + .seed + .ctx + .callbacks + .add_get_container_ip(package_id.clone(), CallbackHandler::new(&context, callback)); + } + let Some(svc) = &*context.seed.ctx.services.get(&package_id).await else { + return Ok(None); + }; + + let Some(lxc) = svc.seed.persistent_container.lxc_container.get() else { + return Ok(None); + }; + let res = lxc.ip().await?; + + Ok(Some(res)) + } else { + let Some(lxc) = context.seed.persistent_container.lxc_container.get() else { + return Ok(None); + }; + lxc.ip().await.map(Some) + } } diff --git a/core/startos/src/service/effects/net/interface.rs b/core/startos/src/service/effects/net/interface.rs index 5de9638c4..6cb327fff 100644 --- a/core/startos/src/service/effects/net/interface.rs +++ b/core/startos/src/service/effects/net/interface.rs @@ -42,35 +42,40 @@ pub async fn export_service_interface( interface_type: r#type, }; - context + let res = context .seed .ctx .db .mutate(|db| { - db.as_public_mut() + let ifaces = db + .as_public_mut() .as_package_data_mut() .as_idx_mut(&package_id) .or_not_found(&package_id)? - .as_service_interfaces_mut() - .insert(&id, &service_interface)?; + .as_service_interfaces_mut(); + ifaces.insert(&id, &service_interface)?; Ok(()) }) - .await?; - if let Some(callbacks) = context - .seed - .ctx - .callbacks - .get_service_interface(&(package_id.clone(), id)) - { - callbacks.call(vector![]).await?; - } - if let Some(callbacks) = context - .seed - .ctx - .callbacks - .list_service_interfaces(&package_id) - { - callbacks.call(vector![]).await?; + .await; + res.result?; + + if res.revision.is_some() { + if let Some(callbacks) = context + .seed + .ctx + .callbacks + .get_service_interface(&(package_id.clone(), id)) + { + callbacks.call(vector![]).await?; + } + if let Some(callbacks) = context + .seed + .ctx + .callbacks + .list_service_interfaces(&package_id) + { + callbacks.call(vector![]).await?; + } } Ok(()) @@ -98,6 +103,15 @@ pub async fn get_service_interface( let package_id = package_id.unwrap_or_else(|| context.seed.id.clone()); let db = context.seed.ctx.db.peek().await; + if let Some(callback) = callback { + let callback = callback.register(&context.seed.persistent_container); + context.seed.ctx.callbacks.add_get_service_interface( + package_id.clone(), + service_interface_id.clone(), + CallbackHandler::new(&context, callback), + ); + } + let interface = db .as_public() .as_package_data() @@ -106,15 +120,6 @@ pub async fn get_service_interface( .map(|m| m.de()) .transpose()?; - if let Some(callback) = callback { - let callback = callback.register(&context.seed.persistent_container); - context.seed.ctx.callbacks.add_get_service_interface( - package_id, - service_interface_id, - CallbackHandler::new(&context, callback), - ); - } - Ok(interface) } @@ -137,6 +142,14 @@ pub async fn list_service_interfaces( let context = context.deref()?; let package_id = package_id.unwrap_or_else(|| context.seed.id.clone()); + if let Some(callback) = callback { + let callback = callback.register(&context.seed.persistent_container); + context.seed.ctx.callbacks.add_list_service_interfaces( + package_id.clone(), + CallbackHandler::new(&context, callback), + ); + } + let res = context .seed .ctx @@ -150,15 +163,6 @@ pub async fn list_service_interfaces( .transpose()? .unwrap_or_default(); - if let Some(callback) = callback { - let callback = callback.register(&context.seed.persistent_container); - context - .seed - .ctx - .callbacks - .add_list_service_interfaces(package_id, CallbackHandler::new(&context, callback)); - } - Ok(res) } @@ -176,17 +180,52 @@ pub async fn clear_service_interfaces( let context = context.deref()?; let package_id = context.seed.id.clone(); - context + let res = context .seed .ctx .db .mutate(|db| { + let mut removed = Vec::new(); db.as_public_mut() .as_package_data_mut() .as_idx_mut(&package_id) .or_not_found(&package_id)? .as_service_interfaces_mut() - .mutate(|s| Ok(s.retain(|id, _| except.contains(id)))) + .mutate(|s| { + Ok(s.retain(|id, _| { + if except.contains(id) { + true + } else { + removed.push(id.clone()); + false + } + })) + })?; + Ok(removed) }) - .await + .await; + let removed = res.result?; + + if res.revision.is_some() { + for id in removed { + if let Some(callbacks) = context + .seed + .ctx + .callbacks + .get_service_interface(&(package_id.clone(), id)) + { + callbacks.call(vector![]).await?; + } + } + if let Some(callbacks) = context + .seed + .ctx + .callbacks + .list_service_interfaces(&package_id) + { + callbacks.call(vector![]).await?; + } + } + + Ok(()) } diff --git a/core/startos/src/service/effects/net/ssl.rs b/core/startos/src/service/effects/net/ssl.rs index 66b4fa1e6..2ebd4e006 100644 --- a/core/startos/src/service/effects/net/ssl.rs +++ b/core/startos/src/service/effects/net/ssl.rs @@ -81,7 +81,8 @@ pub async fn get_ssl_certificate( .as_local_certs_mut() .cert_for(&hostnames) }) - .await?; + .await + .result?; let fullchain = match algorithm { Algorithm::Ecdsa => cert.fullchain_nistp256(), Algorithm::Ed25519 => cert.fullchain_ed25519(), @@ -171,7 +172,8 @@ pub async fn get_ssl_key( .as_local_certs_mut() .cert_for(&hostnames) }) - .await?; + .await + .result?; let key = match algorithm { Algorithm::Ecdsa => cert.leaf.keys.nistp256, Algorithm::Ed25519 => cert.leaf.keys.ed25519, diff --git a/core/startos/src/service/effects/store.rs b/core/startos/src/service/effects/store.rs index 39166c333..6ea28488e 100644 --- a/core/startos/src/service/effects/store.rs +++ b/core/startos/src/service/effects/store.rs @@ -65,7 +65,7 @@ pub async fn set_store( ) -> Result<(), Error> { let context = context.deref()?; let package_id = &context.seed.id; - context + let res = context .seed .ctx .db @@ -82,10 +82,13 @@ pub async fn set_store( .with_kind(ErrorKind::ParseDbField)?; model.ser(&model_value) }) - .await?; + .await; + res.result?; - if let Some(callbacks) = context.seed.ctx.callbacks.get_store(package_id, &path) { - callbacks.call(vector![]).await?; + if let Some(revision) = res.revision { + if let Some(callbacks) = context.seed.ctx.callbacks.get_store(package_id, &revision) { + callbacks.call(vector![]).await?; + } } Ok(()) @@ -116,7 +119,8 @@ pub async fn set_data_version( .as_data_version_mut() .ser(&Some(version)) }) - .await?; + .await + .result?; Ok(()) } diff --git a/core/startos/src/service/effects/system.rs b/core/startos/src/service/effects/system.rs index abf0a33c6..abf6f36ad 100644 --- a/core/startos/src/service/effects/system.rs +++ b/core/startos/src/service/effects/system.rs @@ -15,6 +15,16 @@ pub async fn get_system_smtp( GetSystemSmtpParams { callback }: GetSystemSmtpParams, ) -> Result, Error> { let context = context.deref()?; + + if let Some(callback) = callback { + let callback = callback.register(&context.seed.persistent_container); + context + .seed + .ctx + .callbacks + .add_get_system_smtp(CallbackHandler::new(&context, callback)); + } + let res = context .seed .ctx @@ -26,14 +36,5 @@ pub async fn get_system_smtp( .into_smtp() .de()?; - if let Some(callback) = callback { - let callback = callback.register(&context.seed.persistent_container); - context - .seed - .ctx - .callbacks - .add_get_system_smtp(CallbackHandler::new(&context, callback)); - } - Ok(res) } diff --git a/core/startos/src/service/mod.rs b/core/startos/src/service/mod.rs index 3cc8cb67b..8d3db1944 100644 --- a/core/startos/src/service/mod.rs +++ b/core/startos/src/service/mod.rs @@ -171,7 +171,8 @@ impl ServiceRef { Ok(None) } }) - .await? + .await + .result? { let state = pde.state_info.expect_removing()?; if !soft { @@ -336,7 +337,8 @@ impl Service { // TODO: delete s9pk? ctx.db .mutate(|v| v.as_public_mut().as_package_data_mut().remove(id)) - .await?; + .await + .result?; Ok(None) } PackageStateMatchModelRef::Updating(s) => { @@ -392,7 +394,7 @@ impl Service { }) } }) - .await?; + .await.result?; handle_installed(s9pk, entry).await } PackageStateMatchModelRef::Removing(_) | PackageStateMatchModelRef::Restoring(_) => { @@ -419,7 +421,8 @@ impl Service { ctx.db .mutate(|v| v.as_public_mut().as_package_data_mut().remove(id)) - .await?; + .await + .result?; Ok(None) } @@ -550,7 +553,8 @@ impl Service { Ok(()) }) - .await?; + .await + .result?; Ok(service) } diff --git a/core/startos/src/service/persistent_container.rs b/core/startos/src/service/persistent_container.rs index 016cae49f..a20f5c650 100644 --- a/core/startos/src/service/persistent_container.rs +++ b/core/startos/src/service/persistent_container.rs @@ -7,7 +7,7 @@ use std::time::Duration; use futures::future::ready; use futures::Future; use helpers::NonDetachingJoinHandle; -use imbl::Vector; +use imbl::{vector, Vector}; use imbl_value::InternedString; use models::{ImageId, ProcedureName, VolumeId}; use rpc_toolkit::{Empty, Server, ShutdownHandle}; @@ -297,10 +297,16 @@ impl PersistentContainer { .await?; } } + let ip = lxc_container.ip().await?; let net_service = ctx .net_controller - .create_service(s9pk.as_manifest().id.clone(), lxc_container.ip().await?) + .create_service(s9pk.as_manifest().id.clone(), ip) .await?; + if let Some(callbacks) = ctx.callbacks.get_container_ip(&s9pk.as_manifest().id) { + callbacks + .call(vector![Value::String(Arc::new(ip.to_string()))]) + .await?; + } Ok(Self { s9pk, lxc_container: OnceCell::new_with(Some(lxc_container)), diff --git a/core/startos/src/service/service_actor.rs b/core/startos/src/service/service_actor.rs index a56c92288..422198441 100644 --- a/core/startos/src/service/service_actor.rs +++ b/core/startos/src/service/service_actor.rs @@ -99,7 +99,8 @@ async fn service_actor_loop( } Ok(None) }) - .await?; + .await + .result?; if let Some((previous, new_state)) = major_changes_state { if let Some(callbacks) = seed.ctx.callbacks.get_status(id) { callbacks diff --git a/core/startos/src/service/service_map.rs b/core/startos/src/service/service_map.rs index cec0c8564..777be2bd7 100644 --- a/core/startos/src/service/service_map.rs +++ b/core/startos/src/service/service_map.rs @@ -117,7 +117,8 @@ impl ServiceMap { } Ok(()) }) - .await?; + .await + .result?; } } shutdown_err?; @@ -174,54 +175,62 @@ impl ServiceMap { let mut reload_guard = ServiceRefReloadGuard::new(ctx.clone(), id.clone(), op_name); reload_guard - .handle(ctx.db.mutate({ - let manifest = manifest.clone(); - let id = id.clone(); - let install_progress = progress.snapshot(); - move |db| { - if let Some(pde) = db.as_public_mut().as_package_data_mut().as_idx_mut(&id) { - let prev = pde.as_state_info().expect_installed()?.de()?; - pde.as_state_info_mut() - .ser(&PackageState::Updating(UpdatingState { - manifest: prev.manifest, - installing_info: InstallingInfo { - new_manifest: manifest, - progress: install_progress, - }, - }))?; - } else { - let installing = InstallingState { - installing_info: InstallingInfo { - new_manifest: manifest, - progress: install_progress, - }, - }; - db.as_public_mut().as_package_data_mut().insert( - &id, - &PackageDataEntry { - state_info: if restoring { - PackageState::Restoring(installing) - } else { - PackageState::Installing(installing) - }, - data_version: None, - status: MainStatus::Stopped, - registry: None, - developer_key: Pem::new(developer_key), - icon, - last_backup: None, - current_dependencies: Default::default(), - actions: Default::default(), - requested_actions: Default::default(), - service_interfaces: Default::default(), - hosts: Default::default(), - store_exposed_dependents: Default::default(), - }, - )?; - }; - Ok(()) - } - })) + .handle(async { + ctx.db + .mutate({ + let manifest = manifest.clone(); + let id = id.clone(); + let install_progress = progress.snapshot(); + move |db| { + if let Some(pde) = + db.as_public_mut().as_package_data_mut().as_idx_mut(&id) + { + let prev = pde.as_state_info().expect_installed()?.de()?; + pde.as_state_info_mut().ser(&PackageState::Updating( + UpdatingState { + manifest: prev.manifest, + installing_info: InstallingInfo { + new_manifest: manifest, + progress: install_progress, + }, + }, + ))?; + } else { + let installing = InstallingState { + installing_info: InstallingInfo { + new_manifest: manifest, + progress: install_progress, + }, + }; + db.as_public_mut().as_package_data_mut().insert( + &id, + &PackageDataEntry { + state_info: if restoring { + PackageState::Restoring(installing) + } else { + PackageState::Installing(installing) + }, + data_version: None, + status: MainStatus::Stopped, + registry: None, + developer_key: Pem::new(developer_key), + icon, + last_backup: None, + current_dependencies: Default::default(), + actions: Default::default(), + requested_actions: Default::default(), + service_interfaces: Default::default(), + hosts: Default::default(), + store_exposed_dependents: Default::default(), + }, + )?; + }; + Ok(()) + } + }) + .await + .result + }) .await?; Ok(async move { @@ -425,7 +434,8 @@ impl ServiceRefReloadInfo { (), ) }) - .await?; + .await + .result?; } Ok(()) } diff --git a/core/startos/src/setup.rs b/core/startos/src/setup.rs index 186fbb0c4..a1976e285 100644 --- a/core/startos/src/setup.rs +++ b/core/startos/src/setup.rs @@ -98,7 +98,8 @@ async fn setup_init( .ser(&account.password)?; Ok(account) }) - .await?; + .await + .result?; Ok((account, init_result)) } diff --git a/core/startos/src/shutdown.rs b/core/startos/src/shutdown.rs index 4e45f74c0..12deff743 100644 --- a/core/startos/src/shutdown.rs +++ b/core/startos/src/shutdown.rs @@ -84,7 +84,8 @@ pub async fn shutdown(ctx: RpcContext) -> Result<(), Error> { .as_shutting_down_mut() .ser(&true) }) - .await?; + .await + .result?; ctx.shutdown .send(Some(Shutdown { export_args: Some((ctx.disk_guid.clone(), Path::new(DATA_DIR).to_owned())), @@ -104,7 +105,8 @@ pub async fn restart(ctx: RpcContext) -> Result<(), Error> { .as_restarting_mut() .ser(&true) }) - .await?; + .await + .result?; ctx.shutdown .send(Some(Shutdown { export_args: Some((ctx.disk_guid.clone(), Path::new(DATA_DIR).to_owned())), diff --git a/core/startos/src/ssh.rs b/core/startos/src/ssh.rs index 301ed8721..0f236b813 100644 --- a/core/startos/src/ssh.rs +++ b/core/startos/src/ssh.rs @@ -145,7 +145,8 @@ pub async fn add(ctx: RpcContext, AddParams { key }: AddParams) -> Result Result< .ser(&enable)?; Ok(()) }) - .await?; + .await + .result?; Ok(()) } @@ -170,7 +171,8 @@ pub async fn governor( .as_governor_mut() .ser(&Some(set)) }) - .await?; + .await + .result?; } let current = ctx .db @@ -911,7 +913,8 @@ pub async fn set_system_smtp(ctx: RpcContext, smtp: SmtpValue) -> Result<(), Err .as_smtp_mut() .ser(&smtp) }) - .await?; + .await + .result?; if let Some(callbacks) = ctx.callbacks.get_system_smtp() { callbacks.call(vector![to_value(&smtp)?]).await?; } @@ -925,7 +928,8 @@ pub async fn clear_system_smtp(ctx: RpcContext) -> Result<(), Error> { .as_smtp_mut() .ser(&None) }) - .await?; + .await + .result?; if let Some(callbacks) = ctx.callbacks.get_system_smtp() { callbacks.call(vector![Value::Null]).await?; } diff --git a/core/startos/src/update/mod.rs b/core/startos/src/update/mod.rs index 7daa4f3b2..bf11983ca 100644 --- a/core/startos/src/update/mod.rs +++ b/core/startos/src/update/mod.rs @@ -288,7 +288,8 @@ async fn maybe_do_update( .ser(&status)?; Ok(status) }) - .await?; + .await + .result?; if status.updated { return Err(Error::new( @@ -332,12 +333,10 @@ async fn maybe_do_update( status_info.as_update_progress_mut().ser(&None)?; status_info.as_updated_mut().ser(&true) }) - .await?; - progress_task.await.with_kind(ErrorKind::Unknown)??; - CIRCLE_OF_5THS_SHORT - .play() .await - .expect("could not play sound"); + .result?; + progress_task.await.with_kind(ErrorKind::Unknown)??; + CIRCLE_OF_5THS_SHORT.play().await.log_err(); } Err(e) => { let err_string = format!("Update was not successful because of {}", e); @@ -358,24 +357,13 @@ async fn maybe_do_update( ) }) .await - .unwrap(); + .result + .log_err(); // TODO: refactor sound lib to make compound tempos easier to deal with - UPDATE_FAILED_1 - .play() - .await - .expect("could not play song: update failed 1"); - UPDATE_FAILED_2 - .play() - .await - .expect("could not play song: update failed 2"); - UPDATE_FAILED_3 - .play() - .await - .expect("could not play song: update failed 3"); - UPDATE_FAILED_4 - .play() - .await - .expect("could not play song: update failed 4"); + UPDATE_FAILED_1.play().await.log_err(); + UPDATE_FAILED_2.play().await.log_err(); + UPDATE_FAILED_3.play().await.log_err(); + UPDATE_FAILED_4.play().await.log_err(); } } Ok::<(), Error>(()) diff --git a/core/startos/src/version/mod.rs b/core/startos/src/version/mod.rs index 4dd5d8cdb..3e8523d33 100644 --- a/core/startos/src/version/mod.rs +++ b/core/startos/src/version/mod.rs @@ -36,6 +36,8 @@ mod v0_3_6_alpha_13; mod v0_3_6_alpha_14; mod v0_3_6_alpha_15; mod v0_3_6_alpha_16; +mod v0_3_6_alpha_17; +mod v0_3_6_alpha_18; mod v0_4_0_alpha_0; @@ -56,7 +58,8 @@ impl Current { rollback_to_unchecked(&from, &self, &mut db)?; Ok::<_, Error>((db, ())) }) - .await?; + .await + .result?; } Ordering::Less => { let pre_ups = PreUps::load(&from, &self).await?; @@ -64,7 +67,8 @@ impl Current { migrate_from_unchecked(&from, &self, pre_ups, &mut db)?; Ok::<_, Error>((to_value(&from_value::(db.clone())?)?, ())) }) - .await?; + .await + .result?; } Ordering::Equal => (), } @@ -105,7 +109,8 @@ pub async fn post_init( .as_post_init_migration_todos_mut() .mutate(|m| Ok(m.remove(&version.0.semver()))) }) - .await?; + .await + .result?; progress += 1; } } @@ -138,6 +143,8 @@ enum Version { V0_3_6_alpha_14(Wrapper), V0_3_6_alpha_15(Wrapper), V0_3_6_alpha_16(Wrapper), + V0_3_6_alpha_17(Wrapper), + V0_3_6_alpha_18(Wrapper), V0_4_0_alpha_0(Wrapper), // VERSION_BUMP Other(exver::Version), } @@ -179,7 +186,9 @@ impl Version { Self::V0_3_6_alpha_14(v) => DynVersion(Box::new(v.0)), Self::V0_3_6_alpha_15(v) => DynVersion(Box::new(v.0)), Self::V0_3_6_alpha_16(v) => DynVersion(Box::new(v.0)), - Self::V0_4_0_alpha_0(v) => DynVersion(Box::new(v.0)), // VERSION_BUMP + Self::V0_3_6_alpha_17(v) => DynVersion(Box::new(v.0)), + Self::V0_3_6_alpha_18(v) => DynVersion(Box::new(v.0)), // VERSION_BUMP + Self::V0_4_0_alpha_0(v) => DynVersion(Box::new(v.0)), // VERSION_BUMP Self::Other(v) => { return Err(Error::new( eyre!("unknown version {v}"), @@ -212,6 +221,8 @@ impl Version { Version::V0_3_6_alpha_14(Wrapper(x)) => x.semver(), Version::V0_3_6_alpha_15(Wrapper(x)) => x.semver(), Version::V0_3_6_alpha_16(Wrapper(x)) => x.semver(), + Version::V0_3_6_alpha_17(Wrapper(x)) => x.semver(), + Version::V0_3_6_alpha_18(Wrapper(x)) => x.semver(), Version::V0_4_0_alpha_0(Wrapper(x)) => x.semver(), // VERSION_BUMP Version::Other(x) => x.clone(), } diff --git a/core/startos/src/version/v0_3_6_alpha_17.rs b/core/startos/src/version/v0_3_6_alpha_17.rs new file mode 100644 index 000000000..2d58bab5a --- /dev/null +++ b/core/startos/src/version/v0_3_6_alpha_17.rs @@ -0,0 +1,36 @@ +use exver::{PreReleaseSegment, VersionRange}; + +use super::v0_3_5::V0_3_0_COMPAT; +use super::{v0_3_6_alpha_16, VersionT}; +use crate::prelude::*; + +lazy_static::lazy_static! { + static ref V0_3_6_alpha_17: exver::Version = exver::Version::new( + [0, 3, 6], + [PreReleaseSegment::String("alpha".into()), 17.into()] + ); +} + +#[derive(Clone, Copy, Debug, Default)] +pub struct Version; + +impl VersionT for Version { + type Previous = v0_3_6_alpha_16::Version; + type PreUpRes = (); + + async fn pre_up(self) -> Result { + Ok(()) + } + fn semver(self) -> exver::Version { + V0_3_6_alpha_17.clone() + } + fn compat(self) -> &'static VersionRange { + &V0_3_0_COMPAT + } + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { + Ok(()) + } + fn down(self, _db: &mut Value) -> Result<(), Error> { + Ok(()) + } +} diff --git a/core/startos/src/version/v0_3_6_alpha_18.rs b/core/startos/src/version/v0_3_6_alpha_18.rs new file mode 100644 index 000000000..2d2c7ad32 --- /dev/null +++ b/core/startos/src/version/v0_3_6_alpha_18.rs @@ -0,0 +1,36 @@ +use exver::{PreReleaseSegment, VersionRange}; + +use super::v0_3_5::V0_3_0_COMPAT; +use super::{v0_3_6_alpha_17, VersionT}; +use crate::prelude::*; + +lazy_static::lazy_static! { + static ref V0_3_6_alpha_18: exver::Version = exver::Version::new( + [0, 3, 6], + [PreReleaseSegment::String("alpha".into()), 18.into()] + ); +} + +#[derive(Clone, Copy, Debug, Default)] +pub struct Version; + +impl VersionT for Version { + type Previous = v0_3_6_alpha_17::Version; + type PreUpRes = (); + + async fn pre_up(self) -> Result { + Ok(()) + } + fn semver(self) -> exver::Version { + V0_3_6_alpha_18.clone() + } + fn compat(self) -> &'static VersionRange { + &V0_3_0_COMPAT + } + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { + Ok(()) + } + fn down(self, _db: &mut Value) -> Result<(), Error> { + Ok(()) + } +} diff --git a/core/startos/src/version/v0_3_6_alpha_6.rs b/core/startos/src/version/v0_3_6_alpha_6.rs index 7d62773ea..61d6675e4 100644 --- a/core/startos/src/version/v0_3_6_alpha_6.rs +++ b/core/startos/src/version/v0_3_6_alpha_6.rs @@ -45,7 +45,8 @@ impl VersionT for Version { )?; Ok(()) }) - .await?; + .await + .result?; Ok(()) } fn down(self, _db: &mut Value) -> Result<(), Error> { diff --git a/core/startos/src/version/v0_4_0_alpha_0.rs b/core/startos/src/version/v0_4_0_alpha_0.rs index ceb118780..3c33a1b83 100644 --- a/core/startos/src/version/v0_4_0_alpha_0.rs +++ b/core/startos/src/version/v0_4_0_alpha_0.rs @@ -2,7 +2,7 @@ use exver::{PreReleaseSegment, VersionRange}; use imbl_value::json; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_16, VersionT}; +use super::{v0_3_6_alpha_18, VersionT}; use crate::prelude::*; lazy_static::lazy_static! { @@ -16,7 +16,7 @@ lazy_static::lazy_static! { pub struct Version; impl VersionT for Version { - type Previous = v0_3_6_alpha_16::Version; + type Previous = v0_3_6_alpha_18::Version; type PreUpRes = (); async fn pre_up(self) -> Result { diff --git a/debian/postinst b/debian/postinst index d29fcfb86..2404ac5b3 100755 --- a/debian/postinst +++ b/debian/postinst @@ -109,7 +109,7 @@ rm -rf /var/lib/tor/* ln -sf /usr/lib/startos/scripts/chroot-and-upgrade /usr/bin/chroot-and-upgrade ln -sf /usr/lib/startos/scripts/tor-check /usr/bin/tor-check ln -sf /usr/lib/startos/scripts/gather-debug-info /usr/bin/gather-debug-info -ln -sf /usr/lib/startos/scripts/wg-vps-setup /usr/bin/wg-vps-setup +ln -sf /usr/lib/startos/scripts/wireguard-vps-proxy-setup /usr/bin/wireguard-vps-proxy-setup echo "fs.inotify.max_user_watches=1048576" > /etc/sysctl.d/97-startos.conf diff --git a/image-recipe/build.sh b/image-recipe/build.sh index eaf5e8382..d5c820591 100755 --- a/image-recipe/build.sh +++ b/image-recipe/build.sh @@ -61,7 +61,7 @@ PLATFORM_CONFIG_EXTRAS=() if [ "${IB_TARGET_PLATFORM}" = "raspberrypi" ]; then PLATFORM_CONFIG_EXTRAS+=( --firmware-binary false ) PLATFORM_CONFIG_EXTRAS+=( --firmware-chroot false ) - PLATFORM_CONFIG_EXTRAS+=( --linux-packages linux-image-6.6.51+rpt ) + PLATFORM_CONFIG_EXTRAS+=( --linux-packages linux-image-6.12.20+rpt ) PLATFORM_CONFIG_EXTRAS+=( --linux-flavours "rpi-v8 rpi-2712" ) elif [ "${IB_TARGET_PLATFORM}" = "rockchip64" ]; then PLATFORM_CONFIG_EXTRAS+=( --linux-flavours rockchip64 ) @@ -147,7 +147,7 @@ if [ "${IB_TARGET_PLATFORM}" = "raspberrypi" ]; then fi cat > config/archives/backports.pref <<- EOF -Package: * +Package: linux-image-* Pin: release n=${IB_SUITE}-backports Pin-Priority: 500 EOF @@ -206,8 +206,8 @@ if [ "${IB_TARGET_PLATFORM}" = "raspberrypi" ]; then echo "Configuring raspi kernel '\$v'" extract-ikconfig "/usr/lib/modules/\$v/kernel/kernel/configs.ko.xz" > /boot/config-\$v done - mkinitramfs -c gzip -o /boot/initramfs8 6.6.74-v8+ - mkinitramfs -c gzip -o /boot/initramfs_2712 6.6.74-v8-16k+ + mkinitramfs -c gzip -o /boot/initramfs8 6.12.20-v8+ + mkinitramfs -c gzip -o /boot/initramfs_2712 6.12.20-v8-16k+ fi useradd --shell /bin/bash -G startos -m start9 diff --git a/patch-db b/patch-db index 0df18c651..d1362bdcd 160000 --- a/patch-db +++ b/patch-db @@ -1 +1 @@ -Subproject commit 0df18c651f2311e2e26f3e6c8535a9e40b71502f +Subproject commit d1362bdcd9138125a8079e58ed9cc54358aa56f1 diff --git a/sdk/base/lib/Effects.ts b/sdk/base/lib/Effects.ts index b7c67af12..941e57cf9 100644 --- a/sdk/base/lib/Effects.ts +++ b/sdk/base/lib/Effects.ts @@ -130,7 +130,10 @@ export type Effects = { callback?: () => void }): Promise /** Returns the IP address of the container */ - getContainerIp(): Promise + getContainerIp(options: { + packageId?: PackageId + callback?: () => void + }): Promise /** Returns the IP address of StartOS */ getOsIp(): Promise // interface diff --git a/sdk/base/lib/interfaces/Host.ts b/sdk/base/lib/interfaces/Host.ts index 53419357f..be9525f1c 100644 --- a/sdk/base/lib/interfaces/Host.ts +++ b/sdk/base/lib/interfaces/Host.ts @@ -33,18 +33,6 @@ export const knownProtocols = { secure: { ssl: false }, defaultPort: 22, }, - bitcoin: { - secure: { ssl: false }, - defaultPort: 8333, - }, - lightning: { - secure: { ssl: true }, - defaultPort: 9735, - }, - grpc: { - secure: { ssl: true }, - defaultPort: 50051, - }, dns: { secure: { ssl: false }, defaultPort: 53, diff --git a/sdk/base/lib/osBindings/GetContainerIpParams.ts b/sdk/base/lib/osBindings/GetContainerIpParams.ts new file mode 100644 index 000000000..2c84b4960 --- /dev/null +++ b/sdk/base/lib/osBindings/GetContainerIpParams.ts @@ -0,0 +1,8 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { CallbackId } from "./CallbackId" +import type { PackageId } from "./PackageId" + +export type GetContainerIpParams = { + packageId?: PackageId + callback?: CallbackId +} diff --git a/sdk/base/lib/osBindings/index.ts b/sdk/base/lib/osBindings/index.ts index cbf4c8e0b..b1a9439da 100644 --- a/sdk/base/lib/osBindings/index.ts +++ b/sdk/base/lib/osBindings/index.ts @@ -81,6 +81,7 @@ export { ForgetInterfaceParams } from "./ForgetInterfaceParams" export { FullIndex } from "./FullIndex" export { FullProgress } from "./FullProgress" export { GetActionInputParams } from "./GetActionInputParams" +export { GetContainerIpParams } from "./GetContainerIpParams" export { GetHostInfoParams } from "./GetHostInfoParams" export { GetOsAssetParams } from "./GetOsAssetParams" export { GetOsVersionParams } from "./GetOsVersionParams" diff --git a/sdk/base/lib/test/startosTypeValidation.test.ts b/sdk/base/lib/test/startosTypeValidation.test.ts index f6656e55d..3a66de1e1 100644 --- a/sdk/base/lib/test/startosTypeValidation.test.ts +++ b/sdk/base/lib/test/startosTypeValidation.test.ts @@ -7,6 +7,7 @@ import { ClearCallbacksParams, ClearServiceInterfacesParams, GetActionInputParams, + GetContainerIpParams, GetStatusParams, RequestActionParams, RunActionParams, @@ -77,7 +78,7 @@ describe("startosTypeValidation ", () => { set: {} as any, // as SetStoreParams, }, getSystemSmtp: {} as WithCallback, - getContainerIp: undefined, + getContainerIp: {} as WithCallback, getOsIp: undefined, getServicePortForward: {} as GetServicePortForwardParams, clearServiceInterfaces: {} as ClearServiceInterfacesParams, diff --git a/sdk/package/lib/StartSdk.ts b/sdk/package/lib/StartSdk.ts index 924455305..536d254ad 100644 --- a/sdk/package/lib/StartSdk.ts +++ b/sdk/package/lib/StartSdk.ts @@ -47,7 +47,12 @@ import { GetSystemSmtp } from "./util" import { nullIfEmpty } from "./util" import { getServiceInterface, getServiceInterfaces } from "./util" import { getStore } from "./store/getStore" -import { CommandOptions, MountOptions, SubContainer } from "./util/SubContainer" +import { + CommandOptions, + ExitError, + MountOptions, + SubContainer, +} from "./util/SubContainer" import { splitCommand } from "./util" import { Mounts } from "./mainFn/Mounts" import { setupDependencies } from "../../base/lib/dependencies/setupDependencies" @@ -104,7 +109,10 @@ export class StartSdk { | "getHostInfo" type MainUsedEffects = "setMainStatus" | "setHealth" type CallbackEffects = "constRetry" | "clearCallbacks" - type AlreadyExposed = "getSslCertificate" | "getSystemSmtp" + type AlreadyExposed = + | "getSslCertificate" + | "getSystemSmtp" + | "getContainerIp" // prettier-ignore type StartSdkEffectWrapper = { @@ -123,7 +131,6 @@ export class StartSdk { getServicePortForward: (effects, ...args) => effects.getServicePortForward(...args), clearBindings: (effects, ...args) => effects.clearBindings(...args), - getContainerIp: (effects, ...args) => effects.getContainerIp(...args), getOsIp: (effects, ...args) => effects.getOsIp(...args), getSslKey: (effects, ...args) => effects.getSslKey(...args), setDataVersion: (effects, ...args) => effects.setDataVersion(...args), @@ -191,7 +198,61 @@ export class StartSdk { opts: { packageId: PackageId }, ) => getServiceInterfaces(effects, opts), }, - + getContainerIp: ( + effects: T.Effects, + options: Omit< + Parameters[0], + "callback" + > = {}, + ) => { + async function* watch() { + while (true) { + let callback: () => void = () => {} + const waitForNext = new Promise((resolve) => { + callback = resolve + }) + yield await effects.getContainerIp({ ...options, callback }) + await waitForNext + } + } + return { + const: () => + effects.getContainerIp({ + ...options, + callback: + effects.constRetry && + (() => effects.constRetry && effects.constRetry()), + }), + once: () => effects.getContainerIp(options), + watch, + onChange: ( + callback: ( + value: string | null, + error?: Error, + ) => void | Promise, + ) => { + ;(async () => { + for await (const value of watch()) { + try { + await callback(value) + } catch (e) { + console.error( + "callback function threw an error @ getContainerIp.onChange", + e, + ) + } + } + })() + .catch((e) => callback(null, e)) + .catch((e) => + console.error( + "callback function threw an error @ getContainerIp.onChange", + e, + ), + ) + }, + } + }, store: { get: ( effects: E, @@ -230,7 +291,7 @@ export class StartSdk { }, command: T.CommandType, options: CommandOptions & { - mounts?: { mountpoint: string; options: MountOptions }[] + mounts: Mounts }, /** * A name to use to refer to the ephemeral subcontainer for debugging purposes @@ -527,7 +588,10 @@ export class StartSdk { }) * ``` */ - setupInstall: (fn: InstallFn) => Install.of(fn), + setupInstall: ( + fn: InstallFn, + preFn?: InstallFn, + ) => Install.of(fn, preFn), /** * @description Use this function to determine how this service will be hosted and served. The function executes on service install, service update, and inputSpec save. * @@ -1076,7 +1140,7 @@ export async function runCommand( image: { imageId: keyof Manifest["images"] & T.ImageId; sharedRun?: boolean }, command: T.CommandType, options: CommandOptions & { - mounts?: { mountpoint: string; options: MountOptions }[] + mounts: Mounts }, name?: string, ): Promise<{ stdout: string | Buffer; stderr: string | Buffer }> { @@ -1094,7 +1158,7 @@ export async function runCommand( return SubContainer.with( effects, image, - options.mounts || [], + options.mounts.build(), name || commands .map((c) => { @@ -1105,6 +1169,13 @@ export async function runCommand( } }) .join(" "), - (subcontainer) => subcontainer.exec(commands), + async (subcontainer) => { + const res = await subcontainer.exec(commands) + if (res.exitCode || res.exitSignal) { + throw new ExitError(commands[0], res) + } else { + return res + } + }, ) } diff --git a/sdk/package/lib/inits/setupInit.ts b/sdk/package/lib/inits/setupInit.ts index 8d30f5b1f..21cfd1641 100644 --- a/sdk/package/lib/inits/setupInit.ts +++ b/sdk/package/lib/inits/setupInit.ts @@ -3,6 +3,7 @@ import { ExtendedVersion } from "../../../base/lib/exver" import { UpdateServiceInterfaces } from "../../../base/lib/interfaces/setupInterfaces" import { ExposedStorePaths } from "../../../base/lib/types" import * as T from "../../../base/lib/types" +import { StorePath } from "../util" import { VersionGraph } from "../version/VersionGraph" import { Install } from "./setupInstall" import { Uninstall } from "./setupUninstall" @@ -16,6 +17,7 @@ export function setupInit( effects: T.Effects }) => Promise, actions: Actions, + initStore: Store, exposedStore: ExposedStorePaths, ): { packageInit: T.ExpectedExports.packageInit @@ -53,6 +55,14 @@ export function setupInit( } }, containerInit: async (opts) => { + const prev = await opts.effects.getDataVersion() + if (!prev) { + await opts.effects.store.set({ + path: "" as StorePath, + value: initStore, + }) + await install.preInstall(opts) + } await setServiceInterfaces({ ...opts, }) diff --git a/sdk/package/lib/inits/setupInstall.ts b/sdk/package/lib/inits/setupInstall.ts index 38a96a00b..708367e20 100644 --- a/sdk/package/lib/inits/setupInstall.ts +++ b/sdk/package/lib/inits/setupInstall.ts @@ -4,11 +4,15 @@ export type InstallFn = (opts: { effects: T.Effects }) => Promise export class Install { - private constructor(readonly fn: InstallFn) {} + private constructor( + readonly fn: InstallFn, + readonly preFn?: InstallFn, + ) {} static of( fn: InstallFn, + preFn?: InstallFn, ) { - return new Install(fn) + return new Install(fn, preFn) } async install({ effects }: Parameters[0]) { @@ -16,10 +20,18 @@ export class Install { effects, }) } + + async preInstall({ effects }: Parameters[0]) { + this.preFn && + (await this.preFn({ + effects, + })) + } } export function setupInstall( fn: InstallFn, + preFn?: InstallFn, ) { - return Install.of(fn) + return Install.of(fn, preFn) } diff --git a/sdk/package/lib/mainFn/Daemons.ts b/sdk/package/lib/mainFn/Daemons.ts index d471394c7..9732d6e7a 100644 --- a/sdk/package/lib/mainFn/Daemons.ts +++ b/sdk/package/lib/mainFn/Daemons.ts @@ -172,7 +172,7 @@ export class Daemons daemon, daemonIndex, options.requires - .map((x) => this.ids.indexOf(id as any)) + .map((x) => this.ids.indexOf(x)) .filter((x) => x >= 0) .map((id) => this.healthDaemons[id]), id, diff --git a/sdk/package/lib/util/SubContainer.ts b/sdk/package/lib/util/SubContainer.ts index 912c3112a..13d91535e 100644 --- a/sdk/package/lib/util/SubContainer.ts +++ b/sdk/package/lib/util/SubContainer.ts @@ -467,3 +467,25 @@ export type MountOptionsBackup = { function wait(time: number) { return new Promise((resolve) => setTimeout(resolve, time)) } + +export class ExitError extends Error { + constructor( + readonly command: string, + readonly result: { + exitCode: number | null + exitSignal: T.Signals | null + stdout: string | Buffer + stderr: string | Buffer + }, + ) { + let message: string + if (result.exitCode) { + message = `${command} failed with exit code ${result.exitCode}: ${result.stderr}` + } else if (result.exitSignal) { + message = `${command} terminated with signal ${result.exitSignal}: ${result.stderr}` + } else { + message = `${command} succeeded: ${result.stdout}` + } + super(message) + } +} diff --git a/sdk/package/package-lock.json b/sdk/package/package-lock.json index a98b89158..9eb3add44 100644 --- a/sdk/package/package-lock.json +++ b/sdk/package/package-lock.json @@ -1,12 +1,12 @@ { "name": "@start9labs/start-sdk", - "version": "0.3.6-beta.18", + "version": "0.3.6-beta.20", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@start9labs/start-sdk", - "version": "0.3.6-beta.18", + "version": "0.3.6-beta.20", "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", diff --git a/sdk/package/package.json b/sdk/package/package.json index 8cdcd94ad..31dcf9799 100644 --- a/sdk/package/package.json +++ b/sdk/package/package.json @@ -1,6 +1,6 @@ { "name": "@start9labs/start-sdk", - "version": "0.3.6-beta.18", + "version": "0.3.6-beta.20", "description": "Software development kit to facilitate packaging services for StartOS", "main": "./package/lib/index.js", "types": "./package/lib/index.d.ts",