github.com/simpleiot/simpleiot@v0.18.3/server/args.go (about)

     1  package server
     2  
     3  import (
     4  	"flag"
     5  	"log"
     6  	"os"
     7  	"path"
     8  	"strconv"
     9  
    10  	"github.com/simpleiot/simpleiot/assets/files"
    11  	"github.com/simpleiot/simpleiot/system"
    12  )
    13  
    14  // Args parses common SIOT command line options
    15  func Args(args []string, flags *flag.FlagSet) (Options, error) {
    16  	defaultNatsServer := "nats://127.0.0.1:4222"
    17  
    18  	// =============================================
    19  	// Command line options
    20  	// =============================================
    21  	if flags == nil {
    22  		flags = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
    23  	}
    24  
    25  	// configuration options
    26  	flagDebugHTTP := flags.Bool("debugHttp", false, "dump http requests")
    27  	flagDebugLifecycle := flags.Bool("debugLifecycle", false, "debug program lifecycle")
    28  	flagNatsServer := flags.String("natsServer", defaultNatsServer, "NATS Server")
    29  	flagNatsDisableServer := flags.Bool("natsDisableServer", false, "disable NATS server (if you want to run NATS separately)")
    30  	flagStore := flags.String("store", "siot.sqlite", "store file, default siot.sqlite")
    31  	flagResetStore := flags.Bool("resetStore", false, "permanently wipe data in store at start-up")
    32  	flagAuthToken := flags.String("token", "", "auth token")
    33  	flagSyslog := flags.Bool("syslog", false, "log to syslog instead of stdout")
    34  	flagDev := flags.Bool("dev", false, "run server in development mode")
    35  	flagCustomUIDir := flags.String("customUIDir", "", "pass custom UI directory")
    36  	flagUIAssetsDebug := flags.Bool("UIAssetsDebug", false, "Dump asset files for debugging")
    37  
    38  	if err := flags.Parse(args); err != nil {
    39  		return Options{}, err
    40  	}
    41  
    42  	// =============================================
    43  	// General Setup
    44  	// =============================================
    45  
    46  	// set up local database
    47  	dataDir := os.Getenv("SIOT_DATA")
    48  	if dataDir == "" {
    49  		dataDir = "./"
    50  	}
    51  
    52  	// populate files in file system
    53  	err := files.UpdateFiles(dataDir)
    54  
    55  	if err != nil {
    56  		log.Println("Error updating files:", err)
    57  		os.Exit(-1)
    58  	}
    59  
    60  	storeFilePath := path.Join(dataDir, *flagStore)
    61  
    62  	// =============================================
    63  	// NATS stuff
    64  	// =============================================
    65  
    66  	// populate general args
    67  	natsPort := 4222
    68  
    69  	natsPortE := os.Getenv("SIOT_NATS_PORT")
    70  	if natsPortE != "" {
    71  		n, err := strconv.Atoi(natsPortE)
    72  		if err != nil {
    73  			log.Println("Error parsing SIOT_NATS_PORT:", err)
    74  			os.Exit(-1)
    75  		}
    76  		natsPort = n
    77  	}
    78  
    79  	natsHTTPPort := 8222
    80  
    81  	natsHTTPPortE := os.Getenv("SIOT_NATS_HTTP_PORT")
    82  	if natsHTTPPortE != "" {
    83  		n, err := strconv.Atoi(natsHTTPPortE)
    84  		if err != nil {
    85  			log.Println("Error parsing SIOT_NATS_HTTP_PORT:", err)
    86  			os.Exit(-1)
    87  		}
    88  		natsHTTPPort = n
    89  	}
    90  
    91  	natsWSPort := 9222
    92  	natsWSPortE := os.Getenv("SIOT_NATS_WS_PORT")
    93  	if natsWSPortE != "" {
    94  		n, err := strconv.Atoi(natsWSPortE)
    95  		if err != nil {
    96  			log.Println("Error parsing SIOT_NATS_WS_PORT:", err)
    97  			os.Exit(-1)
    98  		}
    99  		natsWSPort = n
   100  	}
   101  
   102  	natsServer := *flagNatsServer
   103  	// only consider env if command line option is something different
   104  	// that default
   105  	if natsServer == defaultNatsServer {
   106  		natsServerE := os.Getenv("SIOT_NATS_SERVER")
   107  		if natsServerE != "" {
   108  			natsServer = natsServerE
   109  		}
   110  	}
   111  
   112  	natsTLSCert := os.Getenv("SIOT_NATS_TLS_CERT")
   113  	natsTLSKey := os.Getenv("SIOT_NATS_TLS_KEY")
   114  	natsTLSTimeoutS := os.Getenv("SIOT_NATS_TLS_TIMEOUT")
   115  
   116  	natsTLSTimeout := 0.5
   117  
   118  	if natsTLSTimeoutS != "" {
   119  		natsTLSTimeout, err = strconv.ParseFloat(natsTLSTimeoutS, 64)
   120  		if err != nil {
   121  			log.Println("Error parsing nats TLS timeout:", err)
   122  			os.Exit(-1)
   123  		}
   124  	}
   125  
   126  	authToken := os.Getenv("SIOT_AUTH_TOKEN")
   127  	if *flagAuthToken != "" {
   128  		authToken = *flagAuthToken
   129  	}
   130  
   131  	if *flagSyslog {
   132  		err := system.EnableSyslog()
   133  		if err != nil {
   134  			log.Println("Error enabling syslog:", err)
   135  		}
   136  	}
   137  
   138  	// finally, start web server
   139  	port := os.Getenv("SIOT_HTTP_PORT")
   140  	if port == "" {
   141  		port = "8118"
   142  	}
   143  
   144  	osVersionField := os.Getenv("OS_VERSION_FIELD")
   145  	if osVersionField == "" {
   146  		osVersionField = "VERSION"
   147  	}
   148  
   149  	// set up particle connection if configured
   150  	// todo -- move this to a node
   151  	particleAPIKey := os.Getenv("SIOT_PARTICLE_API_KEY")
   152  
   153  	// TODO, convert this to builder pattern
   154  	o := Options{
   155  		StoreFile:         storeFilePath,
   156  		ResetStore:        *flagResetStore,
   157  		HTTPPort:          port,
   158  		DebugHTTP:         *flagDebugHTTP,
   159  		DebugLifecycle:    *flagDebugLifecycle,
   160  		NatsServer:        natsServer,
   161  		NatsDisableServer: *flagNatsDisableServer,
   162  		NatsPort:          natsPort,
   163  		NatsHTTPPort:      natsHTTPPort,
   164  		NatsWSPort:        natsWSPort,
   165  		NatsTLSCert:       natsTLSCert,
   166  		NatsTLSKey:        natsTLSKey,
   167  		NatsTLSTimeout:    natsTLSTimeout,
   168  		AuthToken:         authToken,
   169  		ParticleAPIKey:    particleAPIKey,
   170  		OSVersionField:    osVersionField,
   171  		Dev:               *flagDev,
   172  		CustomUIDir:       *flagCustomUIDir,
   173  		UIAssetsDebug:     *flagUIAssetsDebug,
   174  	}
   175  
   176  	return o, nil
   177  
   178  }