diff --git a/build/docker/deb/build-deb.sh b/build/docker/deb/build-deb.sh index aae54f31..cc9eda24 100755 --- a/build/docker/deb/build-deb.sh +++ b/build/docker/deb/build-deb.sh @@ -13,6 +13,7 @@ shift 2 mkdir -p build cp -r /src/build/templates build +cp -r /src/build/scripts build cp -r /src/configs . mkdir -p /go/src/blockbook/build && cp -r /src/build/tools /go/src/blockbook/build/tools go run build/templates/generate.go $coin diff --git a/build/scripts/rpcauth.py b/build/scripts/rpcauth.py new file mode 100755 index 00000000..13bef3d3 --- /dev/null +++ b/build/scripts/rpcauth.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +# Copyright (c) 2015-2018 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import sys +import os +from random import SystemRandom +import base64 +import hmac + +def generate_salt(): + # This uses os.urandom() underneath + cryptogen = SystemRandom() + + # Create 16 byte hex salt + salt_sequence = [cryptogen.randrange(256) for _ in range(16)] + return ''.join([format(r, 'x') for r in salt_sequence]) + +def generate_password(): + """Create 32 byte b64 password""" + return base64.urlsafe_b64encode(os.urandom(32)).decode('utf-8') + +def password_to_hmac(salt, password): + m = hmac.new(bytearray(salt, 'utf-8'), bytearray(password, 'utf-8'), 'SHA256') + return m.hexdigest() + +def main(): + if len(sys.argv) < 2: + sys.stderr.write('Please include username (and an optional password, will generate one if not provided) as an argument.\n') + sys.exit(0) + + username = sys.argv[1] + + salt = generate_salt() + if len(sys.argv) > 2: + password = sys.argv[2] + else: + password = generate_password() + password_hmac = password_to_hmac(salt, password) + + print('String to be appended to bitcoin.conf:') + print('rpcauth={0}:{1}${2}'.format(username, salt, password_hmac)) + print('Your password:\n{0}'.format(password)) + +if __name__ == '__main__': + main() diff --git a/build/templates/backend/config/bitcoin.conf b/build/templates/backend/config/bitcoin.conf index 640aec2f..b7251f75 100644 --- a/build/templates/backend/config/bitcoin.conf +++ b/build/templates/backend/config/bitcoin.conf @@ -3,8 +3,7 @@ daemon=1 server=1 {{if .Backend.Mainnet}}mainnet=1{{else}}testnet=1{{end}} nolisten=1 -rpcuser={{.IPC.RPCUser}} -rpcpassword={{.IPC.RPCPass}} +{{generateRPCAuth .IPC.RPCUser .IPC.RPCPass -}} rpcport={{.Ports.BackendRPC}} txindex=1 diff --git a/build/templates/backend/config/bitcoin_client.conf b/build/templates/backend/config/bitcoin_client.conf new file mode 100644 index 00000000..35f5b992 --- /dev/null +++ b/build/templates/backend/config/bitcoin_client.conf @@ -0,0 +1,5 @@ +{{define "main" -}} +rpcuser={{.IPC.RPCUser}} +rpcpassword={{.IPC.RPCPass}} +rpcport={{.Ports.BackendRPC}} +{{end}} diff --git a/build/templates/backend/config/bitcoin_like.conf b/build/templates/backend/config/bitcoin_like.conf new file mode 100644 index 00000000..640aec2f --- /dev/null +++ b/build/templates/backend/config/bitcoin_like.conf @@ -0,0 +1,30 @@ +{{define "main" -}} +daemon=1 +server=1 +{{if .Backend.Mainnet}}mainnet=1{{else}}testnet=1{{end}} +nolisten=1 +rpcuser={{.IPC.RPCUser}} +rpcpassword={{.IPC.RPCPass}} +rpcport={{.Ports.BackendRPC}} +txindex=1 + +zmqpubhashtx={{template "IPC.MessageQueueBindingTemplate" .}} +zmqpubhashblock={{template "IPC.MessageQueueBindingTemplate" .}} + +rpcworkqueue=1100 +maxmempool=2000 +dbcache=1000 + +{{- if .Backend.AdditionalParams}} +# generated from additional_params +{{- range $name, $value := .Backend.AdditionalParams}} +{{- if eq $name "addnode"}} +{{- range $index, $node := $value}} +addnode={{$node}} +{{- end}} +{{- else}} +{{$name}}={{$value}} +{{- end}} +{{- end}} +{{- end}} +{{end}} diff --git a/build/templates/backend/config/bitcoin_like_client.conf b/build/templates/backend/config/bitcoin_like_client.conf new file mode 100644 index 00000000..35f5b992 --- /dev/null +++ b/build/templates/backend/config/bitcoin_like_client.conf @@ -0,0 +1,5 @@ +{{define "main" -}} +rpcuser={{.IPC.RPCUser}} +rpcpassword={{.IPC.RPCPass}} +rpcport={{.Ports.BackendRPC}} +{{end}} diff --git a/build/templates/backend/debian/conffiles b/build/templates/backend/debian/conffiles index d1d3266b..85e8ede6 100644 --- a/build/templates/backend/debian/conffiles +++ b/build/templates/backend/debian/conffiles @@ -1,3 +1,4 @@ {{define "main" -}} {{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf +{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}_client.conf {{end}} diff --git a/build/templates/backend/debian/install b/build/templates/backend/debian/install index e163234c..27e68661 100755 --- a/build/templates/backend/debian/install +++ b/build/templates/backend/debian/install @@ -1,5 +1,6 @@ {{define "main" -}} #!/usr/bin/dh-exec backend/* {{.Env.BackendInstallPath}}/{{.Coin.Alias}} -backend.conf => {{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf +server.conf => {{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf +client.conf => {{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}_client.conf {{end}} diff --git a/build/tools/templates.go b/build/tools/templates.go index c2e34157..ebd9d93a 100644 --- a/build/tools/templates.go +++ b/build/tools/templates.go @@ -1,10 +1,12 @@ package build import ( + "bytes" "encoding/json" "fmt" "io" "os" + "os/exec" "path/filepath" "text/template" "time" @@ -59,7 +61,8 @@ type Config struct { ServiceAdditionalParamsTemplate string `json:"service_additional_params_template"` ProtectMemory bool `json:"protect_memory"` Mainnet bool `json:"mainnet"` - ConfigFile string `json:"config_file"` + ServerConfigFile string `json:"server_config_file"` + ClientConfigFile string `json:"client_config_file"` AdditionalParams interface{} `json:"additional_params"` } `json:"backend"` Blockbook struct { @@ -90,6 +93,17 @@ func jsonToString(msg json.RawMessage) (string, error) { return string(d), nil } +func generateRPCAuth(user, pass string) (string, error) { + cmd := exec.Command("/bin/bash", "-c", "build/scripts/rpcauth.py \"$0\" \"$1\" | sed -n -e 2p", user, pass) + var out bytes.Buffer + cmd.Stdout = &out + err := cmd.Run() + if err != nil { + return "", err + } + return out.String(), nil +} + func (c *Config) ParseTemplate() *template.Template { templates := map[string]string{ "IPC.RPCURLTemplate": c.IPC.RPCURLTemplate, @@ -103,7 +117,8 @@ func (c *Config) ParseTemplate() *template.Template { } funcMap := template.FuncMap{ - "jsonToString": jsonToString, + "jsonToString": jsonToString, + "generateRPCAuth": generateRPCAuth, } t := template.New("").Funcs(funcMap) @@ -230,7 +245,10 @@ func GeneratePackageDefinitions(config *Config, templateDir, outputDir string) e } if !isEmpty(config, "backend") { - err = writeBackendConfigFile(config, outputDir) + err = writeBackendServerConfigFile(config, outputDir) + if err == nil { + err = writeBackendClientConfigFile(config, outputDir) + } if err != nil { return err } @@ -262,17 +280,42 @@ func writeTemplate(path string, info os.FileInfo, templ *template.Template, conf return nil } -func writeBackendConfigFile(config *Config, outputDir string) error { - out, err := os.OpenFile(filepath.Join(outputDir, "backend/backend.conf"), os.O_CREATE|os.O_WRONLY, 0644) +func writeBackendServerConfigFile(config *Config, outputDir string) error { + out, err := os.OpenFile(filepath.Join(outputDir, "backend/server.conf"), os.O_CREATE|os.O_WRONLY, 0644) if err != nil { return err } defer out.Close() - if config.Backend.ConfigFile == "" { + if config.Backend.ServerConfigFile == "" { return nil } else { - in, err := os.Open(filepath.Join(outputDir, "backend/config", config.Backend.ConfigFile)) + in, err := os.Open(filepath.Join(outputDir, "backend/config", config.Backend.ServerConfigFile)) + if err != nil { + return err + } + defer in.Close() + + _, err = io.Copy(out, in) + if err != nil { + return err + } + } + + return nil +} + +func writeBackendClientConfigFile(config *Config, outputDir string) error { + out, err := os.OpenFile(filepath.Join(outputDir, "backend/client.conf"), os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + return err + } + defer out.Close() + + if config.Backend.ClientConfigFile == "" { + return nil + } else { + in, err := os.Open(filepath.Join(outputDir, "backend/config", config.Backend.ClientConfigFile)) if err != nil { return err } diff --git a/configs/coins/bcash.json b/configs/coins/bcash.json index c0beb4bd..f4609887 100644 --- a/configs/coins/bcash.json +++ b/configs/coins/bcash.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": true, - "config_file": "bitcoin.conf" + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf" }, "blockbook": { "package_name": "blockbook-bcash", diff --git a/configs/coins/bcash_testnet.json b/configs/coins/bcash_testnet.json index 3d0e4892..302a4c01 100644 --- a/configs/coins/bcash_testnet.json +++ b/configs/coins/bcash_testnet.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": false, - "config_file": "bitcoin.conf" + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf" }, "blockbook": { "package_name": "blockbook-bcash-testnet", diff --git a/configs/coins/bgold.json b/configs/coins/bgold.json index cc14bdf2..01d225e4 100644 --- a/configs/coins/bgold.json +++ b/configs/coins/bgold.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": true, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "mempoolexpiry": 72, "timeout": 768, diff --git a/configs/coins/bitcoin.json b/configs/coins/bitcoin.json index 97798bd8..07b7688e 100644 --- a/configs/coins/bitcoin.json +++ b/configs/coins/bitcoin.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": true, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin.conf", + "client_config_file": "bitcoin_client.conf", "additional_params": { "deprecatedrpc": "estimatefee" } diff --git a/configs/coins/bitcoin_testnet.json b/configs/coins/bitcoin_testnet.json index 913e7e60..e7f05b82 100644 --- a/configs/coins/bitcoin_testnet.json +++ b/configs/coins/bitcoin_testnet.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": false, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin.conf", + "client_config_file": "bitcoin_client.conf", "additional_params": { "deprecatedrpc": "estimatefee" } diff --git a/configs/coins/dash.json b/configs/coins/dash.json index e9156efb..322f667c 100644 --- a/configs/coins/dash.json +++ b/configs/coins/dash.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": true, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "mempoolexpiry": 72 } diff --git a/configs/coins/dash_testnet.json b/configs/coins/dash_testnet.json index e8ebaaa1..d98004e3 100644 --- a/configs/coins/dash_testnet.json +++ b/configs/coins/dash_testnet.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": false, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "mempoolexpiry": 72 } diff --git a/configs/coins/dogecoin.json b/configs/coins/dogecoin.json index cb9b7a68..f48eaa60 100644 --- a/configs/coins/dogecoin.json +++ b/configs/coins/dogecoin.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": false, "mainnet": true, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "whitelist": "127.0.0.1", "rpcthreads": 16, diff --git a/configs/coins/ethereum-classic.json b/configs/coins/ethereum-classic.json index f7e49b56..2b756540 100644 --- a/configs/coins/ethereum-classic.json +++ b/configs/coins/ethereum-classic.json @@ -32,7 +32,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": true, - "config_file": "" + "server_config_file": "", + "client_config_file": "" }, "blockbook": { "package_name": "blockbook-ethereum-classic", diff --git a/configs/coins/ethereum.json b/configs/coins/ethereum.json index 5423c5ed..00f82f8a 100644 --- a/configs/coins/ethereum.json +++ b/configs/coins/ethereum.json @@ -34,7 +34,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": true, - "config_file": "" + "server_config_file": "", + "client_config_file": "" }, "blockbook": { "package_name": "blockbook-ethereum", diff --git a/configs/coins/ethereum_testnet_ropsten.json b/configs/coins/ethereum_testnet_ropsten.json index 42fe3fd0..4644e181 100644 --- a/configs/coins/ethereum_testnet_ropsten.json +++ b/configs/coins/ethereum_testnet_ropsten.json @@ -33,7 +33,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": false, - "config_file": "" + "server_config_file": "", + "client_config_file": "" }, "blockbook": { "package_name": "blockbook-ethereum-testnet-ropsten", diff --git a/configs/coins/litecoin.json b/configs/coins/litecoin.json index 3f9747fd..7368dca1 100644 --- a/configs/coins/litecoin.json +++ b/configs/coins/litecoin.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": true, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "whitelist": "127.0.0.1" } diff --git a/configs/coins/litecoin_testnet.json b/configs/coins/litecoin_testnet.json index 8eae9a61..767f0a62 100644 --- a/configs/coins/litecoin_testnet.json +++ b/configs/coins/litecoin_testnet.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": false, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "whitelist": "127.0.0.1" } diff --git a/configs/coins/monacoin.json b/configs/coins/monacoin.json index 95fb15af..d274e23f 100644 --- a/configs/coins/monacoin.json +++ b/configs/coins/monacoin.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": true, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "whitelist": "127.0.0.1" } diff --git a/configs/coins/monacoin_testnet.json b/configs/coins/monacoin_testnet.json index 3972442c..f539f262 100644 --- a/configs/coins/monacoin_testnet.json +++ b/configs/coins/monacoin_testnet.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": false, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "whitelist": "127.0.0.1" } diff --git a/configs/coins/myriad.json b/configs/coins/myriad.json index fcc1f032..38a06406 100644 --- a/configs/coins/myriad.json +++ b/configs/coins/myriad.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": true, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "whitelist": "127.0.0.1" } diff --git a/configs/coins/namecoin.json b/configs/coins/namecoin.json index 4cb9933f..9d3f30e5 100644 --- a/configs/coins/namecoin.json +++ b/configs/coins/namecoin.json @@ -37,7 +37,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": true, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "whitelist": "127.0.0.1", "upnp": 0, diff --git a/configs/coins/vertcoin.json b/configs/coins/vertcoin.json index fa14c06a..f9b4e742 100644 --- a/configs/coins/vertcoin.json +++ b/configs/coins/vertcoin.json @@ -35,7 +35,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": true, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "whitelist": "127.0.0.1" } diff --git a/configs/coins/vertcoin_testnet.json b/configs/coins/vertcoin_testnet.json index 2f8dfaee..8af863f5 100644 --- a/configs/coins/vertcoin_testnet.json +++ b/configs/coins/vertcoin_testnet.json @@ -35,7 +35,8 @@ "service_additional_params_template": "", "protect_memory": true, "mainnet": false, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "whitelist": "127.0.0.1" } diff --git a/configs/coins/zcash.json b/configs/coins/zcash.json index d55165d8..70062a23 100644 --- a/configs/coins/zcash.json +++ b/configs/coins/zcash.json @@ -35,7 +35,8 @@ "service_additional_params_template": "Environment=\"HOME={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend\"", "protect_memory": false, "mainnet": true, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "addnode": [ "mainnet.z.cash" diff --git a/configs/coins/zcash_testnet.json b/configs/coins/zcash_testnet.json index 5f6d2ca4..39f66c63 100644 --- a/configs/coins/zcash_testnet.json +++ b/configs/coins/zcash_testnet.json @@ -35,7 +35,8 @@ "service_additional_params_template": "Environment=\"HOME={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend\"", "protect_memory": false, "mainnet": false, - "config_file": "bitcoin.conf", + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", "additional_params": { "addnode": [ "testnet.z.cash"