X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=main.go;h=0637de9911151f4f6ca37c77cf364973e0007e7b;hb=be47274f79eb0843da4d805cfc417fbf7921379c;hp=8af553db02c3ec2ec0d6219479d6b269da3d64ab;hpb=8119c1641e88ee5020e380c08119f508c6e24222;p=src%2Fxds%2Fxds-server.git diff --git a/main.go b/main.go index 8af553d..0637de9 100644 --- a/main.go +++ b/main.go @@ -1,30 +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" - "path/filepath" - "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/folder" - "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" ) @@ -39,188 +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 - MFolders *model.Folders - 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(0) -} - -// Helper function to log message on both stdout and logger -func logPrint(ctx *Context, format string, args ...interface{}) { - fmt.Printf(format, args...) - if ctx.Log.Out != os.Stdout { - ctx.Log.Infof(format, args...) - } -} - // 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) + ctxSvr.Config, err = xdsconfig.Init(cliCtx, ctxSvr.Log) if err != nil { return cli.NewExitError(err, -2) } - ctx.Config = cfg - // Logs redirected into a file when logfile option or logsDir config is set - ctx.Config.LogVerboseOut = os.Stderr - if ctx.Config.FileConf.LogsDir != "" { - if ctx.Config.Options.LogFile != "stdout" { - logFile := ctx.Config.Options.LogFile - - fdL, err := os.OpenFile(logFile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) - if err != nil { - msgErr := fmt.Sprintf("Cannot create log file %s", logFile) - return cli.NewExitError(msgErr, int(syscall.EPERM)) - } - ctx.Log.Out = fdL - - logPrint(ctx, "Logging file: %s\n", logFile) - } - - logFileHTTPReq := filepath.Join(ctx.Config.FileConf.LogsDir, "xds-server-verbose.log") - fdLH, err := os.OpenFile(logFileHTTPReq, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) - if err != nil { - msgErr := fmt.Sprintf("Cannot create log file %s", logFileHTTPReq) - return cli.NewExitError(msgErr, int(syscall.EPERM)) - } - ctx.Config.LogVerboseOut = fdLH - - logPrint(ctx, "Logging file for HTTP requests: %s\n", logFileHTTPReq) - } - - // Create syncthing instance when section "syncthing" is present in config.json - if ctx.Config.FileConf.SThgConf != nil { - ctx.SThg = st.NewSyncThing(ctx.Config, ctx.Log) - } - - // Start local instance of Syncthing and Syncthing-notify - if ctx.SThg != nil { - ctx.Log.Infof("Starting Syncthing...") - ctx.SThgCmd, err = ctx.SThg.Start() - if err != nil { - return cli.NewExitError(err, -4) - } - logPrint(ctx, "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, -4) - } - logPrint(ctx, "Syncthing-inotify started (PID %d)\n", ctx.SThgInotCmd.Process.Pid) - - // Establish connection with local Syncthing (retry if connection fail) - logPrint(ctx, "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, -4) - } - - // FIXME: do we still need Builder notion ? if no cleanup - if ctx.Config.Builder, err = xdsconfig.NewBuilderConfig(ctx.SThg.MyID); err != nil { - return cli.NewExitError(err, -4) - } - ctx.Config.SupportedSharing[folder.TypeCloudSync] = true - } - - // Init model folder - ctx.MFolders = model.FoldersNew(ctx.Config, ctx.SThg) - - // Load initial folders config from disk - if err := ctx.MFolders.LoadConfig(); err != nil { - return cli.NewExitError(err, -5) - } - - // Init cross SDKs - ctx.SDKs, err = crosssdk.Init(ctx.Config, ctx.Log) - if err != nil { - return cli.NewExitError(err, -6) - } - - // Create Web Server - ctx.WWWServer = webserver.New(ctx.Config, ctx.MFolders, ctx.SDKs, ctx.Log) - - // Run Web Server until exit requested (blocking call) - if err = ctx.WWWServer.Serve(); err != nil { - ctx.Log.Println(err) - return cli.NewExitError(err, -7) - } + // Run XDS Server (main loop) + errCode, err := ctxSvr.Run() - return cli.NewExitError("Program exited ", -99) + return cli.NewExitError(err, errCode) } // main