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 }