Delete types/v14.go, replace with v15.go.
Rename internal types to not include message version.
I don't currently see the need to support multiple message
versions that have incompatible layouts.
v15 is backwards compatible with v14, so the config example now
specifies both.
Rename the "response" field in the config file to "static" as
dynamic/static makes more sense from the user's perspective.
(Internally it's still SpaceapidConfig.{Dynamic,Response}
to align with type names and usage.)
95 lines
2.3 KiB
Go
95 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"git.hamburg.ccc.de/ccchh/spaceapid/config"
|
|
"git.hamburg.ccc.de/ccchh/spaceapid/handlers"
|
|
"git.hamburg.ccc.de/ccchh/spaceapid/persistence"
|
|
"git.hamburg.ccc.de/ccchh/spaceapid/types"
|
|
"git.hamburg.ccc.de/ccchh/spaceapid/util"
|
|
)
|
|
|
|
var (
|
|
flagHelp bool
|
|
version string
|
|
)
|
|
|
|
func init() {
|
|
flag.BoolVar(&flagHelp, "h", false, "Print help output")
|
|
}
|
|
|
|
func main() {
|
|
if version == "" {
|
|
version = "unknown"
|
|
}
|
|
log.Println("SpaceAPId version", version)
|
|
|
|
flag.Parse()
|
|
|
|
if flagHelp {
|
|
flag.PrintDefaults()
|
|
os.Exit(0)
|
|
}
|
|
|
|
// Get spaceapid configuration
|
|
conf := config.ParseConfiguration()
|
|
|
|
// Merge old state if present
|
|
persistence.MergeOldState(&conf.Response)
|
|
|
|
// Register signal handler
|
|
sc := make(chan os.Signal, 1)
|
|
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM)
|
|
go func(resp *types.SpaceAPIResponse) {
|
|
<-sc
|
|
log.Println("Saving state and shutting down...")
|
|
persistence.SaveCurrentState(*resp)
|
|
os.Exit(0)
|
|
}(&conf.Response)
|
|
|
|
// Root handler
|
|
http.HandleFunc("GET /{$}",
|
|
handlers.Root(&conf.Response),
|
|
)
|
|
// state->open
|
|
http.HandleFunc("PUT /state/open",
|
|
handlers.StateOpen(conf.Credentials, conf.Dynamic.State.Open.AllowedCredentials, &conf.Response.State),
|
|
)
|
|
// state->message
|
|
http.HandleFunc("PUT /state/message",
|
|
handlers.StateMessagePUT(conf.Credentials, conf.Dynamic.State.Open.AllowedCredentials, &conf.Response.State),
|
|
)
|
|
http.HandleFunc("DELETE /state/message",
|
|
handlers.StateMessageDELETE(conf.Credentials, conf.Dynamic.State.Open.AllowedCredentials, &conf.Response.State),
|
|
)
|
|
// Register handlers for environmental sensors
|
|
for sensorType, envSensorConfigs := range conf.Dynamic.Sensors {
|
|
for i, envSensorConfig := range envSensorConfigs {
|
|
urlPattern := util.GetSensorURLPath(
|
|
sensorType, envSensorConfig.SensorData.Location, envSensorConfig.SensorData.Name,
|
|
)
|
|
http.HandleFunc(
|
|
"PUT "+urlPattern,
|
|
handlers.EnvironmentSensorPUT(
|
|
conf.Credentials, envSensorConfig.AllowedCredentials, &conf.Response.Sensors[sensorType][i],
|
|
),
|
|
)
|
|
http.HandleFunc(
|
|
"DELETE "+urlPattern,
|
|
handlers.EnvironmentSensorDELETE(
|
|
conf.Credentials, envSensorConfig.AllowedCredentials, &conf.Response.Sensors[sensorType][i],
|
|
),
|
|
)
|
|
}
|
|
}
|
|
|
|
// Start webserver
|
|
log.Println("Starting HTTP server...")
|
|
log.Fatalln(http.ListenAndServe(":8080", nil))
|
|
}
|