X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=main.go;h=0637de9911151f4f6ca37c77cf364973e0007e7b;hb=be47274f79eb0843da4d805cfc417fbf7921379c;hp=8d49babef23e1b7e069be6391d7de28392a6118e;hpb=61cd1a97e20d58e77470610cb8ee0bd2d5b6d395;p=src%2Fxds%2Fxds-server.git diff --git a/main.go b/main.go index 8d49bab..0637de9 100644 --- a/main.go +++ b/main.go @@ -1,29 +1,39 @@ -// TODO add Doc -// +/* + * Copyright (C) 2017-2018 "IoT.bzh" + * Author Sebastien Douheret + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + * xds-server: X(cross) Development System server. + */ + package main import ( "fmt" "os" - "os/exec" - "os/signal" - "strings" - "syscall" - "time" + "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xdsconfig" + "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xdsserver" "github.com/Sirupsen/logrus" "github.com/codegangsta/cli" - "github.com/iotbzh/xds-server/lib/crosssdk" - "github.com/iotbzh/xds-server/lib/model" - "github.com/iotbzh/xds-server/lib/syncthing" - "github.com/iotbzh/xds-server/lib/webserver" - "github.com/iotbzh/xds-server/lib/xdsconfig" ) const ( appName = "xds-server" appDescription = "X(cross) Development System Server is a web server that allows to remotely cross build applications." - appCopyright = "Apache-2.0" + appCopyright = "Copyright (C) 2017-2018 IoT.bzh - Apache-2.0" appUsage = "X(cross) Development System Server" ) @@ -38,178 +48,23 @@ var AppVersion = "?.?.?" // Should be set by compilation -ldflags "-X main.AppSubVersion=xxx" var AppSubVersion = "unknown-dev" -// Context holds the XDS server context -type Context struct { - ProgName string - Cli *cli.Context - Config *xdsconfig.Config - Log *logrus.Logger - SThg *st.SyncThing - SThgCmd *exec.Cmd - SThgInotCmd *exec.Cmd - MFolder *model.Folder - SDKs *crosssdk.SDKs - WWWServer *webserver.Server - Exit chan os.Signal -} - -// NewContext Create a new instance of XDS server -func NewContext(cliCtx *cli.Context) *Context { - var err error - - // Set logger level and formatter - log := cliCtx.App.Metadata["logger"].(*logrus.Logger) - - logLevel := cliCtx.GlobalString("log") - if logLevel == "" { - logLevel = "error" // FIXME get from Config DefaultLogLevel - } - if log.Level, err = logrus.ParseLevel(logLevel); err != nil { - fmt.Printf("Invalid log level : \"%v\"\n", logLevel) - os.Exit(1) - } - log.Formatter = &logrus.TextFormatter{} - - // Define default configuration - ctx := Context{ - ProgName: cliCtx.App.Name, - Cli: cliCtx, - Log: log, - Exit: make(chan os.Signal, 1), - } - - // register handler on SIGTERM / exit - signal.Notify(ctx.Exit, os.Interrupt, syscall.SIGTERM) - go handlerSigTerm(&ctx) - - return &ctx -} - -// Handle exit and properly stop/close all stuff -func handlerSigTerm(ctx *Context) { - <-ctx.Exit - if ctx.SThg != nil { - ctx.Log.Infof("Stoping Syncthing... (PID %d)", ctx.SThgCmd.Process.Pid) - ctx.SThg.Stop() - ctx.Log.Infof("Stoping Syncthing-inotify... (PID %d)", ctx.SThgInotCmd.Process.Pid) - ctx.SThg.StopInotify() - } - if ctx.WWWServer != nil { - ctx.Log.Infof("Stoping Web server...") - ctx.WWWServer.Stop() - } - os.Exit(1) -} - // XDS Server application main routine func xdsApp(cliCtx *cli.Context) error { var err error // Create XDS server context - ctx := NewContext(cliCtx) + ctxSvr := xdsserver.NewXdsServer(cliCtx) // Load config - cfg, err := xdsconfig.Init(ctx.Cli, ctx.Log) - if err != nil { - return cli.NewExitError(err, 2) - } - ctx.Config = cfg - - // TODO allow to redirect stdout/sterr into logs file - //logFilename := filepath.Join(ctx.Config.FileConf.LogsDir + "xds-server.log") - - // FIXME - add a builder interface and support other builder type (eg. native) - builderType := "syncthing" - - switch builderType { - case "syncthing": - - // Start local instance of Syncthing and Syncthing-notify - ctx.SThg = st.NewSyncThing(ctx.Config, ctx.Log) - - ctx.Log.Infof("Starting Syncthing...") - ctx.SThgCmd, err = ctx.SThg.Start() - if err != nil { - return cli.NewExitError(err, 2) - } - fmt.Printf("Syncthing started (PID %d)\n", ctx.SThgCmd.Process.Pid) - - ctx.Log.Infof("Starting Syncthing-inotify...") - ctx.SThgInotCmd, err = ctx.SThg.StartInotify() - if err != nil { - return cli.NewExitError(err, 2) - } - fmt.Printf("Syncthing-inotify started (PID %d)\n", ctx.SThgInotCmd.Process.Pid) - - // Establish connection with local Syncthing (retry if connection fail) - fmt.Printf("Establishing connection with Syncthing...\n") - time.Sleep(2 * time.Second) - maxRetry := 30 - retry := maxRetry - err = nil - for retry > 0 { - if err = ctx.SThg.Connect(); err == nil { - break - } - ctx.Log.Warningf("Establishing connection to Syncthing (retry %d/%d)", retry, maxRetry) - time.Sleep(time.Second) - retry-- - } - if err != nil || retry == 0 { - return cli.NewExitError(err, 2) - } - - // Retrieve Syncthing config - id, err := ctx.SThg.IDGet() - if err != nil { - return cli.NewExitError(err, 2) - } - - if ctx.Config.Builder, err = xdsconfig.NewBuilderConfig(id); err != nil { - return cli.NewExitError(err, 2) - } - - // Retrieve initial Syncthing config - - // FIXME: cannot retrieve default SDK, need to save on disk or somewhere - // else all config to be able to restore it. - defaultSdk := "" - stCfg, err := ctx.SThg.ConfigGet() - if err != nil { - return cli.NewExitError(err, 2) - } - for _, stFld := range stCfg.Folders { - relativePath := strings.TrimPrefix(stFld.RawPath, ctx.Config.ShareRootDir) - if relativePath == "" { - relativePath = stFld.RawPath - } - - newFld := xdsconfig.NewFolderConfig(stFld.ID, stFld.Label, ctx.Config.ShareRootDir, strings.TrimRight(relativePath, "/"), defaultSdk) - ctx.Config.Folders = ctx.Config.Folders.Update(xdsconfig.FoldersConfig{newFld}) - } - - // Init model folder - ctx.MFolder = model.NewFolder(ctx.Config, ctx.SThg) - - default: - err = fmt.Errorf("Unsupported builder type") - return cli.NewExitError(err, 3) - } - - // Init cross SDKs - ctx.SDKs, err = crosssdk.Init(ctx.Config, ctx.Log) + ctxSvr.Config, err = xdsconfig.Init(cliCtx, ctxSvr.Log) if err != nil { - return cli.NewExitError(err, 2) + return cli.NewExitError(err, -2) } - // Create and start Web Server - ctx.WWWServer = webserver.New(ctx.Config, ctx.MFolder, ctx.SDKs, ctx.Log) - if err = ctx.WWWServer.Serve(); err != nil { - ctx.Log.Println(err) - return cli.NewExitError(err, 3) - } + // Run XDS Server (main loop) + errCode, err := ctxSvr.Run() - return cli.NewExitError("Program exited ", 4) + return cli.NewExitError(err, errCode) } // main @@ -243,6 +98,17 @@ func main() { Usage: "logging level (supported levels: panic, fatal, error, warn, info, debug)\n\t", EnvVar: "LOG_LEVEL", }, + cli.StringFlag{ + Name: "logfile", + Value: "stdout", + Usage: "filename where logs will be redirected (default stdout)\n\t", + EnvVar: "LOG_FILENAME", + }, + cli.BoolFlag{ + Name: "no-folderconfig, nfc", + Usage: fmt.Sprintf("Do not read folder config file (%s)\n\t", xdsconfig.FoldersConfigFilename), + EnvVar: "NO_FOLDERCONFIG", + }, } // only one action: Web Server