Skip to content

Commit

Permalink
refactor(@desktop/general): env variables sorted and CL args introduced
Browse files Browse the repository at this point in the history
- Necessary env variables to build the app:
STATUS_BUILD_INFURA_TOKEN
STATUS_BUILD_INFURA_TOKEN_SECRET
STATUS_BUILD_POKT_TOKEN
STATUS_BUILD_OPENSEA_API_KEY
STATUS_BUILD_ALCHEMY_ETHEREUM_MAINNET_TOKEN
STATUS_BUILD_ALCHEMY_ETHEREUM_GOERLI_TOKEN
STATUS_BUILD_ALCHEMY_ARBITRUM_MAINNET_TOKEN
STATUS_BUILD_ALCHEMY_ARBITRUM_GOERLI_TOKEN
STATUS_BUILD_ALCHEMY_OPTIMISM_MAINNET_TOKEN
STATUS_BUILD_ALCHEMY_OPTIMISM_GOERLI_TOKEN

- The list of available env variables as well as CL arguments can be seen running
the app providing `--help` argument. All env vars are prefixed with `STATUS_RUNTIME_`.
  • Loading branch information
saledjenic committed Oct 24, 2023
1 parent 8caa72c commit f88c23d
Show file tree
Hide file tree
Showing 16 changed files with 304 additions and 182 deletions.
2 changes: 1 addition & 1 deletion ci/Jenkinsfile.combined
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.7.16'
library 'status-jenkins-lib@v1.7.17'

