diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cc4ae18..c597da4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,6 +9,14 @@ repos: - repo: local hooks: + - id: check-swagger + name: check-swagger + language: system + files: swagger.yaml + entry: swagger + args: ["validate", "swagger.yaml"] + pass_filenames: false + - id: tsc name: tsc entry: tsc diff --git a/Makefile b/Makefile index 2a1cbee..36c51f6 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,6 @@ SRC_DIR=./src UI_DIR=./ui -APIDOC_FILE=./src/server/swagger/swagger.yaml - VERSION=$(shell git tag --sort=-version:refname | head -n 1) setup: @@ -24,10 +22,10 @@ build-server: build: build-ui build-server generate-apidoc: - SWAGGER_GENERATE_EXTENSION=false swagger generate spec --scan-models -o ${APIDOC_FILE} + SWAGGER_GENERATE_EXTENSION=false swagger generate spec --scan-models -o swagger.yaml generate-apiclient: - openapi-generator generate -i ${APIDOC_FILE} -g typescript-axios -o ${UI_DIR}/src/sebrauc-client -p "supportsES6=true" + openapi-generator generate -i swagger.yaml -g typescript-axios -o ${UI_DIR}/src/sebrauc-client -p "supportsES6=true" cd ${UI_DIR} && npm run format clean: diff --git a/go.mod b/go.mod index 2090ee2..36fe1e4 100644 --- a/go.mod +++ b/go.mod @@ -4,11 +4,9 @@ go 1.16 require ( code.thetadev.de/TSGRain/ginzip v0.1.1 - github.com/ekyoung/gin-nice-recovery v0.0.0-20160510022553-1654dca486db github.com/fortytw2/leaktest v1.3.0 github.com/gin-contrib/cors v1.3.1 github.com/gin-gonic/gin v1.7.7 - github.com/go-errors/errors v1.4.1 // indirect github.com/google/uuid v1.3.0 github.com/gorilla/websocket v1.4.2 github.com/stretchr/testify v1.7.0 diff --git a/go.sum b/go.sum index 7011440..c2354c4 100644 --- a/go.sum +++ b/go.sum @@ -5,8 +5,6 @@ github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/ekyoung/gin-nice-recovery v0.0.0-20160510022553-1654dca486db h1:oZ4U9IqO8NS+61OmGTBi8vopzqTRxwQeogyBHdrhjbc= -github.com/ekyoung/gin-nice-recovery v0.0.0-20160510022553-1654dca486db/go.mod h1:Pk7/9x6tyChFTkahDvLBQMlvdsWvfC+yU8HTT5VD314= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/gin-contrib/cors v1.3.1 h1:doAsuITavI4IOcd0Y19U4B+O0dNWihRyX//nn4sEmgA= @@ -16,8 +14,6 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs= github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= -github.com/go-errors/errors v1.4.1 h1:IvVlgbzSsaUNudsw5dcXSzF3EWyXTi5XrAdngnuhRyg= -github.com/go-errors/errors v1.4.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= diff --git a/src/assets/assets.go b/src/assets/assets.go new file mode 100644 index 0000000..8f2c9de --- /dev/null +++ b/src/assets/assets.go @@ -0,0 +1,8 @@ +package assets + +import ( + "embed" +) + +//go:embed files/** +var Assets embed.FS diff --git a/src/assets/files/index.html b/src/assets/files/index.html new file mode 100644 index 0000000..0554e60 --- /dev/null +++ b/src/assets/files/index.html @@ -0,0 +1,88 @@ + + + + + Chat Example + + + + +
+ +
+ + +
+ + diff --git a/src/main.go b/src/main.go index 0bbf0f0..2e83122 100644 --- a/src/main.go +++ b/src/main.go @@ -3,28 +3,20 @@ package main import ( "fmt" "log" - "time" - "code.thetadev.de/TSGRain/SEBRAUC/src/rauc" "code.thetadev.de/TSGRain/SEBRAUC/src/server" - "code.thetadev.de/TSGRain/SEBRAUC/src/server/mode" - "code.thetadev.de/TSGRain/SEBRAUC/src/server/stream" "code.thetadev.de/TSGRain/SEBRAUC/src/util" ) func main() { fmt.Println("SEBRAUC " + util.Version()) - mode.Set(util.Mode) - if mode.IsDev() { + if util.TestMode { fmt.Println("Test mode active - no update operations are executed.") fmt.Println("Build with -tags prod to enable live mode.") } - streamer := stream.New(10*time.Second, 1*time.Second, []string{}) - raucUpdater := &rauc.Rauc{} - - srv := server.NewServer(":8080", streamer, raucUpdater) + srv := server.NewServer(":8080") err := srv.Run() if err != nil { log.Fatalln(err) diff --git a/src/model/error.go b/src/model/error.go deleted file mode 100644 index b2f1396..0000000 --- a/src/model/error.go +++ /dev/null @@ -1,24 +0,0 @@ -package model - -// Error model -// -// The Error contains error relevant information. -// -//swagger:model Error -type Error struct { - // The general error message according to HTTP specification. - // - // required: true - // example: Unauthorized - Error string `json:"error"` - // The http error code. - // - // required: true - // example: 500 - StatusCode int `json:"status_code"` - // Concrete error message. - // - // required: true - // example: already running - Message string `json:"msg"` -} diff --git a/src/model/rauc_status.go b/src/model/rauc_status.go index 3a48b53..52eb88b 100644 --- a/src/model/rauc_status.go +++ b/src/model/rauc_status.go @@ -1,9 +1,5 @@ package model -// RaucStatus model -// -// RaucStatus contains information about the current RAUC updater status. -// //swagger:model RaucStatus type RaucStatus struct { // True if the installer is running @@ -23,11 +19,13 @@ type RaucStatus struct { // Installation error message // required: true - // example: Failed to check bundle identifier: Invalid identifier. + //nolint:lll + // example: Failed to check bundle identifier: Invalid identifier. Did you pass a valid RAUC bundle? LastError string `json:"last_error"` // Full command line output of the current installation // required: true - // example: 0% Installing 0% Determining slot states 20% Determining slot states done + //nolint:lll + // example: 0% Installing\n0% Determining slot states\n20% Determining slot states done\n Log string `json:"log"` } diff --git a/src/model/status_message.go b/src/model/status_message.go index d01fe03..256b004 100644 --- a/src/model/status_message.go +++ b/src/model/status_message.go @@ -1,9 +1,5 @@ package model -// StatusMessage model -// -// StatusMessage contains the status of an operation. -// //swagger:model StatusMessage type StatusMessage struct { // Is operation successful? diff --git a/src/model/system_info.go b/src/model/system_info.go index 6c923d7..ec02bbb 100644 --- a/src/model/system_info.go +++ b/src/model/system_info.go @@ -1,9 +1,5 @@ package model -// SystemInfo model -// -// SystemInfo contains information about the running system. -// //swagger:model SystemInfo type SystemInfo struct { // Hostname of the system diff --git a/src/rauc/rauc.go b/src/rauc/rauc.go index e84b142..5c1b4be 100644 --- a/src/rauc/rauc.go +++ b/src/rauc/rauc.go @@ -19,14 +19,23 @@ var ( ) type Rauc struct { - bc util.Broadcaster + bc broadcaster status model.RaucStatus runningMtx sync.Mutex } -func (r *Rauc) SetBroadcaster(bc util.Broadcaster) { - r.bc = bc +type broadcaster interface { + Broadcast(msg []byte) +} + +func NewRauc(bc broadcaster) *Rauc { + r := &Rauc{ + bc: bc, + } + r.bc.Broadcast(r.GetStatusJson()) + + return r } func (r *Rauc) completed(updateFile string) { diff --git a/src/server/docs.go b/src/server/docs.go new file mode 100644 index 0000000..1704805 --- /dev/null +++ b/src/server/docs.go @@ -0,0 +1,17 @@ +// SEBRAUC +// +// REST API for the SEBRAUC firmware updater +// +// --- +// Schemes: http, https +// Version: 0.2.0 +// License: MIT +// +// Consumes: +// - application/json +// +// Produces: +// - application/json +// +// swagger:meta +package server diff --git a/src/server/middleware/cache.go b/src/server/middleware/cache.go deleted file mode 100644 index 8c97b26..0000000 --- a/src/server/middleware/cache.go +++ /dev/null @@ -1,7 +0,0 @@ -package middleware - -import "github.com/gin-gonic/gin" - -func Cache(c *gin.Context) { - c.Writer.Header().Set("Cache-Control", "public, max-age=604800, immutable") -} diff --git a/src/server/middleware/error_handler.go b/src/server/middleware/error_handler.go deleted file mode 100644 index e774c66..0000000 --- a/src/server/middleware/error_handler.go +++ /dev/null @@ -1,58 +0,0 @@ -package middleware - -import ( - "errors" - "fmt" - "net/http" - - "code.thetadev.de/TSGRain/SEBRAUC/src/model" - "code.thetadev.de/TSGRain/SEBRAUC/src/util" - nice "github.com/ekyoung/gin-nice-recovery" - "github.com/gin-gonic/gin" -) - -// ErrorHandler creates a gin middleware for handling errors. -func ErrorHandler(isApi bool) gin.HandlerFunc { - return func(c *gin.Context) { - c.Next() - - if len(c.Errors) > 0 { - for _, e := range c.Errors { - writeError(c, e.Err, isApi) - } - } - } -} - -func PanicHandler(isApi bool) gin.HandlerFunc { - return nice.Recovery(func(c *gin.Context, err interface{}) { - writeError(c, fmt.Errorf("panic: %s", err), isApi) - }) -} - -func writeError(c *gin.Context, err error, isApi bool) { - status := http.StatusInternalServerError - - var httpErr util.HttpError - if errors.As(err, &httpErr) { - status = httpErr.StatusCode() - } - - // only write error message if there is no content - if c.Writer.Size() != -1 { - c.Status(status) - return - } - - if isApi { - // Machine-readable JSON error message - c.JSON(status, &model.Error{ - Error: http.StatusText(status), - StatusCode: status, - Message: err.Error(), - }) - } else { - // Human-readable error message - c.String(status, "%d %s: %s", status, http.StatusText(status), err.Error()) - } -} diff --git a/src/server/server.go b/src/server/server.go index 3f1eafb..7452edd 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -1,25 +1,15 @@ -// SEBRAUC -// -// REST API for the SEBRAUC firmware updater -// -// --- -// Schemes: http, https -// Version: 0.2.0 -// License: MIT -// -// swagger:meta package server import ( "errors" "fmt" - "net/http" + "strings" "time" "code.thetadev.de/TSGRain/SEBRAUC/src/model" - "code.thetadev.de/TSGRain/SEBRAUC/src/server/middleware" + "code.thetadev.de/TSGRain/SEBRAUC/src/rauc" "code.thetadev.de/TSGRain/SEBRAUC/src/server/mode" - "code.thetadev.de/TSGRain/SEBRAUC/src/server/swagger" + "code.thetadev.de/TSGRain/SEBRAUC/src/server/stream" "code.thetadev.de/TSGRain/SEBRAUC/src/sysinfo" "code.thetadev.de/TSGRain/SEBRAUC/src/util" "code.thetadev.de/TSGRain/SEBRAUC/ui" @@ -28,28 +18,17 @@ import ( "github.com/google/uuid" ) -type serverStreamer interface { - util.Broadcaster - Handle(ctx *gin.Context) - Close() -} - -type serverUpdater interface { - GetStatus() model.RaucStatus - RunRauc(updateFile string) error - SetBroadcaster(bc util.Broadcaster) -} - type SEBRAUCServer struct { - address string - streamer serverStreamer - udater serverUpdater - tmpdir string + address string + raucUpdater *rauc.Rauc + streamer *stream.API + tmpdir string } -func NewServer(address string, streamer serverStreamer, - updater serverUpdater) *SEBRAUCServer { - updater.SetBroadcaster(streamer) +func NewServer(address string) *SEBRAUCServer { + streamer := stream.New(10*time.Second, 1*time.Second, []string{}) + + raucUpdater := rauc.NewRauc(streamer) tmpdir, err := util.GetTmpdir() if err != nil { @@ -57,80 +36,68 @@ func NewServer(address string, streamer serverStreamer, } return &SEBRAUCServer{ - address: address, - udater: updater, - streamer: streamer, - tmpdir: tmpdir, + address: address, + raucUpdater: raucUpdater, + streamer: streamer, + tmpdir: tmpdir, } } func (srv *SEBRAUCServer) Run() error { - router := gin.New() - router.Use(gin.Logger()) - _ = router.SetTrustedProxies(nil) + router := gin.Default() if mode.IsDev() { router.Use(cors.Default()) } - router.Use(middleware.ErrorHandler(false), middleware.PanicHandler(false)) - router.NoRoute(func(c *gin.Context) { c.Error(util.ErrPageNotFound) }) - - api := router.Group("/api", - middleware.ErrorHandler(true), middleware.PanicHandler(true)) - // ROUTES - api.GET("/ws", srv.streamer.Handle) - api.GET("/status", srv.controllerStatus) - api.GET("/info", srv.controllerInfo) + router.GET("/api/ws", srv.streamer.Handle) + router.GET("/api/status", srv.controllerStatus) + router.GET("/api/info", srv.controllerInfo) - api.POST("/update", srv.controllerUpdate) - api.POST("/reboot", srv.controllerReboot) - - // Error routes for testing - if mode.IsDev() { - router.GET("/error", srv.controllerError) - router.GET("/panic", srv.controllerPanic) - - api.GET("/error", srv.controllerError) - api.GET("/panic", srv.controllerPanic) - } + router.POST("/api/update", srv.controllerUpdate) + router.POST("/api/reboot", srv.controllerReboot) + // router.StaticFS("/", ui.GetFS()) ui.Register(router) - swagger.Register(router) - return router.Run(srv.address) } -// swagger:operation POST /update startUpdate +// @Description Start the update process +// @Route /update // -// Start the update process +// _Param {name} {in} {goType} {required} {description} +// @Param updateFile form file true "Rauc firmware image file (*.raucb)" // -// --- -// consumes: -// - multipart/form-data -// produces: [application/json] -// parameters: -// - name: updateFile -// in: formData -// description: RAUC firmware image file (*.raucb) -// required: true -// type: file -// responses: -// 200: -// description: Ok -// schema: -// $ref: "#/definitions/StatusMessage" -// 409: -// description: already running -// schema: -// $ref: "#/definitions/Error" -// 500: -// description: Server Error -// schema: -// $ref: "#/definitions/Error" +// _Success {status} {jsonType} {goType} {description} +// @Success 200 object statusMessage +// @Failure 500 object statusMessage "Server error" func (srv *SEBRAUCServer) controllerUpdate(c *gin.Context) { + // swagger:operation POST /update startUpdate + // + // Start the update process + // + // --- + // consumes: + // - multipart/form-data + // produces: [application/json] + // parameters: + // - name: updateFile + // in: formData + // description: Rauc firmware image file (*.raucb) + // required: true + // type: file + // responses: + // 200: + // description: Ok + // schema: + // $ref: "#/definitions/StatusMessage" + // 500: + // description: Server Error + // schema: + // $ref: "#/definitions/StatusMessage" + file, err := c.FormFile("updateFile") if err != nil { c.Error(err) @@ -151,93 +118,100 @@ func (srv *SEBRAUCServer) controllerUpdate(c *gin.Context) { return } - err = srv.udater.RunRauc(updateFile) + err = srv.raucUpdater.RunRauc(updateFile) if err == nil { writeStatus(c, true, "Update started") } else if errors.Is(err, util.ErrAlreadyRunning) { - writeStatus(c, false, "Updater already running") + c.AbortWithError(409, errors.New("already running")) } else { c.Error(err) return } } -// swagger:operation GET /status getStatus -// -// Get the current status of the RAUC updater -// -// --- -// produces: [application/json] -// responses: -// 200: -// description: Ok -// schema: -// $ref: "#/definitions/RaucStatus" -// 500: -// description: Server Error -// schema: -// $ref: "#/definitions/Error" func (srv *SEBRAUCServer) controllerStatus(c *gin.Context) { - c.JSON(http.StatusOK, srv.udater.GetStatus()) + // swagger:operation GET /status getStatus + // + // Get the current status of the RAUC updater + // + // --- + // produces: [application/json] + // responses: + // 200: + // description: Ok + // schema: + // $ref: "#/definitions/RaucStatus" + // 500: + // description: Server Error + // schema: + // $ref: "#/definitions/StatusMessage" + + c.JSON(200, srv.raucUpdater.GetStatus()) } -// swagger:operation GET /info getInfo -// -// Get the current system info -// -// --- -// produces: [application/json] -// responses: -// 200: -// description: Ok -// schema: -// $ref: "#/definitions/SystemInfo" -// 500: -// description: Server Error -// schema: -// $ref: "#/definitions/Error" func (srv *SEBRAUCServer) controllerInfo(c *gin.Context) { + // swagger:operation GET /info getInfo + // + // Get the current system info + // + // --- + // produces: [application/json] + // responses: + // 200: + // description: Ok + // schema: + // $ref: "#/definitions/SystemInfo" + // 500: + // description: Server Error + // schema: + // $ref: "#/definitions/StatusMessage" + info, err := sysinfo.GetSysinfo() if err != nil { c.Error(err) } else { - c.JSON(http.StatusOK, info) + c.JSON(200, info) } } -// swagger:operation GET /reboot startReboot -// -// Reboot the system -// -// --- -// produces: [application/json] -// responses: -// 200: -// description: Ok -// schema: -// $ref: "#/definitions/StatusMessage" -// 500: -// description: Server Error -// schema: -// $ref: "#/definitions/Error" func (srv *SEBRAUCServer) controllerReboot(c *gin.Context) { + // swagger:operation GET /reboot startReboot + // + // Reboot the system + // + // --- + // produces: [application/json] + // responses: + // 200: + // description: Ok + // schema: + // $ref: "#/definitions/StatusMessage" + // 500: + // description: Server Error + // schema: + // $ref: "#/definitions/StatusMessage" + go util.Reboot(5 * time.Second) writeStatus(c, true, "System is rebooting") } -// controllerError throws an error for testing -func (srv *SEBRAUCServer) controllerError(c *gin.Context) { - c.Error(util.HttpErrNew("error test", http.StatusBadRequest)) -} - -// controllerPanic panics for testing -func (srv *SEBRAUCServer) controllerPanic(c *gin.Context) { - panic(errors.New("panic message")) +func errorHandler(c *gin.Context, err error) error { + // API error handling + if strings.HasPrefix(c.FullPath(), "/api") { + writeStatus(c, false, err.Error()) + } + return err } func writeStatus(c *gin.Context, success bool, msg string) { - c.JSON(http.StatusOK, model.StatusMessage{ + status := 200 + + if !success { + status = 500 + } + + c.JSON(status, model.StatusMessage{ Success: success, Msg: msg, }) diff --git a/src/server/swagger/swagger.go b/src/server/swagger/swagger.go deleted file mode 100644 index e48ca00..0000000 --- a/src/server/swagger/swagger.go +++ /dev/null @@ -1,25 +0,0 @@ -package swagger - -import ( - _ "embed" - - "code.thetadev.de/TSGRain/SEBRAUC/src/server/middleware" - "github.com/gin-gonic/gin" -) - -//go:embed swagger.html -var swaggerHtml []byte - -//go:embed swagger.yaml -var swaggerYaml []byte - -func Register(r *gin.Engine) { - swg := r.Group("/api/swagger", middleware.Cache) - - swg.GET("/", func(c *gin.Context) { - c.Data(200, "text/html", swaggerHtml) - }) - swg.GET("/swagger.yaml", func(c *gin.Context) { - c.Data(200, "text/yaml", swaggerYaml) - }) -} diff --git a/src/server/swagger/swagger.html b/src/server/swagger/swagger.html deleted file mode 100644 index cc6855f..0000000 --- a/src/server/swagger/swagger.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - SEBRAUC API documentation - - - - - - - - - - - diff --git a/src/util/commands.go b/src/util/commands.go index 78fb45d..a157fa0 100644 --- a/src/util/commands.go +++ b/src/util/commands.go @@ -3,11 +3,9 @@ package util -import "code.thetadev.de/TSGRain/SEBRAUC/src/server/mode" - const ( RebootCmd = "shutdown -r 0" RaucCmd = "rauc" - Mode = mode.Prod + TestMode = false ) diff --git a/src/util/commands_mock.go b/src/util/commands_mock.go index b447055..d4d1392 100644 --- a/src/util/commands_mock.go +++ b/src/util/commands_mock.go @@ -3,11 +3,9 @@ package util -import "code.thetadev.de/TSGRain/SEBRAUC/src/server/mode" - const ( RebootCmd = "touch /tmp/sebrauc_reboot_test" RaucCmd = "go run code.thetadev.de/TSGRain/SEBRAUC/src/fixtures/rauc_mock" - Mode = mode.Dev + TestMode = true ) diff --git a/src/util/errors.go b/src/util/errors.go index 1d3fc3b..20ee9e4 100644 --- a/src/util/errors.go +++ b/src/util/errors.go @@ -1,12 +1,8 @@ package util -import ( - "errors" - "net/http" -) +import "errors" var ( ErrAlreadyRunning = errors.New("rauc already running") ErrFileDoesNotExist = errors.New("file does not exist") - ErrPageNotFound = HttpErrNew("page not found", http.StatusNotFound) ) diff --git a/src/util/http_error.go b/src/util/http_error.go deleted file mode 100644 index c5d7cf8..0000000 --- a/src/util/http_error.go +++ /dev/null @@ -1,39 +0,0 @@ -package util - -import "errors" - -type HttpError interface { - error - StatusCode() int -} - -type httpErr struct { - err error - statusCode int -} - -func HttpErrWrap(e error, statusCode int) HttpError { - return &httpErr{ - err: e, - statusCode: statusCode, - } -} - -func HttpErrNew(msg string, statusCode int) HttpError { - return HttpErrWrap(errors.New(msg), statusCode) -} - -func (e *httpErr) Error() string { - if e.err == nil { - return "" - } - return e.err.Error() -} - -func (e *httpErr) Unwrap() error { - return e.err -} - -func (e *httpErr) StatusCode() int { - return e.statusCode -} diff --git a/src/util/types.go b/src/util/types.go deleted file mode 100644 index afd106b..0000000 --- a/src/util/types.go +++ /dev/null @@ -1,5 +0,0 @@ -package util - -type Broadcaster interface { - Broadcast(msg []byte) -} diff --git a/src/server/swagger/swagger.yaml b/swagger.yaml similarity index 77% rename from src/server/swagger/swagger.yaml rename to swagger.yaml index 3d85982..14afa86 100644 --- a/src/server/swagger/swagger.yaml +++ b/swagger.yaml @@ -1,40 +1,20 @@ +consumes: + - application/json definitions: - Error: - description: The Error contains error relevant information. - properties: - error: - description: The general error message according to HTTP specification. - example: Unauthorized - type: string - msg: - description: Concrete error message. - example: already running - type: string - status_code: - description: The http error code. - example: 500 - format: int64 - type: integer - required: - - error - - status_code - - msg - title: Error model - type: object RaucStatus: - description: RaucStatus contains information about the current RAUC updater status. properties: installing: description: True if the installer is running type: boolean last_error: description: Installation error message - example: "Failed to check bundle identifier: Invalid identifier." + example: "Failed to check bundle identifier: Invalid identifier. Did you pass + a valid RAUC bundle?" type: string log: description: Full command line output of the current installation - example: 0% Installing 0% Determining slot states 20% Determining slot states - done + example: 0% Installing\n0% Determining slot states\n20% Determining slot states + done\n type: string message: description: Current installation step @@ -52,7 +32,6 @@ definitions: - message - last_error - log - title: RaucStatus model type: object Rootfs: properties: @@ -86,7 +65,6 @@ definitions: - primary type: object StatusMessage: - description: StatusMessage contains the status of an operation. properties: msg: description: Status message text @@ -98,10 +76,8 @@ definitions: required: - success - msg - title: StatusMessage model type: object SystemInfo: - description: SystemInfo contains information about the running system. properties: hostname: description: Hostname of the system @@ -141,7 +117,6 @@ definitions: - rauc_compatible - rauc_variant - rauc_rootfs - title: SystemInfo model type: object info: description: REST API for the SEBRAUC firmware updater @@ -164,7 +139,7 @@ paths: "500": description: Server Error schema: - $ref: "#/definitions/Error" + $ref: "#/definitions/StatusMessage" /reboot: get: description: Reboot the system @@ -179,7 +154,7 @@ paths: "500": description: Server Error schema: - $ref: "#/definitions/Error" + $ref: "#/definitions/StatusMessage" /status: get: description: Get the current status of the RAUC updater @@ -194,7 +169,7 @@ paths: "500": description: Server Error schema: - $ref: "#/definitions/Error" + $ref: "#/definitions/StatusMessage" /update: post: consumes: @@ -202,7 +177,7 @@ paths: description: Start the update process operationId: startUpdate parameters: - - description: RAUC firmware image file (*.raucb) + - description: Rauc firmware image file (*.raucb) in: formData name: updateFile required: true @@ -214,12 +189,12 @@ paths: description: Ok schema: $ref: "#/definitions/StatusMessage" - "409": - description: already running "500": description: Server Error schema: - $ref: "#/definitions/Error" + $ref: "#/definitions/StatusMessage" +produces: + - application/json schemes: - http - https diff --git a/ui/src/sebrauc-client/api.ts b/ui/src/sebrauc-client/api.ts index c98ab0a..015ad91 100644 --- a/ui/src/sebrauc-client/api.ts +++ b/ui/src/sebrauc-client/api.ts @@ -38,32 +38,7 @@ import { } from "./base" /** - * The Error contains error relevant information. - * @export - * @interface ModelError - */ -export interface ModelError { - /** - * The general error message according to HTTP specification. - * @type {string} - * @memberof ModelError - */ - error: string - /** - * Concrete error message. - * @type {string} - * @memberof ModelError - */ - msg: string - /** - * The http error code. - * @type {number} - * @memberof ModelError - */ - status_code: number -} -/** - * RaucStatus contains information about the current RAUC updater status. + * * @export * @interface RaucStatus */ @@ -143,7 +118,7 @@ export interface Rootfs { type: string } /** - * StatusMessage contains the status of an operation. + * * @export * @interface StatusMessage */ @@ -162,7 +137,7 @@ export interface StatusMessage { success: boolean } /** - * SystemInfo contains information about the running system. + * * @export * @interface SystemInfo */ @@ -315,7 +290,7 @@ export const DefaultApiAxiosParamCreator = function (configuration?: Configurati }, /** * Start the update process - * @param {any} updateFile RAUC firmware image file (*.raucb) + * @param {any} updateFile Rauc firmware image file (*.raucb) * @param {*} [options] Override http request option. * @throws {RequiredError} */ @@ -429,7 +404,7 @@ export const DefaultApiFp = function (configuration?: Configuration) { }, /** * Start the update process - * @param {any} updateFile RAUC firmware image file (*.raucb) + * @param {any} updateFile Rauc firmware image file (*.raucb) * @param {*} [options] Override http request option. * @throws {RequiredError} */ @@ -496,7 +471,7 @@ export const DefaultApiFactory = function ( }, /** * Start the update process - * @param {any} updateFile RAUC firmware image file (*.raucb) + * @param {any} updateFile Rauc firmware image file (*.raucb) * @param {*} [options] Override http request option. * @throws {RequiredError} */ @@ -553,7 +528,7 @@ export class DefaultApi extends BaseAPI { /** * Start the update process - * @param {any} updateFile RAUC firmware image file (*.raucb) + * @param {any} updateFile Rauc firmware image file (*.raucb) * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof DefaultApi diff --git a/ui/ui.go b/ui/ui.go index 66329e8..a10fda6 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -7,7 +7,6 @@ import ( "io/fs" "net/http" - "code.thetadev.de/TSGRain/SEBRAUC/src/server/middleware" "code.thetadev.de/TSGRain/SEBRAUC/src/util" "code.thetadev.de/TSGRain/ginzip" "github.com/gin-gonic/gin" @@ -37,7 +36,7 @@ func distFS() fs.FS { func Register(r *gin.Engine) { indexHandler := getIndexHandler() - ui := r.Group("/", ginzip.New(ginzip.DefaultOptions()), middleware.Cache) + ui := r.Group("/", ginzip.New(ginzip.DefaultOptions())) ui.GET("/", indexHandler) ui.GET("/index.html", indexHandler)