Add connection webhook notifications (#392)

Also 

* Added decode of LoginStart message
* Add metrics backend constants
* Updated usage section
* Documented MaxFrameLength
This commit is contained in:
Geoff Bourne
2025-04-21 20:28:34 -05:00
committed by GitHub
parent a058d6e21d
commit cc590524c4
13 changed files with 585 additions and 66 deletions
+19 -1
View File
@@ -28,6 +28,11 @@ type MetricsBackendConfig struct {
}
}
type WebhookConfig struct {
Url string `usage:"If set, a POST request that contains connection status notifications will be sent to this HTTP address"`
RequireUser bool `default:"false" usage:"Indicates if the webhook will only be called if a user is connecting rather than just server list/ping"`
}
type Config struct {
Port int `default:"25565" usage:"The [port] bound to listen for Minecraft client connections"`
Default string `usage:"host:port of a default Minecraft server to use when mapping not found"`
@@ -57,6 +62,8 @@ type Config struct {
ClientsToDeny []string `usage:"Zero or more client IP addresses or CIDRs to deny. Ignored if any configured to allow"`
SimplifySRV bool `default:"false" usage:"Simplify fully qualified SRV records for mapping"`
Webhook WebhookConfig `usage:"Webhook configuration"`
}
var (
@@ -135,12 +142,23 @@ func main() {
trustedIpNets = append(trustedIpNets, ipNet)
}
connector := server.NewConnector(metricsBuilder.BuildConnectorMetrics(), config.UseProxyProtocol, config.ReceiveProxyProtocol, trustedIpNets)
clientFilter, err := server.NewClientFilter(config.ClientsToAllow, config.ClientsToDeny)
if err != nil {
logrus.WithError(err).Fatal("Unable to create client filter")
}
connector.SetClientFilter(clientFilter)
if config.Webhook.Url != "" {
logrus.
WithField("url", config.Webhook.Url).
WithField("require-user", config.Webhook.RequireUser).
Info("Using webhook for connection status notifications")
connector.SetConnectionNotifier(
server.NewWebhookNotifier(config.Webhook.Url, config.Webhook.RequireUser))
}
connector := server.NewConnector(metricsBuilder.BuildConnectorMetrics(), config.UseProxyProtocol, config.ReceiveProxyProtocol, trustedIpNets, clientFilter)
if config.NgrokToken != "" {
connector.UseNgrok(config.NgrokToken)
}
+15 -3
View File
@@ -24,14 +24,26 @@ type MetricsBuilder interface {
Start(ctx context.Context) error
}
const (
MetricsBackendExpvar = "expvar"
MetricsBackendPrometheus = "prometheus"
MetricsBackendInfluxDB = "influxdb"
MetricsBackendDiscard = "discard"
)
// NewMetricsBuilder creates a new MetricsBuilder based on the specified backend.
// If the backend is not recognized, a discard builder is returned.
// config can be nil if the backend is not influxdb.
func NewMetricsBuilder(backend string, config *MetricsBackendConfig) MetricsBuilder {
switch strings.ToLower(backend) {
case "expvar":
case MetricsBackendExpvar:
return &expvarMetricsBuilder{}
case "prometheus":
case MetricsBackendPrometheus:
return &prometheusMetricsBuilder{}
case "influxdb":
case MetricsBackendInfluxDB:
return &influxMetricsBuilder{config: config}
case MetricsBackendDiscard:
return &discardMetricsBuilder{}
default:
return &discardMetricsBuilder{}
}