pipeline {
agent { label 'linux' }
Expand Down
2 changes: 1 addition & 1 deletion ci/Jenkinsfile.linux
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.7.16'
library 'status-jenkins-lib@v1.7.17'

/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
Expand Down
2 changes: 1 addition & 1 deletion ci/Jenkinsfile.macos
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.7.16'
library 'status-jenkins-lib@v1.7.17'

/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
Expand Down
4 changes: 2 additions & 2 deletions ci/Jenkinsfile.tests-e2e
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.7.16'
library 'status-jenkins-lib@v1.7.17'

/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
Expand Down Expand Up @@ -97,7 +97,7 @@ pipeline {

stage('Client') {
environment {
GANACHE_NETWORK_RPC_URL = "http://localhost:${env.GANACHE_RPC_PORT}"
STATUS_RUNTIME_GANACHE_NETWORK_RPC_URL = "http://localhost:${env.GANACHE_RPC_PORT}"
}
steps { script {
linux.bundle('nim_status_client')
Expand Down
2 changes: 1 addition & 1 deletion ci/Jenkinsfile.tests-nim
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.7.16'
library 'status-jenkins-lib@v1.7.17'

/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
Expand Down
2 changes: 1 addition & 1 deletion ci/Jenkinsfile.windows
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.7.16'
library 'status-jenkins-lib@v1.7.17'

/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
Expand Down
2 changes: 1 addition & 1 deletion ci/cpp/Jenkinsfile.linux
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.7.16'
library 'status-jenkins-lib@v1.7.17'

/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
Expand Down
2 changes: 1 addition & 1 deletion ci/cpp/Jenkinsfile.macos
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.7.16'
library 'status-jenkins-lib@v1.7.17'

/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
Expand Down
2 changes: 1 addition & 1 deletion ci/cpp/Jenkinsfile.windows
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.7.16'
library 'status-jenkins-lib@v1.7.17'

/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
Expand Down
8 changes: 4 additions & 4 deletions src/app/boot/app_controller.nim
Original file line number Diff line number Diff line change
Expand Up @@ -135,10 +135,10 @@ proc connect(self: AppController) =
if not existsEnv("LOG_LEVEL"):
self.statusFoundation.events.on(node_configuration_service.SIGNAL_NODE_LOG_LEVEL_UPDATE) do(a: Args):
let args = NodeLogLevelUpdatedArgs(a)
if args.logLevel == LogLevel.DEBUG:
setLogLevel(LogLevel.DEBUG)
if args.logLevel == chronicles.LogLevel.DEBUG:
setLogLevel(chronicles.LogLevel.DEBUG)
elif defined(production):
setLogLevel(LogLevel.INFO)
setLogLevel(chronicles.LogLevel.INFO)

proc newAppController*(statusFoundation: StatusFoundation): AppController =
result = AppController()
Expand Down Expand Up @@ -440,7 +440,7 @@ proc load(self: AppController) =
# Apply runtime log level settings
if not existsEnv("LOG_LEVEL"):
if self.nodeConfigurationService.isDebugEnabled():
setLogLevel(LogLevel.DEBUG)
setLogLevel(chronicles.LogLevel.DEBUG)

# load main module
self.mainModule.load(
Expand Down
72 changes: 2 additions & 70 deletions src/app_service/common/network_constants.nim
Original file line number Diff line number Diff line change
@@ -1,74 +1,6 @@
import json, os, chronicles, strutils
import json, os, strutils
import ../../constants as main_constants

proc resolveEnvVar(envVar: string, defaultValue: string): string =
let envVarValue = $getEnv(envVar)
if envVarValue != "":
return envVarValue
else:
return defaultValue

# provider Tokens
# allow runtime override via environment variable; core contributors can set a
# release token in this way for local development

# set via `nim c` param `-d:POKT_TOKEN:[token]`; should be set in CI/release builds
const POKT_TOKEN {.strdefine.} = ""
let POKT_TOKEN_RESOLVED* = resolveEnvVar("POKT_TOKEN", POKT_TOKEN)

# set via `nim c` param `-d:INFURA_TOKEN:[token]`; should be set in CI/release builds
const INFURA_TOKEN {.strdefine.} = ""
let INFURA_TOKEN_RESOLVED* = resolveEnvVar("INFURA_TOKEN", INFURA_TOKEN)

# set via `nim c` param `-d:INFURA_TOKEN_SECRET:[token]`; should be set in CI/release builds
const INFURA_TOKEN_SECRET {.strdefine.} = ""
let INFURA_TOKEN_SECRET_RESOLVED* = resolveEnvVar("INFURA_TOKEN_SECRET", INFURA_TOKEN_SECRET)

# set via `nim c` param `-d:ALCHEMY_ETHEREUM_MAINNET_TOKEN:[token]`; should be set in CI/release builds
const ALCHEMY_ETHEREUM_MAINNET_TOKEN {.strdefine.} = ""
let ALCHEMY_ETHEREUM_MAINNET_TOKEN_RESOLVED* = resolveEnvVar("ALCHEMY_ETHEREUM_MAINNET_TOKEN", ALCHEMY_ETHEREUM_MAINNET_TOKEN)

# set via `nim c` param `-d:ALCHEMY_ETHEREUM_GOERLI_TOKEN:[token]`; should be set in CI/release builds
const ALCHEMY_ETHEREUM_GOERLI_TOKEN {.strdefine.} = ""
let ALCHEMY_ETHEREUM_GOERLI_TOKEN_RESOLVED* = resolveEnvVar("ALCHEMY_ETHEREUM_GOERLI_TOKEN", ALCHEMY_ETHEREUM_GOERLI_TOKEN)

# set via `nim c` param `-d:ALCHEMY_ARBITRUM_MAINNET_TOKEN:[token]`; should be set in CI/release builds
const ALCHEMY_ARBITRUM_MAINNET_TOKEN {.strdefine.} = ""
let ALCHEMY_ARBITRUM_MAINNET_TOKEN_RESOLVED* = resolveEnvVar("ALCHEMY_ARBITRUM_MAINNET_TOKEN", ALCHEMY_ARBITRUM_MAINNET_TOKEN)

# set via `nim c` param `-d:ALCHEMY_ARBITRUM_GOERLI_TOKEN:[token]`; should be set in CI/release builds
const ALCHEMY_ARBITRUM_GOERLI_TOKEN {.strdefine.} = ""
let ALCHEMY_ARBITRUM_GOERLI_TOKEN_RESOLVED* = resolveEnvVar("ALCHEMY_ARBITRUM_GOERLI_TOKEN", ALCHEMY_ARBITRUM_GOERLI_TOKEN)

# set via `nim c` param `-d:ALCHEMY_OPTIMISM_MAINNET_TOKEN:[token]`; should be set in CI/release builds
const ALCHEMY_OPTIMISM_MAINNET_TOKEN {.strdefine.} = ""
let ALCHEMY_OPTIMISM_MAINNET_TOKEN_RESOLVED* = resolveEnvVar("ALCHEMY_OPTIMISM_MAINNET_TOKEN", ALCHEMY_OPTIMISM_MAINNET_TOKEN)

# set via `nim c` param `-d:ALCHEMY_OPTIMISM_GOERLI_TOKEN:[token]`; should be set in CI/release builds
const ALCHEMY_OPTIMISM_GOERLI_TOKEN {.strdefine.} = ""
let ALCHEMY_OPTIMISM_GOERLI_TOKEN_RESOLVED* = resolveEnvVar("ALCHEMY_OPTIMISM_GOERLI_TOKEN", ALCHEMY_OPTIMISM_GOERLI_TOKEN)

# set via `nim c` param `-d:OPENSEA_API_KEY:[token]`; should be set in CI/release builds
const OPENSEA_API_KEY {.strdefine.} = ""
let OPENSEA_API_KEY_RESOLVED* = resolveEnvVar("OPENSEA_API_KEY", OPENSEA_API_KEY)

const GANACHE_NETWORK_RPC_URL = $getEnv("GANACHE_NETWORK_RPC_URL")

const DEFAULT_TORRENT_CONFIG_PORT = 0 # Random
let TORRENT_CONFIG_PORT* = if (existsEnv("TORRENT_PORT")):
parseInt($getEnv("TORRENT_PORT"))
else:
DEFAULT_TORRENT_CONFIG_PORT

const DEFAULT_WAKU_V2_PORT = 0 # Random
let WAKU_V2_PORT* = if (existsEnv("WAKU_PORT")):
parseInt($getEnv("WAKU_PORT"))
else:
DEFAULT_WAKU_V2_PORT

let DEFAULT_TORRENT_CONFIG_DATADIR* = joinPath(main_constants.defaultDataDir(), "data", "archivedata")
let DEFAULT_TORRENT_CONFIG_TORRENTDIR* = joinPath(main_constants.defaultDataDir(), "data", "torrents")

var NETWORKS* = %* [
{
"chainId": 1,
Expand Down Expand Up @@ -344,7 +276,7 @@ var NODE_CONFIG* = %* {
# Docs: https://pkg.go.dev/gopkg.in/natefinch/lumberjack.v2@v2.0.0#readme-cleaning-up-old-log-files
"LogMaxBackups": 1,
"LogMaxSize": 100, # MB
"LogLevel": $LogLevel.INFO,
"LogLevel": main_constants.DEFAULT_LOG_LEVEL,
"MailserversConfig": {
"Enabled": true
},
Expand Down
79 changes: 61 additions & 18 deletions src/app_service/service/accounts/service.nim
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ QtObject:
"wallet-root-address": account.derivedAccounts.walletRoot.address,
"preview-privacy?": true,
"signing-phrase": generateSigningPhrase(3),
"log-level": $LogLevel.INFO,
"log-level": main_constants.LOG_LEVEL,
"latest-derived-path": 0,
"currency": "usd",
"networks/networks": @[],
Expand Down Expand Up @@ -308,7 +308,7 @@ QtObject:
if(self.importedAccount.id == accountId):
return self.prepareAccountSettingsJsonObject(self.importedAccount, installationId, displayName)

proc getDefaultNodeConfig*(self: Service, installationId: string, recoverAccount: bool, login: bool = false): JsonNode =
proc getDefaultNodeConfig*(self: Service, installationId: string, recoverAccount: bool): JsonNode =
let fleet = Fleet.StatusProd
let dnsDiscoveryURL = @["enrtree://AL65EKLJAUXKKPG43HVTML5EFFWEZ7L4LOKTLZCLJASG4DSESQZEC@prod.status.nodes.status.im"]

Expand Down Expand Up @@ -339,26 +339,69 @@ QtObject:
result["ClusterConfig"]["DiscV5BootstrapNodes"] = %* (@[])
result["Rendezvous"] = newJBool(false)

# Source the connection port from the environment for debugging or if default port not accessible
if existsEnv("STATUS_PORT"):
let wV1Port = $getEnv("STATUS_PORT")
# Waku V1 config
result["ListenAddr"] = newJString("0.0.0.0:" & wV1Port)
result["LogLevel"] = newJString(main_constants.LOG_LEVEL)

# Don't override log level on login. For onboarding it is required, nothing to override
if login:
result.delete("LogLevel")

if existsEnv("LOG_LEVEL"):
let logLvl = getEnv("LOG_LEVEL")
if logLvl in @["ERROR", "WARN", "INFO", "DEBUG", "TRACE"]:
result["LogLevel"] = newJString($logLvl)
if STATUS_PORT != 0:
result["ListenAddr"] = newJString("0.0.0.0:" & $main_constants.STATUS_PORT)

result["KeyStoreDir"] = newJString(self.keyStoreDir.replace(main_constants.STATUSGODIR, ""))
result["RootDataDir"] = newJString(main_constants.STATUSGODIR)
result["KeycardPairingDataFile"] = newJString(main_constants.KEYCARDPAIRINGDATAFILE)
result["ProcessBackedupMessages"] = newJBool(recoverAccount)

proc getLoginNodeConfig(self: Service): JsonNode =
# To create appropriate NodeConfig for Login we set only params that maybe be set via env variables or cli flags
result = %*{}

# mandatory params
result["NetworkId"] = NETWORKS[0]{"chainId"}
result["DataDir"] = %* "./ethereum/mainnet"
result["KeyStoreDir"] = %* "./keystore"
result["KeycardPairingDataFile"] = %* main_constants.KEYCARDPAIRINGDATAFILE

# other params
result["Networks"] = NETWORKS

result["UpstreamConfig"] = %* {
"URL": NETWORKS[0]{"rpcUrl"},
"Enabled": true,
}

result["ShhextConfig"] = %* {
"VerifyENSURL": NETWORKS[0]{"fallbackUrl"},
"VerifyTransactionURL": NETWORKS[0]{"fallbackUrl"}
}

result["WakuV2Config"] = %* {
"Port": WAKU_V2_PORT,
"UDPPort": WAKU_V2_PORT
}

result["WalletConfig"] = %* {
"OpenseaAPIKey": OPENSEA_API_KEY_RESOLVED,
"InfuraAPIKey": INFURA_TOKEN_RESOLVED,
"InfuraAPIKeySecret": INFURA_TOKEN_SECRET_RESOLVED,
"AlchemyAPIKeys": %* {
"1": ALCHEMY_ETHEREUM_MAINNET_TOKEN_RESOLVED,
"5": ALCHEMY_ETHEREUM_GOERLI_TOKEN_RESOLVED,
"42161": ALCHEMY_ARBITRUM_MAINNET_TOKEN_RESOLVED,
"421613": ALCHEMY_ARBITRUM_GOERLI_TOKEN_RESOLVED,
"10": ALCHEMY_OPTIMISM_MAINNET_TOKEN_RESOLVED,
"420": ALCHEMY_OPTIMISM_GOERLI_TOKEN_RESOLVED
}
}

result["TorrentConfig"] = %* {
"Port": TORRENT_CONFIG_PORT,
"DataDir": DEFAULT_TORRENT_CONFIG_DATADIR,
"TorrentDir": DEFAULT_TORRENT_CONFIG_TORRENTDIR
}

result["LogLevel"] = newJString(main_constants.LOG_LEVEL)

if STATUS_PORT != 0:
result["ListenAddr"] = newJString("0.0.0.0:" & $main_constants.STATUS_PORT)

proc setLocalAccountSettingsFile(self: Service) =
if(main_constants.IS_MACOS and self.getLoggedInAccount.isValid()):
singletonInstance.localAccountSettings.setFileName(self.getLoggedInAccount.name)
Expand Down Expand Up @@ -484,7 +527,7 @@ QtObject:
"wallet-root-address": walletRootAddress,
"preview-privacy?": true,
"signing-phrase": generateSigningPhrase(3),
"log-level": $LogLevel.INFO,
"log-level": main_constants.LOG_LEVEL,
"latest-derived-path": 0,
"currency": "usd",
"networks/networks": @[],
Expand Down Expand Up @@ -624,7 +667,7 @@ QtObject:
error "error: ", procName="verifyDatabasePassword", errName = e.name, errDesription = e.msg

proc doLogin(self: Service, account: AccountDto, hashedPassword, thumbnailImage, largeImage: string) =
let nodeConfigJson = self.getDefaultNodeConfig(installationId = "", recoverAccount = false, login = true)
let nodeConfigJson = self.getDefaultNodeConfig(installationId = "", recoverAccount = false)
let response = status_account.login(
account.name,
account.keyUid,
Expand Down Expand Up @@ -706,7 +749,7 @@ QtObject:
"key-uid": accToBeLoggedIn.keyUid,
}

let nodeConfigJson = self.getDefaultNodeConfig(installationId = "", recoverAccount = false, login = true)
let nodeConfigJson = self.getDefaultNodeConfig(installationId = "", recoverAccount = false)

let response = status_account.loginWithKeycard(keycardData.whisperKey.privateKey,
keycardData.encryptionKey.publicKey,
Expand Down
Loading

0 comments on commit f88c23d

Please sign in to comment.