package main import ( "context" "os" "os/signal" "gitea.libretechconsulting.com/rmcguire/go-app/pkg/app" grpcopts "gitea.libretechconsulting.com/rmcguire/go-app/pkg/srv/grpc/opts" httpopts "gitea.libretechconsulting.com/rmcguire/go-app/pkg/srv/http/opts" "golang.org/x/sys/unix" weatherpb "gitea.libretechconsulting.com/rmcguire/ambient-local-exporter/api/v1alpha1/weather" "gitea.libretechconsulting.com/rmcguire/ambient-local-exporter/pkg/ambient" "gitea.libretechconsulting.com/rmcguire/ambient-local-exporter/pkg/ambient/ambienthttp" "gitea.libretechconsulting.com/rmcguire/ambient-local-exporter/pkg/ambient/config" weathergrpc "gitea.libretechconsulting.com/rmcguire/ambient-local-exporter/pkg/weather/grpc" ) const defaultMetricPrefix = "weather" func main() { ctx, cncl := signal.NotifyContext(context.Background(), os.Kill, os.Interrupt, unix.SIGTERM) defer cncl() // Config type for app, which implements go-app/config.AppConfig awConfig := &config.AmbientLocalExporterConfig{ MetricPrefix: defaultMetricPrefix, WeatherStations: make([]config.WeatherStation, 0), } // Read config and environment, set up logging, load up // an appCtx, and prepare ambient weather local exporter ctx, awConfig = app.MustLoadConfigInto(ctx, awConfig) // Prepare the exporter aw := ambient.New(ctx, awConfig).Init() // Define and prepare the app awApp := app.App{ AppContext: ctx, // HTTP Endpoints for Ambient Weather Stations HTTP: &httpopts.AppHTTP{ Funcs: []httpopts.HTTPFunc{ { Path: "/weatherstation/updateweatherstation.php", HandlerFunc: aw.GetWundergroundHandlerFunc(ctx), }, { Path: "/data/report", HandlerFunc: aw.GetAWNHandlerFunc(ctx), }, }, CustomListener: ambienthttp.NewAWNMutatingListener(ctx, awConfig.HTTP.Listen), // Necessary to fix certain bad AWN firmware HealthChecks: []httpopts.HealthCheckFunc{ // TODO: Implement func(ctx context.Context) error { return nil }, }, }, // GRPC Service for retrieving current weather GRPC: &grpcopts.AppGRPC{ Services: []*grpcopts.GRPCService{ { Name: "Weather Service", Type: &weatherpb.AmbientLocalWeatherService_ServiceDesc, Service: weathergrpc.GRPCWeather{}, }, }, }, } // Run and wait awApp.MustRun() <-awApp.Done() }