summaryrefslogtreecommitdiffstats
path: root/templates/machine/imx8mqevk/50_setup.sh
diff options
context:
space:
mode:
authorAnusha Gugale <external.agogale@jp.adit-jv.com>2021-09-02 11:19:06 +0530
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>2021-09-27 07:22:28 +0000
commit8c4b3948fa6aa8d84e4fe5cb4b3b8cc05ce04c5e (patch)
tree46de0026ed55dc2f05a4b694faad247396fc70bf /templates/machine/imx8mqevk/50_setup.sh
parentfab29403e0da3ff8ee6c9fef76e115aa53a06ff7 (diff)
Make the mode configurable at build time for the waltham transmitter
- Create a TRANSMITTER_OUTPUT_MODE variable with a known default - Use this to update the transmitter-output.cfg fragment - Users can redefine this variable based on their needs - While at it do the same for HOST and PORT Bug-AGL: SPEC-4030 Signed-off-by: Anusha Gugale <external.agogale@jp.adit-jv.com> Signed-off-by: Jan-Simon Möller <jsmoeller@linuxfoundation.org> Change-Id: I32374186bdce3171a1f7ad4026e10c6448edaec6 Reviewed-on: https://gerrit.automotivelinux.org/gerrit/c/AGL/meta-agl/+/26609 Tested-by: Jenkins Job builder account ci-image-build: Jenkins Job builder account ci-image-boot-test: Jenkins Job builder account
Diffstat (limited to 'templates/machine/imx8mqevk/50_setup.sh')
0 files changed, 0 insertions, 0 deletions
'>199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278
// TODO add Doc
//
package main

import (
	"fmt"
	"os"
	"os/exec"
	"os/signal"
	"path/filepath"
	"syscall"
	"time"

	"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"
	appUsage       = "X(cross) Development System Server"
)

var appAuthors = []cli.Author{
	cli.Author{Name: "Sebastien Douheret", Email: "sebastien@iot.bzh"},
}

// AppVersion is the version of this application
var AppVersion = "?.?.?"

// AppSubVersion is the git tag id added to version string
// 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
	LogLevelSilly bool
	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{}

	sillyVal, sillyLog := os.LookupEnv("XDS_LOG_SILLY")

	// Define default configuration
	ctx := Context{
		ProgName:      cliCtx.App.Name,
		Cli:           cliCtx,
		Log:           log,
		LogLevelSilly: (sillyLog && sillyVal == "1"),
		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)

	// Load config
	cfg, err := xdsconfig.Init(ctx.Cli, ctx.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, ctx.LogLevelSilly)

	// Run Web Server until exit requested (blocking call)
	if err = ctx.WWWServer.Serve(); err != nil {
		ctx.Log.Println(err)
		return cli.NewExitError(err, -7)
	}

	return cli.NewExitError("Program exited ", -99)
}

// main
func main() {

	// Create a new instance of the logger
	log := logrus.New()

	// Create a new App instance
	app := cli.NewApp()
	app.Name = appName
	app.Description = appDescription
	app.Usage = appUsage
	app.Version = AppVersion + " (" + AppSubVersion + ")"
	app.Authors = appAuthors
	app.Copyright = appCopyright
	app.Metadata = make(map[string]interface{})
	app.Metadata["version"] = AppVersion
	app.Metadata["git-tag"] = AppSubVersion
	app.Metadata["logger"] = log

	app.Flags = []cli.Flag{
		cli.StringFlag{
			Name:   "config, c",
			Usage:  "JSON config file to use\n\t",
			EnvVar: "APP_CONFIG",
		},
		cli.StringFlag{
			Name:   "log, l",
			Value:  "error",
			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
	app.Action = xdsApp

	app.Run(os.Args)
}