mirror of
https://github.com/pgsty/minio.git
synced 2026-08-09 15:53:28 +03:00
feat(server): present Silo identity and close the inherited upstream services
Two coupled changes that must land together, because the same files carry both: the server now identifies itself as Silo, and every path that would have called home to a MinIO-operated service is closed. Product identity - build-constants.go: store name, UA name and startup banner become Silo. The Go identifiers (MinioStoreName, MinioBannerName, ...) keep their names on purpose - renaming exported symbols would churn the compatibility surface for a cosmetic gain, and the rebrand guard freezes that surface. - main.go, server-startup-msg.go, ftp-server.go and the user-visible log, help and error strings across cmd/ and internal/ switch to Silo. Original MinIO copyright, LICENSE, NOTICE and CREDITS are untouched; --version now prints the upstream copyright, the pgsty modification notice, and the trademark policy's approved "based on MinIO technology" attribution. - api-headers.go: the HTTP Server header becomes "Silo". This is the one externally observable identity change, so TestCommonHeadersUseSiloProductName pins it - probes that sniff for "MinIO" must move to capability detection. - Prometheus metric HELP strings keep their MinIO wording. They are part of the metrics contract the guard protects, not product copy. Configuration directory - config-dir.go: new installs use ~/.silo. If only ~/.minio exists it is still read, with a one-time notice and no files moved. If both exist ~/.silo wins and an ambiguity warning is emitted; an explicit --config-dir always wins. Covered by TestSelectDefaultConfigDir. The internal .minio.sys layout is never renamed - this rule applies to the user config directory only. Upstream service lockdown - globalInplaceUpdateDisabled is now true at initialization rather than being set from MINIO_UPDATE. common-main.go still parses MINIO_UPDATE so upgrading nodes do not fail on an unknown key, but warns that the value is ignored; there is no way to re-enable the updater. TestInplaceUpdateCannotBeEnabled guards that. Without this, an admin with mc could have overwritten /usr/bin/silo with an upstream MinIO binary. - verifyBinary and commitBinary refuse early; the ServerUpdate v1/v2 admin routes and the peer-rest update endpoints stay registered and keep returning the existing programmatic error, so clients see a stable failure rather than a 404. - MinioReleaseBaseURL and defaultMinisignPubkey are emptied: no dl.min.io download root, and upstream's minisign key is no longer a trust root for anything this fork ships. - cmd/callhome.go is deleted and internal/config/subnet/ is reduced to parsing its old keys and reporting that the integration is disabled. config-current.go warns instead of failing when callhome or SUBNET settings are present, so an upgraded node with those keys still starts. - internal/config/errors.go replaces the MinIO Slack and support entry points with Silo documentation and issue links. Error codes and programmatic fields are unchanged. Verified: the compatibility baseline is unchanged except for the deliberate removal of the /api/health/upload SUBNET route; go build, go vet and the full cmd/ and internal/ unit suites pass; a locally built binary starts, serves S3/Admin/metrics on the unchanged /minio/* routes, answers with Server: Silo, and falls back to a pre-existing ~/.minio with the expected notice. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+19
-25
@@ -51,6 +51,8 @@ const (
|
||||
)
|
||||
|
||||
var (
|
||||
errInplaceUpdateDisabled = errors.New("Silo in-place updates are disabled; use a package, image, or orchestrator upgrade")
|
||||
|
||||
// Newer official download info URLs appear earlier below.
|
||||
minioReleaseInfoURL = MinioReleaseURL + "minio.sha256sum"
|
||||
|
||||
@@ -223,13 +225,10 @@ func IsPCFTile() bool {
|
||||
return env.Get("MINIO_PCF_TILE_VERSION", "") != ""
|
||||
}
|
||||
|
||||
// DO NOT CHANGE USER AGENT STYLE.
|
||||
// The style should be
|
||||
// Keep the inherited user agent field order stable while identifying Silo as
|
||||
// the maintained product. The style is:
|
||||
//
|
||||
// MinIO (<OS>; <ARCH>[; <MODE>][; dcos][; kubernetes][; docker][; source]) MinIO/<VERSION> MinIO/<RELEASE-TAG> MinIO/<COMMIT-ID> [MinIO/universe-<PACKAGE-NAME>] [MinIO/helm-<HELM-VERSION>]
|
||||
//
|
||||
// Any change here should be discussed by opening an issue at
|
||||
// https://github.com/minio/minio/issues.
|
||||
// Silo (<OS>; <ARCH>[; <MODE>][; dcos][; kubernetes][; docker][; source]) <VERSION> <RELEASE-TAG> <COMMIT-ID> [universe-<PACKAGE-NAME>] [helm-<HELM-VERSION>]
|
||||
func getUserAgent(mode string) string {
|
||||
userAgentParts := []string{}
|
||||
// Helper function to concisely append a pair of strings to a
|
||||
@@ -438,22 +437,14 @@ func getUpdateTransport(timeout time.Duration) http.RoundTripper {
|
||||
return updateTransport
|
||||
}
|
||||
|
||||
func getLatestReleaseTime(u *url.URL, timeout time.Duration, mode string) (sha256Sum []byte, releaseTime time.Time, err error) {
|
||||
data, err := downloadReleaseURL(u, timeout, mode)
|
||||
if err != nil {
|
||||
return sha256Sum, releaseTime, err
|
||||
}
|
||||
|
||||
sha256Sum, releaseTime, _, err = parseReleaseData(data)
|
||||
return sha256Sum, releaseTime, err
|
||||
}
|
||||
|
||||
const (
|
||||
// Kubernetes deployment doc link.
|
||||
kubernetesDeploymentDoc = "https://silo.pgsty.com/operations/deployments/kubernetes/"
|
||||
|
||||
// Mesos deployment doc link.
|
||||
mesosDeploymentDoc = "https://silo.pgsty.com/operations/deployments/kubernetes/"
|
||||
|
||||
siloDownloadPage = "https://silo.pgsty.com/download/"
|
||||
)
|
||||
|
||||
func getDownloadURL(releaseTag string) (downloadURL string) {
|
||||
@@ -472,15 +463,11 @@ func getDownloadURL(releaseTag string) (downloadURL string) {
|
||||
// Check if we are docker environment, return docker update command
|
||||
if IsDocker() {
|
||||
// Construct release tag name.
|
||||
return fmt.Sprintf("podman pull quay.io/minio/minio:%s", releaseTag)
|
||||
return fmt.Sprintf("podman pull docker.io/pgsty/silo:%s", releaseTag)
|
||||
}
|
||||
|
||||
// For binary only installations, we return link to the latest binary.
|
||||
if runtime.GOOS == "windows" {
|
||||
return MinioReleaseURL + "minio.exe"
|
||||
}
|
||||
|
||||
return MinioReleaseURL + "minio"
|
||||
// Binary installations are upgraded from a verified release artifact.
|
||||
return siloDownloadPage
|
||||
}
|
||||
|
||||
func getUpdateReaderFromURL(u *url.URL, transport http.RoundTripper, mode string) (io.ReadCloser, error) {
|
||||
@@ -551,11 +538,15 @@ func downloadBinary(u *url.URL, mode string) (binCompressed []byte, bin []byte,
|
||||
}
|
||||
|
||||
const (
|
||||
// Update this whenever the official minisign pubkey is rotated.
|
||||
defaultMinisignPubkey = "RWTx5Zr1tiHQLwG9keckT0c45M3AGeHD6IvimQHpyRywVWGbP1aVSGav"
|
||||
// Silo has no in-place update trust root. The environment key remains
|
||||
// recognized by inherited code but cannot re-enable the disabled updater.
|
||||
defaultMinisignPubkey = ""
|
||||
)
|
||||
|
||||
func verifyBinary(u *url.URL, sha256Sum []byte, releaseInfo, mode string, reader io.Reader) (err error) {
|
||||
if globalInplaceUpdateDisabled {
|
||||
return errInplaceUpdateDisabled
|
||||
}
|
||||
if !updateInProgress.CompareAndSwap(0, 1) {
|
||||
return errors.New("update already in progress")
|
||||
}
|
||||
@@ -610,6 +601,9 @@ func verifyBinary(u *url.URL, sha256Sum []byte, releaseInfo, mode string, reader
|
||||
}
|
||||
|
||||
func commitBinary() (err error) {
|
||||
if globalInplaceUpdateDisabled {
|
||||
return errInplaceUpdateDisabled
|
||||
}
|
||||
if !updateInProgress.CompareAndSwap(0, 1) {
|
||||
return errors.New("update already in progress")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user