All checks were successful
PR Checks / rust-gates (pull_request) Successful in 2m7s
Module-rust phase 18, step 5 of docs/modules/rust/PLAN.md §34.2.7 (D146, D148, D149, D153). Bundles: ServUO is read at schema 2 from v2/servuo/ and lowered into the schema-1 model. Schema 1 at the root is the fallback, so a pin from before schema 2 still reproduces. Rust bundles are read from v2/rust/. v2 reads use the contents API, because /raw/ is CDN-cached for six hours. --game rust runs install, update, doctor and uninstall for Rust servers (src/rustgame/): - the framework is detected from its marker files, which were read off both rigs; both or neither is refused; - --server-id names an instance: its own service (runicgateway-rust@<id>, or RunicGatewayRust-<id>), config, database and ports; - the plugin config is written once, with ServerId and Port only. An existing one is never rewritten, and one naming another server refuses the run; - each instance's sidecar.toml is written once with its ports and an absolute database path, and the sidecar generates the token into it; - one binary per host. update moves every instance, and a replaced binary restarts all of them; - doctor checks the plugin file hash, the plugin config's ServerId, the required uMod plugins (a warning), the service and /health, and passes when the plugin is connected; - uninstall removes our plugin and keeps its config. --purge also removes the sidecar config and database. The last instance takes the binary, the template and the record, and the shared user only when no ServUO record remains. service.rs takes the service name as a parameter internally. The ServUO public API is unchanged. Finding: Carbon 2.0.259's config.json has no folder keys, so carbon/plugins and carbon/configs are what the installer uses. The plan expected a moved directory to be readable there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
71 lines
3.1 KiB
TOML
71 lines
3.1 KiB
TOML
[package]
|
|
name = "runicgateway-installer"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
description = "Deployment tool for Runic Gateway: syncs the ServUO plugin overlay, installs the uo-link sidecar, and records what it deployed."
|
|
license = "GPL-3.0-or-later"
|
|
repository = "https://gitea.whitlocktech.com/RunicGateway/installer"
|
|
|
|
# The published binary keeps the name PLAN.md §3 and INSTALL.md give it. The library it is built
|
|
# from does not share that name on purpose: Windows' UAC installer detection refuses to launch an
|
|
# unsigned executable whose file name contains "install" (`os error 740`), and Cargo names test
|
|
# harnesses after their target — so a target called `runicgateway_installer` makes `cargo test`
|
|
# unrunnable on Windows. `test = false` keeps Cargo from building a harness under the binary's
|
|
# name; all the code, and all the tests, live in the library. See src/lib.rs.
|
|
[lib]
|
|
name = "rgdeploy"
|
|
path = "src/lib.rs"
|
|
|
|
[[bin]]
|
|
name = "runicgateway-installer"
|
|
path = "src/main.rs"
|
|
test = false
|
|
|
|
[dependencies]
|
|
# Blocking HTTP over a pure-Rust TLS stack (rustls + ring + webpki-roots). The
|
|
# release cross-compiles to x86_64-pc-windows-gnu through MinGW, where anything
|
|
# linking OpenSSL turns a one-line build into a toolchain project — and this tool
|
|
# makes a handful of sequential requests, so an async runtime would be overhead
|
|
# with nothing to overlap.
|
|
ureq = "3.3"
|
|
|
|
# Overlay releases ship as gzipped tar. flate2's default backend is miniz_oxide
|
|
# (pure Rust), so it cross-compiles with no C dependency of its own.
|
|
flate2 = "1"
|
|
tar = "0.4"
|
|
|
|
# SHA256 is the entire trust anchor for these deliberately unsigned artifacts
|
|
# (PLAN.md §3), which makes this load-bearing rather than a nicety.
|
|
sha2 = "0.11"
|
|
|
|
# SHA1 is here for one reason only: a patch's `index <old>..<new>` line carries
|
|
# git blob hashes, and reproducing one is how the patch tier answers rung 1 —
|
|
# "is this whole file still stock?" (PLAN.md §2.2.1). It is never used as a
|
|
# security primitive. Computing it natively is what keeps `git` off the shard
|
|
# host, which is the whole point of shipping the plugin as a release tarball.
|
|
sha1 = "0.11"
|
|
|
|
# Schema-2 bundles are read through Gitea's contents API, which returns the file
|
|
# base64-encoded — the /raw/ route is CDN-cached for hours (bundle.rs). Pure Rust.
|
|
base64 = "0.22"
|
|
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
|
|
# RFC 3339 timestamps for install.json. Same feature set link's sidecar uses.
|
|
chrono = { version = "0.4", default-features = false, features = ["std", "clock"] }
|
|
|
|
# Refusing to deploy under a running shard is a correctness requirement, not a
|
|
# courtesy: ServUO holds Scripts.dll open and rewrites Saves/ on exit. Only the
|
|
# `system` feature is wanted — disks, networks and users are not our business.
|
|
sysinfo = { version = "0.38", default-features = false, features = ["system"] }
|
|
|
|
# Error plumbing, as in link's sidecar. Every failure here is read by an operator
|
|
# rather than matched on, so a chain of `.context()` strings is the whole
|
|
# requirement — the value is that "failed to write install.json" arrives with the
|
|
# path and the OS error attached instead of alone.
|
|
anyhow = "1"
|
|
|
|
[profile.release]
|
|
opt-level = 2
|