From aead5cd817828426a12ec98f565ea313b42824f5 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sun, 10 Jun 2018 09:24:24 +0900 Subject: [PATCH 01/43] Add quaz, snx, vizeh --- README_JP.md | 349 +++++++++++++++++++++++++++++++++ config/hppcoin/hppcoin.compile | 6 + config/hppcoin/hppcoin.conf | 50 +++++ config/hppcoin/hppcoin.env | 6 + config/quaz/quaz.compile | 6 + config/quaz/quaz.conf | 53 +++++ config/quaz/quaz.env | 6 + config/snx/snx.compile | 6 + config/snx/snx.conf | 49 +++++ config/snx/snx.env | 6 + config/vizeh/vizeh.compile | 6 + config/vizeh/vizeh.conf | 49 +++++ config/vizeh/vizeh.env | 6 + input.html | 18 ++ output.php | 10 + send2line.html | 18 ++ 16 files changed, 644 insertions(+) create mode 100644 README_JP.md create mode 100644 config/hppcoin/hppcoin.compile create mode 100644 config/hppcoin/hppcoin.conf create mode 100644 config/hppcoin/hppcoin.env create mode 100644 config/quaz/quaz.compile create mode 100644 config/quaz/quaz.conf create mode 100644 config/quaz/quaz.env create mode 100644 config/snx/snx.compile create mode 100644 config/snx/snx.conf create mode 100644 config/snx/snx.env create mode 100644 config/vizeh/vizeh.compile create mode 100644 config/vizeh/vizeh.conf create mode 100644 config/vizeh/vizeh.env create mode 100644 input.html create mode 100644 output.php create mode 100644 send2line.html diff --git a/README_JP.md b/README_JP.md new file mode 100644 index 00000000..ed2e2c1d --- /dev/null +++ b/README_JP.md @@ -0,0 +1,349 @@ +# Phore マスターノード VPS インストール + +Phoreのマスターノードを簡単に・複数インストールするためのスクリプトです。次の特徴があります。 + +* IPv6 対応 +* 1-100以上のマスターノードを同一VPSサーバーへインストールすることが出来ます(ipv4アドレスはマスターノードの数だけ必要)。 +* Phoreと同じように、他の通貨のマスターノードも対応していればインストール可能です。 +* マスターノードの設定のほとんどをこのスクリプトで実行可能です(現在はPhoreのみプライベートキー生成対応) +* Phoreやその他の通貨においてもリリースタグを利用して自動でコンパイルを行います。 +* セキュリティ向上のため、ユーザーの分離などの施策を実施しています。 + +ノート・必要なこと: + +* Script has only been tested on a Vultr VPS, but should work almost anywhere where IPv6 addresses are available +* Currently only Ubunto 16.04 Linux is supported +* This script needs to run as root or with sudo, the masternodes will and should not! + +This project was forked from https://github.com/masternodes/vps. @marsmensch (Florian) is the primary author behind this VPS installation script for masternodes. If you would like to donate to him, you can use the BTC address below + +**Have fun, this is crypto after all!** + +``` +BTC 33ENWZ9RCYBG7nv6ac8KxBUSuQX64Hx3x3 +``` + +# Install guide on vultr + +## How to get VPS server + +For new masternode owners, **Vultr** is recommended as a VPS hosting provider, but other providers that allow direct root SSH login access and offer Ubunto 16.04 may work. + +You can use the following referral link to sign up with Vultr for VPS hosting: + + + +## Deploy a new system + +First, create a new VPS by clicking that small "+" button. + +VPS creation + +## Location choice + +You can choose any location. You may wish to have it hosted in a city/country near you, or choose a different area to help with the global decentralization of the Phore masternode network. + +VPS location choice + +## Linux distribution (Ubuntu 16.04 LTS) + +Select Ubuntu 16.04. + +VPS location choice + +## VPS size + +The 25 GB SSD / 1024MBB Memory instance is enough for 2-3 masternodes. You may need more memory as the Phore blockchain grows over time, or if you want to run more masternodes. + +VPS sizing + +## Activating additional features (IPv6) + +Toggle "Enable IPv6" to activate that feature--at Vultr there is no additional cost for this. + +VPS sizing + +You may wish to enable DDOS Protection to protect your masternodes against a potential denial of service attack, especially if you are running multiple masternodes from one VPS. Vultr charges an additional fee for this. + +## Hostnames & number of VPS + +Choose how many instances you want and click "Deploy Now". + +VPS sizing + +## Installation of PuTTY as SSH client (Windows) +If you are running your wallet from Windows, install PuTTY while the server is being set up. You can download PuTTY from here: http://www.putty.org/. Skip this step if you are using a Mac--you will use the built in Terminal application instead. + +Once PuTTY is installed, return to the Vultr dashboard to get the login details by clicking on the ... to the right of your server, and select Server Details. + +## Accessing your VPS via SSH + +Copy your password for SSH access from the server details page. +check hostname and password + +Now open PuTTY to add the server. + +login to VPS + +Enter the IP address in the Host Name field, and enter the server name you wish to use for this VPS (e.g., MN01) to Saved Sessions. Click save. + +Click the open button. When the console has opened, click Yes in the PuTTY Security Alert box. +Alert from PuTTY + +Now enter your server login details provided in your Vultr account. +You cannot Ctrl+V to paste in the console. Either right click the mouse or type shift+insert (sometimes +on keyboard it will just be INS key) + +User: root +Password: (paste or type password) + +When you paste it will not display, so don't try to paste again. +Just paste once and press Enter. + +For Mac users, open Terminal (e.g., Press Command-Space and type Terminal and press Enter). Then type: + +``` +ssh -l root +``` +## Install Masternode + +Login to your newly installed node as "root". + +VPS sizing + +Enter this command to copy the Masternode installation script and install a single Phore Masternode: + +```bash +git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore +``` + +If you have masternode private key, please use this(You can generate masternode private key on below Step 2). + +```bash +git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -k **PRIVATE KEY** +``` +You can skip below "Configure masternode configuration files". Because above command inputs masternode private key to masternode configuration files. + + +This prepares the system and installs the Phore Masternode daemon. This includes downloading the latest Phore masternode release, creating a swap file, configuring the firewall, and compiling the Phore Masternode from source code. This process takes about 10-15 minutes. + +VPS configuration + +While that is underway, go back to your local desktop and open phore-qt. + +### More complex situations (ignore if you are installing a single masternode on a new VPS) + +If you wish to install more than one masternode on the same VPS, you can add a -c parameter to tell the script how many to configure, so for example this would install three Phore masternodes: + +```bash +git clone https://github.com/phoreproject/vps.git && cd vps +./install.sh -p phore -c 3 +``` + +If you have masternode private key, + +```bash +git clone https://github.com/phoreproject/vps.git && cd vps +./install.sh -p phore -c 3 --key **PRIVATE KEY 01** --key2 **PRIVATE KEY 02** --key3 **PRIVATE KEY 03** +``` +You can skip below "Configure masternode configuration files". Because above command inputs masternode private key to masternode configuration files. + + +If you are upgrading your masternode(s) to a new release, you can add a -u parameter: + +```bash +git clone https://github.com/phoreproject/vps.git && cd vps +./install.sh -p phore -u +``` + +The project is configured to use the latest official release of the Phore masternode code, and we will update this project each time a new release is issued, but without downloading the latest version of this project and using the -u parameter, the script will not update an existing Phore node that is already installed. + +## Configure Phore Wallet +### Step1 - Create Collateral Transaction +Once the wallet is open on your local computer, generate a new receive address and label it however you want to identify your masternode rewards (e.g., Phore-MN-1). This label will show up in your transactions each time you receive a block reward. + +Click the Request payment button, and copy the address. + +making new address + +Now go to the Send tab, paste the copied address, and send *exactly* 10,000 PHR to it in a single transaction. Wait for it to confirm on the blockchain. This is the collateral transaction that will be locked and paired with your new masternode. If you are setting up more than one masternode at one time, repeat this process for each one. + +sending 10kPHR + +### Step 2 - Generate Masternode Private Key +Go to the **[Tools > Debug Console]** and enter these commands below: + +```bash +masternode genkey +``` +This will produce a masternode private key: + +generating masternode private key + +Copy this value to a text file.t will be needed for both the phore configuration file on the masternode VPS, and the masternode configuration file on the wallet computer. + +If you are setting up multiple masternodes, repeat this step for each one. Each time you run the masternode genkey command it will give you a new private key--it doesn't matter which one you use, but it is important that it is unique for each masternode and that the VPS phore configuration file and wallet masternode configuration file match (see below). + +### Step 3 - Masternode Outputs + +This will give you the rest of the information you need to configure your masternode in your Phore wallet--the transaction ID and the output index. + +```bash +masternode outputs +``` + +getting transaction id + +The long string of characters is the *Transaction ID* for your masternode collateral transaction. The number after the long string is the *Index*. Copy and paste these into the text file next to the private key you generated in Step 2. + +If you have multiple masternodes in the same wallet and have done the 10,000 PHR transactions for each of them, masternode outputs will display transaction IDs and indexes for each one. You can choose which private key to go with each transaction ID and index, as long as they are all different, and you make sure the corresponding lines in masternode.conf and the VPS phore configuration files match (see below). + +## End of installations +When the script finishes, it will look similar to this: + +installation ended + +You only have a few steps remaining to complete your masternode configuration. +## Configure masternode configuration files +Since this installation method supports multiple masternodes, the phore configuration files have a node number added to them (e.g., phore_n1.conf, phore_n2.conf), stored in the /etc/masternodes directory. If you have a single masternode on the VPS, you will only need to edit /etc/masternodes/phore_n1.conf. + +To open phore_n1.conf for editing, enter these commands: +```bash +sudo apt-get install nano +nano /etc/masternodes/phore_n1.conf +``` +The next step adds your masternode private key. + +## Add masternode private key +What you need to change is only masternode private key. +(We recommend using IPv6 which is the default, but if you choose IPv4 when you ran the installation script, please edit #NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER to your VPS IP address). +After typing the nano command, you will see something similar to this. + +add private key + +Copy the masternode private key from the text file you saved it in, and replace HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_phore_1 with that private key (this typically begins with an 8). + +While you have this file opened, copy the information that follows after masternodeaddr=, starting with the open bracket. This is the masternode's IPv6 address and port, and will be needed for the wallet's masternode.conf file. + +Once you have your masternode private key entered, press Ctrl+X . +Then press Y to save, and press Enter to exit. + +Finally, close and restart your Phore wallet so that it will have the new masternode configuration. + +## Start your masternodes +A script for starting all masternodes on the VPS has been created at /usr/local/bin/activate_masternodes_phore.sh. +Run this command after your masternode configuration written above. + +```bash +/usr/local/bin/activate_masternodes_phore +``` + +The masternode daemons will start and begin loading the Phore blockchain. + +## Finishing Wallet Configuration & Activate Masternode +To activate your nodes from your wallet, one of the last steps is to add a line for the masternode in the masternode.conf file. This file has the following format, with each value separated with a space: + +* alias IP:Port masternodeprivatekey collateral_transaction_ID collateral_output_index +* alias - A short name you use to identify the masternode, you can choose this name as long as it is without spaces (e.g., Phore-MN-1) +* IP:Port - The IP address (either IPv6 or IPv4) and the Port where the masternode is running, separated by a colon (:). You copied this from the phore.conf file on the VPS. +* collateral_transaction_ID: This is the transaction ID you copied from masternode outputs. +* collateral_output_index: This is the index you copied from masternode outputs. + +From the wallet menu, edit the local wallet **masternode.conf** file. **[Tools > Open Masternode Configuration File]** +Add the MN conf line, like the example below to the masternode.conf file. Save it, and close the file. It will look like the following example, using your values for each of the fields above. A common mistake is mixing up the private key and the collateral transaction ID--to make this easier, the private key usually begins with an 8. + +example. +``` +Phore-MN-1 [2001:19f0:5001:ca6:2085::1]:11771 88xrxxxxxxxxxxxxxxxxxxxxxxx7K 6b4c9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7ee23 0 +``` + +The image below shows another example using an IPv4 IP address. If you followed this guide you are probably using an IPv6 address that looks like the line above. + +editing masternode.conf + +If you are running multiple masternodes, you need to add one of these lines for each masternode, and make sure the private key on each line matches the corresponding private key you entered in the VPS phore configuration file for that masternode. +## Check syncing status of masternode +The masternode cannot complete activation until it is fully synced with the Phore blockchain network. + +To check the status of your masternode, please enter this command in the VPS terminal. If you have multiple masternodes on the same VPS, you can change n1 to n2 etc. below to check the status of each one. + +```bash +/usr/local/bin/phore-cli -conf=/etc/masternodes/phore_n1.conf getinfo +``` +The output will look like this: +``` +{ + "version": 1010000, + "protocolversion": 7002, + "walletversion": 61000, + "balance": 0.00000000, + "privatesend_balance": 0.00000000, + "blocks": 176209, + "timeoffset": 0, + "connections": 44, + "proxy": "", + "difficulty": 42882.54964804553, + "testnet": false, + "moneysupply" : 11814171.53907114, + "zPHRsupply" : { + "1" : 263.00000000, + "5" : 135.00000000, + "10" : 500.00000000, + "50" : 700.00000000, + "100" : 1300.00000000, + "500" : 5000.00000000, + "1000" : 11000.00000000, + "5000" : 90000.00000000, + "total" : 108898.00000000 + }, + "keypoololdest" : 1507302593, + "keypoolsize" : 1001, + "paytxfee" : 0.00000000, + "relayfee" : 0.00010000, + "staking status" : "Staking Not Active", + "errors" : "" +} +``` + +We're looking at the *blocks*, and need that to be the latest block in the blockchain. You can check your local wallet to see the latest block by hovering over the green check mark. + +checking syncing status + +Once your masternode has synced up to the latest block, go to next step. The syncing process may take 15-30 minutes or more as the Phore blockchain grows. You can keep checking progress with the command above, by pressing the up arrow and Enter to repeat it. + +## Start Masternode + +Go to the debug console of your Phore wallet **[Tools->Debug Console]** and enter the following command, replacing **mn-alias** with the name of the masternode in the Alias column of the Masternodes tab: + +``` +startmasternode alias false mn-alias +``` + +You may need to unlock the wallet **[Settings->Unlock Wallet]** before you run this command, entering your passphrase. You can lock the wallet after it is finished. + +If everything was setup correctly, after entering the command you will see something like this: +``` +{ +"overall" : "Successfully started 1 masternodes, failed to start 0, total 1", +"detail" : { +"status" : { +"alias" : "phore-mn01", +"result" : "successful" +} +``` +If you are setting up multiple masternodes, repeat this for each one. You can now close the debug console, return the Masternodes tab and check the status: +checking syncing status + +It should say ENABLED, and within an hour, the timer in the Active column should start increasing. + +Your Phore masternode is now set up and running! Depending on how many masternodes there are, it may take 12-24 hours before you see your first masternode reward--this is normal and rewards should come at more regular intervals after the first one. + +rewards + +## Issues and Questions +Please open a GitHub Issue if there are problems with this installation method. Many Phore team members activel support people installing masternodes and can provide assistance in the Phore Discord channel. +Here is a Discord invitation: + +https://discord.gg/sbgdcdv + +If you would like to make a donation to Phore's ongoing development, you can send Phore to the core team at this address: PDjGJMDzvJnvbxxgR1bgPm77fFLxn3KAg8 diff --git a/config/hppcoin/hppcoin.compile b/config/hppcoin/hppcoin.compile new file mode 100644 index 00000000..c8eb99bc --- /dev/null +++ b/config/hppcoin/hppcoin.compile @@ -0,0 +1,6 @@ +#!/bin/bash + +./autogen.sh +./configure --disable-dependency-tracking --enable-tests=no --without-gui --without-miniupnpc --with-incompatible-bdb CFLAGS="-march=native" LIBS="-lcurl -lssl -lcrypto -lz" +make +make install \ No newline at end of file diff --git a/config/hppcoin/hppcoin.conf b/config/hppcoin/hppcoin.conf new file mode 100644 index 00000000..20635c61 --- /dev/null +++ b/config/hppcoin/hppcoin.conf @@ -0,0 +1,50 @@ +################################ +# basic settings +################################ +txindex=1 +logtimestamps=1 +listen=1 +daemon=1 +staking=0 +gen=0 +maxconnections=256 +bind=XXX_IPV6_INT_BASE_XXX:XXX_NETWORK_BASE_TAG_XXX::XXX_NUM_XXY:XXX_MNODE_INBOUND_PORT_XXX +externalip=XXX_IPV6_INT_BASE_XXX:XXX_NETWORK_BASE_TAG_XXX::XXX_NUM_XXY:XXX_MNODE_INBOUND_PORT_XXX + +############################# +# nodes we want to stick to +############################# +addnode=51.255.53.77:28878 +addnode=209.250.239.118:28878 + +################################ +# lmnode specific settings +################################ +lmnode=1 +#### INSERT YOUR lmnode PRIVATEKEY BELOW #################################################### +lmnodeprivkey=HERE_GOES_YOUR_lmnode_KEY_FOR_lmnode_XXX_GIT_PROJECT_XXX_XXX_NUM_XXX +################################################################################################# +# +# b. +# 88b Insert your generated lmnode privkey here +# 888b. +# 88888b +# 888888b. +# 8888P" +# P" `8. +# `8. +# `8 +################################################################################################# + +############################# +# optional indices +############################# + +############################# +# JSONRPC +############################# +server=1 +rpcuser=XXX_GIT_PROJECT_XXXrpc +rpcpassword=XXX_PASS_XXX +rpcallowip=127.0.0.1 +rpcport=555XXX_NUM_XXX diff --git a/config/hppcoin/hppcoin.env b/config/hppcoin/hppcoin.env new file mode 100644 index 00000000..40fdbb3b --- /dev/null +++ b/config/hppcoin/hppcoin.env @@ -0,0 +1,6 @@ +CODENAME=hppcoin +MNODE_DAEMON=${MNODE_DAEMON:-/usr/local/bin/hppcoind} +MNODE_INBOUND_PORT=${MNODE_INBOUND_PORT:-28878} +GIT_URL=https://github.com/hppcoin/hppcoin.git +SCVERSION="tags/v1.0.1" +NETWORK_BASE_TAG="2044" diff --git a/config/quaz/quaz.compile b/config/quaz/quaz.compile new file mode 100644 index 00000000..c8eb99bc --- /dev/null +++ b/config/quaz/quaz.compile @@ -0,0 +1,6 @@ +#!/bin/bash + +./autogen.sh +./configure --disable-dependency-tracking --enable-tests=no --without-gui --without-miniupnpc --with-incompatible-bdb CFLAGS="-march=native" LIBS="-lcurl -lssl -lcrypto -lz" +make +make install \ No newline at end of file diff --git a/config/quaz/quaz.conf b/config/quaz/quaz.conf new file mode 100644 index 00000000..f6bc79e5 --- /dev/null +++ b/config/quaz/quaz.conf @@ -0,0 +1,53 @@ +################################ +# basic settings +################################ +txindex=1 +logtimestamps=1 +listen=1 +daemon=1 +staking=0 +gen=0 +maxconnections=256 +bind=XXX_IPV6_INT_BASE_XXX:XXX_NETWORK_BASE_TAG_XXX::XXX_NUM_XXY:XXX_MNODE_INBOUND_PORT_XXX +externalip=XXX_IPV6_INT_BASE_XXX:XXX_NETWORK_BASE_TAG_XXX::XXX_NUM_XXY +masternodeaddr=XXX_IPV6_INT_BASE_XXX:XXX_NETWORK_BASE_TAG_XXX::XXX_NUM_XXY:XXX_MNODE_INBOUND_PORT_XXX + +############################# +# nodes we want to stick to +############################# +addnode=104.207.141.159:11771 +addnode=45.32.192.99:11771 +addnode=45.32.19.50:11771 +addnode=45.32.122.97:11771 + +################################ +# masternode specific settings +################################ +masternode=1 +#### INSERT YOUR MASTERNODE PRIVATEKEY BELOW #################################################### +masternodeprivkey=HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_XXX_GIT_PROJECT_XXX_XXX_NUM_XXX +################################################################################################# +# +# b. +# 88b Insert your generated masternode privkey here +# 888b. +# 88888b +# 888888b. +# 8888P" +# P" `8. +# `8. +# `8 +################################################################################################# + +############################# +# optional indices +############################# + +############################# +# JSONRPC +############################# +server=1 +rpcuser=XXX_GIT_PROJECT_XXXrpc +rpcpassword=XXX_PASS_XXX +rpcallowip=127.0.0.1 +rpcport=555XXX_NUM_XXX \ No newline at end of file diff --git a/config/quaz/quaz.env b/config/quaz/quaz.env new file mode 100644 index 00000000..d9abb45d --- /dev/null +++ b/config/quaz/quaz.env @@ -0,0 +1,6 @@ +CODENAME=phore +MNODE_DAEMON=${MNODE_DAEMON:-/usr/local/bin/phored} +MNODE_INBOUND_PORT=${MNODE_INBOUND_PORT:-11771} +GIT_URL=https://github.com/phoreproject/Phore.git +SCVERSION="tags/v1.2.0.0" +NETWORK_BASE_TAG="2044" diff --git a/config/snx/snx.compile b/config/snx/snx.compile new file mode 100644 index 00000000..c8eb99bc --- /dev/null +++ b/config/snx/snx.compile @@ -0,0 +1,6 @@ +#!/bin/bash + +./autogen.sh +./configure --disable-dependency-tracking --enable-tests=no --without-gui --without-miniupnpc --with-incompatible-bdb CFLAGS="-march=native" LIBS="-lcurl -lssl -lcrypto -lz" +make +make install \ No newline at end of file diff --git a/config/snx/snx.conf b/config/snx/snx.conf new file mode 100644 index 00000000..5ae7a2f0 --- /dev/null +++ b/config/snx/snx.conf @@ -0,0 +1,49 @@ +################################ +# basic settings +################################ +txindex=1 +logtimestamps=1 +listen=1 +daemon=1 +staking=0 +gen=0 +maxconnections=256 +bind=XXX_IPV6_INT_BASE_XXX:XXX_NETWORK_BASE_TAG_XXX::XXX_NUM_XXY:XXX_MNODE_INBOUND_PORT_XXX +externalip=XXX_IPV6_INT_BASE_XXX:XXX_NETWORK_BASE_TAG_XXX::XXX_NUM_XXY +masternodeaddr=XXX_IPV6_INT_BASE_XXX:XXX_NETWORK_BASE_TAG_XXX::XXX_NUM_XXY:XXX_MNODE_INBOUND_PORT_XXX + +############################# +# nodes we want to stick to +############################# + +################################ +# masternode specific settings +################################ +masternode=1 +#### INSERT YOUR MASTERNODE PRIVATEKEY BELOW #################################################### +masternodeprivkey=HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_XXX_GIT_PROJECT_XXX_XXX_NUM_XXX +################################################################################################# +# +# b. +# 88b Insert your generated masternode privkey here +# 888b. +# 88888b +# 888888b. +# 8888P" +# P" `8. +# `8. +# `8 +################################################################################################# + +############################# +# optional indices +############################# + +############################# +# JSONRPC +############################# +server=1 +rpcuser=XXX_GIT_PROJECT_XXXrpc +rpcpassword=XXX_PASS_XXX +rpcallowip=127.0.0.1 +rpcport=555XXX_NUM_XXX \ No newline at end of file diff --git a/config/snx/snx.env b/config/snx/snx.env new file mode 100644 index 00000000..67b04209 --- /dev/null +++ b/config/snx/snx.env @@ -0,0 +1,6 @@ +CODENAME=snx +MNODE_DAEMON=${MNODE_DAEMON:-/usr/local/bin/snxd} +MNODE_INBOUND_PORT=${MNODE_INBOUND_PORT:-43101} +GIT_URL=https://github.com/ipedrero/snx.git +SCVERSION="master" +NETWORK_BASE_TAG="2044" diff --git a/config/vizeh/vizeh.compile b/config/vizeh/vizeh.compile new file mode 100644 index 00000000..c8eb99bc --- /dev/null +++ b/config/vizeh/vizeh.compile @@ -0,0 +1,6 @@ +#!/bin/bash + +./autogen.sh +./configure --disable-dependency-tracking --enable-tests=no --without-gui --without-miniupnpc --with-incompatible-bdb CFLAGS="-march=native" LIBS="-lcurl -lssl -lcrypto -lz" +make +make install \ No newline at end of file diff --git a/config/vizeh/vizeh.conf b/config/vizeh/vizeh.conf new file mode 100644 index 00000000..6e161562 --- /dev/null +++ b/config/vizeh/vizeh.conf @@ -0,0 +1,49 @@ +################################ +# basic settings +################################ +txindex=1 +logtimestamps=1 +listen=1 +daemon=1 +staking=0 +gen=0 +maxconnections=256 +bind=XXX_IPV6_INT_BASE_XXX:XXX_NETWORK_BASE_TAG_XXX::XXX_NUM_XXY:XXX_MNODE_INBOUND_PORT_XXX +externalip=XXX_IPV6_INT_BASE_XXX:XXX_NETWORK_BASE_TAG_XXX::XXX_NUM_XXY +masternodeaddr=XXX_IPV6_INT_BASE_XXX:XXX_NETWORK_BASE_TAG_XXX::XXX_NUM_XXY:XXX_MNODE_INBOUND_PORT_XXX + +############################# +# nodes we want to stick to +############################# + +################################ +# masternode specific settings +################################ +masternode=1 +#### INSERT YOUR MASTERNODE PRIVATEKEY BELOW #################################################### +masternodeprivkey=HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_XXX_GIT_PROJECT_XXX_XXX_NUM_XXX +################################################################################################# +# +# b. +# 88b Insert your generated masternode privkey here +# 888b. +# 88888b +# 888888b. +# 8888P" +# P" `8. +# `8. +# `8 +################################################################################################# + +############################# +# optional indices +############################# + +############################# +# JSONRPC +############################# +server=1 +rpcuser=XXX_GIT_PROJECT_XXXrpc +rpcpassword=XXX_PASS_XXX +rpcallowip=127.0.0.1 +rpcport=555XXX_NUM_XXX diff --git a/config/vizeh/vizeh.env b/config/vizeh/vizeh.env new file mode 100644 index 00000000..23710bc1 --- /dev/null +++ b/config/vizeh/vizeh.env @@ -0,0 +1,6 @@ +CODENAME=vizeh +MNODE_DAEMON=${MNODE_DAEMON:-/usr/local/bin/vizehd} +MNODE_INBOUND_PORT=${MNODE_INBOUND_PORT:-28157} +GIT_URL=https://github.com/VIZEH-PROJECT/VIZEH.git +SCVERSION="tags/v2.2.1.1" +NETWORK_BASE_TAG="2044" diff --git a/input.html b/input.html new file mode 100644 index 00000000..1a83a117 --- /dev/null +++ b/input.html @@ -0,0 +1,18 @@ + +input.html + +入力フォームです。 +名前を入力してみましょう。 +
+ + + + + + +
名前 + +
+
+ + \ No newline at end of file diff --git a/output.php b/output.php new file mode 100644 index 00000000..cd416c2f --- /dev/null +++ b/output.php @@ -0,0 +1,10 @@ + +output.php + +"); + print ("名前:$name
"); +?> + + \ No newline at end of file diff --git a/send2line.html b/send2line.html new file mode 100644 index 00000000..178b3d42 --- /dev/null +++ b/send2line.html @@ -0,0 +1,18 @@ +

+ + +

+ + + \ No newline at end of file From 73fd76ca486e4bd2e1ea1aa84d8bab6aefeb4f35 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sun, 10 Jun 2018 09:33:45 +0900 Subject: [PATCH 02/43] Add fxtc --- config/fxtc/fxtc.compile | 6 ++++++ config/fxtc/fxtc.env | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 config/fxtc/fxtc.compile create mode 100644 config/fxtc/fxtc.env diff --git a/config/fxtc/fxtc.compile b/config/fxtc/fxtc.compile new file mode 100644 index 00000000..af05c4c7 --- /dev/null +++ b/config/fxtc/fxtc.compile @@ -0,0 +1,6 @@ +#!/bin/bash + +./autogen.sh +./configure --disable-dependency-tracking --enable-tests=no --without-gui --without-miniupnpc --with-incompatible-bdb CFLAGS="-march=native" LIBS="-lcurl -lssl -lcrypto -lz" +make +make install \ No newline at end of file diff --git a/config/fxtc/fxtc.env b/config/fxtc/fxtc.env new file mode 100644 index 00000000..4d9fe058 --- /dev/null +++ b/config/fxtc/fxtc.env @@ -0,0 +1,6 @@ +CODENAME=fxtc +MNODE_DAEMON=${MNODE_DAEMON:-/usr/local/bin/fxtcd +MNODE_INBOUND_PORT=${MNODE_INBOUND_PORT:-9468} +GIT_URL=https://github.com/fxtc/fxtc.git +SCVERSION="tags/master" +NETWORK_BASE_TAG="2012" \ No newline at end of file From 71edd1d56f75249be0ae5bdd366edfed3961df1e Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Thu, 23 Aug 2018 18:07:18 +0900 Subject: [PATCH 03/43] Use version v1.3.3.1 --- config/phore/phore.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/phore/phore.env b/config/phore/phore.env index 4c71dd18..9c6264a9 100644 --- a/config/phore/phore.env +++ b/config/phore/phore.env @@ -2,5 +2,5 @@ CODENAME=phore MNODE_DAEMON=${MNODE_DAEMON:-/usr/local/bin/phored} MNODE_INBOUND_PORT=${MNODE_INBOUND_PORT:-11771} GIT_URL=https://github.com/phoreproject/Phore.git -SCVERSION="tags/v1.3.3" +SCVERSION="tags/v1.3.3.1" NETWORK_BASE_TAG="2044" From e88148bc1abef0db90ffa4b9a84709208ef5a7ec Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Thu, 23 Aug 2018 18:12:34 +0900 Subject: [PATCH 04/43] Update to latest on https://github.com/masternodes/vps --- install.sh | 730 +++++++++++++++++++++++++++++------------------------ 1 file changed, 407 insertions(+), 323 deletions(-) diff --git a/install.sh b/install.sh index 7351b3b9..75b1ecfd 100755 --- a/install.sh +++ b/install.sh @@ -5,10 +5,10 @@ # ██║╚██╗██║██║ ██║██║ ██║██╔══╝ ██║╚██╔╝██║██╔══██║╚════██║ ██║ ██╔══╝ ██╔══██╗ # ██║ ╚████║╚██████╔╝██████╔╝███████╗██║ ╚═╝ ██║██║ ██║███████║ ██║ ███████╗██║ ██║ # ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ -# ╚╗ @marsmensch 2016-2018 ╔╝ -# -# version v0.9.4 -# date 2018-04-04 +# ╚╗ @marsmensch 2016-2018 ╔╝ +# +# version v0.9.9 +# date 2018-08-23 # # function: part of the masternode scripts, source the proper config file # @@ -26,13 +26,15 @@ declare -r CRYPTOS=`ls -l config/ | egrep '^d' | awk '{print $9}' | xargs echo - declare -r DATE_STAMP="$(date +%y-%m-%d-%s)" declare -r SCRIPTPATH=$( cd $(dirname ${BASH_SOURCE[0]}) > /dev/null; pwd -P ) declare -r MASTERPATH="$(dirname "${SCRIPTPATH}")" -declare -r SCRIPT_VERSION="v0.9.4" +declare -r SCRIPT_VERSION="v0.9.9" declare -r SCRIPT_LOGFILE="/tmp/nodemaster_${DATE_STAMP}_out.log" declare -r IPV4_DOC_LINK="https://www.vultr.com/docs/add-secondary-ipv4-address" declare -r DO_NET_CONF="/etc/network/interfaces.d/50-cloud-init.cfg" function showbanner() { -cat << "EOF" + + echo $(tput bold)$(tput setaf 2) + cat << "EOF" ███╗ ██╗ ██████╗ ██████╗ ███████╗███╗ ███╗ █████╗ ███████╗████████╗███████╗██████╗ ████╗ ██║██╔═══██╗██╔══██╗██╔════╝████╗ ████║██╔══██╗██╔════╝╚══██╔══╝██╔════╝██╔══██╗ ██╔██╗ ██║██║ ██║██║ ██║█████╗ ██╔████╔██║███████║███████╗ ██║ █████╗ ██████╔╝ @@ -41,6 +43,9 @@ cat << "EOF" ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚╗ @marsmensch 2016-2018 ╔╝ EOF + echo "$(tput sgr0)$(tput setaf 3)Have fun, this is crypto after all!$(tput sgr0)" + echo "$(tput setaf 6)Donations for @marsmensch (BTC): 33ENWZ9RCYBG7nv6ac8KxBUSuQX64Hx3x3" + } # /* @@ -49,94 +54,111 @@ EOF # */ # function get_confirmation() { - # call with a prompt string or use a default - read -r -p "${1:-Are you sure? [y/N]} " response - case "$response" in - [yY][eE][sS]|[yY]) - true - ;; - *) - false - ;; - esac + + # call with a prompt string or use a default + read -r -p "${1:-Are you sure? [y/N]} " response + case "$response" in + [yY][eE][sS]|[yY]) + true + ;; + *) + false + ;; + esac + } # # /* no parameters, displays the help message */ # function show_help(){ - clear - showbanner - echo "install.sh, version $SCRIPT_VERSION"; - echo "Usage example:"; - echo "install.sh (-p|--project) string [(-h|--help)] [(-n|--net) int] [(-c|--count) int] [(-r|--release) string] [(-w|--wipe)] [(-u|--update)] [(-x|--startnodes)]"; - echo "Options:"; - echo "-h or --help: Displays this information."; - echo "-p or --project string: Project to be installed. REQUIRED."; - echo "-n or --net: IP address type t be used (4 vs. 6)."; - echo "-c or --count: Number of masternodes to be installed."; - echo "-r or --release: Release version to be installed."; - echo "-s or --sentinel: Add sentinel monitoring for a node type. Combine with the -p option"; - echo "-w or --wipe: Wipe ALL local data for a node type. Combine with the -p option"; - echo "-u or --update: Update a specific masternode daemon. Combine with the -p option"; - echo "-r or --release: Release version to be installed."; + + clear + showbanner + echo "install.sh, version $SCRIPT_VERSION"; + echo "Usage example:"; + echo "install.sh (-p|--project) string [(-h|--help)] [(-n|--net) int] [(-c|--count) int] [(-r|--release) string] [(-w|--wipe)] [(-u|--update)] [(-x|--startnodes)]"; + echo "Options:"; + echo "-h or --help: Displays this information."; + echo "-p or --project string: Project to be installed. REQUIRED."; + echo "-n or --net: IP address type t be used (4 vs. 6)."; + echo "-c or --count: Number of masternodes to be installed."; + echo "-r or --release: Release version to be installed."; + echo "-s or --sentinel: Add sentinel monitoring for a node type. Combine with the -p option"; + echo "-w or --wipe: Wipe ALL local data for a node type. Combine with the -p option"; + echo "-u or --update: Update a specific masternode daemon. Combine with the -p option"; + echo "-r or --release: Release version to be installed."; + echo "-k or --key: Set private key to masternode configuration files directly"; echo "-x or --startnodes: Start masternodes after installation to sync with blockchain"; - exit 1; + echo "-g or --generate: Generate masternode private key and use" + exit 1; + } # # /* no parameters, checks if we are running on a supported Ubuntu release */ # function check_distro() { - # currently only for Ubuntu 16.04 - if [[ -r /etc/os-release ]]; then - . /etc/os-release - if [[ "${VERSION_ID}" != "16.04" ]]; then - echo "This script only supports ubuntu 16.04 LTS, exiting." - exit 1 - fi - else - # no, thats not ok! - echo "This script only supports ubuntu 16.04 LTS, exiting." - exit 1 - fi + + # currently only for Ubuntu 16.04 & 18.04 + if [[ -r /etc/os-release ]]; then + . /etc/os-release + if [[ "${VERSION_ID}" != "16.04" ]] && [[ "${VERSION_ID}" != "18.04" ]] ; then + echo "This script only supports Ubuntu 16.04 & 18.04 LTS, exiting." + exit 1 + fi + else + # no, thats not ok! + echo "This script only supports Ubuntu 16.04 & 18.04 LTS, exiting." + exit 1 + fi + } # # /* no parameters, installs the base set of packages that are required for all projects */ # function install_packages() { - # development and build packages - # these are common on all cryptos - echo "* Package installation!" - apt-get -qq -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true update - apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install build-essential g++ \ - protobuf-compiler libboost-all-dev autotools-dev \ - automake libcurl4-openssl-dev libboost-all-dev libssl-dev libdb++-dev \ - make autoconf automake libtool git apt-utils libprotobuf-dev pkg-config \ - libcurl3-dev libudev-dev libqrencode-dev bsdmainutils pkg-config libssl-dev \ - libgmp3-dev libevent-dev jp2a pv virtualenv &>> ${SCRIPT_LOGFILE} + + # development and build packages + # these are common on all cryptos + echo "* Package installation!" + add-apt-repository -yu ppa:bitcoin/bitcoin &>> ${SCRIPT_LOGFILE} + apt-get -qq -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true update &>> ${SCRIPT_LOGFILE} + apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install build-essential \ + libcurl4-gnutls-dev protobuf-compiler libboost-all-dev autotools-dev automake \ + libboost-all-dev libssl-dev make autoconf libtool git apt-utils g++ \ + libprotobuf-dev pkg-config libudev-dev libqrencode-dev bsdmainutils \ + pkg-config libgmp3-dev libevent-dev jp2a pv virtualenv libdb4.8-dev libdb4.8++-dev &>> ${SCRIPT_LOGFILE} + + # only for 18.04 // openssl + if [[ "${VERSION_ID}" == "18.04" ]] ; then + apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install libssl1.0-dev + fi + } # # /* no parameters, creates and activates a swapfile since VPS servers often do not have enough RAM for compilation */ # function swaphack() { -#check if swap is available -if [ $(free | awk '/^Swap:/ {exit !$2}') ] || [ ! -f "/var/mnode_swap.img" ];then - echo "* No proper swap, creating it" - # needed because ant servers are ants - rm -f /var/mnode_swap.img - dd if=/dev/zero of=/var/mnode_swap.img bs=1024k count=${MNODE_SWAPSIZE} &>> ${SCRIPT_LOGFILE} - chmod 0600 /var/mnode_swap.img - mkswap /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} - swapon /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} - echo '/var/mnode_swap.img none swap sw 0 0' | tee -a /etc/fstab &>> ${SCRIPT_LOGFILE} - echo 'vm.swappiness=10' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} -else - echo "* All good, we have a swap" -fi + + #check if swap is available + if [ $(free | awk '/^Swap:/ {exit !$2}') ] || [ ! -f "/var/mnode_swap.img" ];then + echo "* No proper swap, creating it" + # needed because ant servers are ants + rm -f /var/mnode_swap.img + dd if=/dev/zero of=/var/mnode_swap.img bs=1024k count=${MNODE_SWAPSIZE} &>> ${SCRIPT_LOGFILE} + chmod 0600 /var/mnode_swap.img + mkswap /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} + swapon /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} + echo '/var/mnode_swap.img none swap sw 0 0' | tee -a /etc/fstab &>> ${SCRIPT_LOGFILE} + echo 'vm.swappiness=10' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + else + echo "* All good, we have a swap" + fi + } # @@ -144,13 +166,13 @@ fi # function create_mn_user() { - # our new mnode unpriv user acc is added - if id "${MNODE_USER}" >/dev/null 2>&1; then - echo "user exists already, do nothing" &>> ${SCRIPT_LOGFILE} - else - echo "Adding new system user ${MNODE_USER}" - adduser --disabled-password --gecos "" ${MNODE_USER} &>> ${SCRIPT_LOGFILE} - fi + # our new mnode unpriv user acc is added + if id "${MNODE_USER}" >/dev/null 2>&1; then + echo "user exists already, do nothing" &>> ${SCRIPT_LOGFILE} + else + echo "Adding new system user ${MNODE_USER}" + adduser --disabled-password --gecos "" ${MNODE_USER} &>> ${SCRIPT_LOGFILE} + fi } @@ -159,14 +181,14 @@ function create_mn_user() { # function create_mn_dirs() { - # individual data dirs for now to avoid problems - echo "* Creating masternode directories" - mkdir -p ${MNODE_CONF_BASE} + # individual data dirs for now to avoid problems + echo "* Creating masternode directories" + mkdir -p ${MNODE_CONF_BASE} for NUM in $(seq 1 ${count}); do - if [ ! -d "${MNODE_DATA_BASE}/${CODENAME}${NUM}" ]; then - echo "creating data directory ${MNODE_DATA_BASE}/${CODENAME}${NUM}" &>> ${SCRIPT_LOGFILE} - mkdir -p ${MNODE_DATA_BASE}/${CODENAME}${NUM} &>> ${SCRIPT_LOGFILE} - fi + if [ ! -d "${MNODE_DATA_BASE}/${CODENAME}${NUM}" ]; then + echo "creating data directory ${MNODE_DATA_BASE}/${CODENAME}${NUM}" &>> ${SCRIPT_LOGFILE} + mkdir -p ${MNODE_DATA_BASE}/${CODENAME}${NUM} &>> ${SCRIPT_LOGFILE} + fi done } @@ -176,39 +198,45 @@ function create_mn_dirs() { # function create_sentinel_setup() { + SENTINEL_BASE=/usr/share/sentinel + SENTINEL_ENV=/usr/share/sentinelenv + # if code directory does not exists, we create it clone the src - if [ ! -d /usr/share/sentinel ]; then + if [ ! -d ${SENTINEL_BASE} ]; then cd /usr/share &>> ${SCRIPT_LOGFILE} git clone https://github.com/dashpay/sentinel.git sentinel &>> ${SCRIPT_LOGFILE} cd sentinel &>> ${SCRIPT_LOGFILE} rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} else echo "* Updating the existing sentinel GIT repo" - cd /usr/share/sentinel &>> ${SCRIPT_LOGFILE} + cd ${SENTINEL_BASE} &>> ${SCRIPT_LOGFILE} git pull &>> ${SCRIPT_LOGFILE} rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} fi # create a globally accessible venv and install sentinel requirements - virtualenv --system-site-packages /usr/share/sentinelvenv &>> ${SCRIPT_LOGFILE} - /usr/share/sentinelvenv/bin/pip install -r requirements.txt &>> ${SCRIPT_LOGFILE} + virtualenv --system-site-packages ${SENTINEL_BASE} &>> ${SCRIPT_LOGFILE} + ${SENTINEL_BASE}/bin/pip install -r requirements.txt &>> ${SCRIPT_LOGFILE} - # create one sentinel config file per masternode + # create one sentinel config file per masternode for NUM in $(seq 1 ${count}); do - if [ ! -f "/usr/share/sentinel/${CODENAME}${NUM}_sentinel.conf" ]; then - echo "* Creating sentinel configuration for ${CODENAME} masternode number ${NUM}" &>> ${SCRIPT_LOGFILE} - echo "dash_conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" > /usr/share/sentinel/${CODENAME}${NUM}_sentinel.conf - echo "network=mainnet" >> /usr/share/sentinel/${CODENAME}${NUM}_sentinel.conf - echo "db_name=database/${CODENAME}_${NUM}_sentinel.db" >> /usr/share/sentinel/${CODENAME}${NUM}_sentinel.conf - echo "db_driver=sqlite" >> /usr/share/sentinel/${CODENAME}${NUM}_sentinel.conf - fi + if [ ! -f "${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf" ]; then + echo "* Creating sentinel configuration for ${CODENAME} masternode number ${NUM}" &>> ${SCRIPT_LOGFILE} + echo "dash_conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" > ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "network=mainnet" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "db_name=database/${CODENAME}_${NUM}_sentinel.db" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "db_driver=sqlite" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + fi done - echo "Generated a Sentinel config for you. To activate Sentinel run" - echo "export SENTINEL_CONFIG=${MNODE_CONF_BASE}/${CODENAME}${NUM}_sentinel.conf; /usr/share/sentinelvenv/bin/python /usr/share/sentinel/bin/sentinel.py" - echo "" - echo "If it works, add the command as cronjob: " - echo "* * * * * export SENTINEL_CONFIG=${MNODE_CONF_BASE}/${CODENAME}${NUM}_sentinel.conf; /usr/share/sentinelvenv/bin/python /usr/share/sentinel/bin/sentinel.py 2>&1 >> /var/log/sentinel/sentinel-cron.log" + export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py + + + echo "$(tput sgr0)$(tput setaf 3)Generated a Sentinel config for you. To activate Sentinel run:$(tput sgr0)" + echo "$(tput sgr0)$(tput setaf 2)export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py$(tput sgr0)" + echo "" + echo "$(tput sgr0)$(tput setaf 2)If it works, add the command as cronjob: $(tput sgr0)" + echo "$(tput sgr0)$(tput setaf 2)* * * * * export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py 2>&1 >> /var/log/sentinel/sentinel-cron.log$(tput sgr0)" } @@ -217,7 +245,7 @@ function create_sentinel_setup() { # function configure_firewall() { - echo "* Configuring firewall rules" + echo "* Configuring firewall rules" # disallow everything except ssh and masternode inbound ports ufw default deny &>> ${SCRIPT_LOGFILE} ufw logging on &>> ${SCRIPT_LOGFILE} @@ -225,7 +253,7 @@ function configure_firewall() { # KISS, its always the same port for all interfaces ufw allow ${MNODE_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} # This will only allow 6 connections every 30 seconds from the same IP address. - ufw limit OpenSSH &>> ${SCRIPT_LOGFILE} + ufw limit OpenSSH &>> ${SCRIPT_LOGFILE} ufw --force enable &>> ${SCRIPT_LOGFILE} echo "* Firewall ufw is active and enabled on system startup" @@ -236,7 +264,7 @@ function configure_firewall() { # function validate_netchoice() { - echo "* Validating network rules" + echo "* Validating network rules" # break here of net isn't 4 or 6 if [ ${net} -ne 4 ] && [ ${net} -ne 6 ]; then @@ -246,9 +274,9 @@ function validate_netchoice() { # generate the required ipv6 config if [ "${net}" -eq 4 ]; then - IPV6_INT_BASE="#NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER" - NETWORK_BASE_TAG="" - echo "IPv4 address generation needs to be done manually atm!" &>> ${SCRIPT_LOGFILE} + IPV6_INT_BASE="#NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER" + NETWORK_BASE_TAG="" + echo "IPv4 address generation needs to be done manually atm!" &>> ${SCRIPT_LOGFILE} fi # end ifneteq4 } @@ -259,77 +287,87 @@ function validate_netchoice() { # function create_mn_configuration() { - # always return to the script root - cd ${SCRIPTPATH} - for NUM in $(seq 1 ${count}); do - if [ -n "${PRIVKEY[${NUM}]}" ]; then - echo ${PRIVKEY[${NUM}]} >> tmp.txt - fi - done - if [ -f tmp.txt ]; then - dup=$(sort -t 8 tmp.txt | uniq -c | sort -nr | head -1 | awk '{print substr($0, 7, 1)}') - if [ 1 -ne "$dup" ]; then - echo "Private key was duplicated. Please restart this script." - rm -r /etc/masternodes - rm tmp.txt - exit 1 - fi - rm tmp.txt - fi - - # create one config file per masternode - for NUM in $(seq 1 ${count}); do - PASS=$(date | md5sum | cut -c1-24) - - # we dont want to overwrite an existing config file - if [ ! -f ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf ]; then - echo "individual masternode config doesn't exist, generate it!" &>> ${SCRIPT_LOGFILE} - # if a template exists, use this instead of the default - if [ -e config/${CODENAME}/${CODENAME}.conf ]; then - echo "custom configuration template for ${CODENAME} found, use this instead" &>> ${SCRIPT_LOGFILE} - cp ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} - else - echo "No ${CODENAME} template found, using the default configuration template" &>> ${SCRIPT_LOGFILE} - cp ${SCRIPTPATH}/config/default.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} - fi - # replace placeholders - echo "running sed on file ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" &>> ${SCRIPT_LOGFILE} - fi - - if [ -n "${PRIVKEY[${NUM}]}" ]; then - if [ ${#PRIVKEY[${NUM}]} -eq 51 ]; then - sed -e "s/HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_XXX_GIT_PROJECT_XXX_XXX_NUM_XXX/${PRIVKEY[${NUM}]}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - else - echo "input private key ${PRIVKEY[${NUM}]} was invalid. Please check the key, and restart this script." - rm -r /etc/masternodes - exit 1 - fi - else : - fi - sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY/${NUM}]/" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV6_INT_BASE}/" -e "s/XXX_NETWORK_BASE_TAG_XXX/${NETWORK_BASE_TAG}/" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - if [ -z "${PRIVKEY[${NUM}]}" ]; then - if [ "$startnodes" -eq 1 ]; then - #uncomment masternode= and masternodeprivkey= so the node can autostart and sync - sed 's/\(^.*masternode\(\|privkey\)=.*$\)/#\1/' -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - fi - fi - done + # always return to the script root + cd ${SCRIPTPATH} + + # recode inputed private key to tmp.txt, check the keys + for NUM in $(seq 1 ${count}); do + if [ -n "${PRIVKEY[${NUM}]}" ]; then + echo ${PRIVKEY[${NUM}]} >> tmp.txt + fi + done + + if [ -f tmp.txt ]; then + dup=$(sort -t 8 tmp.txt | uniq -c | sort -nr | head -1 | awk '{print substr($0, 7, 1)}') + if [ 1 -ne "$dup" ]; then + echo "Private key was duplicated. Please restart this script." + rm -r /etc/masternodes + rm tmp.txt + exit 1 + fi + rm tmp.txt + fi + + # create one config file per masternode + for NUM in $(seq 1 ${count}); do + PASS=$(date | md5sum | cut -c1-24) + + # we dont want to overwrite an existing config file + if [ ! -f ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf ]; then + echo "individual masternode config doesn't exist, generate it!" &>> ${SCRIPT_LOGFILE} + + # if a template exists, use this instead of the default + if [ -e config/${CODENAME}/${CODENAME}.conf ]; then + echo "custom configuration template for ${CODENAME} found, use this instead" &>> ${SCRIPT_LOGFILE} + cp ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} + else + echo "No ${CODENAME} template found, using the default configuration template" &>> ${SCRIPT_LOGFILE} + cp ${SCRIPTPATH}/config/default.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} + fi + + # replace placeholders + echo "running sed on file ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" &>> ${SCRIPT_LOGFILE} + fi + + # Write inputed private key to project.conf + if [ -n "${PRIVKEY[${NUM}]}" ]; then + if [ ${#PRIVKEY[${NUM}]} -eq 51 ]; then + sed -e "s/HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_XXX_GIT_PROJECT_XXX_XXX_NUM_XXX/${PRIVKEY[${NUM}]}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + else + echo "input private key ${PRIVKEY[${NUM}]} was invalid. Please check the key, and restart this script." + rm -r /etc/masternodes + exit 1 + fi + else : + fi + sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY/${NUM}]/" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV6_INT_BASE}/" -e "s/XXX_NETWORK_BASE_TAG_XXX/${NETWORK_BASE_TAG}/" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + if [ -z "${PRIVKEY[${NUM}]}" ]; then + if [ "$startnodes" -eq 1 ]; then + #uncomment masternode= and masternodeprivkey= so the node can autostart and sync + sed 's/\(^.*masternode\(\|privkey\)=.*$\)/#\1/' -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + fi + fi + done + } # # /* no parameters, generates a masternode configuration file per masternode in the default */ # function create_control_configuration() { - # delete any old stuff that's still around - rm -f /tmp/${CODENAME}_masternode.conf &>> ${SCRIPT_LOGFILE} + + # delete any old stuff that's still around + rm -f /tmp/${CODENAME}_masternode.conf &>> ${SCRIPT_LOGFILE} + # create one line per masternode with the data we have for NUM in $(seq 1 ${count}); do if [ -n "${PRIVKEY[${NUM}]}" ]; then - echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} ${PRIVKEY[${NUM}]} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf - else + echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} ${PRIVKEY[${NUM}]} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf + else echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} MASTERNODE_PRIVKEY_FOR_${CODENAME}MN${NUM} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf fi done + } # @@ -337,7 +375,7 @@ function create_control_configuration() { # function create_systemd_configuration() { - echo "* (over)writing systemd config files for masternodes" + echo "* (over)writing systemd config files for masternodes" # create one config file per masternode for NUM in $(seq 1 ${count}); do PASS=$(date | md5sum | cut -c1-24) @@ -376,10 +414,11 @@ function create_systemd_configuration() { # function set_permissions() { - # maybe add a sudoers entry later - chown -R ${MNODE_USER}:${MNODE_USER} ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel &>> ${SCRIPT_LOGFILE} - # make group permissions same as user, so vps-user can be added to masternode group - chmod -R g=u ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel &>> ${SCRIPT_LOGFILE} + # maybe add a sudoers entry later + mkdir -p /var/log/sentinel &>> ${SCRIPT_LOGFILE} + chown -R ${MNODE_USER}:${MNODE_USER} ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel ${SENTINEL_BASE}/database &>> ${SCRIPT_LOGFILE} + # make group permissions same as user, so vps-user can be added to masternode group + chmod -R g=u ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel &>> ${SCRIPT_LOGFILE} } @@ -388,7 +427,7 @@ function set_permissions() { # function wipe_all() { - echo "Deleting all ${project} related data!" + echo "Deleting all ${project} related data!" rm -f /etc/masternodes/${project}_n*.conf rmdir --ignore-fail-on-non-empty -p /var/lib/masternodes/${project}* rm -f /etc/systemd/system/${project}_n*.service @@ -399,22 +438,26 @@ function wipe_all() { } # -#Generate masternode private key +# /* +# Generate masternode private key +# */ # function generate_privkey() { + echo -e "rpcuser=test\nrpcpassword=passtest" >> ${MNODE_CONF_BASE}/${CODENAME}_test.conf - mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test - phored -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test - sleep 5 - + mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test + phored -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test + sleep 5 + for NUM in $(seq 1 ${count}); do - if [ -z "${PRIVKEY[${NUM}]}" ]; then - PRIVKEY[${NUM}]=$(phore-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) - fi - done - phore-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop - sleep 5 - rm -r ${MNODE_CONF_BASE}/${CODENAME}_test.conf ${MNODE_DATA_BASE}/${CODENAME}_test + if [ -z "${PRIVKEY[${NUM}]}" ]; then + PRIVKEY[${NUM}]=$(phore-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) + fi + done + phore-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop + sleep 5 + rm -r ${MNODE_CONF_BASE}/${CODENAME}_test.conf ${MNODE_DATA_BASE}/${CODENAME}_test + } # @@ -425,7 +468,7 @@ function generate_privkey() { # function cleanup_after() { - apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoremove + #apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoremove apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoclean echo "kernel.randomize_va_space=1" > /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} @@ -452,13 +495,13 @@ function cleanup_after() { # source the default and desired crypto configuration files function source_config() { - SETUP_CONF_FILE="${SCRIPTPATH}/config/${project}/${project}.env" + SETUP_CONF_FILE="${SCRIPTPATH}/config/${project}/${project}.env" - # first things first, to break early if things are missing or weird - check_distro + # first things first, to break early if things are missing or weird + check_distro if [ -f ${SETUP_CONF_FILE} ]; then - echo "Script version ${SCRIPT_VERSION}, you picked: ${project}" + echo "Script version ${SCRIPT_VERSION}, you picked: $(tput bold)$(tput setaf 2) ${project} $(tput sgr0), running on Ubuntu ${VERSION_ID}" echo "apply config file for ${project}" &>> ${SCRIPT_LOGFILE} source "${SETUP_CONF_FILE}" @@ -486,22 +529,42 @@ function source_config() { fi # main block of function logic starts here - # if update flag was given, delete the old daemon binary first & proceed - if [ "$update" -eq 1 ]; then - echo "update given, deleting the old daemon NOW!" &>> ${SCRIPT_LOGFILE} - rm -f ${MNODE_DAEMON} - fi + # if update flag was given, delete the old daemon binary first & proceed + if [ "$update" -eq 1 ]; then + if [ ! -f ${MNODE_DAEMON} ]; then + echo "UPDATE FAILED! Daemon hasn't been found. Please try the normal installation process by omitting the upgrade parameter." + exit 1 + fi + if [ ! -f ${MNODE_HELPER}_${CODENAME} ]; then + echo "UPDATE FAILED! Masternode activation file ${MNODE_HELPER}_${CODENAME} hasn't been found. Please try the normal installation process by omitting the upgrade parameter." + exit 1 + fi + if [ ! -d ${MNODE_DATA_BASE} ]; then + echo "UPDATE FAILED! ${MNODE_DATA_BASE} hasn't been found. Please try the normal installation process by omitting the upgrade parameter." + exit 1 + fi + fi echo "************************* Installation Plan *****************************************" echo "" - echo "I am going to install and configure " - echo "=> ${count} ${project} masternode(s) in version ${release}" - echo "for you now." - echo "" - echo "You have to add your masternode private key to the individual config files afterwards" + if [ "$update" -eq 1 ]; then + echo "I am going to update your existing" + echo "$(tput bold)$(tput setaf 2) => ${project} masternode(s) in version ${release} $(tput sgr0)" + else + echo "I am going to install and configure" + echo "$(tput bold)$(tput setaf 2) => ${count} ${project} masternode(s) in version ${release} $(tput sgr0)" + fi + echo "for you now." + echo "" + if [ "$update" -eq 0 ]; then + # only needed if fresh installation + echo "If you didn't set generate, key option, you have to add your masternode private key to the individual config files afterwards." + echo "" + fi echo "" echo "Stay tuned!" - echo "" + echo "" + # show a hint for MANUAL IPv4 configuration if [ "${net}" -eq 4 ]; then NETWORK_TYPE=4 @@ -512,10 +575,12 @@ function source_config() { echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" echo "${IPV4_DOC_LINK}" fi + # sentinel setup if [ "$sentinel" -eq 1 ]; then echo "I will also generate a Sentinel configuration for you." fi + # start nodes after setup if [ "$startnodes" -eq 1 ]; then echo "I will start your masternodes after the installation." @@ -528,31 +593,34 @@ function source_config() { sleep 5 # main routine - print_logo - prepare_mn_interfaces - swaphack - install_packages + if [ "$update" -eq 0 ]; then + prepare_mn_interfaces + swaphack + fi + install_packages + print_logo build_mn_from_source - create_mn_user - create_mn_dirs - - # private key initialize - if [ "$generate" -eq 1 ]; then - echo "Generating masternode private key" &>> ${SCRIPT_LOGFILE} - generate_privkey - fi - - # sentinel setup - if [ "$sentinel" -eq 1 ]; then - echo "* Sentinel setup chosen" &>> ${SCRIPT_LOGFILE} - create_sentinel_setup - fi - - configure_firewall - create_mn_configuration - create_control_configuration - create_systemd_configuration - set_permissions + if [ "$update" -eq 0 ]; then + create_mn_user + create_mn_dirs + + # private key initialize + if [ "$generate" -eq 1 ]; then + echo "Generating masternode private key" &>> ${SCRIPT_LOGFILE} + generate_privkey + fi + + # sentinel setup + if [ "$sentinel" -eq 1 ]; then + echo "* Sentinel setup chosen" &>> ${SCRIPT_LOGFILE} + create_sentinel_setup + fi + configure_firewall + create_mn_configuration + create_control_configuration + create_systemd_configuration + fi + set_permissions cleanup_after showbanner final_call @@ -568,10 +636,10 @@ function print_logo() { # print ascii banner if a logo exists echo -e "* Starting the compilation process for ${CODENAME}, stay tuned" if [ -f "${SCRIPTPATH}/assets/$CODENAME.jpg" ]; then - jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/${CODENAME}.jpg + jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/${CODENAME}.jpg else - jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/default.jpg - fi + jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/default.jpg + fi } @@ -579,42 +647,45 @@ function print_logo() { # /* no parameters, builds the required masternode binary from sources. Exits if already exists and "update" not given */ # function build_mn_from_source() { - # daemon not found compile it - if [ ! -f ${MNODE_DAEMON} ]; then - mkdir -p ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} - # if code directory does not exists, we create it clone the src - if [ ! -d ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} ]; then - mkdir -p ${CODE_DIR} && cd ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} - git clone ${GIT_URL} ${CODENAME} &>> ${SCRIPT_LOGFILE} - cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} - echo "* Checking out desired GIT tag: ${release}" - git checkout ${release} &>> ${SCRIPT_LOGFILE} - else - echo "* Updating the existing GIT repo" - cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} - git pull &>> ${SCRIPT_LOGFILE} - echo "* Checking out desired GIT tag: ${release}" - git checkout ${release} &>> ${SCRIPT_LOGFILE} - fi - - # print ascii banner if a logo exists - echo -e "* Starting the compilation process for ${CODENAME}, stay tuned" - if [ -f "${SCRIPTPATH}/assets/$CODENAME.jpg" ]; then - jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/${CODENAME}.jpg - else - jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/default.jpg - fi - # compilation starts here - source ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.compile | pv -t -i0.1 - else - echo "* Daemon already in place at ${MNODE_DAEMON}, not compiling" - fi - - # if it's not available after compilation, theres something wrong - if [ ! -f ${MNODE_DAEMON} ]; then - echo "COMPILATION FAILED! Please open an issue at https://github.com/masternodes/vps/issues. Thank you!" - exit 1 - fi + # daemon not found compile it + if [ ! -f ${MNODE_DAEMON} ] || [ "$update" -eq 1 ]; then + # create code directory if it doesn't exist + if [ ! -d ${SCRIPTPATH}/${CODE_DIR} ]; then + mkdir -p ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} + fi + # if coin directory (CODENAME) exists, we remove it, to make a clean git clone + if [ -d ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} ]; then + echo "deleting ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} for clean cloning" &>> ${SCRIPT_LOGFILE} + rm -rf ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} + fi + mkdir -p ${CODE_DIR} && cd ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} + git clone ${GIT_URL} ${CODENAME} &>> ${SCRIPT_LOGFILE} + cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} + echo "* Checking out desired GIT tag: ${release}" + git checkout ${release} &>> ${SCRIPT_LOGFILE} + + if [ "$update" -eq 1 ]; then + echo "update given, deleting the old daemon NOW!" &>> ${SCRIPT_LOGFILE} + rm -f ${MNODE_DAEMON} + # old daemon must be removed before compilation. Would be better to remove it afterwards, however not possible with current structure + if [ -f ${MNODE_DAEMON} ]; then + echo "UPDATE FAILED! Daemon ${MNODE_DAEMON} couldn't be removed. Please open an issue at https://github.com/masternodes/vps/issues. Thank you!" + exit 1 + fi + fi + + # compilation starts here + source ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.compile | pv -t -i0.1 + else + echo "* Daemon already in place at ${MNODE_DAEMON}, not compiling" + fi + + # if it's not available after compilation, theres something wrong + if [ ! -f ${MNODE_DAEMON} ]; then + echo "COMPILATION FAILED! Please open an issue at https://github.com/phoreproject/vps/issues. Thank you!" + exit 1 + fi + } # @@ -622,33 +693,41 @@ function build_mn_from_source() { # function final_call() { # note outstanding tasks that need manual work - echo "************! ALMOST DONE !******************************" - echo "There is still work to do in the configuration templates." - echo "These are located at ${MNODE_CONF_BASE}, one per masternode." - echo "Add your masternode private keys now." - echo "eg in /etc/masternodes/${CODENAME}_n1.conf" - echo "" - echo "=> All configuration files are in: ${MNODE_CONF_BASE}" - echo "=> All Data directories are in: ${MNODE_DATA_BASE}" + echo "************! ALMOST DONE !******************************" + if [ "$update" -eq 0 ]; then + echo "There is still work to do in the configuration templates." + echo "These are located at ${MNODE_CONF_BASE}, one per masternode." + echo "If you didn't set generate or key option, add your masternode private keys now." + echo "eg in /etc/masternodes/${CODENAME}_n1.conf" + else + echo "Your ${CODENAME} masternode daemon has been updated! (but not yet activated)" + fi + echo "" + echo "=> $(tput bold)$(tput setaf 2) All configuration files are in: ${MNODE_CONF_BASE} $(tput sgr0)" + echo "=> $(tput bold)$(tput setaf 2) All Data directories are in: ${MNODE_DATA_BASE} $(tput sgr0)" echo "" - echo "last but not least, run /usr/local/bin/activate_masternodes_${CODENAME} as root to activate your nodes." + echo "$(tput bold)$(tput setaf 1)Important:$(tput sgr0) run $(tput setaf 2) /usr/local/bin/activate_masternodes_${CODENAME} $(tput sgr0) as root to activate your nodes." - # place future helper script accordingly + # place future helper script accordingly + if [ "$update" -eq 0 ]; then cp ${SCRIPTPATH}/scripts/activate_masternodes.sh ${MNODE_HELPER}_${CODENAME} - echo "">> ${MNODE_HELPER}_${CODENAME} + echo "">> ${MNODE_HELPER}_${CODENAME} - for NUM in $(seq 1 ${count}); do - echo "systemctl enable ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} - echo "systemctl restart ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} - done + for NUM in $(seq 1 ${count}); do + echo "systemctl enable ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} + echo "systemctl restart ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} + done + + chmod u+x ${MNODE_HELPER}_${CODENAME} + fi - chmod u+x ${MNODE_HELPER}_${CODENAME} if [ "$startnodes" -eq 1 ]; then echo "" echo "** Your nodes are starting up. If you haven't set masternode private key, Don't forget to change the masternodeprivkey later." ${MNODE_HELPER}_${CODENAME} fi tput sgr0 + } # @@ -656,43 +735,48 @@ function final_call() { # function prepare_mn_interfaces() { - # this allows for more flexibility since every provider uses another default interface - # current default is: - # * ens3 (vultr) w/ a fallback to "eth0" (Hetzner, DO & Linode w/ IPv4 only) - # - - # check for the default interface status - if [ ! -f /sys/class/net/${ETH_INTERFACE}/operstate ]; then - echo "Default interface doesn't exist, switching to eth0" - export ETH_INTERFACE="eth0" + # this allows for more flexibility since every provider uses another default interface + # current default is: + # * ens3 (vultr) w/ a fallback to "eth0" (Hetzner, DO & Linode w/ IPv4 only) + # + + # check for the default interface status + if [ ! -f /sys/class/net/${ETH_INTERFACE}/operstate ]; then + echo "Default interface doesn't exist, switching to eth0" + export ETH_INTERFACE="eth0" + fi + + # check for the nuse case <3 + if [ -f /sys/class/net/ens160/operstate ]; then + export ETH_INTERFACE="ens160" + fi + + # get the current interface state + ETH_STATUS=$(cat /sys/class/net/${ETH_INTERFACE}/operstate) + + # check interface status + if [[ "${ETH_STATUS}" = "down" ]] || [[ "${ETH_STATUS}" = "" ]]; then + echo "Default interface is down, fallback didn't work. Break here." + exit 1 + fi + + # DO ipv6 fix, are we on DO? + # check for DO network config file + if [ -f ${DO_NET_CONF} ]; then + # found the DO config + if ! grep -q "::8888" ${DO_NET_CONF}; then + echo "ipv6 fix not found, applying!" + sed -i '/iface eth0 inet6 static/a dns-nameservers 2001:4860:4860::8844 2001:4860:4860::8888 8.8.8.8 127.0.0.1' ${DO_NET_CONF} + ifdown ${ETH_INTERFACE}; ifup ${ETH_INTERFACE}; fi + fi - # get the current interface state - ETH_STATUS=$(cat /sys/class/net/${ETH_INTERFACE}/operstate) - - # check interface status - if [[ "${ETH_STATUS}" = "down" ]] || [[ "${ETH_STATUS}" = "" ]]; then - echo "Default interface is down, fallback didn't work. Break here." - exit 1 - fi - - # DO ipv6 fix, are we on DO? - # check for DO network config file - if [ -f ${DO_NET_CONF} ]; then - # found the DO config - if ! grep -q "::8888" ${DO_NET_CONF}; then - echo "ipv6 fix not found, applying!" - sed -i '/iface eth0 inet6 static/a dns-nameservers 2001:4860:4860::8844 2001:4860:4860::8888 8.8.8.8 127.0.0.1' ${DO_NET_CONF} - ifdown ${ETH_INTERFACE}; ifup ${ETH_INTERFACE}; - fi - fi - - IPV6_INT_BASE="$(ip -6 addr show dev ${ETH_INTERFACE} | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^fe80 | grep -v ^::1 | cut -f1-4 -d':' | head -1)" &>> ${SCRIPT_LOGFILE} + IPV6_INT_BASE="$(ip -6 addr show dev ${ETH_INTERFACE} | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^fe80 | grep -v ^::1 | cut -f1-4 -d':' | head -1)" &>> ${SCRIPT_LOGFILE} validate_netchoice echo "IPV6_INT_BASE AFTER : ${IPV6_INT_BASE}" &>> ${SCRIPT_LOGFILE} - # user opted for ipv6 (default), so we have to check for ipv6 support + # user opted for ipv6 (default), so we have to check for ipv6 support # check for vultr ipv6 box active if [ -z "${IPV6_INT_BASE}" ] && [ ${net} -ne 4 ]; then echo "No IPv6 support on the VPS but IPv6 is the setup default. Please switch to ipv4 with flag \"-n 4\" if you want to continue." @@ -704,8 +788,8 @@ function prepare_mn_interfaces() { # generate the required ipv6 config if [ "${net}" -eq 6 ]; then - # vultr specific, needed to work - sed -ie '/iface ${ETH_INTERFACE} inet6 auto/s/^/#/' ${NETWORK_CONFIG} + # vultr specific, needed to work + sed -ie '/iface ${ETH_INTERFACE} inet6 auto/s/^/#/' ${NETWORK_CONFIG} # move current config out of the way first cp ${NETWORK_CONFIG} ${NETWORK_CONFIG}.${DATE_STAMP}.bkp @@ -716,16 +800,16 @@ function prepare_mn_interfaces() { # check if the interfaces exist ip -6 addr | grep -qi "${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}" if [ $? -eq 0 ] - then - echo "IP for masternode already exists, skipping creation" &>> ${SCRIPT_LOGFILE} + then + echo "IP for masternode already exists, skipping creation" &>> ${SCRIPT_LOGFILE} else - echo "Creating new IP address for ${CODENAME} masternode nr ${NUM}" &>> ${SCRIPT_LOGFILE} - if [ "${NETWORK_CONFIG}" = "/etc/rc.local" ]; then - # need to put network config in front of "exit 0" in rc.local - sed -e '$i ip -6 addr add '"${IPV6_INT_BASE}"':'"${NETWORK_BASE_TAG}"'::'"${NUM}"'/64 dev '"${ETH_INTERFACE}"'\n' -i ${NETWORK_CONFIG} + echo "Creating new IP address for ${CODENAME} masternode nr ${NUM}" &>> ${SCRIPT_LOGFILE} + if [ "${NETWORK_CONFIG}" = "/etc/rc.local" ]; then + # need to put network config in front of "exit 0" in rc.local + sed -e '$i ip -6 addr add '"${IPV6_INT_BASE}"':'"${NETWORK_BASE_TAG}"'::'"${NUM}"'/64 dev '"${ETH_INTERFACE}"'\n' -i ${NETWORK_CONFIG} else - # if not using rc.local, append normally - echo "ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE}" >> ${NETWORK_CONFIG} + # if not using rc.local, append normally + echo "ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE}" >> ${NETWORK_CONFIG} fi sleep 2 ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE} &>> ${SCRIPT_LOGFILE} @@ -815,7 +899,6 @@ while true; do shift; startnodes="1"; ;; - -g | --generate) shift; generate="1"; @@ -926,8 +1009,8 @@ source ${SCRIPTPATH}/config/default.env main() { - echo "starting" &> ${SCRIPT_LOGFILE} - showbanner + echo "starting" &> ${SCRIPT_LOGFILE} + showbanner # debug if [ "$debug" -eq 1 ]; then @@ -977,6 +1060,7 @@ main() { echo "END OPTIONS => " echo "********************** VALUES AFTER CONFIG SOURCING: ************************" fi + } -main "$@" +main "$@" \ No newline at end of file From 0fc2ec56f10eaeeae18f2970422048fa71ec195a Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Thu, 23 Aug 2018 18:13:30 +0900 Subject: [PATCH 05/43] update README --- README.md | 89 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 77 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index c15d9673..a03bcc83 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This masternode installation script vastly simplifies the setup of a Phore maste Some notes and requirements: * Script has only been tested on a Vultr VPS, but should work almost anywhere where IPv6 addresses are available -* Currently only Ubunto 16.04 Linux is supported +* Currently only Ubunto 16.04, 18.04 Linux is supported * This script needs to run as root or with sudo, the masternodes will and should not! This project was forked from https://github.com/masternodes/vps. @marsmensch (Florian) is the primary author behind this VPS installation script for masternodes. If you would like to donate to him, you can use the BTC address below @@ -28,7 +28,7 @@ BTC 33ENWZ9RCYBG7nv6ac8KxBUSuQX64Hx3x3 ## How to get VPS server -For new masternode owners, **Vultr** is recommended as a VPS hosting provider, but other providers that allow direct root SSH login access and offer Ubunto 16.04 may work. +For new masternode owners, **Vultr** is recommended as a VPS hosting provider, but other providers that allow direct root SSH login access and offer Ubuntu 16.04, 18.04 may work. You can use the following referral link to sign up with Vultr for VPS hosting: @@ -118,19 +118,43 @@ Enter this command to copy the Masternode installation script and install a sing git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore ``` -If you have your masternode private key, please use this (you can generate masternode private key with Step 2 below). - -```bash -git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -k **PRIVATE KEY** -``` -Using this command, you can skip "Configure masternode configuration files" below, because the command abopve adds the masternode private key to the masternode configuration files. - This prepares the system and installs the Phore Masternode daemon. This includes downloading the latest Phore masternode release, creating a swap file, configuring the firewall, and compiling the Phore Masternode from source code. This process takes about 10-15 minutes. - VPS configuration While that is underway, go back to your local desktop and open phore-qt. +### Preinput masternode private key within installation (you can generate masternode private key with Step 2 below). + +In these cases, you can skip "Configure masternode configuration files" below. +- If you already generated masternode private key + Enter this command. + ```bash + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -k **PRIVATE KEY** + ``` + + **PRIVATE KEY** means your generated masternode private key. For example, + ```bash + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -k 87AqVXXXXXERNJxqBGdSS9LDS2vXXXXX5RdiiNd1zM7YAM7SHWX + ``` + In this script, you can find configuration in masternode.conf in your PC. + enter this to check it. + ```bash + cat /tmp/phore_masternode.conf + ``` + and add these lines to your masternode.conf. + +- If you want to generate masternode private key within masternode installation + Use this command + ```bash + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -g + ``` + And you can check generated private key in PuTTY. In this script, you can find configuration in masternode.conf in your PC. + enter this to check it. + ```bash + cat /tmp/phore_masternode.conf + ``` + and add these lines to your masternode.conf. + ### More complex situations (ignore if you are installing a single masternode on a new VPS) If you wish to install more than one masternode on the same VPS, you can add a -c parameter to tell the script how many to configure, so for example this would install three Phore masternodes (all entered on one line): @@ -160,6 +184,7 @@ The project is configured to use the latest official release of the Phore master ## Configure Phore Wallet ### Step1 - Create Collateral Transaction + Once the wallet is open on your local computer, generate a new receive address and label it however you want to identify your masternode rewards (e.g., Phore-MN-1). This label will show up in your transactions each time you receive a block reward. Click the Request payment button, and copy the address. @@ -199,12 +224,15 @@ The long string of characters is the *Transaction ID* for your masternode collat If you have multiple masternodes in the same wallet and have done the 10,000 PHR transactions for each of them, masternode outputs will display transaction IDs and indexes for each one. You can choose which private key to go with each transaction ID and index, as long as they are all different, and you make sure the corresponding lines in masternode.conf and the VPS phore configuration files match (see below). ## End of installations + When the script finishes, it will look similar to this: installation ended You only have a few steps remaining to complete your masternode configuration. + ## Configure masternode configuration files + Since this installation method supports multiple masternodes, the phore configuration files have a node number added to them (e.g., phore_n1.conf, phore_n2.conf), stored in the /etc/masternodes directory. If you have a single masternode on the VPS, you will only need to edit /etc/masternodes/phore_n1.conf. To open phore_n1.conf for editing, enter these commands: @@ -215,6 +243,7 @@ nano /etc/masternodes/phore_n1.conf The next step adds your masternode private key. ## Add masternode private key + What you need to change is only masternode private key. (We recommend using IPv6 which is the default, but if you choose IPv4 when you ran the installation script, please edit #NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER to your VPS IP address). After typing the nano command, you will see something similar to this. @@ -231,6 +260,7 @@ Then press Y to save, and press Enter to exit. Finally, close and restart your Phore wallet so that it will have the new masternode configuration. ## Start your masternodes + A script for starting all masternodes on the VPS has been created at /usr/local/bin/activate_masternodes_phore.sh. Run this command after your masternode configuration written above. @@ -241,6 +271,7 @@ Run this command after your masternode configuration written above. The masternode daemons will start and begin loading the Phore blockchain. ## Finishing Wallet Configuration & Activate Masternode + To activate your nodes from your wallet, one of the last steps is to add a line for the masternode in the masternode.conf file. This file has the following format, with each value separated with a space: * alias IP:Port masternodeprivatekey collateral_transaction_ID collateral_output_index @@ -262,7 +293,9 @@ The image below shows another example using an IPv4 IP address. If you followed editing masternode.conf If you are running multiple masternodes, you need to add one of these lines for each masternode, and make sure the private key on each line matches the corresponding private key you entered in the VPS phore configuration file for that masternode. + ## Check syncing status of masternode + The masternode cannot complete activation until it is fully synced with the Phore blockchain network. To check the status of your masternode, please enter this command in the VPS terminal. If you have multiple masternodes on the same VPS, you can change n1 to n2 etc. below to check the status of each one. @@ -273,8 +306,8 @@ To check the status of your masternode, please enter this command in the VPS ter The output will look like this: ``` { - "version": 1010000, - "protocolversion": 7002, + "version": 1030301, + "protocolversion": 70004, "walletversion": 61000, "balance": 0.00000000, "privatesend_balance": 0.00000000, @@ -340,7 +373,39 @@ Your Phore masternode is now set up and running! Depending on how many masternod rewards +## Tips + +You can start and stop masternode client manually. Enter this commands. +### To stop +``` +/usr/local/bin/phore-cli -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 stop +``` + +### To start +``` +/usr/local/bin/phored -daemon -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 +``` + +## Options of this script + +The _install.sh_ script support the following parameters: + +| Long Option | Short Option | Values | Description | +| :----------- | :----------- | ------------------- | ------------------------------------------------------------------- | +| --project | -p | project, ex. "phore"| shortname for the project | +| --net | -n | "4" / "6" | ip type for masternode. (ipv)6 is default | +| --release | -r | e.g. "tags/v1.3.3.1"| a specific git tag/branch, defaults to latest tested | +| --count | -c | number | amount of masternodes to be configured | +| --update | -u | -- | update specified masternode daemon, combine with -p flag | +| --sentinel | -s | -- | install and configure sentinel for node monitoring | +| --wipe | -w | -- | uninstall & wipe all related master node data, combine with -p flag | +| --help | -h | -- | print help info | +| --startnodes | -x | -- | starts masternode(s) after installation | +| --key | -k | masternode privkey | preinput masternode private key to configuration files | +| --generate | -g | -- | generate and preinput masternode private key | + ## Issues and Questions + Please open a GitHub Issue if there are problems with this installation method. Many Phore team members activel support people installing masternodes and can provide assistance in the Phore Discord channel. Here is a Discord invitation: From 2d3ff87a1d7e79579c647f91493e4823faea629c Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Thu, 23 Aug 2018 20:50:02 +0900 Subject: [PATCH 06/43] Delete mispulled file --- send2line.html | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 send2line.html diff --git a/send2line.html b/send2line.html deleted file mode 100644 index 178b3d42..00000000 --- a/send2line.html +++ /dev/null @@ -1,18 +0,0 @@ -

- - -

- - - \ No newline at end of file From ba0f87a65ba307bc352034065d61042ab79cd67b Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Thu, 23 Aug 2018 20:50:30 +0900 Subject: [PATCH 07/43] Delete mispulled file --- output.php | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 output.php diff --git a/output.php b/output.php deleted file mode 100644 index cd416c2f..00000000 --- a/output.php +++ /dev/null @@ -1,10 +0,0 @@ - -output.php - -"); - print ("名前:$name
"); -?> - - \ No newline at end of file From 525a76e23003bf7b79dc054757831620253f8753 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Thu, 23 Aug 2018 20:59:48 +0900 Subject: [PATCH 08/43] Delete input.html --- input.html | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 input.html diff --git a/input.html b/input.html deleted file mode 100644 index 1a83a117..00000000 --- a/input.html +++ /dev/null @@ -1,18 +0,0 @@ - -input.html - -入力フォームです。 -名前を入力してみましょう。 -
- - - - - - -
名前 - -
-
- - \ No newline at end of file From 1d7b153232730611b40d2d2ce738a12ece76f219 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Thu, 23 Aug 2018 21:03:58 +0900 Subject: [PATCH 09/43] Change generate private key feature to general daemon It should work for other masternode cryptos. But it may not work for some cryptos. e.g : daemon which has cli feature --- install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install.sh b/install.sh index 75b1ecfd..4fe4d8a4 100755 --- a/install.sh +++ b/install.sh @@ -446,15 +446,15 @@ function generate_privkey() { echo -e "rpcuser=test\nrpcpassword=passtest" >> ${MNODE_CONF_BASE}/${CODENAME}_test.conf mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test - phored -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test + ${CODENAME}d -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test sleep 5 for NUM in $(seq 1 ${count}); do if [ -z "${PRIVKEY[${NUM}]}" ]; then - PRIVKEY[${NUM}]=$(phore-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) + PRIVKEY[${NUM}]=$(${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) fi done - phore-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop + ${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop sleep 5 rm -r ${MNODE_CONF_BASE}/${CODENAME}_test.conf ${MNODE_DATA_BASE}/${CODENAME}_test From 92fedc003bf863832cc896eb076a7fbb3f0158f9 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Fri, 24 Aug 2018 22:31:58 +0900 Subject: [PATCH 10/43] Add guide about adding new masternode to server --- README.md | 60 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index a03bcc83..ec29174b 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ In these cases, you can skip "Configure masternode configuration files" below. cat /tmp/phore_masternode.conf ``` and add these lines to your masternode.conf. - + - If you want to generate masternode private key within masternode installation Use this command ```bash @@ -157,30 +157,41 @@ In these cases, you can skip "Configure masternode configuration files" below. ### More complex situations (ignore if you are installing a single masternode on a new VPS) -If you wish to install more than one masternode on the same VPS, you can add a -c parameter to tell the script how many to configure, so for example this would install three Phore masternodes (all entered on one line): +- If you wish to install more than one masternode on the same VPS + You can add a -c parameter to tell the script how many to configure, so for example this would install three Phore masternodes (all entered on one line): -```bash -git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 -``` + ```bash + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 + ``` -If you already have your masternode private keys, you can add them as shown below (all entered on one line): - -```bash -git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 --key **PRIVATE KEY 01** --key2 **PRIVATE KEY 02** --key3 **PRIVATE KEY 03** -``` -Using this command, you can skip the step for "Configure masternode configuration files", because the command above adds the masternode private keys to the masternode configuration files. +- If you already have your masternode private keys, you can add them as shown below (all entered on one line): + ```bash + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 --key **PRIVATE KEY 01** --key2 **PRIVATE KEY 02** --key3 **PRIVATE KEY 03** + ``` + Using this command, you can skip the step for "Configure masternode configuration files", because the command above adds the masternode private keys to the masternode configuration files. -If you are upgrading your masternode(s) to a new release, you should first remove the old version of the VPS script so that the new one you download is tagged with the latest version, and then you add a -u parameter to upgrade existing nodes: +- If you are adding new masternode, (and if you installed 2 masternodes already) + ``` + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 + ``` + if you want to use --key option, add --key3 **MASTERNODE PRIVKEY 03**. You are able to use + ``` + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 -g -x + ``` + for new 3rd masternode. + +- If you are upgrading your masternode(s) to a new release + You should first remove the old version of the VPS script so that the new one you download is tagged with the latest version, and then you add a -u parameter to upgrade existing nodes: -```bash -rm -rf /root/ -``` -```bash -git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -u -``` + ```bash + rm -rf /root/ + ``` + ```bash + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -u + ``` -The project is configured to use the latest official release of the Phore masternode code, and we will update this project each time a new release is issued, but without downloading the latest version of this project and using the -u parameter, the script will not update an existing Phore node that is already installed. + The project is configured to use the latest official release of the Phore masternode code, and we will update this project each time a new release is issued, but without downloading the latest version of this project and using the -u parameter, the script will not update an existing Phore node that is already installed. ## Configure Phore Wallet ### Step1 - Create Collateral Transaction @@ -381,11 +392,22 @@ You can start and stop masternode client manually. Enter this commands. /usr/local/bin/phore-cli -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 stop ``` +if use this command, masternode client will restart automatically in 5sec. +To stop completely, +``` +service phore_n1 stop +``` + ### To start ``` /usr/local/bin/phored -daemon -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 ``` +If you stopped service "phore_n1", use +``` +service phore_n1 start +``` + ## Options of this script The _install.sh_ script support the following parameters: From 6784cca081c247e3dcab6b9e4cd3d594f31a4887 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Tue, 2 Oct 2018 00:30:19 +0900 Subject: [PATCH 11/43] Added ZENZO --- config/zenzo/zenzo.compile | 6 ++++++ config/zenzo/zenzo.env | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 config/zenzo/zenzo.compile create mode 100644 config/zenzo/zenzo.env diff --git a/config/zenzo/zenzo.compile b/config/zenzo/zenzo.compile new file mode 100644 index 00000000..c8eb99bc --- /dev/null +++ b/config/zenzo/zenzo.compile @@ -0,0 +1,6 @@ +#!/bin/bash + +./autogen.sh +./configure --disable-dependency-tracking --enable-tests=no --without-gui --without-miniupnpc --with-incompatible-bdb CFLAGS="-march=native" LIBS="-lcurl -lssl -lcrypto -lz" +make +make install \ No newline at end of file diff --git a/config/zenzo/zenzo.env b/config/zenzo/zenzo.env new file mode 100644 index 00000000..43e62e7d --- /dev/null +++ b/config/zenzo/zenzo.env @@ -0,0 +1,6 @@ +CODENAME=zenzo +MNODE_DAEMON=${MNODE_DAEMON:-/usr/local/bin/zenzod} +MNODE_INBOUND_PORT=${MNODE_INBOUND_PORT:-26210} +GIT_URL=https://github.com/Zenzo-Ecosystem/ZENZO-Core.git +SCVERSION="tags/v1.0.0" +NETWORK_BASE_TAG="2003" From ecc13088af09eed1f2d8dce971c205b4c784bb00 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Tue, 2 Oct 2018 06:59:49 +0900 Subject: [PATCH 12/43] Change time for loading wallet on generate private key --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 4fe4d8a4..2cff34c7 100755 --- a/install.sh +++ b/install.sh @@ -447,7 +447,7 @@ function generate_privkey() { echo -e "rpcuser=test\nrpcpassword=passtest" >> ${MNODE_CONF_BASE}/${CODENAME}_test.conf mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test ${CODENAME}d -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test - sleep 5 + sleep 20 for NUM in $(seq 1 ${count}); do if [ -z "${PRIVKEY[${NUM}]}" ]; then From bccbaebda45b90ab35735fb6f704c24dfc1593b8 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Tue, 2 Oct 2018 07:25:58 +0900 Subject: [PATCH 13/43] Add new messages --- install.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/install.sh b/install.sh index 2cff34c7..6dc96bb7 100755 --- a/install.sh +++ b/install.sh @@ -726,6 +726,11 @@ function final_call() { echo "** Your nodes are starting up. If you haven't set masternode private key, Don't forget to change the masternodeprivkey later." ${MNODE_HELPER}_${CODENAME} fi + echo "**ALL YOUR MASTERNODE CONFIGURATION IS HERE. INPUT THESE LINES TO YOUR MASTERNODE.CONF**" + cat /tmp/${CODENAME}_masternode.conf + echo "**This configuration lines are on /tmp/${CODENAME}_masternode.conf. You can check this file with**" + echo "cat /tmp/${CODENAME}_masternode.conf" + echo "" tput sgr0 } From cb0e4338f6cfbefcee6ab5a040d068ac9cda007b Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Tue, 2 Oct 2018 10:57:57 +0900 Subject: [PATCH 14/43] Fixed spacing of service daemon --- install.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/install.sh b/install.sh index 6dc96bb7..581a8439 100755 --- a/install.sh +++ b/install.sh @@ -391,8 +391,7 @@ function create_systemd_configuration() { Type=forking PIDFile=${MNODE_DATA_BASE}/${CODENAME}${NUM}/${CODENAME}.pid - ExecStart=${MNODE_DAEMON} -daemon -pid=${MNODE_DATA_BASE}/${CODENAME}${NUM}/${CODENAME}.pid \ - -conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}${NUM} + ExecStart=${MNODE_DAEMON} -daemon -pid=${MNODE_DATA_BASE}/${CODENAME}${NUM}/${CODENAME}.pid -conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}${NUM} Restart=always RestartSec=5 From cd0193aba40a70455a092a74398986c736e2c893 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sun, 7 Oct 2018 10:52:08 +0900 Subject: [PATCH 15/43] Change scheme for getting masternode.conf lines --- install.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/install.sh b/install.sh index 581a8439..d0a69016 100755 --- a/install.sh +++ b/install.sh @@ -362,8 +362,10 @@ function create_control_configuration() { # create one line per masternode with the data we have for NUM in $(seq 1 ${count}); do if [ -n "${PRIVKEY[${NUM}]}" ]; then - echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} ${PRIVKEY[${NUM}]} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf - else + PRIVKEY[${NUM}]=$(cat ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf | grep masternodeprivkey) + PRIVKEY[${NUM}]=${PRIVKEY[${NUM}]:18} + echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} ${PRIVKEY[${NUM}]} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf + else echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} MASTERNODE_PRIVKEY_FOR_${CODENAME}MN${NUM} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf fi done @@ -1067,4 +1069,4 @@ main() { } -main "$@" \ No newline at end of file +main "$@" From a56d4d7e9b403402aca94a5f883828e7010219bd Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sun, 7 Oct 2018 10:57:49 +0900 Subject: [PATCH 16/43] Added zenzo icon --- assets/zenzo.png | Bin 0 -> 1823 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/zenzo.png diff --git a/assets/zenzo.png b/assets/zenzo.png new file mode 100644 index 0000000000000000000000000000000000000000..2df8af3432267cf5e0c3ab24fad268b5a438fced GIT binary patch literal 1823 zcmV+)2jKXLP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf02y>eSaefwW^{L9 za%BKPWN%_+AW3auXJt}lVPtu6$z?nM00xgqL_t(|Ue%guY*bYg$4{pPN?W>07q%{x zmNqmfRe~`FJ`jTt2~pgLn3RZURIDEi%NM`|5J;qniEAPl6GP$$iKuZY3bGh*Nli^# z%F;qhfws~@EiIN>-a^eOY{<4$R z#H6Ig!Lr9QVMf73_7`vQ%m80~)(*A5_pn-cJi0m?ib@k%%`8R@aOpxHeEMMwwM!u5!d4e;is^Q;to zFmS%OA(z$M;o1QG{r^JMwkB2^TZG~bt_%=PWOozEtF3hTtCcoG!EJ2NHo#u%)Nfm- z?*J+;1LAFMr0d(9fnwz&1&RWTQ@qgMp zqO%rEtrS59K(|scmNw5(tx5D;5o7?>of?aq=U_0FL3wsS3{ZWl6GeO7v=lCxIpbl? z`su7jqgspe00TVW*biMW6azwuQXSRS3thYV5A580-k+gF;0CF_T-e{vhyj|L`d}ay zgxa)2?D|xDFSUESJUv&uGL7uVWoN_yAANio?!*p}ic7RiCxPnYwPa*lPk&S&uD7b1 zSxcJ%C`)l|-dMm|(NKN7mI_=m)eqItGn(oA1~_o&8rhIb1=UAKN$GJgBYz_KKb2JA zM`EfU7ssCkDtDb@)nKYN6ta>SS$`+0@pQ&owKNmvmnE~Bm_7Si;BxzIRtuzX`b2nn z)zo1R7>FAZN(ZW+Q{{6fX&DpSpr|oWIF8Qdk=HAxlVhOjuiWyt@q57YRcHMbiVrGh zu~Ou5uIv8NWT<#3i`Dc{?alXHO*eT*P%kXcVNIh0E|9Nf{v7w4N9_A?3h{k%vcpOZ zn971RuOMl-m0>!224M9&X9KkTU@QA?Ah-@Z`R5k9-#qfjg7lz$aUn5JzSk(c=m*xB zcmFrOXob2feXJIY7jr)KK79>VmZyV{3J_dg@JGijaxSj7f4a(AnuD4LRek=ZWdO?+ zL^93t{f*>2c71>0CTndDY93Tu-vIciyTN4|Y7R=Kq2}O%EsNCVm5 zE^LDmjmiH{^>s=I*;p?X-sNxO_keHy>VY+N^rtbT?ZFaOqPclz5N7|}$ZC;6wI*cB zv3gbthWGb-z>+%jGU7>+1!w^(<+;2*-Pd-}zD4`vw?bLQNej(cHefl$C<% z9vp~_;3hKa#GAm**Gtvu=V)&)E173uqWsriv9~IC#%gLBOYPdDktW1Y0-PQQH8VP!`15k~tZ+T9Sb-ezaHo9IwJ{EOKoCBpf4n1*W?068*PV z9BB{~fmVJsBc0Wv55}BOHjjkl0d}J44Mt*2xCY=v(h#A#JB2X=aPrQag^L4vFH+sI zHzyk^4PQOu2Cx%uL`QToM>u$D01AAd!3Qg+mn=+7fECHf#!pxdz<*-09`DZmVQ&Bc N002ovPDHLkV1hLxVaxyk literal 0 HcmV?d00001 From 596af5cb6acc78535e411f48e0d4ecfebabc8ed6 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sat, 13 Oct 2018 20:15:49 +0900 Subject: [PATCH 17/43] Followed all update on https://github.com/masternodes/vps Changed in NETWORK_BASE, sentinel setup --- install.sh | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/install.sh b/install.sh index d0a69016..733a747d 100755 --- a/install.sh +++ b/install.sh @@ -24,12 +24,13 @@ # Useful variables declare -r CRYPTOS=`ls -l config/ | egrep '^d' | awk '{print $9}' | xargs echo -n; echo` declare -r DATE_STAMP="$(date +%y-%m-%d-%s)" -declare -r SCRIPTPATH=$( cd $(dirname ${BASH_SOURCE[0]}) > /dev/null; pwd -P ) +declare -r SCRIPTPATH="$( cd $(dirname ${BASH_SOURCE[0]}) > /dev/null; pwd -P )" declare -r MASTERPATH="$(dirname "${SCRIPTPATH}")" declare -r SCRIPT_VERSION="v0.9.9" declare -r SCRIPT_LOGFILE="/tmp/nodemaster_${DATE_STAMP}_out.log" declare -r IPV4_DOC_LINK="https://www.vultr.com/docs/add-secondary-ipv4-address" declare -r DO_NET_CONF="/etc/network/interfaces.d/50-cloud-init.cfg" +declare -r NETWORK_BASE_TAG="$(dd if=/dev/urandom bs=2 count=1 2>/dev/null | od -x -A n | sed -e 's/^[[:space:]]*//g')" function showbanner() { @@ -236,7 +237,7 @@ function create_sentinel_setup() { echo "$(tput sgr0)$(tput setaf 2)export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py$(tput sgr0)" echo "" echo "$(tput sgr0)$(tput setaf 2)If it works, add the command as cronjob: $(tput sgr0)" - echo "$(tput sgr0)$(tput setaf 2)* * * * * export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py 2>&1 >> /var/log/sentinel/sentinel-cron.log$(tput sgr0)" + echo "$(tput sgr0)$(tput setaf 2)* * * * * export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py >> /var/log/sentinel/sentinel-cron.log$(tput sgr0) 2>&1" } @@ -275,7 +276,6 @@ function validate_netchoice() { # generate the required ipv6 config if [ "${net}" -eq 4 ]; then IPV6_INT_BASE="#NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER" - NETWORK_BASE_TAG="" echo "IPv4 address generation needs to be done manually atm!" &>> ${SCRIPT_LOGFILE} fi # end ifneteq4 @@ -470,7 +470,7 @@ function generate_privkey() { function cleanup_after() { #apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoremove - apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoclean + apt-get -qqy -o=Dpkg::Use-Pty=0 --allow-downgrades --allow-change-held-packages autoclean echo "kernel.randomize_va_space=1" > /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} echo "net.ipv4.conf.all.rp_filter=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} @@ -795,10 +795,10 @@ function prepare_mn_interfaces() { # generate the required ipv6 config if [ "${net}" -eq 6 ]; then # vultr specific, needed to work - sed -ie '/iface ${ETH_INTERFACE} inet6 auto/s/^/#/' ${NETWORK_CONFIG} + sed -ie '/iface ${ETH_INTERFACE} inet6 auto/s/^/#/' ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} # move current config out of the way first - cp ${NETWORK_CONFIG} ${NETWORK_CONFIG}.${DATE_STAMP}.bkp + cp ${NETWORK_CONFIG} ${NETWORK_CONFIG}.${DATE_STAMP}.bkp &>> ${SCRIPT_LOGFILE} # create the additional ipv6 interfaces, rc.local because it's more generic for NUM in $(seq 1 ${count}); do @@ -812,10 +812,10 @@ function prepare_mn_interfaces() { echo "Creating new IP address for ${CODENAME} masternode nr ${NUM}" &>> ${SCRIPT_LOGFILE} if [ "${NETWORK_CONFIG}" = "/etc/rc.local" ]; then # need to put network config in front of "exit 0" in rc.local - sed -e '$i ip -6 addr add '"${IPV6_INT_BASE}"':'"${NETWORK_BASE_TAG}"'::'"${NUM}"'/64 dev '"${ETH_INTERFACE}"'\n' -i ${NETWORK_CONFIG} + sed -e '$i ip -6 addr add '"${IPV6_INT_BASE}"':'"${NETWORK_BASE_TAG}"'::'"${NUM}"'/64 dev '"${ETH_INTERFACE}"'\n' -i ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} else # if not using rc.local, append normally - echo "ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE}" >> ${NETWORK_CONFIG} + echo "ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE}" >> ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} fi sleep 2 ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE} &>> ${SCRIPT_LOGFILE} @@ -1033,6 +1033,7 @@ main() { echo "MNODE_USER: ${MNODE_USER}" echo "MNODE_HELPER: ${MNODE_HELPER}" echo "MNODE_SWAPSIZE: ${MNODE_SWAPSIZE}" + echo "NETWORK_BASE_TAG: ${NETWORK_BASE_TAG}" echo "CODE_DIR: ${CODE_DIR}" echo "SCVERSION: ${SCVERSION}" echo "RELEASE: ${release}" From 510b74694257abed0c2f53809b73011bc615af06 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sat, 13 Oct 2018 20:51:46 +0900 Subject: [PATCH 18/43] beautifier install.sh --- install.sh | 1530 ++++++++++++++++++++++++++-------------------------- 1 file changed, 765 insertions(+), 765 deletions(-) diff --git a/install.sh b/install.sh index 733a747d..6a12c834 100755 --- a/install.sh +++ b/install.sh @@ -33,8 +33,8 @@ declare -r DO_NET_CONF="/etc/network/interfaces.d/50-cloud-init.cfg" declare -r NETWORK_BASE_TAG="$(dd if=/dev/urandom bs=2 count=1 2>/dev/null | od -x -A n | sed -e 's/^[[:space:]]*//g')" function showbanner() { - - echo $(tput bold)$(tput setaf 2) + + echo $(tput bold)$(tput setaf 2) cat << "EOF" ███╗ ██╗ ██████╗ ██████╗ ███████╗███╗ ███╗ █████╗ ███████╗████████╗███████╗██████╗ ████╗ ██║██╔═══██╗██╔══██╗██╔════╝████╗ ████║██╔══██╗██╔════╝╚══██╔══╝██╔════╝██╔══██╗ @@ -44,9 +44,9 @@ function showbanner() { ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚╗ @marsmensch 2016-2018 ╔╝ EOF - echo "$(tput sgr0)$(tput setaf 3)Have fun, this is crypto after all!$(tput sgr0)" - echo "$(tput setaf 6)Donations for @marsmensch (BTC): 33ENWZ9RCYBG7nv6ac8KxBUSuQX64Hx3x3" - + echo "$(tput sgr0)$(tput setaf 3)Have fun, this is crypto after all!$(tput sgr0)" + echo "$(tput setaf 6)Donations for @marsmensch (BTC): 33ENWZ9RCYBG7nv6ac8KxBUSuQX64Hx3x3" + } # /* @@ -55,230 +55,230 @@ EOF # */ # function get_confirmation() { - - # call with a prompt string or use a default - read -r -p "${1:-Are you sure? [y/N]} " response - case "$response" in - [yY][eE][sS]|[yY]) - true - ;; - *) - false - ;; - esac - + + # call with a prompt string or use a default + read -r -p "${1:-Are you sure? [y/N]} " response + case "$response" in + [yY][eE][sS]|[yY]) + true + ;; + *) + false + ;; + esac + } # # /* no parameters, displays the help message */ # function show_help(){ - - clear - showbanner - echo "install.sh, version $SCRIPT_VERSION"; - echo "Usage example:"; - echo "install.sh (-p|--project) string [(-h|--help)] [(-n|--net) int] [(-c|--count) int] [(-r|--release) string] [(-w|--wipe)] [(-u|--update)] [(-x|--startnodes)]"; - echo "Options:"; - echo "-h or --help: Displays this information."; - echo "-p or --project string: Project to be installed. REQUIRED."; - echo "-n or --net: IP address type t be used (4 vs. 6)."; - echo "-c or --count: Number of masternodes to be installed."; - echo "-r or --release: Release version to be installed."; - echo "-s or --sentinel: Add sentinel monitoring for a node type. Combine with the -p option"; - echo "-w or --wipe: Wipe ALL local data for a node type. Combine with the -p option"; - echo "-u or --update: Update a specific masternode daemon. Combine with the -p option"; - echo "-r or --release: Release version to be installed."; - echo "-k or --key: Set private key to masternode configuration files directly"; - echo "-x or --startnodes: Start masternodes after installation to sync with blockchain"; - echo "-g or --generate: Generate masternode private key and use" - exit 1; - + + clear + showbanner + echo "install.sh, version $SCRIPT_VERSION"; + echo "Usage example:"; + echo "install.sh (-p|--project) string [(-h|--help)] [(-n|--net) int] [(-c|--count) int] [(-r|--release) string] [(-w|--wipe)] [(-u|--update)] [(-x|--startnodes)]"; + echo "Options:"; + echo "-h or --help: Displays this information."; + echo "-p or --project string: Project to be installed. REQUIRED."; + echo "-n or --net: IP address type t be used (4 vs. 6)."; + echo "-c or --count: Number of masternodes to be installed."; + echo "-r or --release: Release version to be installed."; + echo "-s or --sentinel: Add sentinel monitoring for a node type. Combine with the -p option"; + echo "-w or --wipe: Wipe ALL local data for a node type. Combine with the -p option"; + echo "-u or --update: Update a specific masternode daemon. Combine with the -p option"; + echo "-r or --release: Release version to be installed."; + echo "-k or --key: Set private key to masternode configuration files directly"; + echo "-x or --startnodes: Start masternodes after installation to sync with blockchain"; + echo "-g or --generate: Generate masternode private key and use" + exit 1; + } # # /* no parameters, checks if we are running on a supported Ubuntu release */ # function check_distro() { - - # currently only for Ubuntu 16.04 & 18.04 - if [[ -r /etc/os-release ]]; then - . /etc/os-release - if [[ "${VERSION_ID}" != "16.04" ]] && [[ "${VERSION_ID}" != "18.04" ]] ; then - echo "This script only supports Ubuntu 16.04 & 18.04 LTS, exiting." - exit 1 + + # currently only for Ubuntu 16.04 & 18.04 + if [[ -r /etc/os-release ]]; then + . /etc/os-release + if [[ "${VERSION_ID}" != "16.04" ]] && [[ "${VERSION_ID}" != "18.04" ]] ; then + echo "This script only supports Ubuntu 16.04 & 18.04 LTS, exiting." + exit 1 + fi + else + # no, thats not ok! + echo "This script only supports Ubuntu 16.04 & 18.04 LTS, exiting." + exit 1 fi - else - # no, thats not ok! - echo "This script only supports Ubuntu 16.04 & 18.04 LTS, exiting." - exit 1 - fi - + } # # /* no parameters, installs the base set of packages that are required for all projects */ # function install_packages() { - - # development and build packages - # these are common on all cryptos - echo "* Package installation!" - add-apt-repository -yu ppa:bitcoin/bitcoin &>> ${SCRIPT_LOGFILE} - apt-get -qq -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true update &>> ${SCRIPT_LOGFILE} - apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install build-essential \ - libcurl4-gnutls-dev protobuf-compiler libboost-all-dev autotools-dev automake \ - libboost-all-dev libssl-dev make autoconf libtool git apt-utils g++ \ - libprotobuf-dev pkg-config libudev-dev libqrencode-dev bsdmainutils \ - pkg-config libgmp3-dev libevent-dev jp2a pv virtualenv libdb4.8-dev libdb4.8++-dev &>> ${SCRIPT_LOGFILE} - - # only for 18.04 // openssl - if [[ "${VERSION_ID}" == "18.04" ]] ; then - apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install libssl1.0-dev - fi - + + # development and build packages + # these are common on all cryptos + echo "* Package installation!" + add-apt-repository -yu ppa:bitcoin/bitcoin &>> ${SCRIPT_LOGFILE} + apt-get -qq -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true update &>> ${SCRIPT_LOGFILE} + apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install build-essential \ + libcurl4-gnutls-dev protobuf-compiler libboost-all-dev autotools-dev automake \ + libboost-all-dev libssl-dev make autoconf libtool git apt-utils g++ \ + libprotobuf-dev pkg-config libudev-dev libqrencode-dev bsdmainutils \ + pkg-config libgmp3-dev libevent-dev jp2a pv virtualenv libdb4.8-dev libdb4.8++-dev &>> ${SCRIPT_LOGFILE} + + # only for 18.04 // openssl + if [[ "${VERSION_ID}" == "18.04" ]] ; then + apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install libssl1.0-dev + fi + } # # /* no parameters, creates and activates a swapfile since VPS servers often do not have enough RAM for compilation */ # function swaphack() { - - #check if swap is available - if [ $(free | awk '/^Swap:/ {exit !$2}') ] || [ ! -f "/var/mnode_swap.img" ];then - echo "* No proper swap, creating it" - # needed because ant servers are ants - rm -f /var/mnode_swap.img - dd if=/dev/zero of=/var/mnode_swap.img bs=1024k count=${MNODE_SWAPSIZE} &>> ${SCRIPT_LOGFILE} - chmod 0600 /var/mnode_swap.img - mkswap /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} - swapon /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} - echo '/var/mnode_swap.img none swap sw 0 0' | tee -a /etc/fstab &>> ${SCRIPT_LOGFILE} - echo 'vm.swappiness=10' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - else - echo "* All good, we have a swap" - fi - + + #check if swap is available + if [ $(free | awk '/^Swap:/ {exit !$2}') ] || [ ! -f "/var/mnode_swap.img" ];then + echo "* No proper swap, creating it" + # needed because ant servers are ants + rm -f /var/mnode_swap.img + dd if=/dev/zero of=/var/mnode_swap.img bs=1024k count=${MNODE_SWAPSIZE} &>> ${SCRIPT_LOGFILE} + chmod 0600 /var/mnode_swap.img + mkswap /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} + swapon /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} + echo '/var/mnode_swap.img none swap sw 0 0' | tee -a /etc/fstab &>> ${SCRIPT_LOGFILE} + echo 'vm.swappiness=10' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + else + echo "* All good, we have a swap" + fi + } # # /* no parameters, creates and activates a dedicated masternode user */ # function create_mn_user() { - - # our new mnode unpriv user acc is added - if id "${MNODE_USER}" >/dev/null 2>&1; then - echo "user exists already, do nothing" &>> ${SCRIPT_LOGFILE} - else - echo "Adding new system user ${MNODE_USER}" - adduser --disabled-password --gecos "" ${MNODE_USER} &>> ${SCRIPT_LOGFILE} - fi - + + # our new mnode unpriv user acc is added + if id "${MNODE_USER}" >/dev/null 2>&1; then + echo "user exists already, do nothing" &>> ${SCRIPT_LOGFILE} + else + echo "Adding new system user ${MNODE_USER}" + adduser --disabled-password --gecos "" ${MNODE_USER} &>> ${SCRIPT_LOGFILE} + fi + } # # /* no parameters, creates a masternode data directory (one per masternode) */ # function create_mn_dirs() { - - # individual data dirs for now to avoid problems - echo "* Creating masternode directories" - mkdir -p ${MNODE_CONF_BASE} - for NUM in $(seq 1 ${count}); do - if [ ! -d "${MNODE_DATA_BASE}/${CODENAME}${NUM}" ]; then - echo "creating data directory ${MNODE_DATA_BASE}/${CODENAME}${NUM}" &>> ${SCRIPT_LOGFILE} - mkdir -p ${MNODE_DATA_BASE}/${CODENAME}${NUM} &>> ${SCRIPT_LOGFILE} - fi - done - + + # individual data dirs for now to avoid problems + echo "* Creating masternode directories" + mkdir -p ${MNODE_CONF_BASE} + for NUM in $(seq 1 ${count}); do + if [ ! -d "${MNODE_DATA_BASE}/${CODENAME}${NUM}" ]; then + echo "creating data directory ${MNODE_DATA_BASE}/${CODENAME}${NUM}" &>> ${SCRIPT_LOGFILE} + mkdir -p ${MNODE_DATA_BASE}/${CODENAME}${NUM} &>> ${SCRIPT_LOGFILE} + fi + done + } # # /* no parameters, creates a sentinel config for a set of masternodes (one per masternode) */ # function create_sentinel_setup() { - - SENTINEL_BASE=/usr/share/sentinel - SENTINEL_ENV=/usr/share/sentinelenv - - # if code directory does not exists, we create it clone the src - if [ ! -d ${SENTINEL_BASE} ]; then - cd /usr/share &>> ${SCRIPT_LOGFILE} - git clone https://github.com/dashpay/sentinel.git sentinel &>> ${SCRIPT_LOGFILE} - cd sentinel &>> ${SCRIPT_LOGFILE} - rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} - else - echo "* Updating the existing sentinel GIT repo" - cd ${SENTINEL_BASE} &>> ${SCRIPT_LOGFILE} - git pull &>> ${SCRIPT_LOGFILE} - rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} - fi - - # create a globally accessible venv and install sentinel requirements - virtualenv --system-site-packages ${SENTINEL_BASE} &>> ${SCRIPT_LOGFILE} - ${SENTINEL_BASE}/bin/pip install -r requirements.txt &>> ${SCRIPT_LOGFILE} - - # create one sentinel config file per masternode - for NUM in $(seq 1 ${count}); do - if [ ! -f "${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf" ]; then - echo "* Creating sentinel configuration for ${CODENAME} masternode number ${NUM}" &>> ${SCRIPT_LOGFILE} - echo "dash_conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" > ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf - echo "network=mainnet" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf - echo "db_name=database/${CODENAME}_${NUM}_sentinel.db" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf - echo "db_driver=sqlite" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + + SENTINEL_BASE=/usr/share/sentinel + SENTINEL_ENV=/usr/share/sentinelenv + + # if code directory does not exists, we create it clone the src + if [ ! -d ${SENTINEL_BASE} ]; then + cd /usr/share &>> ${SCRIPT_LOGFILE} + git clone https://github.com/dashpay/sentinel.git sentinel &>> ${SCRIPT_LOGFILE} + cd sentinel &>> ${SCRIPT_LOGFILE} + rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} + else + echo "* Updating the existing sentinel GIT repo" + cd ${SENTINEL_BASE} &>> ${SCRIPT_LOGFILE} + git pull &>> ${SCRIPT_LOGFILE} + rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} fi - done - - export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py - - - echo "$(tput sgr0)$(tput setaf 3)Generated a Sentinel config for you. To activate Sentinel run:$(tput sgr0)" - echo "$(tput sgr0)$(tput setaf 2)export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py$(tput sgr0)" - echo "" - echo "$(tput sgr0)$(tput setaf 2)If it works, add the command as cronjob: $(tput sgr0)" - echo "$(tput sgr0)$(tput setaf 2)* * * * * export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py >> /var/log/sentinel/sentinel-cron.log$(tput sgr0) 2>&1" - + + # create a globally accessible venv and install sentinel requirements + virtualenv --system-site-packages ${SENTINEL_BASE} &>> ${SCRIPT_LOGFILE} + ${SENTINEL_BASE}/bin/pip install -r requirements.txt &>> ${SCRIPT_LOGFILE} + + # create one sentinel config file per masternode + for NUM in $(seq 1 ${count}); do + if [ ! -f "${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf" ]; then + echo "* Creating sentinel configuration for ${CODENAME} masternode number ${NUM}" &>> ${SCRIPT_LOGFILE} + echo "dash_conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" > ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "network=mainnet" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "db_name=database/${CODENAME}_${NUM}_sentinel.db" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "db_driver=sqlite" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + fi + done + + export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py + + + echo "$(tput sgr0)$(tput setaf 3)Generated a Sentinel config for you. To activate Sentinel run:$(tput sgr0)" + echo "$(tput sgr0)$(tput setaf 2)export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py$(tput sgr0)" + echo "" + echo "$(tput sgr0)$(tput setaf 2)If it works, add the command as cronjob: $(tput sgr0)" + echo "$(tput sgr0)$(tput setaf 2)* * * * * export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py >> /var/log/sentinel/sentinel-cron.log$(tput sgr0) 2>&1" + } # # /* no parameters, creates a minimal set of firewall rules that allows INBOUND masternode p2p & SSH ports */ # function configure_firewall() { - - echo "* Configuring firewall rules" - # disallow everything except ssh and masternode inbound ports - ufw default deny &>> ${SCRIPT_LOGFILE} - ufw logging on &>> ${SCRIPT_LOGFILE} - ufw allow ${SSH_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} - # KISS, its always the same port for all interfaces - ufw allow ${MNODE_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} - # This will only allow 6 connections every 30 seconds from the same IP address. - ufw limit OpenSSH &>> ${SCRIPT_LOGFILE} - ufw --force enable &>> ${SCRIPT_LOGFILE} - echo "* Firewall ufw is active and enabled on system startup" - + + echo "* Configuring firewall rules" + # disallow everything except ssh and masternode inbound ports + ufw default deny &>> ${SCRIPT_LOGFILE} + ufw logging on &>> ${SCRIPT_LOGFILE} + ufw allow ${SSH_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} + # KISS, its always the same port for all interfaces + ufw allow ${MNODE_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} + # This will only allow 6 connections every 30 seconds from the same IP address. + ufw limit OpenSSH &>> ${SCRIPT_LOGFILE} + ufw --force enable &>> ${SCRIPT_LOGFILE} + echo "* Firewall ufw is active and enabled on system startup" + } # # /* no parameters, checks if the choice of networking matches w/ this VPS installation */ # function validate_netchoice() { - - echo "* Validating network rules" - - # break here of net isn't 4 or 6 - if [ ${net} -ne 4 ] && [ ${net} -ne 6 ]; then - echo "invalid NETWORK setting, can only be 4 or 6!" - exit 1; - fi - - # generate the required ipv6 config - if [ "${net}" -eq 4 ]; then - IPV6_INT_BASE="#NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER" - echo "IPv4 address generation needs to be done manually atm!" &>> ${SCRIPT_LOGFILE} - fi # end ifneteq4 - + + echo "* Validating network rules" + + # break here of net isn't 4 or 6 + if [ ${net} -ne 4 ] && [ ${net} -ne 6 ]; then + echo "invalid NETWORK setting, can only be 4 or 6!" + exit 1; + fi + + # generate the required ipv6 config + if [ "${net}" -eq 4 ]; then + IPV6_INT_BASE="#NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER" + echo "IPv4 address generation needs to be done manually atm!" &>> ${SCRIPT_LOGFILE} + fi # end ifneteq4 + } # @@ -286,102 +286,102 @@ function validate_netchoice() { # directory (eg. /etc/masternodes/${CODENAME} and replaces the existing placeholders if possible */ # function create_mn_configuration() { - - # always return to the script root - cd ${SCRIPTPATH} - - # recode inputed private key to tmp.txt, check the keys - for NUM in $(seq 1 ${count}); do - if [ -n "${PRIVKEY[${NUM}]}" ]; then - echo ${PRIVKEY[${NUM}]} >> tmp.txt - fi - done - - if [ -f tmp.txt ]; then - dup=$(sort -t 8 tmp.txt | uniq -c | sort -nr | head -1 | awk '{print substr($0, 7, 1)}') - if [ 1 -ne "$dup" ]; then - echo "Private key was duplicated. Please restart this script." - rm -r /etc/masternodes - rm tmp.txt - exit 1 - fi - rm tmp.txt - fi - - # create one config file per masternode - for NUM in $(seq 1 ${count}); do - PASS=$(date | md5sum | cut -c1-24) - - # we dont want to overwrite an existing config file - if [ ! -f ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf ]; then - echo "individual masternode config doesn't exist, generate it!" &>> ${SCRIPT_LOGFILE} - - # if a template exists, use this instead of the default - if [ -e config/${CODENAME}/${CODENAME}.conf ]; then - echo "custom configuration template for ${CODENAME} found, use this instead" &>> ${SCRIPT_LOGFILE} - cp ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} - else - echo "No ${CODENAME} template found, using the default configuration template" &>> ${SCRIPT_LOGFILE} - cp ${SCRIPTPATH}/config/default.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} - fi - - # replace placeholders - echo "running sed on file ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" &>> ${SCRIPT_LOGFILE} - fi - - # Write inputed private key to project.conf - if [ -n "${PRIVKEY[${NUM}]}" ]; then - if [ ${#PRIVKEY[${NUM}]} -eq 51 ]; then - sed -e "s/HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_XXX_GIT_PROJECT_XXX_XXX_NUM_XXX/${PRIVKEY[${NUM}]}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - else - echo "input private key ${PRIVKEY[${NUM}]} was invalid. Please check the key, and restart this script." - rm -r /etc/masternodes - exit 1 - fi - else : + + # always return to the script root + cd ${SCRIPTPATH} + + # recode inputed private key to tmp.txt, check the keys + for NUM in $(seq 1 ${count}); do + if [ -n "${PRIVKEY[${NUM}]}" ]; then + echo ${PRIVKEY[${NUM}]} >> tmp.txt + fi + done + + if [ -f tmp.txt ]; then + dup=$(sort -t 8 tmp.txt | uniq -c | sort -nr | head -1 | awk '{print substr($0, 7, 1)}') + if [ 1 -ne "$dup" ]; then + echo "Private key was duplicated. Please restart this script." + rm -r /etc/masternodes + rm tmp.txt + exit 1 + fi + rm tmp.txt fi - sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY/${NUM}]/" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV6_INT_BASE}/" -e "s/XXX_NETWORK_BASE_TAG_XXX/${NETWORK_BASE_TAG}/" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - if [ -z "${PRIVKEY[${NUM}]}" ]; then - if [ "$startnodes" -eq 1 ]; then - #uncomment masternode= and masternodeprivkey= so the node can autostart and sync - sed 's/\(^.*masternode\(\|privkey\)=.*$\)/#\1/' -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - fi - fi - done - + + # create one config file per masternode + for NUM in $(seq 1 ${count}); do + PASS=$(date | md5sum | cut -c1-24) + + # we dont want to overwrite an existing config file + if [ ! -f ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf ]; then + echo "individual masternode config doesn't exist, generate it!" &>> ${SCRIPT_LOGFILE} + + # if a template exists, use this instead of the default + if [ -e config/${CODENAME}/${CODENAME}.conf ]; then + echo "custom configuration template for ${CODENAME} found, use this instead" &>> ${SCRIPT_LOGFILE} + cp ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} + else + echo "No ${CODENAME} template found, using the default configuration template" &>> ${SCRIPT_LOGFILE} + cp ${SCRIPTPATH}/config/default.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} + fi + + # replace placeholders + echo "running sed on file ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" &>> ${SCRIPT_LOGFILE} + fi + + # Write inputed private key to project.conf + if [ -n "${PRIVKEY[${NUM}]}" ]; then + if [ ${#PRIVKEY[${NUM}]} -eq 51 ]; then + sed -e "s/HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_XXX_GIT_PROJECT_XXX_XXX_NUM_XXX/${PRIVKEY[${NUM}]}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + else + echo "input private key ${PRIVKEY[${NUM}]} was invalid. Please check the key, and restart this script." + rm -r /etc/masternodes + exit 1 + fi + else : + fi + sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY/${NUM}]/" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV6_INT_BASE}/" -e "s/XXX_NETWORK_BASE_TAG_XXX/${NETWORK_BASE_TAG}/" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + if [ -z "${PRIVKEY[${NUM}]}" ]; then + if [ "$startnodes" -eq 1 ]; then + #uncomment masternode= and masternodeprivkey= so the node can autostart and sync + sed 's/\(^.*masternode\(\|privkey\)=.*$\)/#\1/' -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + fi + fi + done + } # # /* no parameters, generates a masternode configuration file per masternode in the default */ # function create_control_configuration() { - - # delete any old stuff that's still around - rm -f /tmp/${CODENAME}_masternode.conf &>> ${SCRIPT_LOGFILE} - - # create one line per masternode with the data we have - for NUM in $(seq 1 ${count}); do - if [ -n "${PRIVKEY[${NUM}]}" ]; then - PRIVKEY[${NUM}]=$(cat ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf | grep masternodeprivkey) - PRIVKEY[${NUM}]=${PRIVKEY[${NUM}]:18} - echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} ${PRIVKEY[${NUM}]} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf - else - echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} MASTERNODE_PRIVKEY_FOR_${CODENAME}MN${NUM} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf - fi - done - + + # delete any old stuff that's still around + rm -f /tmp/${CODENAME}_masternode.conf &>> ${SCRIPT_LOGFILE} + + # create one line per masternode with the data we have + for NUM in $(seq 1 ${count}); do + if [ -n "${PRIVKEY[${NUM}]}" ]; then + PRIVKEY[${NUM}]=$(cat ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf | grep masternodeprivkey) + PRIVKEY[${NUM}]=${PRIVKEY[${NUM}]:18} + echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} ${PRIVKEY[${NUM}]} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf + else + echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} MASTERNODE_PRIVKEY_FOR_${CODENAME}MN${NUM} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf + fi + done + } # # /* no parameters, generates a a pre-populated masternode systemd config file */ # function create_systemd_configuration() { - - echo "* (over)writing systemd config files for masternodes" - # create one config file per masternode - for NUM in $(seq 1 ${count}); do - PASS=$(date | md5sum | cut -c1-24) - echo "* (over)writing systemd config file ${SYSTEMD_CONF}/${CODENAME}_n${NUM}.service" &>> ${SCRIPT_LOGFILE} + + echo "* (over)writing systemd config files for masternodes" + # create one config file per masternode + for NUM in $(seq 1 ${count}); do + PASS=$(date | md5sum | cut -c1-24) + echo "* (over)writing systemd config file ${SYSTEMD_CONF}/${CODENAME}_n${NUM}.service" &>> ${SCRIPT_LOGFILE} cat > ${SYSTEMD_CONF}/${CODENAME}_n${NUM}.service <<-EOF [Unit] Description=${CODENAME} distributed currency daemon @@ -406,36 +406,36 @@ function create_systemd_configuration() { [Install] WantedBy=multi-user.target EOF - done - + done + } # # /* set all permissions to the masternode user */ # function set_permissions() { - - # maybe add a sudoers entry later - mkdir -p /var/log/sentinel &>> ${SCRIPT_LOGFILE} - chown -R ${MNODE_USER}:${MNODE_USER} ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel ${SENTINEL_BASE}/database &>> ${SCRIPT_LOGFILE} - # make group permissions same as user, so vps-user can be added to masternode group - chmod -R g=u ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel &>> ${SCRIPT_LOGFILE} - + + # maybe add a sudoers entry later + mkdir -p /var/log/sentinel &>> ${SCRIPT_LOGFILE} + chown -R ${MNODE_USER}:${MNODE_USER} ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel ${SENTINEL_BASE}/database &>> ${SCRIPT_LOGFILE} + # make group permissions same as user, so vps-user can be added to masternode group + chmod -R g=u ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel &>> ${SCRIPT_LOGFILE} + } # # /* wipe all files and folders generated by the script for a specific project */ # function wipe_all() { - - echo "Deleting all ${project} related data!" - rm -f /etc/masternodes/${project}_n*.conf - rmdir --ignore-fail-on-non-empty -p /var/lib/masternodes/${project}* - rm -f /etc/systemd/system/${project}_n*.service - rm -f ${MNODE_DAEMON} - echo "DONE!" - exit 0 - + + echo "Deleting all ${project} related data!" + rm -f /etc/masternodes/${project}_n*.conf + rmdir --ignore-fail-on-non-empty -p /var/lib/masternodes/${project}* + rm -f /etc/systemd/system/${project}_n*.service + rm -f ${MNODE_DAEMON} + echo "DONE!" + exit 0 + } # @@ -444,21 +444,21 @@ function wipe_all() { # */ # function generate_privkey() { - - echo -e "rpcuser=test\nrpcpassword=passtest" >> ${MNODE_CONF_BASE}/${CODENAME}_test.conf - mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test - ${CODENAME}d -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test - sleep 20 - - for NUM in $(seq 1 ${count}); do - if [ -z "${PRIVKEY[${NUM}]}" ]; then - PRIVKEY[${NUM}]=$(${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) - fi - done - ${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop - sleep 5 - rm -r ${MNODE_CONF_BASE}/${CODENAME}_test.conf ${MNODE_DATA_BASE}/${CODENAME}_test - + + echo -e "rpcuser=test\nrpcpassword=passtest" >> ${MNODE_CONF_BASE}/${CODENAME}_test.conf + mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test + ${CODENAME}d -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test + sleep 20 + + for NUM in $(seq 1 ${count}); do + if [ -z "${PRIVKEY[${NUM}]}" ]; then + PRIVKEY[${NUM}]=$(${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) + fi + done + ${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop + sleep 5 + rm -r ${MNODE_CONF_BASE}/${CODENAME}_test.conf ${MNODE_DATA_BASE}/${CODENAME}_test + } # @@ -468,25 +468,25 @@ function generate_privkey() { # */ # function cleanup_after() { - - #apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoremove - apt-get -qqy -o=Dpkg::Use-Pty=0 --allow-downgrades --allow-change-held-packages autoclean - - echo "kernel.randomize_va_space=1" > /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.rp_filter=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.accept_source_route=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.log_martians=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.default.log_martians=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.accept_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv6.conf.all.accept_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.send_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "kernel.sysrq=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.tcp_timestamps=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.icmp_ignore_bogus_error_responses=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - sysctl -p - + + #apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoremove + apt-get -qqy -o=Dpkg::Use-Pty=0 --allow-downgrades --allow-change-held-packages autoclean + + echo "kernel.randomize_va_space=1" > /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.rp_filter=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.accept_source_route=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.log_martians=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.default.log_martians=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.accept_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv6.conf.all.accept_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.send_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "kernel.sysrq=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.tcp_timestamps=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.icmp_ignore_bogus_error_responses=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + sysctl -p + } # @@ -495,334 +495,334 @@ function cleanup_after() { # source the default and desired crypto configuration files function source_config() { - - SETUP_CONF_FILE="${SCRIPTPATH}/config/${project}/${project}.env" - - # first things first, to break early if things are missing or weird - check_distro - - if [ -f ${SETUP_CONF_FILE} ]; then - echo "Script version ${SCRIPT_VERSION}, you picked: $(tput bold)$(tput setaf 2) ${project} $(tput sgr0), running on Ubuntu ${VERSION_ID}" - echo "apply config file for ${project}" &>> ${SCRIPT_LOGFILE} - source "${SETUP_CONF_FILE}" - - # count is from the default config but can ultimately be - # overwritten at runtime - if [ -z "${count}" ] - then - count=${SETUP_MNODES_COUNT} - echo "No number given, installing default number of nodes: ${SETUP_MNODES_COUNT}" &>> ${SCRIPT_LOGFILE} - fi - - # release is from the default project config but can ultimately be - # overwritten at runtime - if [ -z "$release" ] - then - release=${SCVERSION} - echo "release empty, setting to project default: ${SCVERSION}" &>> ${SCRIPT_LOGFILE} - fi - - # net is from the default config but can ultimately be - # overwritten at runtime - if [ -z "${net}" ]; then - net=${NETWORK_TYPE} - echo "net EMPTY, setting to default: ${NETWORK_TYPE}" &>> ${SCRIPT_LOGFILE} - fi - - # main block of function logic starts here - # if update flag was given, delete the old daemon binary first & proceed - if [ "$update" -eq 1 ]; then - if [ ! -f ${MNODE_DAEMON} ]; then - echo "UPDATE FAILED! Daemon hasn't been found. Please try the normal installation process by omitting the upgrade parameter." - exit 1 - fi - if [ ! -f ${MNODE_HELPER}_${CODENAME} ]; then - echo "UPDATE FAILED! Masternode activation file ${MNODE_HELPER}_${CODENAME} hasn't been found. Please try the normal installation process by omitting the upgrade parameter." - exit 1 - fi - if [ ! -d ${MNODE_DATA_BASE} ]; then - echo "UPDATE FAILED! ${MNODE_DATA_BASE} hasn't been found. Please try the normal installation process by omitting the upgrade parameter." - exit 1 - fi - fi - - echo "************************* Installation Plan *****************************************" - echo "" - if [ "$update" -eq 1 ]; then - echo "I am going to update your existing" - echo "$(tput bold)$(tput setaf 2) => ${project} masternode(s) in version ${release} $(tput sgr0)" + + SETUP_CONF_FILE="${SCRIPTPATH}/config/${project}/${project}.env" + + # first things first, to break early if things are missing or weird + check_distro + + if [ -f ${SETUP_CONF_FILE} ]; then + echo "Script version ${SCRIPT_VERSION}, you picked: $(tput bold)$(tput setaf 2) ${project} $(tput sgr0), running on Ubuntu ${VERSION_ID}" + echo "apply config file for ${project}" &>> ${SCRIPT_LOGFILE} + source "${SETUP_CONF_FILE}" + + # count is from the default config but can ultimately be + # overwritten at runtime + if [ -z "${count}" ] + then + count=${SETUP_MNODES_COUNT} + echo "No number given, installing default number of nodes: ${SETUP_MNODES_COUNT}" &>> ${SCRIPT_LOGFILE} + fi + + # release is from the default project config but can ultimately be + # overwritten at runtime + if [ -z "$release" ] + then + release=${SCVERSION} + echo "release empty, setting to project default: ${SCVERSION}" &>> ${SCRIPT_LOGFILE} + fi + + # net is from the default config but can ultimately be + # overwritten at runtime + if [ -z "${net}" ]; then + net=${NETWORK_TYPE} + echo "net EMPTY, setting to default: ${NETWORK_TYPE}" &>> ${SCRIPT_LOGFILE} + fi + + # main block of function logic starts here + # if update flag was given, delete the old daemon binary first & proceed + if [ "$update" -eq 1 ]; then + if [ ! -f ${MNODE_DAEMON} ]; then + echo "UPDATE FAILED! Daemon hasn't been found. Please try the normal installation process by omitting the upgrade parameter." + exit 1 + fi + if [ ! -f ${MNODE_HELPER}_${CODENAME} ]; then + echo "UPDATE FAILED! Masternode activation file ${MNODE_HELPER}_${CODENAME} hasn't been found. Please try the normal installation process by omitting the upgrade parameter." + exit 1 + fi + if [ ! -d ${MNODE_DATA_BASE} ]; then + echo "UPDATE FAILED! ${MNODE_DATA_BASE} hasn't been found. Please try the normal installation process by omitting the upgrade parameter." + exit 1 + fi + fi + + echo "************************* Installation Plan *****************************************" + echo "" + if [ "$update" -eq 1 ]; then + echo "I am going to update your existing" + echo "$(tput bold)$(tput setaf 2) => ${project} masternode(s) in version ${release} $(tput sgr0)" + else + echo "I am going to install and configure" + echo "$(tput bold)$(tput setaf 2) => ${count} ${project} masternode(s) in version ${release} $(tput sgr0)" + fi + echo "for you now." + echo "" + if [ "$update" -eq 0 ]; then + # only needed if fresh installation + echo "If you didn't set generate, key option, you have to add your masternode private key to the individual config files afterwards." + echo "" + fi + echo "" + echo "Stay tuned!" + echo "" + + # show a hint for MANUAL IPv4 configuration + if [ "${net}" -eq 4 ]; then + NETWORK_TYPE=4 + echo "WARNING:" + echo "You selected IPv4 for networking but there is no automatic workflow for this part." + echo "This means you will have some mamual work to do to after this configuration run." + echo "" + echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" + echo "${IPV4_DOC_LINK}" + fi + + # sentinel setup + if [ "$sentinel" -eq 1 ]; then + echo "I will also generate a Sentinel configuration for you." + fi + + # start nodes after setup + if [ "$startnodes" -eq 1 ]; then + echo "I will start your masternodes after the installation." + fi + echo "" + echo "A logfile for this run can be found at the following location:" + echo "${SCRIPT_LOGFILE}" + echo "" + echo "*************************************************************************************" + sleep 5 + + # main routine + if [ "$update" -eq 0 ]; then + prepare_mn_interfaces + swaphack + fi + install_packages + print_logo + build_mn_from_source + if [ "$update" -eq 0 ]; then + create_mn_user + create_mn_dirs + + # private key initialize + if [ "$generate" -eq 1 ]; then + echo "Generating masternode private key" &>> ${SCRIPT_LOGFILE} + generate_privkey + fi + + # sentinel setup + if [ "$sentinel" -eq 1 ]; then + echo "* Sentinel setup chosen" &>> ${SCRIPT_LOGFILE} + create_sentinel_setup + fi + configure_firewall + create_mn_configuration + create_control_configuration + create_systemd_configuration + fi + set_permissions + cleanup_after + showbanner + final_call else - echo "I am going to install and configure" - echo "$(tput bold)$(tput setaf 2) => ${count} ${project} masternode(s) in version ${release} $(tput sgr0)" - fi - echo "for you now." - echo "" - if [ "$update" -eq 0 ]; then - # only needed if fresh installation - echo "If you didn't set generate, key option, you have to add your masternode private key to the individual config files afterwards." - echo "" - fi - echo "" - echo "Stay tuned!" - echo "" - - # show a hint for MANUAL IPv4 configuration - if [ "${net}" -eq 4 ]; then - NETWORK_TYPE=4 - echo "WARNING:" - echo "You selected IPv4 for networking but there is no automatic workflow for this part." - echo "This means you will have some mamual work to do to after this configuration run." - echo "" - echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" - echo "${IPV4_DOC_LINK}" - fi - - # sentinel setup - if [ "$sentinel" -eq 1 ]; then - echo "I will also generate a Sentinel configuration for you." - fi - - # start nodes after setup - if [ "$startnodes" -eq 1 ]; then - echo "I will start your masternodes after the installation." - fi - echo "" - echo "A logfile for this run can be found at the following location:" - echo "${SCRIPT_LOGFILE}" - echo "" - echo "*************************************************************************************" - sleep 5 - - # main routine - if [ "$update" -eq 0 ]; then - prepare_mn_interfaces - swaphack - fi - install_packages - print_logo - build_mn_from_source - if [ "$update" -eq 0 ]; then - create_mn_user - create_mn_dirs - - # private key initialize - if [ "$generate" -eq 1 ]; then - echo "Generating masternode private key" &>> ${SCRIPT_LOGFILE} - generate_privkey - fi - - # sentinel setup - if [ "$sentinel" -eq 1 ]; then - echo "* Sentinel setup chosen" &>> ${SCRIPT_LOGFILE} - create_sentinel_setup - fi - configure_firewall - create_mn_configuration - create_control_configuration - create_systemd_configuration + echo "required file ${SETUP_CONF_FILE} does not exist, abort!" + exit 1 fi - set_permissions - cleanup_after - showbanner - final_call - else - echo "required file ${SETUP_CONF_FILE} does not exist, abort!" - exit 1 - fi - + } function print_logo() { - - # print ascii banner if a logo exists - echo -e "* Starting the compilation process for ${CODENAME}, stay tuned" - if [ -f "${SCRIPTPATH}/assets/$CODENAME.jpg" ]; then - jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/${CODENAME}.jpg - else - jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/default.jpg - fi - + + # print ascii banner if a logo exists + echo -e "* Starting the compilation process for ${CODENAME}, stay tuned" + if [ -f "${SCRIPTPATH}/assets/$CODENAME.jpg" ]; then + jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/${CODENAME}.jpg + else + jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/default.jpg + fi + } # # /* no parameters, builds the required masternode binary from sources. Exits if already exists and "update" not given */ # function build_mn_from_source() { - # daemon not found compile it - if [ ! -f ${MNODE_DAEMON} ] || [ "$update" -eq 1 ]; then - # create code directory if it doesn't exist - if [ ! -d ${SCRIPTPATH}/${CODE_DIR} ]; then - mkdir -p ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} - fi - # if coin directory (CODENAME) exists, we remove it, to make a clean git clone - if [ -d ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} ]; then - echo "deleting ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} for clean cloning" &>> ${SCRIPT_LOGFILE} - rm -rf ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} + # daemon not found compile it + if [ ! -f ${MNODE_DAEMON} ] || [ "$update" -eq 1 ]; then + # create code directory if it doesn't exist + if [ ! -d ${SCRIPTPATH}/${CODE_DIR} ]; then + mkdir -p ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} + fi + # if coin directory (CODENAME) exists, we remove it, to make a clean git clone + if [ -d ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} ]; then + echo "deleting ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} for clean cloning" &>> ${SCRIPT_LOGFILE} + rm -rf ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} + fi + mkdir -p ${CODE_DIR} && cd ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} + git clone ${GIT_URL} ${CODENAME} &>> ${SCRIPT_LOGFILE} + cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} + echo "* Checking out desired GIT tag: ${release}" + git checkout ${release} &>> ${SCRIPT_LOGFILE} + + if [ "$update" -eq 1 ]; then + echo "update given, deleting the old daemon NOW!" &>> ${SCRIPT_LOGFILE} + rm -f ${MNODE_DAEMON} + # old daemon must be removed before compilation. Would be better to remove it afterwards, however not possible with current structure + if [ -f ${MNODE_DAEMON} ]; then + echo "UPDATE FAILED! Daemon ${MNODE_DAEMON} couldn't be removed. Please open an issue at https://github.com/masternodes/vps/issues. Thank you!" + exit 1 + fi + fi + + # compilation starts here + source ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.compile | pv -t -i0.1 + else + echo "* Daemon already in place at ${MNODE_DAEMON}, not compiling" fi - mkdir -p ${CODE_DIR} && cd ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} - git clone ${GIT_URL} ${CODENAME} &>> ${SCRIPT_LOGFILE} - cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} - echo "* Checking out desired GIT tag: ${release}" - git checkout ${release} &>> ${SCRIPT_LOGFILE} - - if [ "$update" -eq 1 ]; then - echo "update given, deleting the old daemon NOW!" &>> ${SCRIPT_LOGFILE} - rm -f ${MNODE_DAEMON} - # old daemon must be removed before compilation. Would be better to remove it afterwards, however not possible with current structure - if [ -f ${MNODE_DAEMON} ]; then - echo "UPDATE FAILED! Daemon ${MNODE_DAEMON} couldn't be removed. Please open an issue at https://github.com/masternodes/vps/issues. Thank you!" + + # if it's not available after compilation, theres something wrong + if [ ! -f ${MNODE_DAEMON} ]; then + echo "COMPILATION FAILED! Please open an issue at https://github.com/phoreproject/vps/issues. Thank you!" exit 1 - fi fi - - # compilation starts here - source ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.compile | pv -t -i0.1 - else - echo "* Daemon already in place at ${MNODE_DAEMON}, not compiling" - fi - - # if it's not available after compilation, theres something wrong - if [ ! -f ${MNODE_DAEMON} ]; then - echo "COMPILATION FAILED! Please open an issue at https://github.com/phoreproject/vps/issues. Thank you!" - exit 1 - fi - + } # # /* no parameters, print some (hopefully) helpful advice */ # function final_call() { - # note outstanding tasks that need manual work - echo "************! ALMOST DONE !******************************" - if [ "$update" -eq 0 ]; then - echo "There is still work to do in the configuration templates." - echo "These are located at ${MNODE_CONF_BASE}, one per masternode." - echo "If you didn't set generate or key option, add your masternode private keys now." - echo "eg in /etc/masternodes/${CODENAME}_n1.conf" - else - echo "Your ${CODENAME} masternode daemon has been updated! (but not yet activated)" - fi - echo "" - echo "=> $(tput bold)$(tput setaf 2) All configuration files are in: ${MNODE_CONF_BASE} $(tput sgr0)" - echo "=> $(tput bold)$(tput setaf 2) All Data directories are in: ${MNODE_DATA_BASE} $(tput sgr0)" - echo "" - echo "$(tput bold)$(tput setaf 1)Important:$(tput sgr0) run $(tput setaf 2) /usr/local/bin/activate_masternodes_${CODENAME} $(tput sgr0) as root to activate your nodes." - - # place future helper script accordingly - if [ "$update" -eq 0 ]; then - cp ${SCRIPTPATH}/scripts/activate_masternodes.sh ${MNODE_HELPER}_${CODENAME} - echo "">> ${MNODE_HELPER}_${CODENAME} - - for NUM in $(seq 1 ${count}); do - echo "systemctl enable ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} - echo "systemctl restart ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} - done - - chmod u+x ${MNODE_HELPER}_${CODENAME} - fi - - if [ "$startnodes" -eq 1 ]; then - echo "" - echo "** Your nodes are starting up. If you haven't set masternode private key, Don't forget to change the masternodeprivkey later." - ${MNODE_HELPER}_${CODENAME} - fi - echo "**ALL YOUR MASTERNODE CONFIGURATION IS HERE. INPUT THESE LINES TO YOUR MASTERNODE.CONF**" - cat /tmp/${CODENAME}_masternode.conf - echo "**This configuration lines are on /tmp/${CODENAME}_masternode.conf. You can check this file with**" - echo "cat /tmp/${CODENAME}_masternode.conf" - echo "" - tput sgr0 - + # note outstanding tasks that need manual work + echo "************! ALMOST DONE !******************************" + if [ "$update" -eq 0 ]; then + echo "There is still work to do in the configuration templates." + echo "These are located at ${MNODE_CONF_BASE}, one per masternode." + echo "If you didn't set generate or key option, add your masternode private keys now." + echo "eg in /etc/masternodes/${CODENAME}_n1.conf" + else + echo "Your ${CODENAME} masternode daemon has been updated! (but not yet activated)" + fi + echo "" + echo "=> $(tput bold)$(tput setaf 2) All configuration files are in: ${MNODE_CONF_BASE} $(tput sgr0)" + echo "=> $(tput bold)$(tput setaf 2) All Data directories are in: ${MNODE_DATA_BASE} $(tput sgr0)" + echo "" + echo "$(tput bold)$(tput setaf 1)Important:$(tput sgr0) run $(tput setaf 2) /usr/local/bin/activate_masternodes_${CODENAME} $(tput sgr0) as root to activate your nodes." + + # place future helper script accordingly + if [ "$update" -eq 0 ]; then + cp ${SCRIPTPATH}/scripts/activate_masternodes.sh ${MNODE_HELPER}_${CODENAME} + echo "">> ${MNODE_HELPER}_${CODENAME} + + for NUM in $(seq 1 ${count}); do + echo "systemctl enable ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} + echo "systemctl restart ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} + done + + chmod u+x ${MNODE_HELPER}_${CODENAME} + fi + + if [ "$startnodes" -eq 1 ]; then + echo "" + echo "** Your nodes are starting up. If you haven't set masternode private key, Don't forget to change the masternodeprivkey later." + ${MNODE_HELPER}_${CODENAME} + fi + echo "**ALL YOUR MASTERNODE CONFIGURATION IS HERE. INPUT THESE LINES TO YOUR MASTERNODE.CONF**" + cat /tmp/${CODENAME}_masternode.conf + echo "**This configuration lines are on /tmp/${CODENAME}_masternode.conf. You can check this file with**" + echo "cat /tmp/${CODENAME}_masternode.conf" + echo "" + tput sgr0 + } # # /* no parameters, create the required network configuration. IPv6 is auto. */ # function prepare_mn_interfaces() { - - # this allows for more flexibility since every provider uses another default interface - # current default is: - # * ens3 (vultr) w/ a fallback to "eth0" (Hetzner, DO & Linode w/ IPv4 only) - # - - # check for the default interface status - if [ ! -f /sys/class/net/${ETH_INTERFACE}/operstate ]; then - echo "Default interface doesn't exist, switching to eth0" - export ETH_INTERFACE="eth0" - fi - - # check for the nuse case <3 - if [ -f /sys/class/net/ens160/operstate ]; then - export ETH_INTERFACE="ens160" - fi - - # get the current interface state - ETH_STATUS=$(cat /sys/class/net/${ETH_INTERFACE}/operstate) - - # check interface status - if [[ "${ETH_STATUS}" = "down" ]] || [[ "${ETH_STATUS}" = "" ]]; then - echo "Default interface is down, fallback didn't work. Break here." - exit 1 - fi - - # DO ipv6 fix, are we on DO? - # check for DO network config file - if [ -f ${DO_NET_CONF} ]; then - # found the DO config - if ! grep -q "::8888" ${DO_NET_CONF}; then - echo "ipv6 fix not found, applying!" - sed -i '/iface eth0 inet6 static/a dns-nameservers 2001:4860:4860::8844 2001:4860:4860::8888 8.8.8.8 127.0.0.1' ${DO_NET_CONF} - ifdown ${ETH_INTERFACE}; ifup ${ETH_INTERFACE}; + + # this allows for more flexibility since every provider uses another default interface + # current default is: + # * ens3 (vultr) w/ a fallback to "eth0" (Hetzner, DO & Linode w/ IPv4 only) + # + + # check for the default interface status + if [ ! -f /sys/class/net/${ETH_INTERFACE}/operstate ]; then + echo "Default interface doesn't exist, switching to eth0" + export ETH_INTERFACE="eth0" fi - fi - - IPV6_INT_BASE="$(ip -6 addr show dev ${ETH_INTERFACE} | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^fe80 | grep -v ^::1 | cut -f1-4 -d':' | head -1)" &>> ${SCRIPT_LOGFILE} - - validate_netchoice - echo "IPV6_INT_BASE AFTER : ${IPV6_INT_BASE}" &>> ${SCRIPT_LOGFILE} - - # user opted for ipv6 (default), so we have to check for ipv6 support - # check for vultr ipv6 box active - if [ -z "${IPV6_INT_BASE}" ] && [ ${net} -ne 4 ]; then - echo "No IPv6 support on the VPS but IPv6 is the setup default. Please switch to ipv4 with flag \"-n 4\" if you want to continue." - echo "" - echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" - echo "${IPV4_DOC_LINK}" - exit 1 - fi - - # generate the required ipv6 config - if [ "${net}" -eq 6 ]; then - # vultr specific, needed to work - sed -ie '/iface ${ETH_INTERFACE} inet6 auto/s/^/#/' ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} - - # move current config out of the way first - cp ${NETWORK_CONFIG} ${NETWORK_CONFIG}.${DATE_STAMP}.bkp &>> ${SCRIPT_LOGFILE} - - # create the additional ipv6 interfaces, rc.local because it's more generic - for NUM in $(seq 1 ${count}); do - - # check if the interfaces exist - ip -6 addr | grep -qi "${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}" - if [ $? -eq 0 ] - then - echo "IP for masternode already exists, skipping creation" &>> ${SCRIPT_LOGFILE} - else - echo "Creating new IP address for ${CODENAME} masternode nr ${NUM}" &>> ${SCRIPT_LOGFILE} - if [ "${NETWORK_CONFIG}" = "/etc/rc.local" ]; then - # need to put network config in front of "exit 0" in rc.local - sed -e '$i ip -6 addr add '"${IPV6_INT_BASE}"':'"${NETWORK_BASE_TAG}"'::'"${NUM}"'/64 dev '"${ETH_INTERFACE}"'\n' -i ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} - else - # if not using rc.local, append normally - echo "ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE}" >> ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} - fi - sleep 2 - ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE} &>> ${SCRIPT_LOGFILE} - fi - done # end forloop - fi # end ifneteq6 - + + # check for the nuse case <3 + if [ -f /sys/class/net/ens160/operstate ]; then + export ETH_INTERFACE="ens160" + fi + + # get the current interface state + ETH_STATUS=$(cat /sys/class/net/${ETH_INTERFACE}/operstate) + + # check interface status + if [[ "${ETH_STATUS}" = "down" ]] || [[ "${ETH_STATUS}" = "" ]]; then + echo "Default interface is down, fallback didn't work. Break here." + exit 1 + fi + + # DO ipv6 fix, are we on DO? + # check for DO network config file + if [ -f ${DO_NET_CONF} ]; then + # found the DO config + if ! grep -q "::8888" ${DO_NET_CONF}; then + echo "ipv6 fix not found, applying!" + sed -i '/iface eth0 inet6 static/a dns-nameservers 2001:4860:4860::8844 2001:4860:4860::8888 8.8.8.8 127.0.0.1' ${DO_NET_CONF} + ifdown ${ETH_INTERFACE}; ifup ${ETH_INTERFACE}; + fi + fi + + IPV6_INT_BASE="$(ip -6 addr show dev ${ETH_INTERFACE} | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^fe80 | grep -v ^::1 | cut -f1-4 -d':' | head -1)" &>> ${SCRIPT_LOGFILE} + + validate_netchoice + echo "IPV6_INT_BASE AFTER : ${IPV6_INT_BASE}" &>> ${SCRIPT_LOGFILE} + + # user opted for ipv6 (default), so we have to check for ipv6 support + # check for vultr ipv6 box active + if [ -z "${IPV6_INT_BASE}" ] && [ ${net} -ne 4 ]; then + echo "No IPv6 support on the VPS but IPv6 is the setup default. Please switch to ipv4 with flag \"-n 4\" if you want to continue." + echo "" + echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" + echo "${IPV4_DOC_LINK}" + exit 1 + fi + + # generate the required ipv6 config + if [ "${net}" -eq 6 ]; then + # vultr specific, needed to work + sed -ie '/iface ${ETH_INTERFACE} inet6 auto/s/^/#/' ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} + + # move current config out of the way first + cp ${NETWORK_CONFIG} ${NETWORK_CONFIG}.${DATE_STAMP}.bkp &>> ${SCRIPT_LOGFILE} + + # create the additional ipv6 interfaces, rc.local because it's more generic + for NUM in $(seq 1 ${count}); do + + # check if the interfaces exist + ip -6 addr | grep -qi "${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}" + if [ $? -eq 0 ] + then + echo "IP for masternode already exists, skipping creation" &>> ${SCRIPT_LOGFILE} + else + echo "Creating new IP address for ${CODENAME} masternode nr ${NUM}" &>> ${SCRIPT_LOGFILE} + if [ "${NETWORK_CONFIG}" = "/etc/rc.local" ]; then + # need to put network config in front of "exit 0" in rc.local + sed -e '$i ip -6 addr add '"${IPV6_INT_BASE}"':'"${NETWORK_BASE_TAG}"'::'"${NUM}"'/64 dev '"${ETH_INTERFACE}"'\n' -i ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} + else + # if not using rc.local, append normally + echo "ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE}" >> ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} + fi + sleep 2 + ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE} &>> ${SCRIPT_LOGFILE} + fi + done # end forloop + fi # end ifneteq6 + } ##################------------Menu()---------##################################### @@ -851,148 +851,148 @@ while true; do -h |--help) shift; help; - ;; + ;; -p |--project) shift; - if [ -n "$1" ]; - then - project="$1"; - shift; - fi - ;; + if [ -n "$1" ]; + then + project="$1"; + shift; + fi + ;; -n |--net) shift; - if [ -n "$1" ]; - then - net="$1"; - shift; - fi - ;; + if [ -n "$1" ]; + then + net="$1"; + shift; + fi + ;; -c |--count) shift; - if [ -n "$1" ]; - then - count="$1"; - shift; - fi - ;; + if [ -n "$1" ]; + then + count="$1"; + shift; + fi + ;; -r |--release) shift; - if [ -n "$1" ]; - then - release="$1"; - SCVERSION="$1" - shift; - fi - ;; + if [ -n "$1" ]; + then + release="$1"; + SCVERSION="$1" + shift; + fi + ;; -w |--wipe) shift; - wipe="1"; - ;; + wipe="1"; + ;; -s |--sentinel) shift; - sentinel="1"; - ;; + sentinel="1"; + ;; -u |--update) shift; - update="1"; - ;; + update="1"; + ;; -d |--debug) shift; - debug="1"; - ;; + debug="1"; + ;; -x|--startnodes) shift; - startnodes="1"; - ;; + startnodes="1"; + ;; -g | --generate) shift; - generate="1"; - ;; + generate="1"; + ;; -k |--key) shift; - if [ -n "$1" ]; - then - PRIVKEY[1]="$1"; - shift; - fi - ;; + if [ -n "$1" ]; + then + PRIVKEY[1]="$1"; + shift; + fi + ;; -k2 |--key2) shift; - if [ -n "$1" ]; - then - PRIVKEY[2]="$1"; - shift; - fi - ;; + if [ -n "$1" ]; + then + PRIVKEY[2]="$1"; + shift; + fi + ;; -k3 |--key3) shift; - if [ -n "$1" ]; - then - PRIVKEY[3]="$1"; - shift; - fi - ;; + if [ -n "$1" ]; + then + PRIVKEY[3]="$1"; + shift; + fi + ;; -k4 |--key4) shift; - if [ -n "$1" ]; - then - PRIVKEY[4]="$1"; - shift; - fi - ;; + if [ -n "$1" ]; + then + PRIVKEY[4]="$1"; + shift; + fi + ;; -k5 |--key5) shift; - if [ -n "$1" ]; - then - PRIVKEY[5]="$1"; - shift; - fi - ;; + if [ -n "$1" ]; + then + PRIVKEY[5]="$1"; + shift; + fi + ;; -k6 |--key6) shift; - if [ -n "$1" ]; - then - PRIVKEY[6]="$1"; - shift; - fi - ;; + if [ -n "$1" ]; + then + PRIVKEY[6]="$1"; + shift; + fi + ;; -k7 |--key7) shift; - if [ -n "$1" ]; - then - PRIVKEY[7]="$1"; - shift; - fi - ;; - -k8 |--key8) + if [ -n "$1" ]; + then + PRIVKEY[7]="$1"; + shift; + fi + ;; + -k8 |--key8) shift; - if [ -n "$1" ]; - then - PRIVKEY[8]="$1"; - shift; - fi - ;; + if [ -n "$1" ]; + then + PRIVKEY[8]="$1"; + shift; + fi + ;; -k9 |--key9) shift; - if [ -n "$1" ]; - then - PRIVKEY[9]="$1"; - shift; - fi - ;; - -k10 |--key10) + if [ -n "$1" ]; + then + PRIVKEY[9]="$1"; + shift; + fi + ;; + -k10 |--key10) shift; - if [ -n "$1" ]; - then - PRIVKEY[10]="$1"; - shift; - fi - ;; + if [ -n "$1" ]; + then + PRIVKEY[10]="$1"; + shift; + fi + ;; --) shift; break; - ;; + ;; esac done @@ -1004,8 +1004,8 @@ fi # Check required arguments if [ "$wipe" -eq 1 ]; then - get_confirmation "Would you really like to WIPE ALL DATA!? YES/NO y/n" && wipe_all - exit 0 + get_confirmation "Would you really like to WIPE ALL DATA!? YES/NO y/n" && wipe_all + exit 0 fi ################################################# @@ -1014,60 +1014,60 @@ source ${SCRIPTPATH}/config/default.env ################################################# main() { - - echo "starting" &> ${SCRIPT_LOGFILE} - showbanner - - # debug - if [ "$debug" -eq 1 ]; then - echo "********************** VALUES AFTER CONFIG SOURCING: ************************" - echo "START DEFAULTS => " - echo "SCRIPT_VERSION: $SCRIPT_VERSION" - echo "SSH_INBOUND_PORT: ${SSH_INBOUND_PORT}" - echo "SYSTEMD_CONF: ${SYSTEMD_CONF}" - echo "NETWORK_CONFIG: ${NETWORK_CONFIG}" - echo "NETWORK_TYPE: ${NETWORK_TYPE}" - echo "ETH_INTERFACE: ${ETH_INTERFACE}" - echo "MNODE_CONF_BASE: ${MNODE_CONF_BASE}" - echo "MNODE_DATA_BASE: ${MNODE_DATA_BASE}" - echo "MNODE_USER: ${MNODE_USER}" - echo "MNODE_HELPER: ${MNODE_HELPER}" - echo "MNODE_SWAPSIZE: ${MNODE_SWAPSIZE}" - echo "NETWORK_BASE_TAG: ${NETWORK_BASE_TAG}" - echo "CODE_DIR: ${CODE_DIR}" - echo "SCVERSION: ${SCVERSION}" - echo "RELEASE: ${release}" - echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" - echo "END DEFAULTS => " - fi - - # source project configuration + + echo "starting" &> ${SCRIPT_LOGFILE} + showbanner + + # debug + if [ "$debug" -eq 1 ]; then + echo "********************** VALUES AFTER CONFIG SOURCING: ************************" + echo "START DEFAULTS => " + echo "SCRIPT_VERSION: $SCRIPT_VERSION" + echo "SSH_INBOUND_PORT: ${SSH_INBOUND_PORT}" + echo "SYSTEMD_CONF: ${SYSTEMD_CONF}" + echo "NETWORK_CONFIG: ${NETWORK_CONFIG}" + echo "NETWORK_TYPE: ${NETWORK_TYPE}" + echo "ETH_INTERFACE: ${ETH_INTERFACE}" + echo "MNODE_CONF_BASE: ${MNODE_CONF_BASE}" + echo "MNODE_DATA_BASE: ${MNODE_DATA_BASE}" + echo "MNODE_USER: ${MNODE_USER}" + echo "MNODE_HELPER: ${MNODE_HELPER}" + echo "MNODE_SWAPSIZE: ${MNODE_SWAPSIZE}" + echo "NETWORK_BASE_TAG: ${NETWORK_BASE_TAG}" + echo "CODE_DIR: ${CODE_DIR}" + echo "SCVERSION: ${SCVERSION}" + echo "RELEASE: ${release}" + echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" + echo "END DEFAULTS => " + fi + + # source project configuration source_config ${project} - - # debug - if [ "$debug" -eq 1 ]; then - echo "START PROJECT => " - echo "CODENAME: $CODENAME" - echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" - echo "MNODE_DAEMON: ${MNODE_DAEMON}" - echo "MNODE_INBOUND_PORT: ${MNODE_INBOUND_PORT}" - echo "GIT_URL: ${GIT_URL}" - echo "SCVERSION: ${SCVERSION}" - echo "RELEASE: ${release}" - echo "NETWORK_BASE_TAG: ${NETWORK_BASE_TAG}" - echo "END PROJECT => " - - echo "START OPTIONS => " - echo "RELEASE: ${release}" - echo "PROJECT: ${project}" - echo "SETUP_MNODES_COUNT: ${count}" - echo "NETWORK_TYPE: ${NETWORK_TYPE}" - echo "NETWORK_TYPE: ${net}" - - echo "END OPTIONS => " - echo "********************** VALUES AFTER CONFIG SOURCING: ************************" - fi - + + # debug + if [ "$debug" -eq 1 ]; then + echo "START PROJECT => " + echo "CODENAME: $CODENAME" + echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" + echo "MNODE_DAEMON: ${MNODE_DAEMON}" + echo "MNODE_INBOUND_PORT: ${MNODE_INBOUND_PORT}" + echo "GIT_URL: ${GIT_URL}" + echo "SCVERSION: ${SCVERSION}" + echo "RELEASE: ${release}" + echo "NETWORK_BASE_TAG: ${NETWORK_BASE_TAG}" + echo "END PROJECT => " + + echo "START OPTIONS => " + echo "RELEASE: ${release}" + echo "PROJECT: ${project}" + echo "SETUP_MNODES_COUNT: ${count}" + echo "NETWORK_TYPE: ${NETWORK_TYPE}" + echo "NETWORK_TYPE: ${net}" + + echo "END OPTIONS => " + echo "********************** VALUES AFTER CONFIG SOURCING: ************************" + fi + } main "$@" From 55f9e2f2a95849d065303b39391b19bacb67eafc Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sat, 3 Nov 2018 15:43:07 +0900 Subject: [PATCH 19/43] Version 1.4.4 --- config/phore/phore.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/phore/phore.env b/config/phore/phore.env index 9c6264a9..2739ce93 100644 --- a/config/phore/phore.env +++ b/config/phore/phore.env @@ -2,5 +2,5 @@ CODENAME=phore MNODE_DAEMON=${MNODE_DAEMON:-/usr/local/bin/phored} MNODE_INBOUND_PORT=${MNODE_INBOUND_PORT:-11771} GIT_URL=https://github.com/phoreproject/Phore.git -SCVERSION="tags/v1.3.3.1" +SCVERSION="tags/v1.4.4" NETWORK_BASE_TAG="2044" From 5d416eef9f1f4e4f4c7a8cce52f2921b36669ac3 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sat, 3 Nov 2018 15:43:38 +0900 Subject: [PATCH 20/43] Update readme to add about checking masternode status --- README.md | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ec29174b..92677d17 100644 --- a/README.md +++ b/README.md @@ -180,7 +180,7 @@ In these cases, you can skip "Configure masternode configuration files" below. git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 -g -x ``` for new 3rd masternode. - + - If you are upgrading your masternode(s) to a new release You should first remove the old version of the VPS script so that the new one you download is tagged with the latest version, and then you add a -u parameter to upgrade existing nodes: @@ -317,8 +317,8 @@ To check the status of your masternode, please enter this command in the VPS ter The output will look like this: ``` { - "version": 1030301, - "protocolversion": 70004, + "version": 1040400, + "protocolversion": 70005, "walletversion": 61000, "balance": 0.00000000, "privatesend_balance": 0.00000000, @@ -386,6 +386,24 @@ Your Phore masternode is now set up and running! Depending on how many masternod ## Tips +### Check masternode status on VPS Server +You can check your masternode status on VPS server. Use this command. +``` +/usr/local/bin/phore-cli -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 masternode status +``` +If it returns +``` +{ + "txhash": "a7eba991be786ce80948e9099e26f6a816317b2142f9e5e12abea357f885d0f2", + "outputidx": 1, + "netaddr": "[2001:19f0:5c01:457:2044::6]:11771", + "addr": "PEtMbHEuqo1QHs7Xy2wCTTmugAuemyd2mU", + "status": 4, + "message": "Masternode successfully started" +} +``` +like this, Your masternode is successfully started(Please check txhash, outputidx are same as your masternode.conf). + You can start and stop masternode client manually. Enter this commands. ### To stop ``` From 08c8da89f6cb7265dd10ddd6c09633bd8d7836e5 Mon Sep 17 00:00:00 2001 From: tohsnoom Date: Fri, 27 Jul 2018 17:27:11 -0500 Subject: [PATCH 21/43] Updated for v1.4.5 --- config/phore/phore.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/phore/phore.env b/config/phore/phore.env index 5a975b62..2680364e 100644 --- a/config/phore/phore.env +++ b/config/phore/phore.env @@ -2,5 +2,5 @@ CODENAME=phore MNODE_DAEMON=${MNODE_DAEMON:-/usr/local/bin/phored} MNODE_INBOUND_PORT=${MNODE_INBOUND_PORT:-11771} GIT_URL=https://github.com/phoreproject/Phore.git -SCVERSION="tags/v1.3.2" +SCVERSION="tags/v1.4.5" NETWORK_BASE_TAG="2044" From ca092b16d25789baee27094456970465266e0b5a Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Wed, 21 Nov 2018 15:54:18 +0900 Subject: [PATCH 22/43] update to upstream masternodes/vps * Fix package set for 18.04 (https://github.com/masternodes/vps/commit/3e5a8cd2a0fb592e348f004250ca97e2fcc47577#diff-3fbb47e318cd8802bd325e7da9aaabe8) * Fix package option * Fix sed errors * Fix SCRIPTPATH * Fix sentinel cron installation (https://github.com/masternodes/vps/commit/1bdd39bc7c968e17fb4ee76202cef49eebeef374#diff-3fbb47e318cd8802bd325e7da9aaabe8) * Add new ens160 fallback --- install.sh | 1492 +++++++++++++++++++++++++++------------------------- 1 file changed, 762 insertions(+), 730 deletions(-) diff --git a/install.sh b/install.sh index 7351b3b9..4965ad39 100755 --- a/install.sh +++ b/install.sh @@ -5,10 +5,10 @@ # ██║╚██╗██║██║ ██║██║ ██║██╔══╝ ██║╚██╔╝██║██╔══██║╚════██║ ██║ ██╔══╝ ██╔══██╗ # ██║ ╚████║╚██████╔╝██████╔╝███████╗██║ ╚═╝ ██║██║ ██║███████║ ██║ ███████╗██║ ██║ # ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ -# ╚╗ @marsmensch 2016-2018 ╔╝ -# -# version v0.9.4 -# date 2018-04-04 +# ╚╗ @marsmensch 2016-2018 ╔╝ +# +# version v0.9.9 +# date 2018-08-23 # # function: part of the masternode scripts, source the proper config file # @@ -16,7 +16,7 @@ # Run this script w/ the desired parameters. Leave blank or use -h for help. # # Platforms: -# - Linux Ubuntu 16.04 LTS ONLY on a Vultr, Hetzner or DigitalOcean VPS +# - Linux Ubuntu 16.04 LTS AND 18.04 LTS ONLY on a Vultr, Hetzner or DigitalOcean VPS # - Generic Ubuntu support will be added at a later point in time # # Twitter @marsmensch @@ -26,13 +26,14 @@ declare -r CRYPTOS=`ls -l config/ | egrep '^d' | awk '{print $9}' | xargs echo - declare -r DATE_STAMP="$(date +%y-%m-%d-%s)" declare -r SCRIPTPATH=$( cd $(dirname ${BASH_SOURCE[0]}) > /dev/null; pwd -P ) declare -r MASTERPATH="$(dirname "${SCRIPTPATH}")" -declare -r SCRIPT_VERSION="v0.9.4" +declare -r SCRIPT_VERSION="v0.9.9" declare -r SCRIPT_LOGFILE="/tmp/nodemaster_${DATE_STAMP}_out.log" declare -r IPV4_DOC_LINK="https://www.vultr.com/docs/add-secondary-ipv4-address" declare -r DO_NET_CONF="/etc/network/interfaces.d/50-cloud-init.cfg" function showbanner() { -cat << "EOF" + echo $(tput bold)$(tput setaf 2) + cat << "EOF" ███╗ ██╗ ██████╗ ██████╗ ███████╗███╗ ███╗ █████╗ ███████╗████████╗███████╗██████╗ ████╗ ██║██╔═══██╗██╔══██╗██╔════╝████╗ ████║██╔══██╗██╔════╝╚══██╔══╝██╔════╝██╔══██╗ ██╔██╗ ██║██║ ██║██║ ██║█████╗ ██╔████╔██║███████║███████╗ ██║ █████╗ ██████╔╝ @@ -41,6 +42,8 @@ cat << "EOF" ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚╗ @marsmensch 2016-2018 ╔╝ EOF + echo "$(tput sgr0)$(tput setaf 3)Have fun, this is crypto after all!$(tput sgr0)" + echo "$(tput setaf 6)Donations for @marsmensch (BTC): 33ENWZ9RCYBG7nv6ac8KxBUSuQX64Hx3x3" } # /* @@ -49,208 +52,209 @@ EOF # */ # function get_confirmation() { - # call with a prompt string or use a default - read -r -p "${1:-Are you sure? [y/N]} " response - case "$response" in - [yY][eE][sS]|[yY]) - true - ;; - *) - false - ;; - esac + # call with a prompt string or use a default + read -r -p "${1:-Are you sure? [y/N]} " response + case "$response" in + [yY][eE][sS]|[yY]) + true + ;; + *) + false + ;; + esac } # # /* no parameters, displays the help message */ # function show_help(){ - clear - showbanner - echo "install.sh, version $SCRIPT_VERSION"; - echo "Usage example:"; - echo "install.sh (-p|--project) string [(-h|--help)] [(-n|--net) int] [(-c|--count) int] [(-r|--release) string] [(-w|--wipe)] [(-u|--update)] [(-x|--startnodes)]"; - echo "Options:"; - echo "-h or --help: Displays this information."; - echo "-p or --project string: Project to be installed. REQUIRED."; - echo "-n or --net: IP address type t be used (4 vs. 6)."; - echo "-c or --count: Number of masternodes to be installed."; - echo "-r or --release: Release version to be installed."; - echo "-s or --sentinel: Add sentinel monitoring for a node type. Combine with the -p option"; - echo "-w or --wipe: Wipe ALL local data for a node type. Combine with the -p option"; - echo "-u or --update: Update a specific masternode daemon. Combine with the -p option"; - echo "-r or --release: Release version to be installed."; - echo "-x or --startnodes: Start masternodes after installation to sync with blockchain"; - exit 1; + clear + showbanner + echo "install.sh, version $SCRIPT_VERSION"; + echo "Usage example:"; + echo "install.sh (-p|--project) string [(-h|--help)] [(-n|--net) int] [(-c|--count) int] [(-r|--release) string] [(-w|--wipe)] [(-g|--generate)][(-k|--key) string] [(-u|--update)] [(-x|--startnodes)]"; + echo "Options:"; + echo "-h or --help: Displays this information."; + echo "-p or --project string: Project to be installed. REQUIRED."; + echo "-n or --net: IP address type t be used (4 vs. 6)."; + echo "-c or --count: Number of masternodes to be installed."; + echo "-r or --release: Release version to be installed."; + echo "-s or --sentinel: Add sentinel monitoring for a node type. Combine with the -p option"; + echo "-w or --wipe: Wipe ALL local data for a node type. Combine with the -p option"; + echo "-u or --update: Update a specific masternode daemon. Combine with the -p option"; + echo "-r or --release: Release version to be installed."; + echo "-k or --key: Set private key to masternode configuration files directly"; + echo "-x or --startnodes: Start masternodes after installation to sync with blockchain"; + echo "-g or --generate: Generate masternode private key and use" + exit 1; } # # /* no parameters, checks if we are running on a supported Ubuntu release */ # function check_distro() { - # currently only for Ubuntu 16.04 - if [[ -r /etc/os-release ]]; then - . /etc/os-release - if [[ "${VERSION_ID}" != "16.04" ]]; then - echo "This script only supports ubuntu 16.04 LTS, exiting." - exit 1 - fi - else - # no, thats not ok! - echo "This script only supports ubuntu 16.04 LTS, exiting." - exit 1 - fi + # currently only for Ubuntu 16.04 & 18.04 + if [[ -r /etc/os-release ]]; then + . /etc/os-release + if [[ "${VERSION_ID}" != "16.04" ]] && [[ "${VERSION_ID}" != "18.04" ]]; then + echo "This script only supports ubuntu 16.04 & 18.04 LTS, exiting." + exit 1 + fi + else + # no, thats not ok! + echo "This script only supports ubuntu 16.04 & 18.04 LTS, exiting." + exit 1 + fi } # # /* no parameters, installs the base set of packages that are required for all projects */ # function install_packages() { - # development and build packages - # these are common on all cryptos - echo "* Package installation!" - apt-get -qq -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true update - apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install build-essential g++ \ - protobuf-compiler libboost-all-dev autotools-dev \ - automake libcurl4-openssl-dev libboost-all-dev libssl-dev libdb++-dev \ - make autoconf automake libtool git apt-utils libprotobuf-dev pkg-config \ - libcurl3-dev libudev-dev libqrencode-dev bsdmainutils pkg-config libssl-dev \ - libgmp3-dev libevent-dev jp2a pv virtualenv &>> ${SCRIPT_LOGFILE} + # development and build packages + # these are common on all cryptos + echo "* Package installation!" + add-apt-repository -yu ppa:bitcoin/bitcoin &>> ${SCRIPT_LOGFILE} + apt-get -qq -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true update &>> ${SCRIPT_LOGFILE} + apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install build-essential \ + libcurl4-gnutls-dev protobuf-compiler libboost-all-dev autotools-dev automake \ + libboost-all-dev libssl-dev make autoconf libtool git apt-utils g++ \ + libprotobuf-dev pkg-config libudev-dev libqrencode-dev bsdmainutils \ + pkg-config libgmp3-dev libevent-dev jp2a pv virtualenv libdb4.8-dev libdb4.8++-dev &>> ${SCRIPT_LOGFILE} + + # only for 18.04 // openssl + if [[ "${VERSION_ID}" == "18.04" ]] ; then + apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install libssl1.0-dev + fi } # # /* no parameters, creates and activates a swapfile since VPS servers often do not have enough RAM for compilation */ # function swaphack() { -#check if swap is available -if [ $(free | awk '/^Swap:/ {exit !$2}') ] || [ ! -f "/var/mnode_swap.img" ];then - echo "* No proper swap, creating it" - # needed because ant servers are ants - rm -f /var/mnode_swap.img - dd if=/dev/zero of=/var/mnode_swap.img bs=1024k count=${MNODE_SWAPSIZE} &>> ${SCRIPT_LOGFILE} - chmod 0600 /var/mnode_swap.img - mkswap /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} - swapon /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} - echo '/var/mnode_swap.img none swap sw 0 0' | tee -a /etc/fstab &>> ${SCRIPT_LOGFILE} - echo 'vm.swappiness=10' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} -else - echo "* All good, we have a swap" -fi + #check if swap is available + if [ $(free | awk '/^Swap:/ {exit !$2}') ] || [ ! -f "/var/mnode_swap.img" ];then + echo "* No proper swap, creating it" + # needed because ant servers are ants + rm -f /var/mnode_swap.img + dd if=/dev/zero of=/var/mnode_swap.img bs=1024k count=${MNODE_SWAPSIZE} &>> ${SCRIPT_LOGFILE} + chmod 0600 /var/mnode_swap.img + mkswap /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} + swapon /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} + echo '/var/mnode_swap.img none swap sw 0 0' | tee -a /etc/fstab &>> ${SCRIPT_LOGFILE} + echo 'vm.swappiness=10' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + else + echo "* All good, we have a swap" + fi } # # /* no parameters, creates and activates a dedicated masternode user */ # function create_mn_user() { - - # our new mnode unpriv user acc is added - if id "${MNODE_USER}" >/dev/null 2>&1; then - echo "user exists already, do nothing" &>> ${SCRIPT_LOGFILE} - else - echo "Adding new system user ${MNODE_USER}" - adduser --disabled-password --gecos "" ${MNODE_USER} &>> ${SCRIPT_LOGFILE} - fi - + # our new mnode unpriv user acc is added + if id "${MNODE_USER}" >/dev/null 2>&1; then + echo "user exists already, do nothing" &>> ${SCRIPT_LOGFILE} + else + echo "Adding new system user ${MNODE_USER}" + adduser --disabled-password --gecos "" ${MNODE_USER} &>> ${SCRIPT_LOGFILE} + fi } # # /* no parameters, creates a masternode data directory (one per masternode) */ # function create_mn_dirs() { - - # individual data dirs for now to avoid problems - echo "* Creating masternode directories" - mkdir -p ${MNODE_CONF_BASE} - for NUM in $(seq 1 ${count}); do - if [ ! -d "${MNODE_DATA_BASE}/${CODENAME}${NUM}" ]; then - echo "creating data directory ${MNODE_DATA_BASE}/${CODENAME}${NUM}" &>> ${SCRIPT_LOGFILE} - mkdir -p ${MNODE_DATA_BASE}/${CODENAME}${NUM} &>> ${SCRIPT_LOGFILE} - fi - done - + # individual data dirs for now to avoid problems + echo "* Creating masternode directories" + mkdir -p ${MNODE_CONF_BASE} + for NUM in $(seq 1 ${count}); do + if [ ! -d "${MNODE_DATA_BASE}/${CODENAME}${NUM}" ]; then + echo "creating data directory ${MNODE_DATA_BASE}/${CODENAME}${NUM}" &>> ${SCRIPT_LOGFILE} + mkdir -p ${MNODE_DATA_BASE}/${CODENAME}${NUM} &>> ${SCRIPT_LOGFILE} + fi + done } # # /* no parameters, creates a sentinel config for a set of masternodes (one per masternode) */ # function create_sentinel_setup() { + SENTINEL_BASE=/usr/share/sentinel + SENTINEL_ENV=/usr/share/sentinelenv + + # if code directory does not exists, we create it clone the src + if [ ! -d ${SENTINEL_BASE} ]; then + cd /usr/share &>> ${SCRIPT_LOGFILE} + git clone https://github.com/dashpay/sentinel.git sentinel &>> ${SCRIPT_LOGFILE} + cd sentinel &>> ${SCRIPT_LOGFILE} + rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} + else + echo "* Updating the existing sentinel GIT repo" + cd ${SENTINEL_BASE} &>> ${SCRIPT_LOGFILE} + git pull &>> ${SCRIPT_LOGFILE} + rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} + fi + + # create a globally accessible venv and install sentinel requirements + virtualenv --system-site-packages ${SENTINEL_ENV} &>> ${SCRIPT_LOGFILE} + ${SENTINEL_ENV}/bin/pip install -r requirements.txt &>> ${SCRIPT_LOGFILE} + + # create one sentinel config file per masternode + for NUM in $(seq 1 ${count}); do + if [ ! -f "${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf" ]; then + echo "* Creating sentinel configuration for ${CODENAME} masternode number ${NUM}" &>> ${SCRIPT_LOGFILE} + echo "dash_conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" > {SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "network=mainnet" >> {SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "db_name=${SENTINEL_BASE}/database/${CODENAME}_${NUM}_sentinel.db" >> {SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "db_driver=sqlite" >> {SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + fi + done - # if code directory does not exists, we create it clone the src - if [ ! -d /usr/share/sentinel ]; then - cd /usr/share &>> ${SCRIPT_LOGFILE} - git clone https://github.com/dashpay/sentinel.git sentinel &>> ${SCRIPT_LOGFILE} - cd sentinel &>> ${SCRIPT_LOGFILE} - rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} - else - echo "* Updating the existing sentinel GIT repo" - cd /usr/share/sentinel &>> ${SCRIPT_LOGFILE} - git pull &>> ${SCRIPT_LOGFILE} - rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} - fi - - # create a globally accessible venv and install sentinel requirements - virtualenv --system-site-packages /usr/share/sentinelvenv &>> ${SCRIPT_LOGFILE} - /usr/share/sentinelvenv/bin/pip install -r requirements.txt &>> ${SCRIPT_LOGFILE} - - # create one sentinel config file per masternode - for NUM in $(seq 1 ${count}); do - if [ ! -f "/usr/share/sentinel/${CODENAME}${NUM}_sentinel.conf" ]; then - echo "* Creating sentinel configuration for ${CODENAME} masternode number ${NUM}" &>> ${SCRIPT_LOGFILE} - echo "dash_conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" > /usr/share/sentinel/${CODENAME}${NUM}_sentinel.conf - echo "network=mainnet" >> /usr/share/sentinel/${CODENAME}${NUM}_sentinel.conf - echo "db_name=database/${CODENAME}_${NUM}_sentinel.db" >> /usr/share/sentinel/${CODENAME}${NUM}_sentinel.conf - echo "db_driver=sqlite" >> /usr/share/sentinel/${CODENAME}${NUM}_sentinel.conf - fi - done - - echo "Generated a Sentinel config for you. To activate Sentinel run" - echo "export SENTINEL_CONFIG=${MNODE_CONF_BASE}/${CODENAME}${NUM}_sentinel.conf; /usr/share/sentinelvenv/bin/python /usr/share/sentinel/bin/sentinel.py" - echo "" - echo "If it works, add the command as cronjob: " - echo "* * * * * export SENTINEL_CONFIG=${MNODE_CONF_BASE}/${CODENAME}${NUM}_sentinel.conf; /usr/share/sentinelvenv/bin/python /usr/share/sentinel/bin/sentinel.py 2>&1 >> /var/log/sentinel/sentinel-cron.log" + export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py + echo "$(tput sgr0)$(tput setaf 3)Generated a Sentinel config for you. To activate Sentinel run:$(tput sgr0)" + echo "$(tput sgr0)$(tput setaf 2)export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py$(tput sgr0)" + echo "" + echo "$(tput sgr0)$(tput setaf 2)If it works, add the command as cronjob: $(tput sgr0)" + echo "$(tput sgr0)$(tput setaf 2)* * * * * export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py >> /var/log/sentinel/sentinel-cron.log$(tput sgr0) 2>&1" } # # /* no parameters, creates a minimal set of firewall rules that allows INBOUND masternode p2p & SSH ports */ # function configure_firewall() { - - echo "* Configuring firewall rules" - # disallow everything except ssh and masternode inbound ports - ufw default deny &>> ${SCRIPT_LOGFILE} - ufw logging on &>> ${SCRIPT_LOGFILE} - ufw allow ${SSH_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} - # KISS, its always the same port for all interfaces - ufw allow ${MNODE_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} - # This will only allow 6 connections every 30 seconds from the same IP address. - ufw limit OpenSSH &>> ${SCRIPT_LOGFILE} - ufw --force enable &>> ${SCRIPT_LOGFILE} - echo "* Firewall ufw is active and enabled on system startup" - + echo "* Configuring firewall rules" + # disallow everything except ssh and masternode inbound ports + ufw default deny &>> ${SCRIPT_LOGFILE} + ufw logging on &>> ${SCRIPT_LOGFILE} + ufw allow ${SSH_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} + # KISS, its always the same port for all interfaces + ufw allow ${MNODE_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} + # This will only allow 6 connections every 30 seconds from the same IP address. + ufw limit OpenSSH &>> ${SCRIPT_LOGFILE} + ufw --force enable &>> ${SCRIPT_LOGFILE} + echo "* Firewall ufw is active and enabled on system startup" } # # /* no parameters, checks if the choice of networking matches w/ this VPS installation */ # function validate_netchoice() { + echo "* Validating network rules" - echo "* Validating network rules" - - # break here of net isn't 4 or 6 - if [ ${net} -ne 4 ] && [ ${net} -ne 6 ]; then - echo "invalid NETWORK setting, can only be 4 or 6!" - exit 1; - fi - - # generate the required ipv6 config - if [ "${net}" -eq 4 ]; then - IPV6_INT_BASE="#NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER" - NETWORK_BASE_TAG="" - echo "IPv4 address generation needs to be done manually atm!" &>> ${SCRIPT_LOGFILE} - fi # end ifneteq4 + # break here of net isn't 4 or 6 + if [ ${net} -ne 4 ] && [ ${net} -ne 6 ]; then + echo "invalid NETWORK setting, can only be 4 or 6!" + exit 1; + fi + # generate the required ipv6 config + if [ "${net}" -eq 4 ]; then + IPV6_INT_BASE="#NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER" + echo "IPv4 address generation needs to be done manually atm!" &>> ${SCRIPT_LOGFILE} + fi # end ifneteq4 } # @@ -259,90 +263,94 @@ function validate_netchoice() { # function create_mn_configuration() { - # always return to the script root - cd ${SCRIPTPATH} - for NUM in $(seq 1 ${count}); do - if [ -n "${PRIVKEY[${NUM}]}" ]; then - echo ${PRIVKEY[${NUM}]} >> tmp.txt - fi - done - if [ -f tmp.txt ]; then - dup=$(sort -t 8 tmp.txt | uniq -c | sort -nr | head -1 | awk '{print substr($0, 7, 1)}') - if [ 1 -ne "$dup" ]; then - echo "Private key was duplicated. Please restart this script." - rm -r /etc/masternodes - rm tmp.txt - exit 1 - fi - rm tmp.txt - fi + # always return to the script root + cd ${SCRIPTPATH} - # create one config file per masternode - for NUM in $(seq 1 ${count}); do - PASS=$(date | md5sum | cut -c1-24) - - # we dont want to overwrite an existing config file - if [ ! -f ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf ]; then - echo "individual masternode config doesn't exist, generate it!" &>> ${SCRIPT_LOGFILE} - # if a template exists, use this instead of the default - if [ -e config/${CODENAME}/${CODENAME}.conf ]; then - echo "custom configuration template for ${CODENAME} found, use this instead" &>> ${SCRIPT_LOGFILE} - cp ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} - else - echo "No ${CODENAME} template found, using the default configuration template" &>> ${SCRIPT_LOGFILE} - cp ${SCRIPTPATH}/config/default.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} - fi - # replace placeholders - echo "running sed on file ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" &>> ${SCRIPT_LOGFILE} - fi - - if [ -n "${PRIVKEY[${NUM}]}" ]; then - if [ ${#PRIVKEY[${NUM}]} -eq 51 ]; then - sed -e "s/HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_XXX_GIT_PROJECT_XXX_XXX_NUM_XXX/${PRIVKEY[${NUM}]}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - else - echo "input private key ${PRIVKEY[${NUM}]} was invalid. Please check the key, and restart this script." - rm -r /etc/masternodes - exit 1 - fi - else : - fi - sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY/${NUM}]/" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV6_INT_BASE}/" -e "s/XXX_NETWORK_BASE_TAG_XXX/${NETWORK_BASE_TAG}/" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - if [ -z "${PRIVKEY[${NUM}]}" ]; then - if [ "$startnodes" -eq 1 ]; then - #uncomment masternode= and masternodeprivkey= so the node can autostart and sync - sed 's/\(^.*masternode\(\|privkey\)=.*$\)/#\1/' -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - fi - fi - done + # store private keys + for NUM in $(seq 1 ${count}); do + if [ -n "${PRIVKEY[${NUM}]}" ]; then + echo ${PRIVKEY[${NUM}]} >> tmp.txt + fi + done + + # check whether masternode private keys are duplicated + if [ -f tmp.txt ]; then + dup=$(sort -t 8 tmp.txt | uniq -c | sort -nr | head -1 | awk '{print substr($0, 7, 1)}') + if [ 1 -ne "$dup" ]; then + echo "Private key was duplicated. Please restart this script." + rm -r /etc/masternodes + rm tmp.txt + exit 1 + fi + rm tmp.txt + fi + + # create one config file per masternode + for NUM in $(seq 1 ${count}); do + PASS=$(date | md5sum | cut -c1-24) + + # we dont want to overwrite an existing config file + if [ ! -f ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf ]; then + echo "individual masternode config doesn't exist, generate it!" &>> ${SCRIPT_LOGFILE} + # if a template exists, use this instead of the default + if [ -e config/${CODENAME}/${CODENAME}.conf ]; then + echo "custom configuration template for ${CODENAME} found, use this instead" &>> ${SCRIPT_LOGFILE} + cp ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} + else + echo "No ${CODENAME} template found, using the default configuration template" &>> ${SCRIPT_LOGFILE} + cp ${SCRIPTPATH}/config/default.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} + fi + # replace placeholders + echo "running sed on file ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" &>> ${SCRIPT_LOGFILE} + fi + + # replace masternode private keys + if [ -n "${PRIVKEY[${NUM}]}" ]; then + if [ ${#PRIVKEY[${NUM}]} -eq 51 ]; then + sed -e "s/HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_XXX_GIT_PROJECT_XXX_XXX_NUM_XXX/${PRIVKEY[${NUM}]}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + else + echo "input private key ${PRIVKEY[${NUM}]} was invalid. Please check the key, and restart this script." + rm -r /etc/masternodes + exit 1 + fi + else : + fi + sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY/${NUM}]/" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV6_INT_BASE}/" -e "s/XXX_NETWORK_BASE_TAG_XXX/${NETWORK_BASE_TAG}/" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + if [ -z "${PRIVKEY[${NUM}]}" ]; then + if [ "$startnodes" -eq 1 ]; then + #uncomment masternode= and masternodeprivkey= so the node can autostart and sync + sed 's/\(^.*masternode\(\|privkey\)=.*$\)/#\1/' -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + fi + fi + done } # # /* no parameters, generates a masternode configuration file per masternode in the default */ # function create_control_configuration() { - # delete any old stuff that's still around - rm -f /tmp/${CODENAME}_masternode.conf &>> ${SCRIPT_LOGFILE} - # create one line per masternode with the data we have - for NUM in $(seq 1 ${count}); do - if [ -n "${PRIVKEY[${NUM}]}" ]; then - echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} ${PRIVKEY[${NUM}]} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf - else - echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} MASTERNODE_PRIVKEY_FOR_${CODENAME}MN${NUM} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf - fi - done + # delete any old stuff that's still around + rm -f /tmp/${CODENAME}_masternode.conf &>> ${SCRIPT_LOGFILE} + # create one line per masternode with the data we have + for NUM in $(seq 1 ${count}); do + if [ -n "${PRIVKEY[${NUM}]}" ]; then + echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} ${PRIVKEY[${NUM}]} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf + else + echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} MASTERNODE_PRIVKEY_FOR_${CODENAME}MN${NUM} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf + fi + done } # # /* no parameters, generates a a pre-populated masternode systemd config file */ # function create_systemd_configuration() { - - echo "* (over)writing systemd config files for masternodes" - # create one config file per masternode - for NUM in $(seq 1 ${count}); do - PASS=$(date | md5sum | cut -c1-24) - echo "* (over)writing systemd config file ${SYSTEMD_CONF}/${CODENAME}_n${NUM}.service" &>> ${SCRIPT_LOGFILE} - cat > ${SYSTEMD_CONF}/${CODENAME}_n${NUM}.service <<-EOF + echo "* (over)writing systemd config files for masternodes" + # create one config file per masternode + for NUM in $(seq 1 ${count}); do + PASS=$(date | md5sum | cut -c1-24) + echo "* (over)writing systemd config file ${SYSTEMD_CONF}/${CODENAME}_n${NUM}.service" &>> ${SCRIPT_LOGFILE} + cat > ${SYSTEMD_CONF}/${CODENAME}_n${NUM}.service <<-EOF [Unit] Description=${CODENAME} distributed currency daemon After=network.target @@ -353,8 +361,7 @@ function create_systemd_configuration() { Type=forking PIDFile=${MNODE_DATA_BASE}/${CODENAME}${NUM}/${CODENAME}.pid - ExecStart=${MNODE_DAEMON} -daemon -pid=${MNODE_DATA_BASE}/${CODENAME}${NUM}/${CODENAME}.pid \ - -conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}${NUM} + ExecStart=${MNODE_DAEMON} -daemon -pid=${MNODE_DATA_BASE}/${CODENAME}${NUM}/${CODENAME}.pid -conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}${NUM} Restart=always RestartSec=5 @@ -367,54 +374,50 @@ function create_systemd_configuration() { [Install] WantedBy=multi-user.target EOF - done - + done } # # /* set all permissions to the masternode user */ # function set_permissions() { - - # maybe add a sudoers entry later - chown -R ${MNODE_USER}:${MNODE_USER} ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel &>> ${SCRIPT_LOGFILE} - # make group permissions same as user, so vps-user can be added to masternode group - chmod -R g=u ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel &>> ${SCRIPT_LOGFILE} - + # maybe add a sudoers entry later + mkdir -p /var/log/sentinel &>> ${SCRIPT_LOGFILE} + chown -R ${MNODE_USER}:${MNODE_USER} ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel ${SENTINEL_BASE}/database &>> ${SCRIPT_LOGFILE} + # make group permissions same as user, so vps-user can be added to masternode group + chmod -R g=u ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel &>> ${SCRIPT_LOGFILE} &>> ${SCRIPT_LOGFILE} } # # /* wipe all files and folders generated by the script for a specific project */ # function wipe_all() { - - echo "Deleting all ${project} related data!" - rm -f /etc/masternodes/${project}_n*.conf - rmdir --ignore-fail-on-non-empty -p /var/lib/masternodes/${project}* - rm -f /etc/systemd/system/${project}_n*.service - rm -f ${MNODE_DAEMON} - echo "DONE!" - exit 0 - + echo "Deleting all ${project} related data!" + rm -f /etc/masternodes/${project}_n*.conf + rmdir --ignore-fail-on-non-empty -p /var/lib/masternodes/${project}* + rm -f /etc/systemd/system/${project}_n*.service + rm -f ${MNODE_DAEMON} + echo "DONE!" + exit 0 } # #Generate masternode private key # function generate_privkey() { - echo -e "rpcuser=test\nrpcpassword=passtest" >> ${MNODE_CONF_BASE}/${CODENAME}_test.conf - mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test - phored -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test - sleep 5 - - for NUM in $(seq 1 ${count}); do - if [ -z "${PRIVKEY[${NUM}]}" ]; then - PRIVKEY[${NUM}]=$(phore-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) - fi - done - phore-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop - sleep 5 - rm -r ${MNODE_CONF_BASE}/${CODENAME}_test.conf ${MNODE_DATA_BASE}/${CODENAME}_test + echo -e "rpcuser=test\nrpcpassword=passtest" >> ${MNODE_CONF_BASE}/${CODENAME}_test.conf + mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test + phored -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test + sleep 5 + + for NUM in $(seq 1 ${count}); do + if [ -z "${PRIVKEY[${NUM}]}" ]; then + PRIVKEY[${NUM}]=$(phore-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) + fi + done + phore-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop + sleep 5 + rm -r ${MNODE_CONF_BASE}/${CODENAME}_test.conf ${MNODE_DATA_BASE}/${CODENAME}_test } # @@ -424,25 +427,23 @@ function generate_privkey() { # */ # function cleanup_after() { - - apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoremove - apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoclean - - echo "kernel.randomize_va_space=1" > /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.rp_filter=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.accept_source_route=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.log_martians=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.default.log_martians=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.accept_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv6.conf.all.accept_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.send_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "kernel.sysrq=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.tcp_timestamps=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.icmp_ignore_bogus_error_responses=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - sysctl -p - + #apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoremove + apt-get -qqy -o=Dpkg::Use-Pty=0 --allow-downgrades --allow-change-held-packages autoclean + + echo "kernel.randomize_va_space=1" > /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.rp_filter=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.accept_source_route=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.log_martians=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.default.log_martians=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.accept_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv6.conf.all.accept_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.send_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "kernel.sysrq=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.tcp_timestamps=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.icmp_ignore_bogus_error_responses=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + sysctl -p } # @@ -451,288 +452,320 @@ function cleanup_after() { # source the default and desired crypto configuration files function source_config() { + SETUP_CONF_FILE="${SCRIPTPATH}/config/${project}/${project}.env" + + # first things first, to break early if things are missing or weird + check_distro + + if [ -f ${SETUP_CONF_FILE} ]; then + echo "Script version ${SCRIPT_VERSION}, you picked: $(tput bold)$(tput setaf 2) ${project} $(tput sgr0), running on Ubuntu ${VERSION_ID}" + echo "apply config file for ${project}" &>> ${SCRIPT_LOGFILE} + source "${SETUP_CONF_FILE}" + + # count is from the default config but can ultimately be + # overwritten at runtime + if [ -z "${count}" ] + then + count=${SETUP_MNODES_COUNT} + echo "No number given, installing default number of nodes: ${SETUP_MNODES_COUNT}" &>> ${SCRIPT_LOGFILE} + fi - SETUP_CONF_FILE="${SCRIPTPATH}/config/${project}/${project}.env" - - # first things first, to break early if things are missing or weird - check_distro - - if [ -f ${SETUP_CONF_FILE} ]; then - echo "Script version ${SCRIPT_VERSION}, you picked: ${project}" - echo "apply config file for ${project}" &>> ${SCRIPT_LOGFILE} - source "${SETUP_CONF_FILE}" - - # count is from the default config but can ultimately be - # overwritten at runtime - if [ -z "${count}" ] - then - count=${SETUP_MNODES_COUNT} - echo "No number given, installing default number of nodes: ${SETUP_MNODES_COUNT}" &>> ${SCRIPT_LOGFILE} - fi - - # release is from the default project config but can ultimately be - # overwritten at runtime - if [ -z "$release" ] - then - release=${SCVERSION} - echo "release empty, setting to project default: ${SCVERSION}" &>> ${SCRIPT_LOGFILE} - fi - - # net is from the default config but can ultimately be - # overwritten at runtime - if [ -z "${net}" ]; then - net=${NETWORK_TYPE} - echo "net EMPTY, setting to default: ${NETWORK_TYPE}" &>> ${SCRIPT_LOGFILE} - fi - - # main block of function logic starts here - # if update flag was given, delete the old daemon binary first & proceed - if [ "$update" -eq 1 ]; then - echo "update given, deleting the old daemon NOW!" &>> ${SCRIPT_LOGFILE} - rm -f ${MNODE_DAEMON} - fi - - echo "************************* Installation Plan *****************************************" - echo "" - echo "I am going to install and configure " - echo "=> ${count} ${project} masternode(s) in version ${release}" - echo "for you now." - echo "" - echo "You have to add your masternode private key to the individual config files afterwards" - echo "" - echo "Stay tuned!" - echo "" - # show a hint for MANUAL IPv4 configuration - if [ "${net}" -eq 4 ]; then - NETWORK_TYPE=4 - echo "WARNING:" - echo "You selected IPv4 for networking but there is no automatic workflow for this part." - echo "This means you will have some mamual work to do to after this configuration run." - echo "" - echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" - echo "${IPV4_DOC_LINK}" - fi - # sentinel setup - if [ "$sentinel" -eq 1 ]; then - echo "I will also generate a Sentinel configuration for you." - fi - # start nodes after setup - if [ "$startnodes" -eq 1 ]; then - echo "I will start your masternodes after the installation." - fi - echo "" - echo "A logfile for this run can be found at the following location:" - echo "${SCRIPT_LOGFILE}" - echo "" - echo "*************************************************************************************" - sleep 5 - - # main routine - print_logo - prepare_mn_interfaces - swaphack - install_packages - build_mn_from_source - create_mn_user - create_mn_dirs - - # private key initialize - if [ "$generate" -eq 1 ]; then - echo "Generating masternode private key" &>> ${SCRIPT_LOGFILE} - generate_privkey - fi - - # sentinel setup - if [ "$sentinel" -eq 1 ]; then - echo "* Sentinel setup chosen" &>> ${SCRIPT_LOGFILE} - create_sentinel_setup - fi - - configure_firewall - create_mn_configuration - create_control_configuration - create_systemd_configuration - set_permissions - cleanup_after - showbanner - final_call - else - echo "required file ${SETUP_CONF_FILE} does not exist, abort!" - exit 1 - fi + # release is from the default project config but can ultimately be + # overwritten at runtime + if [ -z "$release" ] + then + release=${SCVERSION} + echo "release empty, setting to project default: ${SCVERSION}" &>> ${SCRIPT_LOGFILE} + fi -} + # net is from the default config but can ultimately be + # overwritten at runtime + if [ -z "${net}" ]; then + net=${NETWORK_TYPE} + echo "net EMPTY, setting to default: ${NETWORK_TYPE}" &>> ${SCRIPT_LOGFILE} + fi -function print_logo() { + # main block of function logic starts here + # if update flag was given, delete the old daemon binary first & proceed + if [ "$update" -eq 1 ]; then + if [ ! -f ${MNODE_DAEMON} ]; then + echo "UPDATE FAILED! Daemon hasn't been found. Please try the normal installation process by omitting the upgrade parameter." + exit 1 + fi + if [ ! -f ${MNODE_HELPER}_${CODENAME} ]; then + echo "UPDATE FAILED! Masternode activation file ${MNODE_HELPER}_${CODENAME} hasn't been found. Please try the normal installation process by omitting the upgrade parameter." + exit 1 + fi + if [ ! -d ${MNODE_DATA_BASE} ]; then + echo "UPDATE FAILED! ${MNODE_DATA_BASE} hasn't been found. Please try the normal installation process by omitting the upgrade parameter." + exit 1 + fi + fi - # print ascii banner if a logo exists - echo -e "* Starting the compilation process for ${CODENAME}, stay tuned" - if [ -f "${SCRIPTPATH}/assets/$CODENAME.jpg" ]; then - jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/${CODENAME}.jpg - else - jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/default.jpg - fi + echo "************************* Installation Plan *****************************************" + echo "" + if [ "$update" -eq 1 ]; then + echo "I am going to update your existing " + echo "$(tput bold)$(tput setaf 2) => ${project} masternode(s) in version ${release} $(tput sgr0)" + else + echo "I am going to install and configure " + echo "$(tput bold)$(tput setaf 2) => ${count} ${project} masternode(s) in version ${release} $(tput sgr0)" + fi + echo "for you now." + echo "" + if [ "$update" -eq 0 ]; then + # only needed if fresh installation + echo "You have to add your masternode private key to the individual config files afterwards" + echo "" + fi + echo "Stay tuned!" + echo "" + # show a hint for MANUAL IPv4 configuration + if [ "${net}" -eq 4 ]; then + NETWORK_TYPE=4 + echo "WARNING:" + echo "You selected IPv4 for networking but there is no automatic workflow for this part." + echo "This means you will have some mamual work to do to after this configuration run." + echo "" + echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" + echo "${IPV4_DOC_LINK}" + fi + # sentinel setup + if [ "$sentinel" -eq 1 ]; then + echo "I will also generate a Sentinel configuration for you." + fi + # start nodes after setup + if [ "$startnodes" -eq 1 ]; then + echo "I will start your masternodes after the installation." + fi + echo "" + echo "A logfile for this run can be found at the following location:" + echo "${SCRIPT_LOGFILE}" + echo "" + echo "*************************************************************************************" + sleep 5 + # main routine + if [ "$update" -eq 0 ]; then + prepare_mn_interfaces + swaphack + fi + install_packages + print_logo + build_mn_from_source + if [ "$update" -eq 0 ]; then + create_mn_user + create_mn_dirs + # sentinel setup + if [ "$sentinel" -eq 1 ]; then + echo "* Sentinel setup chosen" &>> ${SCRIPT_LOGFILE} + create_sentinel_setup + fi + # private key initialize + if [ "$generate" -eq 1 ]; then + echo "Generating masternode private key" &>> ${SCRIPT_LOGFILE} + generate_privkey + fi + configure_firewall + create_mn_configuration + create_control_configuration + create_systemd_configuration + fi + set_permissions + cleanup_after + showbanner + final_call + #if [ "$update" -eq 1 ]; then + # need to update the systemctl daemon, else an error will occur when running `systemctl enable` on a changed systemd process + # systemctl daemon-reload + #fi + else + echo "required file ${SETUP_CONF_FILE} does not exist, abort!" + exit 1 + fi +} + +function print_logo() { + # print ascii banner if a logo exists + echo -e "* Starting the compilation process for ${CODENAME}, stay tuned" + if [ -f "${SCRIPTPATH}/assets/$CODENAME.jpg" ]; then + jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/${CODENAME}.jpg + else + jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/default.jpg + fi } # # /* no parameters, builds the required masternode binary from sources. Exits if already exists and "update" not given */ # function build_mn_from_source() { - # daemon not found compile it - if [ ! -f ${MNODE_DAEMON} ]; then - mkdir -p ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} - # if code directory does not exists, we create it clone the src - if [ ! -d ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} ]; then - mkdir -p ${CODE_DIR} && cd ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} - git clone ${GIT_URL} ${CODENAME} &>> ${SCRIPT_LOGFILE} - cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} - echo "* Checking out desired GIT tag: ${release}" - git checkout ${release} &>> ${SCRIPT_LOGFILE} - else - echo "* Updating the existing GIT repo" - cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} - git pull &>> ${SCRIPT_LOGFILE} - echo "* Checking out desired GIT tag: ${release}" - git checkout ${release} &>> ${SCRIPT_LOGFILE} - fi - - # print ascii banner if a logo exists - echo -e "* Starting the compilation process for ${CODENAME}, stay tuned" - if [ -f "${SCRIPTPATH}/assets/$CODENAME.jpg" ]; then - jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/${CODENAME}.jpg - else - jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/default.jpg - fi - # compilation starts here - source ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.compile | pv -t -i0.1 - else - echo "* Daemon already in place at ${MNODE_DAEMON}, not compiling" - fi + # daemon not found compile it + if [ ! -f ${MNODE_DAEMON} ] || [ "$update" -eq 1 ]; then + # create code directory if it doesn't exist + if [ ! -d ${SCRIPTPATH}/${CODE_DIR} ]; then + mkdir -p ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} + fi + # if coin directory (CODENAME) exists, we remove it, to make a clean git clone + if [ -d ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} ]; then + echo "deleting ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} for clean cloning" &>> ${SCRIPT_LOGFILE} + rm -rf ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} + fi + cd ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} + git clone ${GIT_URL} ${CODENAME} &>> ${SCRIPT_LOGFILE} + cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} + echo "* Checking out desired GIT tag: ${release}" + git checkout ${release} &>> ${SCRIPT_LOGFILE} + + if [ "$update" -eq 1 ]; then + echo "update given, deleting the old daemon NOW!" &>> ${SCRIPT_LOGFILE} + rm -f ${MNODE_DAEMON} + # old daemon must be removed before compilation. Would be better to remove it afterwards, however not possible with current structure + if [ -f ${MNODE_DAEMON} ]; then + echo "UPDATE FAILED! Daemon ${MNODE_DAEMON} couldn't be removed. Please open an issue at https://github.com/masternodes/vps/issues. Thank you!" + exit 1 + fi + fi - # if it's not available after compilation, theres something wrong - if [ ! -f ${MNODE_DAEMON} ]; then - echo "COMPILATION FAILED! Please open an issue at https://github.com/masternodes/vps/issues. Thank you!" - exit 1 - fi + # compilation starts here + source ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.compile | pv -t -i0.1 + else + echo "* Daemon already in place at ${MNODE_DAEMON}, not compiling" + fi + + # if it's not available after compilation, theres something wrong + if [ ! -f ${MNODE_DAEMON} ]; then + echo "COMPILATION FAILED! Please open an issue at https://github.com/masternodes/vps/issues. Thank you!" + exit 1 + fi } # # /* no parameters, print some (hopefully) helpful advice */ # function final_call() { - # note outstanding tasks that need manual work - echo "************! ALMOST DONE !******************************" - echo "There is still work to do in the configuration templates." - echo "These are located at ${MNODE_CONF_BASE}, one per masternode." - echo "Add your masternode private keys now." - echo "eg in /etc/masternodes/${CODENAME}_n1.conf" - echo "" - echo "=> All configuration files are in: ${MNODE_CONF_BASE}" - echo "=> All Data directories are in: ${MNODE_DATA_BASE}" - echo "" - echo "last but not least, run /usr/local/bin/activate_masternodes_${CODENAME} as root to activate your nodes." - - # place future helper script accordingly + # note outstanding tasks that need manual work + echo "************! ALMOST DONE !******************************" + if [ "$update" -eq 0 ]; then + echo "There is still work to do in the configuration templates." + echo "These are located at ${MNODE_CONF_BASE}, one per masternode." + echo "Add your masternode private keys now." + echo "eg in /etc/masternodes/${CODENAME}_n1.conf" + else + echo "Your ${CODENAME} masternode daemon has been updated! (but not yet activated)" + fi + echo "" + echo "=> $(tput bold)$(tput setaf 2) All configuration files are in: ${MNODE_CONF_BASE} $(tput sgr0)" + echo "=> $(tput bold)$(tput setaf 2) All Data directories are in: ${MNODE_DATA_BASE} $(tput sgr0)" + echo "" + echo "$(tput bold)$(tput setaf 1)Important:$(tput sgr0) run $(tput setaf 2) /usr/local/bin/activate_masternodes_${CODENAME} $(tput sgr0) as root to activate your nodes." + + # place future helper script accordingly on fresh install + if [ "$update" -eq 0 ]; then cp ${SCRIPTPATH}/scripts/activate_masternodes.sh ${MNODE_HELPER}_${CODENAME} - echo "">> ${MNODE_HELPER}_${CODENAME} - - for NUM in $(seq 1 ${count}); do - echo "systemctl enable ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} - echo "systemctl restart ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} - done - - chmod u+x ${MNODE_HELPER}_${CODENAME} - if [ "$startnodes" -eq 1 ]; then - echo "" - echo "** Your nodes are starting up. If you haven't set masternode private key, Don't forget to change the masternodeprivkey later." - ${MNODE_HELPER}_${CODENAME} - fi - tput sgr0 + echo "" >> ${MNODE_HELPER}_${CODENAME} + + for NUM in $(seq 1 ${count}); do + echo "systemctl daemon-reload" >> ${MNODE_HELPER}_${CODENAME} + echo "systemctl enable ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} + echo "systemctl restart ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} + done + + chmod u+x ${MNODE_HELPER}_${CODENAME} + fi + + if [ "$startnodes" -eq 1 ]; then + echo "" + echo "** Your nodes are starting up. If you haven't set masternode private key, Don't forget to change the masternodeprivkey later." + ${MNODE_HELPER}_${CODENAME} + fi + tput sgr0 } # # /* no parameters, create the required network configuration. IPv6 is auto. */ # function prepare_mn_interfaces() { - - # this allows for more flexibility since every provider uses another default interface - # current default is: - # * ens3 (vultr) w/ a fallback to "eth0" (Hetzner, DO & Linode w/ IPv4 only) - # - - # check for the default interface status - if [ ! -f /sys/class/net/${ETH_INTERFACE}/operstate ]; then - echo "Default interface doesn't exist, switching to eth0" - export ETH_INTERFACE="eth0" + # this allows for more flexibility since every provider uses another default interface + # current default is: + # * ens3 (vultr) w/ a fallback to "eth0" (Hetzner, DO & Linode w/ IPv4 only) + # + + # check for the default interface status + if [ ! -f /sys/class/net/${ETH_INTERFACE}/operstate ]; then + echo "Default interface doesn't exist, switching to eth0" + export ETH_INTERFACE="eth0" + fi + + # check for the nuse case <3 + if [ -f /sys/class/net/ens160/operstate ]; then + export ETH_INTERFACE="ens160" + fi + + # get the current interface state + ETH_STATUS=$(cat /sys/class/net/${ETH_INTERFACE}/operstate) + + # check interface status + if [[ "${ETH_STATUS}" = "down" ]] || [[ "${ETH_STATUS}" = "" ]]; then + echo "Default interface is down, fallback didn't work. Break here." + exit 1 + fi + + # DO ipv6 fix, are we on DO? + # check for DO network config file + if [ -f ${DO_NET_CONF} ]; then + # found the DO config + if ! grep -q "::8888" ${DO_NET_CONF}; then + echo "ipv6 fix not found, applying!" + sed -i '/iface eth0 inet6 static/a dns-nameservers 2001:4860:4860::8844 2001:4860:4860::8888 8.8.8.8 127.0.0.1' ${DO_NET_CONF} &>> ${SCRIPT_LOGFILE} + ifdown ${ETH_INTERFACE}; ifup ${ETH_INTERFACE}; &>> ${SCRIPT_LOGFILE} fi + fi - # get the current interface state - ETH_STATUS=$(cat /sys/class/net/${ETH_INTERFACE}/operstate) + IPV6_INT_BASE="$(ip -6 addr show dev ${ETH_INTERFACE} | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^fe80 | grep -v ^::1 | cut -f1-4 -d':' | head -1)" &>> ${SCRIPT_LOGFILE} - # check interface status - if [[ "${ETH_STATUS}" = "down" ]] || [[ "${ETH_STATUS}" = "" ]]; then - echo "Default interface is down, fallback didn't work. Break here." - exit 1 - fi - - # DO ipv6 fix, are we on DO? - # check for DO network config file - if [ -f ${DO_NET_CONF} ]; then - # found the DO config - if ! grep -q "::8888" ${DO_NET_CONF}; then - echo "ipv6 fix not found, applying!" - sed -i '/iface eth0 inet6 static/a dns-nameservers 2001:4860:4860::8844 2001:4860:4860::8888 8.8.8.8 127.0.0.1' ${DO_NET_CONF} - ifdown ${ETH_INTERFACE}; ifup ${ETH_INTERFACE}; - fi - fi - - IPV6_INT_BASE="$(ip -6 addr show dev ${ETH_INTERFACE} | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^fe80 | grep -v ^::1 | cut -f1-4 -d':' | head -1)" &>> ${SCRIPT_LOGFILE} - - validate_netchoice - echo "IPV6_INT_BASE AFTER : ${IPV6_INT_BASE}" &>> ${SCRIPT_LOGFILE} - - # user opted for ipv6 (default), so we have to check for ipv6 support - # check for vultr ipv6 box active - if [ -z "${IPV6_INT_BASE}" ] && [ ${net} -ne 4 ]; then - echo "No IPv6 support on the VPS but IPv6 is the setup default. Please switch to ipv4 with flag \"-n 4\" if you want to continue." - echo "" - echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" - echo "${IPV4_DOC_LINK}" - exit 1 - fi - - # generate the required ipv6 config - if [ "${net}" -eq 6 ]; then - # vultr specific, needed to work - sed -ie '/iface ${ETH_INTERFACE} inet6 auto/s/^/#/' ${NETWORK_CONFIG} - - # move current config out of the way first - cp ${NETWORK_CONFIG} ${NETWORK_CONFIG}.${DATE_STAMP}.bkp - - # create the additional ipv6 interfaces, rc.local because it's more generic - for NUM in $(seq 1 ${count}); do - - # check if the interfaces exist - ip -6 addr | grep -qi "${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}" - if [ $? -eq 0 ] - then - echo "IP for masternode already exists, skipping creation" &>> ${SCRIPT_LOGFILE} - else - echo "Creating new IP address for ${CODENAME} masternode nr ${NUM}" &>> ${SCRIPT_LOGFILE} - if [ "${NETWORK_CONFIG}" = "/etc/rc.local" ]; then - # need to put network config in front of "exit 0" in rc.local - sed -e '$i ip -6 addr add '"${IPV6_INT_BASE}"':'"${NETWORK_BASE_TAG}"'::'"${NUM}"'/64 dev '"${ETH_INTERFACE}"'\n' -i ${NETWORK_CONFIG} - else - # if not using rc.local, append normally - echo "ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE}" >> ${NETWORK_CONFIG} - fi - sleep 2 - ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE} &>> ${SCRIPT_LOGFILE} - fi - done # end forloop - fi # end ifneteq6 + validate_netchoice + echo "IPV6_INT_BASE AFTER : ${IPV6_INT_BASE}" &>> ${SCRIPT_LOGFILE} + # user opted for ipv6 (default), so we have to check for ipv6 support + # check for vultr ipv6 box active + if [ -z "${IPV6_INT_BASE}" ] && [ ${net} -ne 4 ]; then + echo "No IPv6 support on the VPS but IPv6 is the setup default. Please switch to ipv4 with flag \"-n 4\" if you want to continue." + echo "" + echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" + echo "${IPV4_DOC_LINK}" + exit 1 + fi + + # generate the required ipv6 config + if [ "${net}" -eq 6 ]; then + # vultr specific, needed to work + sed -ie '/iface ${ETH_INTERFACE} inet6 auto/s/^/#/' ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} + + # move current config out of the way first + cp ${NETWORK_CONFIG} ${NETWORK_CONFIG}.${DATE_STAMP}.bkp &>> ${SCRIPT_LOGFILE} + + # create the additional ipv6 interfaces, rc.local because it's more generic + for NUM in $(seq 1 ${count}); do + + # check if the interfaces exist + ip -6 addr | grep -qi "${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}" + if [ $? -eq 0 ] + then + echo "IP for masternode already exists, skipping creation" &>> ${SCRIPT_LOGFILE} + else + echo "Creating new IP address for ${CODENAME} masternode nr ${NUM}" &>> ${SCRIPT_LOGFILE} + if [ "${NETWORK_CONFIG}" = "/etc/rc.local" ]; then + # need to put network config in front of "exit 0" in rc.local + sed -e '$i ip -6 addr add '"${IPV6_INT_BASE}"':'"${NETWORK_BASE_TAG}"'::'"${NUM}"'/64 dev '"${ETH_INTERFACE}"'\n' -i ${NETWORK_CONFIG} + else + # if not using rc.local, append normally + echo "ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE}" >> ${NETWORK_CONFIG} + fi + sleep 2 + ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE} &>> ${SCRIPT_LOGFILE} + fi + done # end forloop + fi # end ifneteq6 } ##################------------Menu()---------##################################### @@ -751,172 +784,172 @@ ARGS=$(getopt -o "hp:n:c:r:wsudxgk:k2:k3:k4:k5:k6:k7:k8:k9:k10:" -l "help,projec #Bad arguments if [ $? -ne 0 ]; then - help; + help; fi eval set -- "$ARGS"; while true; do - case "$1" in - -h |--help) - shift; - help; - ;; - -p |--project) - shift; - if [ -n "$1" ]; - then - project="$1"; - shift; - fi - ;; - -n |--net) - shift; - if [ -n "$1" ]; - then - net="$1"; - shift; - fi - ;; - -c |--count) - shift; - if [ -n "$1" ]; - then - count="$1"; - shift; - fi - ;; - -r |--release) - shift; - if [ -n "$1" ]; - then - release="$1"; - SCVERSION="$1" - shift; - fi - ;; - -w |--wipe) - shift; - wipe="1"; - ;; - -s |--sentinel) - shift; - sentinel="1"; - ;; - -u |--update) - shift; - update="1"; - ;; - -d |--debug) - shift; - debug="1"; - ;; - -x|--startnodes) - shift; - startnodes="1"; - ;; - - -g | --generate) - shift; - generate="1"; - ;; - -k |--key) - shift; - if [ -n "$1" ]; - then - PRIVKEY[1]="$1"; - shift; - fi - ;; - -k2 |--key2) - shift; - if [ -n "$1" ]; - then - PRIVKEY[2]="$1"; - shift; - fi - ;; - -k3 |--key3) - shift; - if [ -n "$1" ]; - then - PRIVKEY[3]="$1"; - shift; - fi - ;; - -k4 |--key4) - shift; - if [ -n "$1" ]; - then - PRIVKEY[4]="$1"; - shift; - fi - ;; - -k5 |--key5) - shift; - if [ -n "$1" ]; - then - PRIVKEY[5]="$1"; - shift; - fi - ;; - -k6 |--key6) - shift; - if [ -n "$1" ]; - then - PRIVKEY[6]="$1"; - shift; - fi - ;; - -k7 |--key7) - shift; - if [ -n "$1" ]; - then - PRIVKEY[7]="$1"; - shift; - fi - ;; - -k8 |--key8) - shift; - if [ -n "$1" ]; - then - PRIVKEY[8]="$1"; - shift; - fi - ;; - -k9 |--key9) - shift; - if [ -n "$1" ]; - then - PRIVKEY[9]="$1"; - shift; - fi - ;; - -k10 |--key10) - shift; - if [ -n "$1" ]; - then - PRIVKEY[10]="$1"; - shift; - fi - ;; - --) - shift; - break; - ;; - esac + case "$1" in + -h |--help) + shift; + help; + ;; + -p |--project) + shift; + if [ -n "$1" ]; + then + project="$1"; + shift; + fi + ;; + -n |--net) + shift; + if [ -n "$1" ]; + then + net="$1"; + shift; + fi + ;; + -c |--count) + shift; + if [ -n "$1" ]; + then + count="$1"; + shift; + fi + ;; + -r |--release) + shift; + if [ -n "$1" ]; + then + release="$1"; + SCVERSION="$1" + shift; + fi + ;; + -w |--wipe) + shift; + wipe="1"; + ;; + -s |--sentinel) + shift; + sentinel="1"; + ;; + -u |--update) + shift; + update="1"; + ;; + -d |--debug) + shift; + debug="1"; + ;; + -x|--startnodes) + shift; + startnodes="1"; + ;; + + -g | --generate) + shift; + generate="1"; + ;; + -k |--key) + shift; + if [ -n "$1" ]; + then + PRIVKEY[1]="$1"; + shift; + fi + ;; + -k2 |--key2) + shift; + if [ -n "$1" ]; + then + PRIVKEY[2]="$1"; + shift; + fi + ;; + -k3 |--key3) + shift; + if [ -n "$1" ]; + then + PRIVKEY[3]="$1"; + shift; + fi + ;; + -k4 |--key4) + shift; + if [ -n "$1" ]; + then + PRIVKEY[4]="$1"; + shift; + fi + ;; + -k5 |--key5) + shift; + if [ -n "$1" ]; + then + PRIVKEY[5]="$1"; + shift; + fi + ;; + -k6 |--key6) + shift; + if [ -n "$1" ]; + then + PRIVKEY[6]="$1"; + shift; + fi + ;; + -k7 |--key7) + shift; + if [ -n "$1" ]; + then + PRIVKEY[7]="$1"; + shift; + fi + ;; + -k8 |--key8) + shift; + if [ -n "$1" ]; + then + PRIVKEY[8]="$1"; + shift; + fi + ;; + -k9 |--key9) + shift; + if [ -n "$1" ]; + then + PRIVKEY[9]="$1"; + shift; + fi + ;; + -k10 |--key10) + shift; + if [ -n "$1" ]; + then + PRIVKEY[10]="$1"; + shift; + fi + ;; + --) + shift; + break; + ;; + esac done # Check required arguments if [ -z "$project" ] then - show_help; + show_help; fi # Check required arguments if [ "$wipe" -eq 1 ]; then - get_confirmation "Would you really like to WIPE ALL DATA!? YES/NO y/n" && wipe_all - exit 0 + get_confirmation "Would you really like to WIPE ALL DATA!? YES/NO y/n" && wipe_all + exit 0 fi ################################################# @@ -925,58 +958,57 @@ source ${SCRIPTPATH}/config/default.env ################################################# main() { - - echo "starting" &> ${SCRIPT_LOGFILE} - showbanner - - # debug - if [ "$debug" -eq 1 ]; then - echo "********************** VALUES AFTER CONFIG SOURCING: ************************" - echo "START DEFAULTS => " - echo "SCRIPT_VERSION: $SCRIPT_VERSION" - echo "SSH_INBOUND_PORT: ${SSH_INBOUND_PORT}" - echo "SYSTEMD_CONF: ${SYSTEMD_CONF}" - echo "NETWORK_CONFIG: ${NETWORK_CONFIG}" - echo "NETWORK_TYPE: ${NETWORK_TYPE}" - echo "ETH_INTERFACE: ${ETH_INTERFACE}" - echo "MNODE_CONF_BASE: ${MNODE_CONF_BASE}" - echo "MNODE_DATA_BASE: ${MNODE_DATA_BASE}" - echo "MNODE_USER: ${MNODE_USER}" - echo "MNODE_HELPER: ${MNODE_HELPER}" - echo "MNODE_SWAPSIZE: ${MNODE_SWAPSIZE}" - echo "CODE_DIR: ${CODE_DIR}" - echo "SCVERSION: ${SCVERSION}" - echo "RELEASE: ${release}" - echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" - echo "END DEFAULTS => " - fi - - # source project configuration - source_config ${project} - - # debug - if [ "$debug" -eq 1 ]; then - echo "START PROJECT => " - echo "CODENAME: $CODENAME" - echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" - echo "MNODE_DAEMON: ${MNODE_DAEMON}" - echo "MNODE_INBOUND_PORT: ${MNODE_INBOUND_PORT}" - echo "GIT_URL: ${GIT_URL}" - echo "SCVERSION: ${SCVERSION}" - echo "RELEASE: ${release}" - echo "NETWORK_BASE_TAG: ${NETWORK_BASE_TAG}" - echo "END PROJECT => " - - echo "START OPTIONS => " - echo "RELEASE: ${release}" - echo "PROJECT: ${project}" - echo "SETUP_MNODES_COUNT: ${count}" - echo "NETWORK_TYPE: ${NETWORK_TYPE}" - echo "NETWORK_TYPE: ${net}" - - echo "END OPTIONS => " - echo "********************** VALUES AFTER CONFIG SOURCING: ************************" - fi + echo "starting" &> ${SCRIPT_LOGFILE} + showbanner + + # debug + if [ "$debug" -eq 1 ]; then + echo "********************** VALUES AFTER CONFIG SOURCING: ************************" + echo "START DEFAULTS => " + echo "SCRIPT_VERSION: $SCRIPT_VERSION" + echo "SSH_INBOUND_PORT: ${SSH_INBOUND_PORT}" + echo "SYSTEMD_CONF: ${SYSTEMD_CONF}" + echo "NETWORK_CONFIG: ${NETWORK_CONFIG}" + echo "NETWORK_TYPE: ${NETWORK_TYPE}" + echo "ETH_INTERFACE: ${ETH_INTERFACE}" + echo "MNODE_CONF_BASE: ${MNODE_CONF_BASE}" + echo "MNODE_DATA_BASE: ${MNODE_DATA_BASE}" + echo "MNODE_USER: ${MNODE_USER}" + echo "MNODE_HELPER: ${MNODE_HELPER}" + echo "MNODE_SWAPSIZE: ${MNODE_SWAPSIZE}" + echo "CODE_DIR: ${CODE_DIR}" + echo "SCVERSION: ${SCVERSION}" + echo "RELEASE: ${release}" + echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" + echo "END DEFAULTS => " + fi + + # source project configuration + source_config ${project} + + # debug + if [ "$debug" -eq 1 ]; then + echo "START PROJECT => " + echo "CODENAME: $CODENAME" + echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" + echo "MNODE_DAEMON: ${MNODE_DAEMON}" + echo "MNODE_INBOUND_PORT: ${MNODE_INBOUND_PORT}" + echo "GIT_URL: ${GIT_URL}" + echo "SCVERSION: ${SCVERSION}" + echo "RELEASE: ${release}" + echo "NETWORK_BASE_TAG: ${NETWORK_BASE_TAG}" + echo "END PROJECT => " + + echo "START OPTIONS => " + echo "RELEASE: ${release}" + echo "PROJECT: ${project}" + echo "SETUP_MNODES_COUNT: ${count}" + echo "NETWORK_TYPE: ${NETWORK_TYPE}" + echo "NETWORK_TYPE: ${net}" + + echo "END OPTIONS => " + echo "********************** VALUES AFTER CONFIG SOURCING: ************************" + fi } main "$@" From 010618aa32d207154dd9c77b897c1ccf0d7cd325 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Wed, 21 Nov 2018 16:06:53 +0900 Subject: [PATCH 23/43] Change daemon name for generation private keys Change daemon name. We can generate private keys with pivx-like daemon. --- install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install.sh b/install.sh index 4965ad39..8e422608 100755 --- a/install.sh +++ b/install.sh @@ -407,15 +407,15 @@ function wipe_all() { function generate_privkey() { echo -e "rpcuser=test\nrpcpassword=passtest" >> ${MNODE_CONF_BASE}/${CODENAME}_test.conf mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test - phored -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test + ${CODENAME}d -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test sleep 5 for NUM in $(seq 1 ${count}); do if [ -z "${PRIVKEY[${NUM}]}" ]; then - PRIVKEY[${NUM}]=$(phore-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) + PRIVKEY[${NUM}]=$(${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) fi done - phore-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop + ${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop sleep 5 rm -r ${MNODE_CONF_BASE}/${CODENAME}_test.conf ${MNODE_DATA_BASE}/${CODENAME}_test } From 050646e2c66f9209350cb5c8a5c5e290b6606510 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Wed, 21 Nov 2018 16:12:34 +0900 Subject: [PATCH 24/43] Fix bugs within generation private key and setting up service * Change loading time * Add new message for remind tmp files * Fix indentation within daemon.service --- install.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 8e422608..6504b43f 100755 --- a/install.sh +++ b/install.sh @@ -408,7 +408,7 @@ function generate_privkey() { echo -e "rpcuser=test\nrpcpassword=passtest" >> ${MNODE_CONF_BASE}/${CODENAME}_test.conf mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test ${CODENAME}d -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test - sleep 5 + sleep 15 for NUM in $(seq 1 ${count}); do if [ -z "${PRIVKEY[${NUM}]}" ]; then @@ -678,6 +678,13 @@ function final_call() { echo "** Your nodes are starting up. If you haven't set masternode private key, Don't forget to change the masternodeprivkey later." ${MNODE_HELPER}_${CODENAME} fi + if [ "$update" -eq 0 ]; then + echo "**ALL YOUR MASTERNODE CONFIGURATION IS HERE. INPUT THESE LINES TO YOUR MASTERNODE.CONF**" + cat /tmp/${CODENAME}_masternode.conf + echo "**This configuration lines are on /tmp/${CODENAME}_masternode.conf. You can check this file with**" + echo "cat /tmp/${CODENAME}_masternode.conf" + echo "" + fi tput sgr0 } From 3173895d30bb5a1cc426d85db9a50faf1141a500 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Wed, 21 Nov 2018 16:20:06 +0900 Subject: [PATCH 25/43] Change scheme for get conf lines Change scheme for get conf. It fixs a bug in changing tmp file in reinstallation. --- install.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/install.sh b/install.sh index 6504b43f..a3de7727 100755 --- a/install.sh +++ b/install.sh @@ -334,6 +334,8 @@ function create_control_configuration() { # create one line per masternode with the data we have for NUM in $(seq 1 ${count}); do if [ -n "${PRIVKEY[${NUM}]}" ]; then + PRIVKEY[${NUM}]=$(cat ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf | grep masternodeprivkey) + PRIVKEY[${NUM}]=${PRIVKEY[${NUM}]:18} echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} ${PRIVKEY[${NUM}]} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf else echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} MASTERNODE_PRIVKEY_FOR_${CODENAME}MN${NUM} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf From 907f07b2310b84babc194422257256f31a5386e3 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Wed, 21 Nov 2018 16:43:55 +0900 Subject: [PATCH 26/43] Fix indentation in install.sh --- install.sh | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/install.sh b/install.sh index a3de7727..013f8130 100755 --- a/install.sh +++ b/install.sh @@ -7,8 +7,8 @@ # ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ # ╚╗ @marsmensch 2016-2018 ╔╝ # -# version v0.9.9 -# date 2018-08-23 +# version v1.0.0 +# date 2018-11-21 # # function: part of the masternode scripts, source the proper config file # @@ -24,12 +24,13 @@ # Useful variables declare -r CRYPTOS=`ls -l config/ | egrep '^d' | awk '{print $9}' | xargs echo -n; echo` declare -r DATE_STAMP="$(date +%y-%m-%d-%s)" -declare -r SCRIPTPATH=$( cd $(dirname ${BASH_SOURCE[0]}) > /dev/null; pwd -P ) +declare -r SCRIPTPATH="$( cd $(dirname ${BASH_SOURCE[0]}) > /dev/null; pwd -P )" declare -r MASTERPATH="$(dirname "${SCRIPTPATH}")" -declare -r SCRIPT_VERSION="v0.9.9" +declare -r SCRIPT_VERSION="v1.0.0" declare -r SCRIPT_LOGFILE="/tmp/nodemaster_${DATE_STAMP}_out.log" declare -r IPV4_DOC_LINK="https://www.vultr.com/docs/add-secondary-ipv4-address" declare -r DO_NET_CONF="/etc/network/interfaces.d/50-cloud-init.cfg" +declare -r NETWORK_BASE_TAG="$(dd if=/dev/urandom bs=2 count=1 2>/dev/null | od -x -A n | sed -e 's/^[[:space:]]*//g')" function showbanner() { echo $(tput bold)$(tput setaf 2) @@ -205,10 +206,10 @@ function create_sentinel_setup() { for NUM in $(seq 1 ${count}); do if [ ! -f "${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf" ]; then echo "* Creating sentinel configuration for ${CODENAME} masternode number ${NUM}" &>> ${SCRIPT_LOGFILE} - echo "dash_conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" > {SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf - echo "network=mainnet" >> {SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf - echo "db_name=${SENTINEL_BASE}/database/${CODENAME}_${NUM}_sentinel.db" >> {SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf - echo "db_driver=sqlite" >> {SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "dash_conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" > ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "network=mainnet" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "db_name=${SENTINEL_BASE}/database/${CODENAME}_${NUM}_sentinel.db" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "db_driver=sqlite" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf fi done @@ -262,7 +263,6 @@ function validate_netchoice() { # directory (eg. /etc/masternodes/${CODENAME} and replaces the existing placeholders if possible */ # function create_mn_configuration() { - # always return to the script root cd ${SCRIPTPATH} @@ -318,7 +318,7 @@ function create_mn_configuration() { sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY/${NUM}]/" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV6_INT_BASE}/" -e "s/XXX_NETWORK_BASE_TAG_XXX/${NETWORK_BASE_TAG}/" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf if [ -z "${PRIVKEY[${NUM}]}" ]; then if [ "$startnodes" -eq 1 ]; then - #uncomment masternode= and masternodeprivkey= so the node can autostart and sync + # uncomment masternode= and masternodeprivkey= so the node can autostart and sync sed 's/\(^.*masternode\(\|privkey\)=.*$\)/#\1/' -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf fi fi @@ -331,6 +331,7 @@ function create_mn_configuration() { function create_control_configuration() { # delete any old stuff that's still around rm -f /tmp/${CODENAME}_masternode.conf &>> ${SCRIPT_LOGFILE} + # create one line per masternode with the data we have for NUM in $(seq 1 ${count}); do if [ -n "${PRIVKEY[${NUM}]}" ]; then @@ -522,6 +523,7 @@ function source_config() { fi echo "Stay tuned!" echo "" + # show a hint for MANUAL IPv4 configuration if [ "${net}" -eq 4 ]; then NETWORK_TYPE=4 @@ -532,10 +534,12 @@ function source_config() { echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" echo "${IPV4_DOC_LINK}" fi + # sentinel setup if [ "$sentinel" -eq 1 ]; then echo "I will also generate a Sentinel configuration for you." fi + # start nodes after setup if [ "$startnodes" -eq 1 ]; then echo "I will start your masternodes after the installation." @@ -558,16 +562,18 @@ function source_config() { if [ "$update" -eq 0 ]; then create_mn_user create_mn_dirs - # sentinel setup - if [ "$sentinel" -eq 1 ]; then - echo "* Sentinel setup chosen" &>> ${SCRIPT_LOGFILE} - create_sentinel_setup - fi + # private key initialize if [ "$generate" -eq 1 ]; then echo "Generating masternode private key" &>> ${SCRIPT_LOGFILE} generate_privkey fi + + # sentinel setup + if [ "$sentinel" -eq 1 ]; then + echo "* Sentinel setup chosen" &>> ${SCRIPT_LOGFILE} + create_sentinel_setup + fi configure_firewall create_mn_configuration create_control_configuration @@ -605,21 +611,21 @@ function build_mn_from_source() { if [ ! -f ${MNODE_DAEMON} ] || [ "$update" -eq 1 ]; then # create code directory if it doesn't exist if [ ! -d ${SCRIPTPATH}/${CODE_DIR} ]; then - mkdir -p ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} + mkdir -p ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} fi # if coin directory (CODENAME) exists, we remove it, to make a clean git clone if [ -d ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} ]; then echo "deleting ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} for clean cloning" &>> ${SCRIPT_LOGFILE} - rm -rf ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} + rm -rf ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} fi - cd ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} - git clone ${GIT_URL} ${CODENAME} &>> ${SCRIPT_LOGFILE} - cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} + mkdir -p ${CODE_DIR} && cd ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} + git clone ${GIT_URL} ${CODENAME} &>> ${SCRIPT_LOGFILE} + cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} echo "* Checking out desired GIT tag: ${release}" - git checkout ${release} &>> ${SCRIPT_LOGFILE} + git checkout ${release} &>> ${SCRIPT_LOGFILE} if [ "$update" -eq 1 ]; then - echo "update given, deleting the old daemon NOW!" &>> ${SCRIPT_LOGFILE} + echo "update given, deleting the old daemon NOW!" &>> ${SCRIPT_LOGFILE} rm -f ${MNODE_DAEMON} # old daemon must be removed before compilation. Would be better to remove it afterwards, however not possible with current structure if [ -f ${MNODE_DAEMON} ]; then From 57a0da160bb94b11f14da86658fd6030c5a286f4 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Wed, 21 Nov 2018 16:59:17 +0900 Subject: [PATCH 27/43] update README.md * Add update, reinstall --- README.md | 121 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 107 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index c15d9673..098c3305 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This masternode installation script vastly simplifies the setup of a Phore maste Some notes and requirements: * Script has only been tested on a Vultr VPS, but should work almost anywhere where IPv6 addresses are available -* Currently only Ubunto 16.04 Linux is supported +* Currently only Ubuntu 16.04, 18.04 LTS Linux is supported * This script needs to run as root or with sudo, the masternodes will and should not! This project was forked from https://github.com/masternodes/vps. @marsmensch (Florian) is the primary author behind this VPS installation script for masternodes. If you would like to donate to him, you can use the BTC address below @@ -28,7 +28,7 @@ BTC 33ENWZ9RCYBG7nv6ac8KxBUSuQX64Hx3x3 ## How to get VPS server -For new masternode owners, **Vultr** is recommended as a VPS hosting provider, but other providers that allow direct root SSH login access and offer Ubunto 16.04 may work. +For new masternode owners, **Vultr** is recommended as a VPS hosting provider, but other providers that allow direct root SSH login access and offer Ubuntu 16.04, 18.04 LTS may work. You can use the following referral link to sign up with Vultr for VPS hosting: @@ -118,19 +118,42 @@ Enter this command to copy the Masternode installation script and install a sing git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore ``` -If you have your masternode private key, please use this (you can generate masternode private key with Step 2 below). - -```bash -git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -k **PRIVATE KEY** -``` -Using this command, you can skip "Configure masternode configuration files" below, because the command abopve adds the masternode private key to the masternode configuration files. - This prepares the system and installs the Phore Masternode daemon. This includes downloading the latest Phore masternode release, creating a swap file, configuring the firewall, and compiling the Phore Masternode from source code. This process takes about 10-15 minutes. VPS configuration While that is underway, go back to your local desktop and open phore-qt. +### Preinput masternode private key within installation (you can generate masternode private key with Step 2 below). + In these cases, you can skip "Configure masternode configuration files" below. +- If you already generated masternode private key + Enter this command. + ```bash + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -k **PRIVATE KEY** + ``` + **PRIVATE KEY** means your generated masternode private key. For example, + ```bash + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -k 87AqVXXXXXERNJxqBGdSS9LDS2vXXXXX5RdiiNd1zM7YAM7SHWX + ``` + In this script, you can find configuration in masternode.conf in your PC. + enter this to check it. + ```bash + cat /tmp/phore_masternode.conf + ``` + and add these lines to your masternode.conf. + +- If you want to generate masternode private key within masternode installation + Use this command + ```bash + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -g + ``` + And you can check generated private key in PuTTY. In this script, you can find configuration in masternode.conf in your PC. + enter this to check it. + ```bash + cat /tmp/phore_masternode.conf + ``` + and add these lines to your masternode.conf. + ### More complex situations (ignore if you are installing a single masternode on a new VPS) If you wish to install more than one masternode on the same VPS, you can add a -c parameter to tell the script how many to configure, so for example this would install three Phore masternodes (all entered on one line): @@ -144,8 +167,19 @@ If you already have your masternode private keys, you can add them as shown belo ```bash git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 --key **PRIVATE KEY 01** --key2 **PRIVATE KEY 02** --key3 **PRIVATE KEY 03** ``` + Using this command, you can skip the step for "Configure masternode configuration files", because the command above adds the masternode private keys to the masternode configuration files. +If you are adding new masternode, (and if you installed 2 masternodes already) + +``` +git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 +``` +if you want to use --key option, add --key3 **MASTERNODE PRIVKEY 03**. You are able to use +``` +git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 -g -x +``` +for new 3rd masternode. If you are upgrading your masternode(s) to a new release, you should first remove the old version of the VPS script so that the new one you download is tagged with the latest version, and then you add a -u parameter to upgrade existing nodes: @@ -185,7 +219,6 @@ Copy this value to a text file. It will be needed for both the phore configurati If you are setting up multiple masternodes, repeat this step for each one. Each time you run the masternode genkey command it will give you a new private key--it doesn't matter which one you use, but it is important that it is unique for each masternode and that the VPS phore configuration file and wallet masternode configuration file match (see below). ### Step 3 - Masternode Outputs - This will give you the rest of the information you need to configure your masternode in your Phore wallet--the transaction ID and the output index. ```bash @@ -204,6 +237,7 @@ When the script finishes, it will look similar to this: installation ended You only have a few steps remaining to complete your masternode configuration. + ## Configure masternode configuration files Since this installation method supports multiple masternodes, the phore configuration files have a node number added to them (e.g., phore_n1.conf, phore_n2.conf), stored in the /etc/masternodes directory. If you have a single masternode on the VPS, you will only need to edit /etc/masternodes/phore_n1.conf. @@ -262,6 +296,7 @@ The image below shows another example using an IPv4 IP address. If you followed editing masternode.conf If you are running multiple masternodes, you need to add one of these lines for each masternode, and make sure the private key on each line matches the corresponding private key you entered in the VPS phore configuration file for that masternode. + ## Check syncing status of masternode The masternode cannot complete activation until it is fully synced with the Phore blockchain network. @@ -273,12 +308,12 @@ To check the status of your masternode, please enter this command in the VPS ter The output will look like this: ``` { - "version": 1010000, - "protocolversion": 7002, + "version": 1040500, + "protocolversion": 70005, "walletversion": 61000, "balance": 0.00000000, "privatesend_balance": 0.00000000, - "blocks": 176209, + "blocks": 506209, "timeoffset": 0, "connections": 44, "proxy": "", @@ -312,7 +347,6 @@ We're looking at the *blocks*, and need that to be the latest block in the block Once your masternode has synced up to the latest block, go to next step. The syncing process may take 15-30 minutes or more as the Phore blockchain grows. You can keep checking progress with the command above, by pressing the up arrow and Enter to repeat it. ## Start Masternode - Go to the debug console of your Phore wallet **[Tools->Debug Console]** and enter the following command, replacing **mn-alias** with the name of the masternode in the Alias column of the Masternodes tab: ``` @@ -340,6 +374,65 @@ Your Phore masternode is now set up and running! Depending on how many masternod rewards +## Tips + You can start and stop masternode client manually. Enter this commands. + +### Check masternode status on VPS Server +You can check your masternode status on VPS server. Use this command. + + ``` + /usr/local/bin/phore-cli -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 masternode status + ``` + If it returns + ``` + { + "txhash": "a7eba991be786ce80948e9099e26f6a816317b2142f9e5e12abea357f885d0f2", + "outputidx": 1, + "netaddr": "[2001:19f0:5c01:457:2044::6]:11771", + "addr": "PEtMbHEuqo1QHs7Xy2wCTTmugAuemyd2mU", + "status": 4, + "message": "Masternode successfully started" + } + ``` + + like this, Your masternode is successfully started(Please check txhash, outputidx are same as your masternode.conf). + +### To stop +``` +/usr/local/bin/phore-cli -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 stop +``` +if use above command, masternode client will restart automatically in 5sec. +To stop completely, +``` +service phore_n1 stop +``` + + ### To start +``` +/usr/local/bin/phored -daemon -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 +``` + +If you stopped service "phore_n1", use +``` +service phore_n1 start +``` + + ## Options of this script + The _install.sh_ script support the following parameters: + | Long Option | Short Option | Values | Description | +| :----------- | :----------- | ------------------- | ------------------------------------------------------------------- | +| --project | -p | project, ex. "phore"| shortname for the project | +| --net | -n | "4" / "6" | ip type for masternode. (ipv)6 is default | +| --release | -r | e.g. "tags/v1.3.3.1"| a specific git tag/branch, defaults to latest tested | +| --count | -c | number | amount of masternodes to be configured | +| --update | -u | -- | update specified masternode daemon, combine with -p flag | +| --sentinel | -s | -- | install and configure sentinel for node monitoring | +| --wipe | -w | -- | uninstall & wipe all related master node data, combine with -p flag | +| --help | -h | -- | print help info | +| --startnodes | -x | -- | starts masternode(s) after installation | +| --key | -k | masternode privkey | preinput masternode private key to configuration files | +| --generate | -g | -- | generate and preinput masternode private key | + ## Issues and Questions Please open a GitHub Issue if there are problems with this installation method. Many Phore team members activel support people installing masternodes and can provide assistance in the Phore Discord channel. Here is a Discord invitation: From 157b57726cbfede5bc70bbd7ec125fa25fc67250 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Fri, 14 Dec 2018 16:47:14 +0900 Subject: [PATCH 28/43] Add IPv4 Address autofill feature 1. Add contact to inet-ip.info 2. Add autofill for phore_n~.conf --- install.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/install.sh b/install.sh index 6a12c834..bf95cba4 100755 --- a/install.sh +++ b/install.sh @@ -273,10 +273,11 @@ function validate_netchoice() { exit 1; fi - # generate the required ipv6 config + # Generate IPv4 Address if [ "${net}" -eq 4 ]; then IPV6_INT_BASE="#NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER" - echo "IPv4 address generation needs to be done manually atm!" &>> ${SCRIPT_LOGFILE} + IPV4_ADDRESS=$(curl -s inet-ip.info) + echo "IPv4 address: ${IPV4_ADDRESS} was configured with inet-ip.info. You can't host multiple ${CODENAME} masternodes with same IPv4 address: ${IPV4_ADDRESS}." &>> ${SCRIPT_LOGFILE} fi # end ifneteq4 } @@ -340,7 +341,11 @@ function create_mn_configuration() { fi else : fi - sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY/${NUM}]/" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV6_INT_BASE}/" -e "s/XXX_NETWORK_BASE_TAG_XXX/${NETWORK_BASE_TAG}/" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + if [ ${net} -eq 4 ]; then + sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY//" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV4_ADDRESS}/" -e "s/:XXX_NETWORK_BASE_TAG_XXX:://" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + else + sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY/${NUM}]/" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV6_INT_BASE}/" -e "s/XXX_NETWORK_BASE_TAG_XXX/${NETWORK_BASE_TAG}/" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + fi if [ -z "${PRIVKEY[${NUM}]}" ]; then if [ "$startnodes" -eq 1 ]; then #uncomment masternode= and masternodeprivkey= so the node can autostart and sync From f8bfcf70ce5a29c1f6df09df885058cfa1448aaf Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Fri, 14 Dec 2018 17:20:42 +0900 Subject: [PATCH 29/43] Edit IPv4 guide for UI/UX --- install.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/install.sh b/install.sh index bf95cba4..704dea15 100755 --- a/install.sh +++ b/install.sh @@ -574,10 +574,8 @@ function source_config() { # show a hint for MANUAL IPv4 configuration if [ "${net}" -eq 4 ]; then NETWORK_TYPE=4 - echo "WARNING:" - echo "You selected IPv4 for networking but there is no automatic workflow for this part." - echo "This means you will have some mamual work to do to after this configuration run." - echo "" + echo "CAUTION:" + echo "You selected IPv4 for networking. If you want to use 2nd IPv4 address, please edit each configuration file manually. Because this script only uses primary IPv4 address." echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" echo "${IPV4_DOC_LINK}" fi From 5d654746dbd29a13ce799765063fad025f061ea4 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Fri, 14 Dec 2018 17:28:18 +0900 Subject: [PATCH 30/43] Add new layout of masternode configuration lines 1. Add ${CODENAME}_gui.conf on /tmp/ for user friendly. 2. Edit log about _gui.conf --- install.sh | 52 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/install.sh b/install.sh index 704dea15..b6cb0f34 100755 --- a/install.sh +++ b/install.sh @@ -7,8 +7,8 @@ # ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ # ╚╗ @marsmensch 2016-2018 ╔╝ # -# version v0.9.9 -# date 2018-08-23 +# version v1.0.0 +# date 2018-12-14 # # function: part of the masternode scripts, source the proper config file # @@ -16,7 +16,7 @@ # Run this script w/ the desired parameters. Leave blank or use -h for help. # # Platforms: -# - Linux Ubuntu 16.04 LTS ONLY on a Vultr, Hetzner or DigitalOcean VPS +# - Linux Ubuntu ONLY 16.04/18.04 LTS on a Vultr, Hetzner or DigitalOcean VPS # - Generic Ubuntu support will be added at a later point in time # # Twitter @marsmensch @@ -26,7 +26,7 @@ declare -r CRYPTOS=`ls -l config/ | egrep '^d' | awk '{print $9}' | xargs echo - declare -r DATE_STAMP="$(date +%y-%m-%d-%s)" declare -r SCRIPTPATH="$( cd $(dirname ${BASH_SOURCE[0]}) > /dev/null; pwd -P )" declare -r MASTERPATH="$(dirname "${SCRIPTPATH}")" -declare -r SCRIPT_VERSION="v0.9.9" +declare -r SCRIPT_VERSION="v1.0.0" declare -r SCRIPT_LOGFILE="/tmp/nodemaster_${DATE_STAMP}_out.log" declare -r IPV4_DOC_LINK="https://www.vultr.com/docs/add-secondary-ipv4-address" declare -r DO_NET_CONF="/etc/network/interfaces.d/50-cloud-init.cfg" @@ -375,6 +375,47 @@ function create_control_configuration() { fi done + # add well layout text for GUI Configuration + rm -f /tmp/${CODENAME}_gui.conf &>> ${SCRIPT_LOGFILE} + + for NUM in $(seq 1 ${count}); do + if [ -n "${PRIVKEY[${NUM}]}" ]; then + PRIVKEY[${NUM}]=$(cat ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf | grep masternodeprivkey) + PRIVKEY[${NUM}]=${PRIVKEY[${NUM}]:18} + if [ "${net}" -eq 4 ]; then + cat >> /tmp/${CODENAME}_gui.conf <<-EOF + ************** ${CODENAME} Masternode ${NUM} ***************** + Alias Name: ${CODENAME}MN${NUM} + VPS IP: ${IPV4_ADDRESS}:${MNODE_INBOUND_PORT} + Priv Key: ${PRIVKEY[${NUM}]} + EOF + else + cat >> /tmp/${CODENAME}_gui.conf <<-EOF + ************** ${CODENAME} Masternode ${NUM} ***************** + Alias Name: ${CODENAME}MN${NUM} + VPS IP: [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} + Priv Key: ${PRIVKEY[${NUM}]} + EOF + fi + else + if [ "${net}" -eq 4 ]; then + cat >> /tmp/${CODENAME}_gui.conf <<-EOF + ************** ${CODENAME} Masternode ${NUM} ***************** + Alias Name: ${CODENAME}MN${NUM} + VPS IP: ${IPV4_ADDRESS}:${MNODE_INBOUND_PORT} + Priv Key: YOU NEED TO INPUT Masternode PrivKey to ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + EOF + else + cat >> /tmp/${CODENAME}_gui.conf <<-EOF + ************** ${CODENAME} Masternode ${NUM} ***************** + Alias Name: ${CODENAME}MN${NUM} + VPS IP: [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} + Priv Key: YOU NEED TO INPUT Masternode PrivKey to ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + EOF + fi + fi + done + } # @@ -734,6 +775,9 @@ function final_call() { cat /tmp/${CODENAME}_masternode.conf echo "**This configuration lines are on /tmp/${CODENAME}_masternode.conf. You can check this file with**" echo "cat /tmp/${CODENAME}_masternode.conf" + cat /tmp/${CODENAME}_gui.conf + echo "**For GUI Installation user, configuration files are on /tmp/${CODENAME}_gui.conf. You can check this file with**" + echo "cat /tmp/${CODENAME}_gui.conf" echo "" tput sgr0 From 701c22310ae24ab1e56a8825fd328eef356f04c5 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Fri, 14 Dec 2018 18:14:59 +0900 Subject: [PATCH 31/43] Fix heredocument --- install.sh | 86 +++++++++++++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/install.sh b/install.sh index b6cb0f34..9e6b6abb 100755 --- a/install.sh +++ b/install.sh @@ -383,35 +383,35 @@ function create_control_configuration() { PRIVKEY[${NUM}]=$(cat ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf | grep masternodeprivkey) PRIVKEY[${NUM}]=${PRIVKEY[${NUM}]:18} if [ "${net}" -eq 4 ]; then - cat >> /tmp/${CODENAME}_gui.conf <<-EOF - ************** ${CODENAME} Masternode ${NUM} ***************** - Alias Name: ${CODENAME}MN${NUM} - VPS IP: ${IPV4_ADDRESS}:${MNODE_INBOUND_PORT} - Priv Key: ${PRIVKEY[${NUM}]} - EOF + cat >> /tmp/${CODENAME}_gui.conf <> /tmp/${CODENAME}_gui.conf <<-EOF - ************** ${CODENAME} Masternode ${NUM} ***************** - Alias Name: ${CODENAME}MN${NUM} - VPS IP: [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} - Priv Key: ${PRIVKEY[${NUM}]} - EOF + cat >> /tmp/${CODENAME}_gui.conf <> /tmp/${CODENAME}_gui.conf <<-EOF - ************** ${CODENAME} Masternode ${NUM} ***************** - Alias Name: ${CODENAME}MN${NUM} - VPS IP: ${IPV4_ADDRESS}:${MNODE_INBOUND_PORT} - Priv Key: YOU NEED TO INPUT Masternode PrivKey to ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + cat >> /tmp/${CODENAME}_gui.conf <> /tmp/${CODENAME}_gui.conf <<-EOF - ************** ${CODENAME} Masternode ${NUM} ***************** - Alias Name: ${CODENAME}MN${NUM} - VPS IP: [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} - Priv Key: YOU NEED TO INPUT Masternode PrivKey to ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - EOF + cat >> /tmp/${CODENAME}_gui.conf <> ${SCRIPT_LOGFILE} - cat > ${SYSTEMD_CONF}/${CODENAME}_n${NUM}.service <<-EOF - [Unit] - Description=${CODENAME} distributed currency daemon - After=network.target + cat > ${SYSTEMD_CONF}/${CODENAME}_n${NUM}.service < Date: Fri, 14 Dec 2018 22:40:09 +0900 Subject: [PATCH 32/43] Fix indentation --- install.sh | 216 +++++++++++++++++++++++++++-------------------------- 1 file changed, 112 insertions(+), 104 deletions(-) diff --git a/install.sh b/install.sh index 9e6b6abb..c4ad1e39 100755 --- a/install.sh +++ b/install.sh @@ -33,7 +33,7 @@ declare -r DO_NET_CONF="/etc/network/interfaces.d/50-cloud-init.cfg" declare -r NETWORK_BASE_TAG="$(dd if=/dev/urandom bs=2 count=1 2>/dev/null | od -x -A n | sed -e 's/^[[:space:]]*//g')" function showbanner() { - + echo $(tput bold)$(tput setaf 2) cat << "EOF" ███╗ ██╗ ██████╗ ██████╗ ███████╗███╗ ███╗ █████╗ ███████╗████████╗███████╗██████╗ @@ -46,7 +46,7 @@ function showbanner() { EOF echo "$(tput sgr0)$(tput setaf 3)Have fun, this is crypto after all!$(tput sgr0)" echo "$(tput setaf 6)Donations for @marsmensch (BTC): 33ENWZ9RCYBG7nv6ac8KxBUSuQX64Hx3x3" - + } # /* @@ -55,7 +55,7 @@ EOF # */ # function get_confirmation() { - + # call with a prompt string or use a default read -r -p "${1:-Are you sure? [y/N]} " response case "$response" in @@ -66,14 +66,14 @@ function get_confirmation() { false ;; esac - + } # # /* no parameters, displays the help message */ # function show_help(){ - + clear showbanner echo "install.sh, version $SCRIPT_VERSION"; @@ -93,14 +93,14 @@ function show_help(){ echo "-x or --startnodes: Start masternodes after installation to sync with blockchain"; echo "-g or --generate: Generate masternode private key and use" exit 1; - + } # # /* no parameters, checks if we are running on a supported Ubuntu release */ # function check_distro() { - + # currently only for Ubuntu 16.04 & 18.04 if [[ -r /etc/os-release ]]; then . /etc/os-release @@ -113,14 +113,14 @@ function check_distro() { echo "This script only supports Ubuntu 16.04 & 18.04 LTS, exiting." exit 1 fi - + } # # /* no parameters, installs the base set of packages that are required for all projects */ # function install_packages() { - + # development and build packages # these are common on all cryptos echo "* Package installation!" @@ -131,19 +131,19 @@ function install_packages() { libboost-all-dev libssl-dev make autoconf libtool git apt-utils g++ \ libprotobuf-dev pkg-config libudev-dev libqrencode-dev bsdmainutils \ pkg-config libgmp3-dev libevent-dev jp2a pv virtualenv libdb4.8-dev libdb4.8++-dev &>> ${SCRIPT_LOGFILE} - + # only for 18.04 // openssl if [[ "${VERSION_ID}" == "18.04" ]] ; then apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install libssl1.0-dev fi - + } # # /* no parameters, creates and activates a swapfile since VPS servers often do not have enough RAM for compilation */ # function swaphack() { - + #check if swap is available if [ $(free | awk '/^Swap:/ {exit !$2}') ] || [ ! -f "/var/mnode_swap.img" ];then echo "* No proper swap, creating it" @@ -159,14 +159,14 @@ function swaphack() { else echo "* All good, we have a swap" fi - + } # # /* no parameters, creates and activates a dedicated masternode user */ # function create_mn_user() { - + # our new mnode unpriv user acc is added if id "${MNODE_USER}" >/dev/null 2>&1; then echo "user exists already, do nothing" &>> ${SCRIPT_LOGFILE} @@ -174,14 +174,14 @@ function create_mn_user() { echo "Adding new system user ${MNODE_USER}" adduser --disabled-password --gecos "" ${MNODE_USER} &>> ${SCRIPT_LOGFILE} fi - + } # # /* no parameters, creates a masternode data directory (one per masternode) */ # function create_mn_dirs() { - + # individual data dirs for now to avoid problems echo "* Creating masternode directories" mkdir -p ${MNODE_CONF_BASE} @@ -191,17 +191,17 @@ function create_mn_dirs() { mkdir -p ${MNODE_DATA_BASE}/${CODENAME}${NUM} &>> ${SCRIPT_LOGFILE} fi done - + } # # /* no parameters, creates a sentinel config for a set of masternodes (one per masternode) */ # function create_sentinel_setup() { - + SENTINEL_BASE=/usr/share/sentinel SENTINEL_ENV=/usr/share/sentinelenv - + # if code directory does not exists, we create it clone the src if [ ! -d ${SENTINEL_BASE} ]; then cd /usr/share &>> ${SCRIPT_LOGFILE} @@ -214,11 +214,11 @@ function create_sentinel_setup() { git pull &>> ${SCRIPT_LOGFILE} rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} fi - + # create a globally accessible venv and install sentinel requirements virtualenv --system-site-packages ${SENTINEL_BASE} &>> ${SCRIPT_LOGFILE} ${SENTINEL_BASE}/bin/pip install -r requirements.txt &>> ${SCRIPT_LOGFILE} - + # create one sentinel config file per masternode for NUM in $(seq 1 ${count}); do if [ ! -f "${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf" ]; then @@ -229,23 +229,23 @@ function create_sentinel_setup() { echo "db_driver=sqlite" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf fi done - + export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py - - + + echo "$(tput sgr0)$(tput setaf 3)Generated a Sentinel config for you. To activate Sentinel run:$(tput sgr0)" echo "$(tput sgr0)$(tput setaf 2)export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py$(tput sgr0)" echo "" echo "$(tput sgr0)$(tput setaf 2)If it works, add the command as cronjob: $(tput sgr0)" echo "$(tput sgr0)$(tput setaf 2)* * * * * export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py >> /var/log/sentinel/sentinel-cron.log$(tput sgr0) 2>&1" - + } # # /* no parameters, creates a minimal set of firewall rules that allows INBOUND masternode p2p & SSH ports */ # function configure_firewall() { - + echo "* Configuring firewall rules" # disallow everything except ssh and masternode inbound ports ufw default deny &>> ${SCRIPT_LOGFILE} @@ -257,29 +257,29 @@ function configure_firewall() { ufw limit OpenSSH &>> ${SCRIPT_LOGFILE} ufw --force enable &>> ${SCRIPT_LOGFILE} echo "* Firewall ufw is active and enabled on system startup" - + } # # /* no parameters, checks if the choice of networking matches w/ this VPS installation */ # function validate_netchoice() { - + echo "* Validating network rules" - + # break here of net isn't 4 or 6 if [ ${net} -ne 4 ] && [ ${net} -ne 6 ]; then echo "invalid NETWORK setting, can only be 4 or 6!" exit 1; fi - + # Generate IPv4 Address if [ "${net}" -eq 4 ]; then IPV6_INT_BASE="#NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER" IPV4_ADDRESS=$(curl -s inet-ip.info) echo "IPv4 address: ${IPV4_ADDRESS} was configured with inet-ip.info. You can't host multiple ${CODENAME} masternodes with same IPv4 address: ${IPV4_ADDRESS}." &>> ${SCRIPT_LOGFILE} fi # end ifneteq4 - + } # @@ -287,17 +287,17 @@ function validate_netchoice() { # directory (eg. /etc/masternodes/${CODENAME} and replaces the existing placeholders if possible */ # function create_mn_configuration() { - + # always return to the script root cd ${SCRIPTPATH} - + # recode inputed private key to tmp.txt, check the keys for NUM in $(seq 1 ${count}); do if [ -n "${PRIVKEY[${NUM}]}" ]; then echo ${PRIVKEY[${NUM}]} >> tmp.txt fi done - + if [ -f tmp.txt ]; then dup=$(sort -t 8 tmp.txt | uniq -c | sort -nr | head -1 | awk '{print substr($0, 7, 1)}') if [ 1 -ne "$dup" ]; then @@ -308,15 +308,15 @@ function create_mn_configuration() { fi rm tmp.txt fi - + # create one config file per masternode for NUM in $(seq 1 ${count}); do PASS=$(date | md5sum | cut -c1-24) - + # we dont want to overwrite an existing config file if [ ! -f ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf ]; then echo "individual masternode config doesn't exist, generate it!" &>> ${SCRIPT_LOGFILE} - + # if a template exists, use this instead of the default if [ -e config/${CODENAME}/${CODENAME}.conf ]; then echo "custom configuration template for ${CODENAME} found, use this instead" &>> ${SCRIPT_LOGFILE} @@ -325,11 +325,11 @@ function create_mn_configuration() { echo "No ${CODENAME} template found, using the default configuration template" &>> ${SCRIPT_LOGFILE} cp ${SCRIPTPATH}/config/default.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} fi - + # replace placeholders echo "running sed on file ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" &>> ${SCRIPT_LOGFILE} fi - + # Write inputed private key to project.conf if [ -n "${PRIVKEY[${NUM}]}" ]; then if [ ${#PRIVKEY[${NUM}]} -eq 51 ]; then @@ -353,17 +353,17 @@ function create_mn_configuration() { fi fi done - + } # # /* no parameters, generates a masternode configuration file per masternode in the default */ # function create_control_configuration() { - + # delete any old stuff that's still around rm -f /tmp/${CODENAME}_masternode.conf &>> ${SCRIPT_LOGFILE} - + # create one line per masternode with the data we have for NUM in $(seq 1 ${count}); do if [ -n "${PRIVKEY[${NUM}]}" ]; then @@ -374,7 +374,7 @@ function create_control_configuration() { echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} MASTERNODE_PRIVKEY_FOR_${CODENAME}MN${NUM} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf fi done - + # add well layout text for GUI Configuration rm -f /tmp/${CODENAME}_gui.conf &>> ${SCRIPT_LOGFILE} @@ -384,45 +384,53 @@ function create_control_configuration() { PRIVKEY[${NUM}]=${PRIVKEY[${NUM}]:18} if [ "${net}" -eq 4 ]; then cat >> /tmp/${CODENAME}_gui.conf <> /tmp/${CODENAME}_gui.conf <> /tmp/${CODENAME}_gui.conf <> /tmp/${CODENAME}_gui.conf <> ${SCRIPT_LOGFILE} chown -R ${MNODE_USER}:${MNODE_USER} ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel ${SENTINEL_BASE}/database &>> ${SCRIPT_LOGFILE} # make group permissions same as user, so vps-user can be added to masternode group chmod -R g=u ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel &>> ${SCRIPT_LOGFILE} - + } # # /* wipe all files and folders generated by the script for a specific project */ # function wipe_all() { - + echo "Deleting all ${project} related data!" rm -f /etc/masternodes/${project}_n*.conf rmdir --ignore-fail-on-non-empty -p /var/lib/masternodes/${project}* @@ -481,7 +489,7 @@ function wipe_all() { rm -f ${MNODE_DAEMON} echo "DONE!" exit 0 - + } # @@ -490,12 +498,12 @@ function wipe_all() { # */ # function generate_privkey() { - + echo -e "rpcuser=test\nrpcpassword=passtest" >> ${MNODE_CONF_BASE}/${CODENAME}_test.conf mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test ${CODENAME}d -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test sleep 20 - + for NUM in $(seq 1 ${count}); do if [ -z "${PRIVKEY[${NUM}]}" ]; then PRIVKEY[${NUM}]=$(${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) @@ -504,7 +512,7 @@ function generate_privkey() { ${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop sleep 5 rm -r ${MNODE_CONF_BASE}/${CODENAME}_test.conf ${MNODE_DATA_BASE}/${CODENAME}_test - + } # @@ -514,10 +522,10 @@ function generate_privkey() { # */ # function cleanup_after() { - + #apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoremove apt-get -qqy -o=Dpkg::Use-Pty=0 --allow-downgrades --allow-change-held-packages autoclean - + echo "kernel.randomize_va_space=1" > /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} echo "net.ipv4.conf.all.rp_filter=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} echo "net.ipv4.conf.all.accept_source_route=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} @@ -532,7 +540,7 @@ function cleanup_after() { echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} echo "net.ipv4.icmp_ignore_bogus_error_responses=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} sysctl -p - + } # @@ -541,17 +549,17 @@ function cleanup_after() { # source the default and desired crypto configuration files function source_config() { - + SETUP_CONF_FILE="${SCRIPTPATH}/config/${project}/${project}.env" - + # first things first, to break early if things are missing or weird check_distro - + if [ -f ${SETUP_CONF_FILE} ]; then echo "Script version ${SCRIPT_VERSION}, you picked: $(tput bold)$(tput setaf 2) ${project} $(tput sgr0), running on Ubuntu ${VERSION_ID}" echo "apply config file for ${project}" &>> ${SCRIPT_LOGFILE} source "${SETUP_CONF_FILE}" - + # count is from the default config but can ultimately be # overwritten at runtime if [ -z "${count}" ] @@ -559,7 +567,7 @@ function source_config() { count=${SETUP_MNODES_COUNT} echo "No number given, installing default number of nodes: ${SETUP_MNODES_COUNT}" &>> ${SCRIPT_LOGFILE} fi - + # release is from the default project config but can ultimately be # overwritten at runtime if [ -z "$release" ] @@ -567,14 +575,14 @@ function source_config() { release=${SCVERSION} echo "release empty, setting to project default: ${SCVERSION}" &>> ${SCRIPT_LOGFILE} fi - + # net is from the default config but can ultimately be # overwritten at runtime if [ -z "${net}" ]; then net=${NETWORK_TYPE} echo "net EMPTY, setting to default: ${NETWORK_TYPE}" &>> ${SCRIPT_LOGFILE} fi - + # main block of function logic starts here # if update flag was given, delete the old daemon binary first & proceed if [ "$update" -eq 1 ]; then @@ -591,7 +599,7 @@ function source_config() { exit 1 fi fi - + echo "************************* Installation Plan *****************************************" echo "" if [ "$update" -eq 1 ]; then @@ -611,7 +619,7 @@ function source_config() { echo "" echo "Stay tuned!" echo "" - + # show a hint for MANUAL IPv4 configuration if [ "${net}" -eq 4 ]; then NETWORK_TYPE=4 @@ -620,12 +628,12 @@ function source_config() { echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" echo "${IPV4_DOC_LINK}" fi - + # sentinel setup if [ "$sentinel" -eq 1 ]; then echo "I will also generate a Sentinel configuration for you." fi - + # start nodes after setup if [ "$startnodes" -eq 1 ]; then echo "I will start your masternodes after the installation." @@ -636,7 +644,7 @@ function source_config() { echo "" echo "*************************************************************************************" sleep 5 - + # main routine if [ "$update" -eq 0 ]; then prepare_mn_interfaces @@ -648,13 +656,13 @@ function source_config() { if [ "$update" -eq 0 ]; then create_mn_user create_mn_dirs - + # private key initialize if [ "$generate" -eq 1 ]; then echo "Generating masternode private key" &>> ${SCRIPT_LOGFILE} generate_privkey fi - + # sentinel setup if [ "$sentinel" -eq 1 ]; then echo "* Sentinel setup chosen" &>> ${SCRIPT_LOGFILE} @@ -673,11 +681,11 @@ function source_config() { echo "required file ${SETUP_CONF_FILE} does not exist, abort!" exit 1 fi - + } function print_logo() { - + # print ascii banner if a logo exists echo -e "* Starting the compilation process for ${CODENAME}, stay tuned" if [ -f "${SCRIPTPATH}/assets/$CODENAME.jpg" ]; then @@ -685,7 +693,7 @@ function print_logo() { else jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/default.jpg fi - + } # @@ -708,7 +716,7 @@ function build_mn_from_source() { cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} echo "* Checking out desired GIT tag: ${release}" git checkout ${release} &>> ${SCRIPT_LOGFILE} - + if [ "$update" -eq 1 ]; then echo "update given, deleting the old daemon NOW!" &>> ${SCRIPT_LOGFILE} rm -f ${MNODE_DAEMON} @@ -718,19 +726,19 @@ function build_mn_from_source() { exit 1 fi fi - + # compilation starts here source ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.compile | pv -t -i0.1 else echo "* Daemon already in place at ${MNODE_DAEMON}, not compiling" fi - + # if it's not available after compilation, theres something wrong if [ ! -f ${MNODE_DAEMON} ]; then echo "COMPILATION FAILED! Please open an issue at https://github.com/phoreproject/vps/issues. Thank you!" exit 1 fi - + } # @@ -752,20 +760,20 @@ function final_call() { echo "=> $(tput bold)$(tput setaf 2) All Data directories are in: ${MNODE_DATA_BASE} $(tput sgr0)" echo "" echo "$(tput bold)$(tput setaf 1)Important:$(tput sgr0) run $(tput setaf 2) /usr/local/bin/activate_masternodes_${CODENAME} $(tput sgr0) as root to activate your nodes." - + # place future helper script accordingly if [ "$update" -eq 0 ]; then cp ${SCRIPTPATH}/scripts/activate_masternodes.sh ${MNODE_HELPER}_${CODENAME} echo "">> ${MNODE_HELPER}_${CODENAME} - + for NUM in $(seq 1 ${count}); do echo "systemctl enable ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} echo "systemctl restart ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} done - + chmod u+x ${MNODE_HELPER}_${CODENAME} fi - + if [ "$startnodes" -eq 1 ]; then echo "" echo "** Your nodes are starting up. If you haven't set masternode private key, Don't forget to change the masternodeprivkey later." @@ -780,39 +788,39 @@ function final_call() { echo "cat /tmp/${CODENAME}_gui.conf" echo "" tput sgr0 - + } # # /* no parameters, create the required network configuration. IPv6 is auto. */ # function prepare_mn_interfaces() { - + # this allows for more flexibility since every provider uses another default interface # current default is: # * ens3 (vultr) w/ a fallback to "eth0" (Hetzner, DO & Linode w/ IPv4 only) # - + # check for the default interface status if [ ! -f /sys/class/net/${ETH_INTERFACE}/operstate ]; then echo "Default interface doesn't exist, switching to eth0" export ETH_INTERFACE="eth0" fi - + # check for the nuse case <3 if [ -f /sys/class/net/ens160/operstate ]; then export ETH_INTERFACE="ens160" fi - + # get the current interface state ETH_STATUS=$(cat /sys/class/net/${ETH_INTERFACE}/operstate) - + # check interface status if [[ "${ETH_STATUS}" = "down" ]] || [[ "${ETH_STATUS}" = "" ]]; then echo "Default interface is down, fallback didn't work. Break here." exit 1 fi - + # DO ipv6 fix, are we on DO? # check for DO network config file if [ -f ${DO_NET_CONF} ]; then @@ -823,12 +831,12 @@ function prepare_mn_interfaces() { ifdown ${ETH_INTERFACE}; ifup ${ETH_INTERFACE}; fi fi - + IPV6_INT_BASE="$(ip -6 addr show dev ${ETH_INTERFACE} | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^fe80 | grep -v ^::1 | cut -f1-4 -d':' | head -1)" &>> ${SCRIPT_LOGFILE} - + validate_netchoice echo "IPV6_INT_BASE AFTER : ${IPV6_INT_BASE}" &>> ${SCRIPT_LOGFILE} - + # user opted for ipv6 (default), so we have to check for ipv6 support # check for vultr ipv6 box active if [ -z "${IPV6_INT_BASE}" ] && [ ${net} -ne 4 ]; then @@ -838,18 +846,18 @@ function prepare_mn_interfaces() { echo "${IPV4_DOC_LINK}" exit 1 fi - + # generate the required ipv6 config if [ "${net}" -eq 6 ]; then # vultr specific, needed to work sed -ie '/iface ${ETH_INTERFACE} inet6 auto/s/^/#/' ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} - + # move current config out of the way first cp ${NETWORK_CONFIG} ${NETWORK_CONFIG}.${DATE_STAMP}.bkp &>> ${SCRIPT_LOGFILE} - + # create the additional ipv6 interfaces, rc.local because it's more generic for NUM in $(seq 1 ${count}); do - + # check if the interfaces exist ip -6 addr | grep -qi "${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}" if [ $? -eq 0 ] @@ -869,7 +877,7 @@ function prepare_mn_interfaces() { fi done # end forloop fi # end ifneteq6 - + } ##################------------Menu()---------##################################### @@ -1061,10 +1069,10 @@ source ${SCRIPTPATH}/config/default.env ################################################# main() { - + echo "starting" &> ${SCRIPT_LOGFILE} showbanner - + # debug if [ "$debug" -eq 1 ]; then echo "********************** VALUES AFTER CONFIG SOURCING: ************************" @@ -1087,10 +1095,10 @@ main() { echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" echo "END DEFAULTS => " fi - + # source project configuration source_config ${project} - + # debug if [ "$debug" -eq 1 ]; then echo "START PROJECT => " @@ -1103,18 +1111,18 @@ main() { echo "RELEASE: ${release}" echo "NETWORK_BASE_TAG: ${NETWORK_BASE_TAG}" echo "END PROJECT => " - + echo "START OPTIONS => " echo "RELEASE: ${release}" echo "PROJECT: ${project}" echo "SETUP_MNODES_COUNT: ${count}" echo "NETWORK_TYPE: ${NETWORK_TYPE}" echo "NETWORK_TYPE: ${net}" - + echo "END OPTIONS => " echo "********************** VALUES AFTER CONFIG SOURCING: ************************" fi - + } main "$@" From c556fce5946cbc398e7a5aa6dff82a2cc9a1b1f5 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sat, 15 Dec 2018 02:13:31 +0900 Subject: [PATCH 33/43] Update masternode guide --- README.md | 248 +++++++----------- .../masternode_vps/check-blocks-number.png | Bin 3952 -> 2524 bytes .../check-masternode-status.png | Bin 30120 -> 7563 bytes .../masternode_vps/end-of-installation.png | Bin 33073 -> 18731 bytes ...tall-the-desired-masternode-and-amount.png | Bin 50599 -> 34206 bytes docs/images/masternode_vps/rewards.png | Bin 16137 -> 3137 bytes .../masternode_vps/step1-newaddress.png | Bin 23431 -> 15070 bytes .../step1-newmasternodealias.png | Bin 0 -> 17936 bytes .../step1-newmasternodealias_inputed.png | Bin 0 -> 15827 bytes .../masternode_vps/step1-send10kphr.png | Bin 49136 -> 24870 bytes install.sh | 5 + 11 files changed, 107 insertions(+), 146 deletions(-) create mode 100644 docs/images/masternode_vps/step1-newmasternodealias.png create mode 100644 docs/images/masternode_vps/step1-newmasternodealias_inputed.png diff --git a/README.md b/README.md index 92677d17..62a0ec0d 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,9 @@ This masternode installation script vastly simplifies the setup of a Phore masternode running on a virtual private server (VPS), and it also adds a number of other powerful features, including: -* IPv6 Support -* Installs 1-100 (or more!) Phore masternodes in parallel on one VPS, with individual phore.conf and data directories +* IPv6/IPv4 Support +* With IPv6 Installs 1-100 (or more!) Phore masternodes in parallel on one VPS, with individual phore.conf and data directories +* With IPv4, You can install 1 Phore masternodes per IPv4 address * It can install masternodes for other coins on the same VPS as Phore * 100% auto-compilation and 99% of configuration on the masternode side of things * Automatically compiling from the latest Phore release tag, or another tag can be specified @@ -13,8 +14,8 @@ This masternode installation script vastly simplifies the setup of a Phore maste Some notes and requirements: * Script has only been tested on a Vultr VPS, but should work almost anywhere where IPv6 addresses are available -* Currently only Ubunto 16.04, 18.04 Linux is supported -* This script needs to run as root or with sudo, the masternodes will and should not! +* Currently only Ubuntu 16.04, 18.04 LTS is supported +* This script needs to run as root! This project was forked from https://github.com/masternodes/vps. @marsmensch (Florian) is the primary author behind this VPS installation script for masternodes. If you would like to donate to him, you can use the BTC address below @@ -46,9 +47,9 @@ You can choose any location. You may wish to have it hosted in a city/country ne VPS location choice -## Linux distribution (Ubuntu 16.04 LTS) +## Linux distribution (Ubuntu 16.04/18.04 LTS) -Select Ubuntu 16.04. +Select Ubuntu 16.04/18.04. VPS location choice @@ -106,74 +107,79 @@ For Mac users, open Terminal (e.g., Press Command-Space and type Terminal and pr ``` ssh -l root ``` + ## Install Masternode Login to your newly installed node as "root". VPS sizing -Enter this command to copy the Masternode installation script and install a single Phore Masternode: +### Install One Phore Masternode +Enter this command to copy the Masternode installation script and install a single Phore Masternode with IPv6: ```bash -git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore +git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -g -x ``` -This prepares the system and installs the Phore Masternode daemon. This includes downloading the latest Phore masternode release, creating a swap file, configuring the firewall, and compiling the Phore Masternode from source code. This process takes about 10-15 minutes. +With IPv4 address: +```bash +git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -n 4 -g -x +``` + +This prepares the system and installs the Phore Masternode daemon. This includes downloading the latest Phore masternode release, creating a swap file, configuring the firewall, and compiling the Phore Masternode from source code, generate configuration file and masternode privkey. This process takes about 20-30 minutes. VPS configuration While that is underway, go back to your local desktop and open phore-qt. -### Preinput masternode private key within installation (you can generate masternode private key with Step 2 below). +### Install Multiple Phore Masternode +Enter this command to copy the Masternode installation script and install a single Phore Masternode with IPv6: +```bash +git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 -g -x +``` +`-c 3` term means 3 phore masternodes. + +IPv4: You can't install automatically with multiple IPv4 address with this script. + +## Update Mastenode + You should first remove the old version of the VPS script so that the new one you download is tagged with the latest version, and then you add a -u parameter to upgrade existing nodes: -In these cases, you can skip "Configure masternode configuration files" below. -- If you already generated masternode private key - Enter this command. ```bash - git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -k **PRIVATE KEY** + rm -rf /root/vps ``` - - **PRIVATE KEY** means your generated masternode private key. For example, ```bash - git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -k 87AqVXXXXXERNJxqBGdSS9LDS2vXXXXX5RdiiNd1zM7YAM7SHWX + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -u ``` - In this script, you can find configuration in masternode.conf in your PC. - enter this to check it. + + The project is configured to use the latest official release of the Phore masternode code, and we will update this project each time a new release is issued, but without downloading the latest version of this project and using the -u parameter, the script will not update an existing Phore node that is already installed. + +### Complex Situations +- In single masternode installation, if you already generated masternode private key + Enter this command. ```bash - cat /tmp/phore_masternode.conf + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -x -k **PRIVATE KEY** ``` - and add these lines to your masternode.conf. -- If you want to generate masternode private key within masternode installation - Use this command + **PRIVATE KEY** means your generated masternode private key. For example, ```bash - git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -g + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -x -k 87AqVXXXXXERNJxqBGdSS9LDS2vXXXXX5RdiiNd1zM7YAM7SHWX ``` - And you can check generated private key in PuTTY. In this script, you can find configuration in masternode.conf in your PC. + In this script, you can find configuration in masternode.conf in your PC. enter this to check it. ```bash cat /tmp/phore_masternode.conf ``` and add these lines to your masternode.conf. -### More complex situations (ignore if you are installing a single masternode on a new VPS) - -- If you wish to install more than one masternode on the same VPS - You can add a -c parameter to tell the script how many to configure, so for example this would install three Phore masternodes (all entered on one line): - - ```bash - git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 - ``` - -- If you already have your masternode private keys, you can add them as shown below (all entered on one line): +- In multiple masternodes installation and if you already have your masternode private keys, you can add them as shown below (all entered on one line): ```bash - git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 --key **PRIVATE KEY 01** --key2 **PRIVATE KEY 02** --key3 **PRIVATE KEY 03** + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 -x --key **PRIVATE KEY 01** --key2 **PRIVATE KEY 02** --key3 **PRIVATE KEY 03** ``` Using this command, you can skip the step for "Configure masternode configuration files", because the command above adds the masternode private keys to the masternode configuration files. - If you are adding new masternode, (and if you installed 2 masternodes already) ``` - git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -x -c 3 ``` if you want to use --key option, add --key3 **MASTERNODE PRIVKEY 03**. You are able to use ``` @@ -181,129 +187,48 @@ In these cases, you can skip "Configure masternode configuration files" below. ``` for new 3rd masternode. -- If you are upgrading your masternode(s) to a new release - You should first remove the old version of the VPS script so that the new one you download is tagged with the latest version, and then you add a -u parameter to upgrade existing nodes: - - ```bash - rm -rf /root/ - ``` - ```bash - git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -u - ``` - - The project is configured to use the latest official release of the Phore masternode code, and we will update this project each time a new release is issued, but without downloading the latest version of this project and using the -u parameter, the script will not update an existing Phore node that is already installed. - -## Configure Phore Wallet -### Step1 - Create Collateral Transaction - -Once the wallet is open on your local computer, generate a new receive address and label it however you want to identify your masternode rewards (e.g., Phore-MN-1). This label will show up in your transactions each time you receive a block reward. - -Click the Request payment button, and copy the address. - -making new address - -Now go to the Send tab, paste the copied address, and send *exactly* 10,000 PHR to it in a single transaction. Wait for it to confirm on the blockchain. This is the collateral transaction that will be locked and paired with your new masternode. If you are setting up more than one masternode at one time, repeat this process for each one. - -sending 10kPHR - -### Step 2 - Generate Masternode Private Key -Go to the **[Tools > Debug Console]** and enter these commands below: - -```bash -masternode genkey -``` -This will produce a masternode private key: - -generating masternode private key - -Copy this value to a text file. It will be needed for both the phore configuration file on the masternode VPS, and the masternode configuration file on the computer with the controlling Phore wallet. - -If you are setting up multiple masternodes, repeat this step for each one. Each time you run the masternode genkey command it will give you a new private key--it doesn't matter which one you use, but it is important that it is unique for each masternode and that the VPS phore configuration file and wallet masternode configuration file match (see below). - -### Step 3 - Masternode Outputs - -This will give you the rest of the information you need to configure your masternode in your Phore wallet--the transaction ID and the output index. - -```bash -masternode outputs -``` - -getting transaction id - -The long string of characters is the *Transaction ID* for your masternode collateral transaction. The number after the long string is the *Index*. Copy and paste these into the text file next to the private key you generated in Step 2. - -If you have multiple masternodes in the same wallet and have done the 10,000 PHR transactions for each of them, masternode outputs will display transaction IDs and indexes for each one. You can choose which private key to go with each transaction ID and index, as long as they are all different, and you make sure the corresponding lines in masternode.conf and the VPS phore configuration files match (see below). - ## End of installations When the script finishes, it will look similar to this: installation ended -You only have a few steps remaining to complete your masternode configuration. - -## Configure masternode configuration files +Copy **VPS IP** and **Priv Key** to a text file. It will be needed for configuration in Phore wallet(in this example, VPS IP is [2001:19f0:7001:fd4:e2b7::1]:11771, Priv Key is 87KsYyqumG9HJjG000008jtpSEQUKSuEWkBG9xov19cuEsXH5vB). -Since this installation method supports multiple masternodes, the phore configuration files have a node number added to them (e.g., phore_n1.conf, phore_n2.conf), stored in the /etc/masternodes directory. If you have a single masternode on the VPS, you will only need to edit /etc/masternodes/phore_n1.conf. +*Tips*: If you installed multiple masternode, copy each *VPS IP*, *Priv Key*. -To open phore_n1.conf for editing, enter these commands: -```bash -sudo apt-get install nano -nano /etc/masternodes/phore_n1.conf -``` -The next step adds your masternode private key. - -## Add masternode private key - -What you need to change is only masternode private key. -(We recommend using IPv6 which is the default, but if you choose IPv4 when you ran the installation script, please edit #NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER to your VPS IP address). -After typing the nano command, you will see something similar to this. - -add private key - -Copy the masternode private key from the text file you saved it in, and replace HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_phore_1 with that private key (this typically begins with an 8). - -While you have this file opened, copy the information that follows after masternodeaddr=, starting with the open bracket. This is the masternode's IPv6 address and port, and will be needed for the wallet's masternode.conf file. - -Once you have your masternode private key entered, press Ctrl+X . -Then press Y to save, and press Enter to exit. - -Finally, close and restart your Phore wallet so that it will have the new masternode configuration. +You only have a few steps remaining to complete your masternode configuration. -## Start your masternodes +## Configure Phore Wallet +### Step1 - Create Collateral Transaction -A script for starting all masternodes on the VPS has been created at /usr/local/bin/activate_masternodes_phore.sh. -Run this command after your masternode configuration written above. +Once the wallet is open on your local computer, generate a new receive address in *Receive* tab and label it however you want to identify your masternode rewards (e.g., Phore-MN-1). This label will show up in your transactions each time you receive a block reward. -```bash -/usr/local/bin/activate_masternodes_phore -``` +Click the Request payment button, and copy the address. -The masternode daemons will start and begin loading the Phore blockchain. +making new address -## Finishing Wallet Configuration & Activate Masternode +Now go to the *Send* tab, paste the copied address, and send *exactly* 10,000 PHR to it in a single transaction. Wait for it to confirm on the blockchain. This is the collateral transaction that will be locked and paired with your new masternode. If you are setting up more than one masternode at one time, repeat this process for each one. -To activate your nodes from your wallet, one of the last steps is to add a line for the masternode in the masternode.conf file. This file has the following format, with each value separated with a space: +sending 10kPHR -* alias IP:Port masternodeprivatekey collateral_transaction_ID collateral_output_index -* alias - A short name you use to identify the masternode, you can choose this name as long as it is without spaces (e.g., Phore-MN-1) -* IP:Port - The IP address (either IPv6 or IPv4) and the Port where the masternode is running, separated by a colon (:). You copied this from the phore.conf file on the VPS. -* collateral_transaction_ID: This is the transaction ID you copied from masternode outputs. -* collateral_output_index: This is the index you copied from masternode outputs. +### Step 2 - Make New Masternode Configuration +Go to the *Masternodes* Tab and click **ADD MASTERNODE** button. -From the wallet menu, edit the local wallet **masternode.conf** file. **[Tools > Open Masternode Configuration File]** -Add the MN conf line, like the example below to the masternode.conf file. Save it, and close the file. It will look like the following example, using your values for each of the fields above. A common mistake is mixing up the private key and the collateral transaction ID--to make this easier, the private key usually begins with an 8. +This will open *New Masternode Alias* window. +New Masternode Alias window -example. -``` -Phore-MN-1 [2001:19f0:5001:ca6:2085::1]:11771 88xrxxxxxxxxxxxxxxxxxxxxxxx7K 6b4c9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7ee23 0 -``` +Click **AUTOFIL OUTPUTS** button. It autofills Priv Key, Output, Output ID. +If Output(ID) isn't filled, wait 1~2 mins. +Then enter *Alias Name*, *VPS IP*, *Priv Key*. +*Alias Name* means your masternode name(Only for identify), *VPS IP* is your VPS server IP which was copied in [End of installations](#End of installations). +In this example, *Alias Name* is phore-mn01 and *VPS IP* is [2001:19f0:7001:fd4:e2b7::1]:11771, *Priv Key* is 87KsYyqumG9HJjG000008jtpSEQUKSuEWkBG9xov19cuEsXH5vB. -The image below shows another example using an IPv4 IP address. If you followed this guide you are probably using an IPv6 address that looks like the line above. +New Masternode Alias inputed -editing masternode.conf +If you are setting up multiple masternodes, repeat this step for each one. -If you are running multiple masternodes, you need to add one of these lines for each masternode, and make sure the private key on each line matches the corresponding private key you entered in the VPS phore configuration file for that masternode. +*Tips:* If you want, you can generate Priv Key here, but you will need to edit masternode configuration file manually on VPS(See [Add masternode private key](#Add masternode private key)). ## Check syncing status of masternode @@ -317,12 +242,12 @@ To check the status of your masternode, please enter this command in the VPS ter The output will look like this: ``` { - "version": 1040400, - "protocolversion": 70005, + "version": 1050100, + "protocolversion": 70006, "walletversion": 61000, "balance": 0.00000000, "privatesend_balance": 0.00000000, - "blocks": 176209, + "blocks": 606209, "timeoffset": 0, "connections": 44, "proxy": "", @@ -357,7 +282,9 @@ Once your masternode has synced up to the latest block, go to next step. The syn ## Start Masternode -Go to the debug console of your Phore wallet **[Tools->Debug Console]** and enter the following command, replacing **mn-alias** with the name of the masternode in the Alias column of the Masternodes tab: +Go *Masternodes* tab and click each masternode then click **START ALIAS** button. If you get "successful started", your masternode was finally activated! + +Tips: Sometimes you get *error*, go to the debug console of your Phore wallet **[Tools->Debug Console]** and enter the following command, replacing **mn-alias** with the name of the masternode in the Alias column of the Masternodes tab: ``` startmasternode alias false mn-alias @@ -380,10 +307,39 @@ If you are setting up multiple masternodes, repeat this for each one. You can no It should say ENABLED, and within an hour, the timer in the Active column should start increasing. -Your Phore masternode is now set up and running! Depending on how many masternodes there are, it may take 12-24 hours before you see your first masternode reward--this is normal and rewards should come at more regular intervals after the first one. +Your Phore masternode is now set up and running! Depending on how many masternodes there are, it may take 24-30 hours before you see your first masternode reward--this is normal and rewards should come at more regular intervals after the first one. rewards +## With Manually installation +## Configure masternode configuration files + +Since this installation method supports multiple masternodes, the phore configuration files have a node number added to them (e.g., phore_n1.conf, phore_n2.conf), stored in the /etc/masternodes directory. If you have a single masternode on the VPS, you will only need to edit /etc/masternodes/phore_n1.conf. + +To open phore_n1.conf for editing, enter these commands: +```bash +sudo apt-get install nano +nano /etc/masternodes/phore_n1.conf +``` +The next step adds your masternode private key. + +## Add masternode private key + +What you need to change is only masternode private key. +(We recommend using IPv6 which is the default, but if you choose IPv4 when you ran the installation script, please edit #NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER to your VPS IP address). +After typing the nano command, you will see something similar to this. + +add private key + +Copy the masternode private key from the text file you saved it in, and replace HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_phore_1 with that private key (this typically begins with an 8). + +While you have this file opened, copy the information that follows after masternodeaddr=, starting with the open bracket. This is the masternode's IPv6 address and port, and will be needed for the wallet's masternode.conf file. + +Once you have your masternode private key entered, press Ctrl+X . +Then press Y to save, and press Enter to exit. + +Finally, close and restart your Phore wallet so that it will have the new masternode configuration. + ## Tips ### Check masternode status on VPS Server @@ -449,6 +405,6 @@ The _install.sh_ script support the following parameters: Please open a GitHub Issue if there are problems with this installation method. Many Phore team members activel support people installing masternodes and can provide assistance in the Phore Discord channel. Here is a Discord invitation: -https://discord.gg/sbgdcdv +https://discord.gg/Aucncz5 If you would like to make a donation to Phore's ongoing development, you can send Phore to the core team at this address: PDjGJMDzvJnvbxxgR1bgPm77fFLxn3KAg8 diff --git a/docs/images/masternode_vps/check-blocks-number.png b/docs/images/masternode_vps/check-blocks-number.png index 2293e785685a8ff7b9d19e4f10b5baddbd29c6b6..0c8f93ef66a9e5111728319638cd3c18c9ce91e5 100644 GIT binary patch delta 2500 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 M48Z!;x({Oh2Z*l0FaQ7m diff --git a/docs/images/masternode_vps/check-masternode-status.png b/docs/images/masternode_vps/check-masternode-status.png index 2b53d359fd13b9c9d415e84dd8fc23a5f08a0b58..976d74a90f264a0c4f616b8cea914d96b309e7af 100644 GIT binary patch literal 7563 zcmd^EeK2GoCfXNNB4t!qjQAW?FXBXjxAq09Jtr^C z!(R3|E-Iw4n3yL#j!-$aQIhW2y^m(U1OmUegDe^ezH{_zb(-uEE1jXyY&J^bTv^&e+f12ka$$-bIY$Y2W;Kzqyr44@AHIv>xKA zo_#>zoowOa>L(~(Vu)51B~zANL*3?i8ne1;t{IedApu!MuR{XnKQZUZ?Wm zu1dG(Ju~+2R5QBR&)|43ls)tAcPi(I8bqHM@PZ5b{DGe#q}CB?Zh0J!2BqR098aZW z*1aU~FD(QB-f?g~3+dBK59x2{1|9L~4~sLRA>Czt2N4h-y;o_iW?v??>M22|a=laa!A_fCFyUH4lvx~s1C z$)YO>fukGhEbN$CA|tv{X)faPSB9ya%~PQy-%*?xWn&P)CISm`d#K*Qx6=CjQ3#cP zOeZ)za0_|XGg2ow{!FF1a^sC0TEk!Arc9oD_`B$%yb}=u+aJMd3w#?AU#`0<;RpL3 zD`xul&&>VvtV!wf)*Sjsdg($hd2|U9OC)Doh;xk0QCq;`1M9xsX$X{RL#p%>y^;e? zHWn=6!QZpJLkK$(B(^FAPSoik&RkF2=5u%Q%#f`_VOm3<+ zeO-A^cMF`X+_!GHj)9E=@`=?=?J+~2kirV533|VtTzvjU0l>k+zCu9AG8wUDAgfuM z@^IlbL209b#kg)Nhu+q3c{<~R-PoCp?9%GP{CPu%H1b-VO=!K8-L+-fBQ^0~%kER& z+;DlD@FaKLI#0Nmyj-Yk=oEdLeh1Ny8o(o_+50ab!*-f8r#7m7+3ImR%pudJ#zOgN z#!I3_Mz>7k=7N9C+NR}42c1HP%F_2UZx=0Rg(OxcK)#1Wtj29um`}?H2i~_o4m{AKj{pvuZr(Mp`9> zy|?6cK0-<;T#e9)Jv?2LGrNyM)rs9C7RNpth&z(LL5b2Y-WZ+Sf0T?bvG#ZTa{A@PjD@+dq zgzt^H4@g27&MMArd%l0}J`ovQQrUEU9K-fv&06fc(g5#Yj0Fh59QO|yPk~dkRPuVG zJm&S)CrcyjPzSDZ5;ye>OnfV%J3g0cZ_GkTc5To!3x$>)9&&yC8`esy{SqN38Gg23XKbIH52 zso0j_6A{%9T@x-run0yXHqNL@OAPVhwF*9f37aR(^QvA!B4$gEf^*LtPB$9+wlK3{ zerwr%aq&SpRW2*jb zwb|79B-WJb)f6>cmv}n|oOf?49-jhxhsOvB<;y2``Y}2}26r`uiXzLRJCgL__bHt+aLfQK#rdTJURZ5j%v?$kgiy&VY=lsZOLFaGv5~C&CcHarE1zhjpK| zLhz|@_w#DJ_42R3n*1ZsX~@v=%S;zwn04^PJ(@Sz(2gNUaSd*(y_DBPL0ywbzcv}J z;l5npx&1kKcE-j3`DY}~bF0>qu{LeOp57tzfNy!tA6O$-P(|M;{x)D&GI1Qulmxfu zks{=s1_KnCjRQxS$mF>VO0y7J(;0`=Tqt6S)M zRmy4pK#|E8OEFEgw=oQ8<7V28-VsHcz9HG)7jB&AKEDWKYif!Lhg1cYlr5?_dD%xl zZJUDtDgU+;-V6mI{Cui#K9SJf6FZr4;;gz`-5p%xE* zsPyX@IdWKJSonVULdd6WLlA%x8!|V{ONZeVlRIbQWO+JE2W*`BdC4mWCyq;tl_R{8 z_M-cfZ3Xtv*i~t{SsFoNk;y_4uQ^1l+O^WkyV_8nysq{IJA+I)G?~=LdvbNs{8I>` z*GG2wo<9_inYfp2vXKTL-OD3Q)5xYyAJC!nJ^bZQG&JdjEXI>zPcqzm6mhip$M3v* z?nBJhWE+uWVA`787g9gIei}l-9qVhcP{t2B*TjXlR3}`xaLy*x?^PvoFw$~!fVGz?%bb=k=L3ISBb?9 zVVH7qYm`^;;;Z%ZjtLT-dcS+ist!1@kFhKBVUIwh+0rVj_*y+z=it&p^+q=%PeA=9 zpFuM+ru{%%VLh&@*=QFL56iFmu-V%c7d!@^SbWO*w_xJlyMsQ#&yo|}JHf#ieUOR2 z=!&Ky3gBu-zD%>oPB0BQAwJogH_az z=+ywcMeM$?M~jWFgGm1=g2M6U7M}NeU#NW$Ga^kneYUnq=+ot}{EVMOMN`-ndLjG8 zBxFzoB1f#Dk?*j!RHBjbkvT2g2o%E6e8W&7xyx3(XVS5h|Dc2JUq=0LqO`zJHMtW_ zwzHLP%BJuLxLZK8#GASj%4ze{O(@T=1$GqZrnR4#4k_w>-5BSc%CfE&iJW58IkZsR zq&8D`f%5jLG~u5SP3&K-yG0+d-k{?HzG>Bh37!{%G&K7c>2Ndk9dLdEaqn(pd|tf9 za=v#l|2QAut$Cjy4wg3ou{dK1VUQ^q*7z{|Kfje6={AhziG!%9f8>f#v0z-A!*se7 zs*t{}35e!9%iS56PJ78kZGjXXK|F7yJk(ez#n9_Dm)UK8J%%}*W;#AqGkmWNU-lL$ z-|h%DVlZh^2or}&J=0c&hx|#sSZI2(i@@K5*AL6p!*9p0JVH!4bo*H|9Sow%0}qI_ z=eByqD~+k?{jare{W3^`+pD=_`JYe!=95?uOX%W>SB0Y`?}VWF3s};O=U|m?+P9pp z5!wDU#2}`zz-ZX3GOA=Z%yCP$$n0P^=Bu3sf%&zE+32pOgVlr6Y;24KE_RK4Z!tb^ z8NZbEJFR4Ys7+GWev)lrNbBgkayB19M~-Ly$0W$PRFsWu_?g~#d`zPttY^U)ecJVI zv(f19VH6Sk7+AhI#iLuvNti)VnYg=UTD}T&x*N`*&AB1xpLJ~BIt=R1eG^bp8R}f@ zeT%0X_P9Qv6vYcMA_H#_MN68*tn1%LRXw>o%s}ChLF+aybU%30ipnI8Ec+CiA4o0m z)dZcVgtS(28r*=&d3}@(aO+4(9n20j10In7;63Wga)o_-VP7h6JMGk@Lt^sT5C*xc zPGdlnSSa$`*125Y+gb|Rgd>1>!_-w4{;`{jjah1eA7@UHQ^~*;JEPH*ibQaT#uH#5;kn!l6%jPaAneBH9I?m3R~i*S-;1$ecY9+P!piz2mEpUa`f zzjzf=0gUleR>l%28GG3DZE6zA@cC6fEu*!pt#5g)r(%E6!>rA@(AWezx8XQdEZ;LN z=MDllXw;SHUd`G2S*ku8(}$tL8INVQbkL1sag!gdA`%xFDm<%mQN~i)R)hz# zduLrU30Uf1_0j=SRnAJ>{wt;Uxc_8p5+GoK_*8h%%~^0B|;y#1K3fo$#dOSq-;Fxto3@TUOagj~p?1 zic$!EvbK`ADU8@PFYaV^b-XMe;fylp9OO@Jmnr^ON={#87XjSM?)j!(`2IPLwcf$g zdZFASe6TA8JTx}T9HL$Y4WI;egOX(Qr@jc)Ruhi{tnRA`(5iHhP`!B(&k?$AG;8fuz`Q@R{W@eDfohUG~Q9r2?a zy~fMGa%@LCuTUun({_%(s-1DqD>hY!e(sR~kV1-M_E;9HJSWN;UieRinH{CuI8#5X z8|HzInERVN3sJWE3~PpAk_!mTk|Qx3Y#GN3PtMd(iKc%SoTs-C;fS?xr-sL#{y9;P z8WF{2x`y(%;gRJcY#)nqg#Ki(%)hBD{=@#1Lu~r3V!Q;_)hWl@1o7{X>wYy9aDi{C z(3jc7JH~4cBdb+fK0`1k`c7J`e-ze9OkhquUwd=;`X<-esU>4~ z%}2@^bWflpsa;^6r7je8O2tE9(DTv`rXgAmL9XA368W6~o-ArF^$D z<_?`!B}Ob2b;`cl)+iQ;a_O@Z_OpGt>2CT#J_x%XWOvbnr;VT}MHEN1%n7*X7w&7Z z=v1w|KT+7jf8z<1+3S`LqIw;NSeWv9hfSy`lg<=V;A5VE|3c*#=wo?#Ht%V9TF&moL|dj>?S@BNpc1DRp@UwUKly#R22g})7cE@K_wRCm zwOs7x{Gt81N|mP^CCtFChrVBuXuoJ6tDu7TSeWs=TeDBatFd72Y)al_^_K8A&SF^>}beeS)pweEa&+ENKZnLBPtuO+{@Y60 zBh?%INrsZEj?qDI=u7w4hX;3o(b@n&hc;8p2L!vwa%CJvupD zy@@}+q@YbtX#oHls&d`VpaH+!VL?28vlBdD3m<3~srsvhut%6rSUUKLsdCAX%O_k) zSGqYHbFZ!Q)y~?V3lt{IZ3jyg`|wd||7{vsvF2E&0;__4YQfeA0Iar`QAv0;+kR`P ziDj68rN5%?ShErIzy1DG2W%!DrSV*W?a7$-Xb(PutJ?=U>3CSU|QH*16g?U)+SXt_m$4*3yj{x&@TO}yg1tt zKGynIQk=hKowafgR(7H3`eV7_IWZ*`v#A#cVtGRU zS7T>Pw-ru7xeE-p61?1tZ>n8A$nR{>uX)X!TbF9(nO9OETyyMl`YQ4tr$_T555TZ# zdlbzhf0oNf%PyFw&!505GK0P*n37b9^tU65C6H${R|a_(y57yLk_CnS=tSE~qDckD zfvb_TQWb3}l(1D$af^VFo5R*=%(rnR1y+%5Z@3xEZ-giUI#llL91us|vvdhrFZk|u zyk+p-e9Lavjy)=f1Dv{cw4R%pnsH^i**@+@7EgWA zra$m|`wYH+^;3DKq+jH6S9I3z*uC^PV!3ITd* zVjtLOmRoHUMCxyYvgSy+xrFov{8gEgpITRa9amMjG4KppdZC;Vlcs_{r(%qjPBilb=l(RSv4?V|u1&+0562r6u^i?)ejb zXQcyT&7^)Vq5`#svYI@e=hFOa%T#H}CKcXuBQ5xN)t}d6wco#$Qs%nmhPx|Dn1(!Zl>#9B|vPpz7JfOvgA@!0l~X#uNCdF{jIXzXI$# zC{qcFqus?4IQkRP$77at)OD@4kkjQof4DL}_&ErH2(1Io!;~1UOd6c%nuVHjqh$l% zJ&s7Efhy8?9@*Epo1%G=keOb$L?o+N?tAah-C0F#rt&0iG`>%?c89o_lWyRkOJ|lxf-FfJ?S4vn+6%d zeQsM;#a1gHeZ7+a*srku>{Wp&IOK5P_=3ZZDGDu%yY<3G@rT!ODYxc*L;eS6x8rp| zqf_SU6^JtV76nfyeL=+?nbKR5XoVE9+cl&8_Sv-cJm6@5{F#%z@|N9gn1dOfmlG`k z%q2}Yz>xjEdd%7z6^%l1iG~8WX?HhuIfrEveodh9~JDK`WWjC*?dx zk48UgdQGWT>?S)@R%u0LH9YRC;N3JyJ{5Qb&PT8*DUs3FN(9!2Z+s6RcAffGZn2sf zar`BR+m^0jXWy!$SzM5!?Mvazp%|*Gh_z!Pw%QhDfAPnrs-o~@-SF^Nrv=>+5ygHp z2;Q*VFwsP;a^-!OiydrTrOcY0E^6wCzR_Ls4ZH&KCN3+ea!7!#>AqD~`c{ zKLQ=TE|XPv!E^6vF}8q^cA{KeGL9^I7?56?XgkOvk++hs{Nu_v?V_mlXBzLwZdQxH za?x|iadER^@3898k<{abZ`lvzhd5`VwmFW;R?P0RjghyjZtCR<_8m+b+dF~IWoY~B zO7kJ>w(?S=-<$@* z%&f_V#*M=*4uP^yFri<67wO(QB}c=%WhGDyREWf0Nht2*^rgL~dPZqK*WiK44B|2w zQn2mpLP1|-e;|Im^^jxcguFGvJwwg>H}SIBkeULtG3?+P>QU-J)w*QiW{3IgC1B42 z9!-vE5@m9|9vdS~3fB}B)Iw`84k}kYPYd*9`)%iaT^$z9K-B3fUcUgN} z-;81s0JIMa?B~|9$};6XU*B#ev9kv#3t0TJE}B)#N}noT+r87y9f9T zTu2O4ze$9&|4*J@ZIkvPL29bgVD_*-96N&lM_%ej(uiU=daSnof5^gr*!%swm+x@j X9cSzieFcYOI{=jBHRLK}-hKHm#)RJ$ literal 30120 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 diff --git a/docs/images/masternode_vps/end-of-installation.png b/docs/images/masternode_vps/end-of-installation.png index 9c7c3be3235be5ef9826e82086448c7db048be1c..04f45bbf24726616e1712365f67ebd128ce4ca76 100644 GIT binary patch literal 18731 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 udH+ZX%St`xwqXmW!f$Jd77XEno=l=(sXVmEc literal 50599 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 Qz%7uJn7n9(@W(Iz56|>P`2YX_ literal 0 HcmV?d00001 diff --git a/docs/images/masternode_vps/step1-send10kphr.png b/docs/images/masternode_vps/step1-send10kphr.png index dfcb898fd2b206a8592b77af41ac1765f91e2146..8f3619524f05fd0052f6cc2fbbd941379d729034 100644 GIT binary patch literal 24870 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 Nl;qT9^JSj<{y#G&VNw79 literal 49136 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 P6OfdcylAzsLE!%e_&x{b diff --git a/install.sh b/install.sh index c4ad1e39..d4f6b5b8 100755 --- a/install.sh +++ b/install.sh @@ -780,11 +780,16 @@ function final_call() { ${MNODE_HELPER}_${CODENAME} fi echo "**ALL YOUR MASTERNODE CONFIGURATION IS HERE. INPUT THESE LINES TO YOUR MASTERNODE.CONF**" + echo "" cat /tmp/${CODENAME}_masternode.conf + echo "" echo "**This configuration lines are on /tmp/${CODENAME}_masternode.conf. You can check this file with**" + echo "" echo "cat /tmp/${CODENAME}_masternode.conf" cat /tmp/${CODENAME}_gui.conf + echo "" echo "**For GUI Installation user, configuration files are on /tmp/${CODENAME}_gui.conf. You can check this file with**" + echo "" echo "cat /tmp/${CODENAME}_gui.conf" echo "" tput sgr0 From 21bfed82998eda6f5f2dabfa2ca079497d85d36e Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sat, 15 Dec 2018 02:18:11 +0900 Subject: [PATCH 34/43] Fix internal links in guide --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 62a0ec0d..17b6d446 100644 --- a/README.md +++ b/README.md @@ -216,19 +216,19 @@ Now go to the *Send* tab, paste the copied address, and send *exactly* 10,000 PH Go to the *Masternodes* Tab and click **ADD MASTERNODE** button. This will open *New Masternode Alias* window. -New Masternode Alias window +New Masternode Alias window Click **AUTOFIL OUTPUTS** button. It autofills Priv Key, Output, Output ID. If Output(ID) isn't filled, wait 1~2 mins. Then enter *Alias Name*, *VPS IP*, *Priv Key*. -*Alias Name* means your masternode name(Only for identify), *VPS IP* is your VPS server IP which was copied in [End of installations](#End of installations). +*Alias Name* means your masternode name(Only for identify), *VPS IP* is your VPS server IP which was copied in [End of installations](#End-of-installations). In this example, *Alias Name* is phore-mn01 and *VPS IP* is [2001:19f0:7001:fd4:e2b7::1]:11771, *Priv Key* is 87KsYyqumG9HJjG000008jtpSEQUKSuEWkBG9xov19cuEsXH5vB. -New Masternode Alias inputed +New Masternode Alias inputed If you are setting up multiple masternodes, repeat this step for each one. -*Tips:* If you want, you can generate Priv Key here, but you will need to edit masternode configuration file manually on VPS(See [Add masternode private key](#Add masternode private key)). +*Tips:* If you want, you can generate Priv Key here, but you will need to edit masternode configuration file manually on VPS(See [Add masternode private key](#Add-masternode-private-key)). ## Check syncing status of masternode From ec2428df2f090253f7f0273cbe68424ec3d883de Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sat, 15 Dec 2018 02:34:34 +0900 Subject: [PATCH 35/43] IPv4 autofill, new layout, fix indentation 1. Add IPv4 address autofill feature 157b577 2. Add new layout of masternode conf lines 5d65474 3. Fix indentation a5da496 --- install.sh | 1634 ++++++++++++++++++++++++++++------------------------ 1 file changed, 869 insertions(+), 765 deletions(-) diff --git a/install.sh b/install.sh index 013f8130..d4f6b5b8 100755 --- a/install.sh +++ b/install.sh @@ -8,7 +8,7 @@ # ╚╗ @marsmensch 2016-2018 ╔╝ # # version v1.0.0 -# date 2018-11-21 +# date 2018-12-14 # # function: part of the masternode scripts, source the proper config file # @@ -16,7 +16,7 @@ # Run this script w/ the desired parameters. Leave blank or use -h for help. # # Platforms: -# - Linux Ubuntu 16.04 LTS AND 18.04 LTS ONLY on a Vultr, Hetzner or DigitalOcean VPS +# - Linux Ubuntu ONLY 16.04/18.04 LTS on a Vultr, Hetzner or DigitalOcean VPS # - Generic Ubuntu support will be added at a later point in time # # Twitter @marsmensch @@ -33,7 +33,8 @@ declare -r DO_NET_CONF="/etc/network/interfaces.d/50-cloud-init.cfg" declare -r NETWORK_BASE_TAG="$(dd if=/dev/urandom bs=2 count=1 2>/dev/null | od -x -A n | sed -e 's/^[[:space:]]*//g')" function showbanner() { - echo $(tput bold)$(tput setaf 2) + + echo $(tput bold)$(tput setaf 2) cat << "EOF" ███╗ ██╗ ██████╗ ██████╗ ███████╗███╗ ███╗ █████╗ ███████╗████████╗███████╗██████╗ ████╗ ██║██╔═══██╗██╔══██╗██╔════╝████╗ ████║██╔══██╗██╔════╝╚══██╔══╝██╔════╝██╔══██╗ @@ -43,8 +44,9 @@ function showbanner() { ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚╗ @marsmensch 2016-2018 ╔╝ EOF - echo "$(tput sgr0)$(tput setaf 3)Have fun, this is crypto after all!$(tput sgr0)" - echo "$(tput setaf 6)Donations for @marsmensch (BTC): 33ENWZ9RCYBG7nv6ac8KxBUSuQX64Hx3x3" + echo "$(tput sgr0)$(tput setaf 3)Have fun, this is crypto after all!$(tput sgr0)" + echo "$(tput setaf 6)Donations for @marsmensch (BTC): 33ENWZ9RCYBG7nv6ac8KxBUSuQX64Hx3x3" + } # /* @@ -53,209 +55,231 @@ EOF # */ # function get_confirmation() { - # call with a prompt string or use a default - read -r -p "${1:-Are you sure? [y/N]} " response - case "$response" in - [yY][eE][sS]|[yY]) - true - ;; - *) - false - ;; - esac + + # call with a prompt string or use a default + read -r -p "${1:-Are you sure? [y/N]} " response + case "$response" in + [yY][eE][sS]|[yY]) + true + ;; + *) + false + ;; + esac + } # # /* no parameters, displays the help message */ # function show_help(){ - clear - showbanner - echo "install.sh, version $SCRIPT_VERSION"; - echo "Usage example:"; - echo "install.sh (-p|--project) string [(-h|--help)] [(-n|--net) int] [(-c|--count) int] [(-r|--release) string] [(-w|--wipe)] [(-g|--generate)][(-k|--key) string] [(-u|--update)] [(-x|--startnodes)]"; - echo "Options:"; - echo "-h or --help: Displays this information."; - echo "-p or --project string: Project to be installed. REQUIRED."; - echo "-n or --net: IP address type t be used (4 vs. 6)."; - echo "-c or --count: Number of masternodes to be installed."; - echo "-r or --release: Release version to be installed."; - echo "-s or --sentinel: Add sentinel monitoring for a node type. Combine with the -p option"; - echo "-w or --wipe: Wipe ALL local data for a node type. Combine with the -p option"; - echo "-u or --update: Update a specific masternode daemon. Combine with the -p option"; - echo "-r or --release: Release version to be installed."; - echo "-k or --key: Set private key to masternode configuration files directly"; - echo "-x or --startnodes: Start masternodes after installation to sync with blockchain"; - echo "-g or --generate: Generate masternode private key and use" - exit 1; + + clear + showbanner + echo "install.sh, version $SCRIPT_VERSION"; + echo "Usage example:"; + echo "install.sh (-p|--project) string [(-h|--help)] [(-n|--net) int] [(-c|--count) int] [(-r|--release) string] [(-w|--wipe)] [(-u|--update)] [(-x|--startnodes)]"; + echo "Options:"; + echo "-h or --help: Displays this information."; + echo "-p or --project string: Project to be installed. REQUIRED."; + echo "-n or --net: IP address type t be used (4 vs. 6)."; + echo "-c or --count: Number of masternodes to be installed."; + echo "-r or --release: Release version to be installed."; + echo "-s or --sentinel: Add sentinel monitoring for a node type. Combine with the -p option"; + echo "-w or --wipe: Wipe ALL local data for a node type. Combine with the -p option"; + echo "-u or --update: Update a specific masternode daemon. Combine with the -p option"; + echo "-r or --release: Release version to be installed."; + echo "-k or --key: Set private key to masternode configuration files directly"; + echo "-x or --startnodes: Start masternodes after installation to sync with blockchain"; + echo "-g or --generate: Generate masternode private key and use" + exit 1; + } # # /* no parameters, checks if we are running on a supported Ubuntu release */ # function check_distro() { - # currently only for Ubuntu 16.04 & 18.04 - if [[ -r /etc/os-release ]]; then - . /etc/os-release - if [[ "${VERSION_ID}" != "16.04" ]] && [[ "${VERSION_ID}" != "18.04" ]]; then - echo "This script only supports ubuntu 16.04 & 18.04 LTS, exiting." - exit 1 + + # currently only for Ubuntu 16.04 & 18.04 + if [[ -r /etc/os-release ]]; then + . /etc/os-release + if [[ "${VERSION_ID}" != "16.04" ]] && [[ "${VERSION_ID}" != "18.04" ]] ; then + echo "This script only supports Ubuntu 16.04 & 18.04 LTS, exiting." + exit 1 + fi + else + # no, thats not ok! + echo "This script only supports Ubuntu 16.04 & 18.04 LTS, exiting." + exit 1 fi - else - # no, thats not ok! - echo "This script only supports ubuntu 16.04 & 18.04 LTS, exiting." - exit 1 - fi + } # # /* no parameters, installs the base set of packages that are required for all projects */ # function install_packages() { - # development and build packages - # these are common on all cryptos - echo "* Package installation!" - add-apt-repository -yu ppa:bitcoin/bitcoin &>> ${SCRIPT_LOGFILE} - apt-get -qq -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true update &>> ${SCRIPT_LOGFILE} - apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install build-essential \ + + # development and build packages + # these are common on all cryptos + echo "* Package installation!" + add-apt-repository -yu ppa:bitcoin/bitcoin &>> ${SCRIPT_LOGFILE} + apt-get -qq -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true update &>> ${SCRIPT_LOGFILE} + apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install build-essential \ libcurl4-gnutls-dev protobuf-compiler libboost-all-dev autotools-dev automake \ libboost-all-dev libssl-dev make autoconf libtool git apt-utils g++ \ libprotobuf-dev pkg-config libudev-dev libqrencode-dev bsdmainutils \ pkg-config libgmp3-dev libevent-dev jp2a pv virtualenv libdb4.8-dev libdb4.8++-dev &>> ${SCRIPT_LOGFILE} - # only for 18.04 // openssl - if [[ "${VERSION_ID}" == "18.04" ]] ; then - apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install libssl1.0-dev - fi + # only for 18.04 // openssl + if [[ "${VERSION_ID}" == "18.04" ]] ; then + apt-get -qqy -o=Dpkg::Use-Pty=0 -o=Acquire::ForceIPv4=true install libssl1.0-dev + fi + } # # /* no parameters, creates and activates a swapfile since VPS servers often do not have enough RAM for compilation */ # function swaphack() { - #check if swap is available - if [ $(free | awk '/^Swap:/ {exit !$2}') ] || [ ! -f "/var/mnode_swap.img" ];then - echo "* No proper swap, creating it" - # needed because ant servers are ants - rm -f /var/mnode_swap.img - dd if=/dev/zero of=/var/mnode_swap.img bs=1024k count=${MNODE_SWAPSIZE} &>> ${SCRIPT_LOGFILE} - chmod 0600 /var/mnode_swap.img - mkswap /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} - swapon /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} - echo '/var/mnode_swap.img none swap sw 0 0' | tee -a /etc/fstab &>> ${SCRIPT_LOGFILE} - echo 'vm.swappiness=10' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - else - echo "* All good, we have a swap" - fi + + #check if swap is available + if [ $(free | awk '/^Swap:/ {exit !$2}') ] || [ ! -f "/var/mnode_swap.img" ];then + echo "* No proper swap, creating it" + # needed because ant servers are ants + rm -f /var/mnode_swap.img + dd if=/dev/zero of=/var/mnode_swap.img bs=1024k count=${MNODE_SWAPSIZE} &>> ${SCRIPT_LOGFILE} + chmod 0600 /var/mnode_swap.img + mkswap /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} + swapon /var/mnode_swap.img &>> ${SCRIPT_LOGFILE} + echo '/var/mnode_swap.img none swap sw 0 0' | tee -a /etc/fstab &>> ${SCRIPT_LOGFILE} + echo 'vm.swappiness=10' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + else + echo "* All good, we have a swap" + fi + } # # /* no parameters, creates and activates a dedicated masternode user */ # function create_mn_user() { - # our new mnode unpriv user acc is added - if id "${MNODE_USER}" >/dev/null 2>&1; then - echo "user exists already, do nothing" &>> ${SCRIPT_LOGFILE} - else - echo "Adding new system user ${MNODE_USER}" - adduser --disabled-password --gecos "" ${MNODE_USER} &>> ${SCRIPT_LOGFILE} - fi + + # our new mnode unpriv user acc is added + if id "${MNODE_USER}" >/dev/null 2>&1; then + echo "user exists already, do nothing" &>> ${SCRIPT_LOGFILE} + else + echo "Adding new system user ${MNODE_USER}" + adduser --disabled-password --gecos "" ${MNODE_USER} &>> ${SCRIPT_LOGFILE} + fi + } # # /* no parameters, creates a masternode data directory (one per masternode) */ # function create_mn_dirs() { - # individual data dirs for now to avoid problems - echo "* Creating masternode directories" - mkdir -p ${MNODE_CONF_BASE} - for NUM in $(seq 1 ${count}); do - if [ ! -d "${MNODE_DATA_BASE}/${CODENAME}${NUM}" ]; then - echo "creating data directory ${MNODE_DATA_BASE}/${CODENAME}${NUM}" &>> ${SCRIPT_LOGFILE} - mkdir -p ${MNODE_DATA_BASE}/${CODENAME}${NUM} &>> ${SCRIPT_LOGFILE} - fi - done + + # individual data dirs for now to avoid problems + echo "* Creating masternode directories" + mkdir -p ${MNODE_CONF_BASE} + for NUM in $(seq 1 ${count}); do + if [ ! -d "${MNODE_DATA_BASE}/${CODENAME}${NUM}" ]; then + echo "creating data directory ${MNODE_DATA_BASE}/${CODENAME}${NUM}" &>> ${SCRIPT_LOGFILE} + mkdir -p ${MNODE_DATA_BASE}/${CODENAME}${NUM} &>> ${SCRIPT_LOGFILE} + fi + done + } # # /* no parameters, creates a sentinel config for a set of masternodes (one per masternode) */ # function create_sentinel_setup() { - SENTINEL_BASE=/usr/share/sentinel - SENTINEL_ENV=/usr/share/sentinelenv - - # if code directory does not exists, we create it clone the src - if [ ! -d ${SENTINEL_BASE} ]; then - cd /usr/share &>> ${SCRIPT_LOGFILE} - git clone https://github.com/dashpay/sentinel.git sentinel &>> ${SCRIPT_LOGFILE} - cd sentinel &>> ${SCRIPT_LOGFILE} - rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} - else - echo "* Updating the existing sentinel GIT repo" - cd ${SENTINEL_BASE} &>> ${SCRIPT_LOGFILE} - git pull &>> ${SCRIPT_LOGFILE} - rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} - fi - - # create a globally accessible venv and install sentinel requirements - virtualenv --system-site-packages ${SENTINEL_ENV} &>> ${SCRIPT_LOGFILE} - ${SENTINEL_ENV}/bin/pip install -r requirements.txt &>> ${SCRIPT_LOGFILE} - - # create one sentinel config file per masternode - for NUM in $(seq 1 ${count}); do - if [ ! -f "${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf" ]; then - echo "* Creating sentinel configuration for ${CODENAME} masternode number ${NUM}" &>> ${SCRIPT_LOGFILE} - echo "dash_conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" > ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf - echo "network=mainnet" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf - echo "db_name=${SENTINEL_BASE}/database/${CODENAME}_${NUM}_sentinel.db" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf - echo "db_driver=sqlite" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + + SENTINEL_BASE=/usr/share/sentinel + SENTINEL_ENV=/usr/share/sentinelenv + + # if code directory does not exists, we create it clone the src + if [ ! -d ${SENTINEL_BASE} ]; then + cd /usr/share &>> ${SCRIPT_LOGFILE} + git clone https://github.com/dashpay/sentinel.git sentinel &>> ${SCRIPT_LOGFILE} + cd sentinel &>> ${SCRIPT_LOGFILE} + rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} + else + echo "* Updating the existing sentinel GIT repo" + cd ${SENTINEL_BASE} &>> ${SCRIPT_LOGFILE} + git pull &>> ${SCRIPT_LOGFILE} + rm -f rm sentinel.conf &>> ${SCRIPT_LOGFILE} fi - done - export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py + # create a globally accessible venv and install sentinel requirements + virtualenv --system-site-packages ${SENTINEL_BASE} &>> ${SCRIPT_LOGFILE} + ${SENTINEL_BASE}/bin/pip install -r requirements.txt &>> ${SCRIPT_LOGFILE} + + # create one sentinel config file per masternode + for NUM in $(seq 1 ${count}); do + if [ ! -f "${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf" ]; then + echo "* Creating sentinel configuration for ${CODENAME} masternode number ${NUM}" &>> ${SCRIPT_LOGFILE} + echo "dash_conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" > ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "network=mainnet" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "db_name=database/${CODENAME}_${NUM}_sentinel.db" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + echo "db_driver=sqlite" >> ${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf + fi + done + + export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py + + + echo "$(tput sgr0)$(tput setaf 3)Generated a Sentinel config for you. To activate Sentinel run:$(tput sgr0)" + echo "$(tput sgr0)$(tput setaf 2)export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py$(tput sgr0)" + echo "" + echo "$(tput sgr0)$(tput setaf 2)If it works, add the command as cronjob: $(tput sgr0)" + echo "$(tput sgr0)$(tput setaf 2)* * * * * export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py >> /var/log/sentinel/sentinel-cron.log$(tput sgr0) 2>&1" - echo "$(tput sgr0)$(tput setaf 3)Generated a Sentinel config for you. To activate Sentinel run:$(tput sgr0)" - echo "$(tput sgr0)$(tput setaf 2)export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py$(tput sgr0)" - echo "" - echo "$(tput sgr0)$(tput setaf 2)If it works, add the command as cronjob: $(tput sgr0)" - echo "$(tput sgr0)$(tput setaf 2)* * * * * export SENTINEL_CONFIG=${SENTINEL_BASE}/${CODENAME}${NUM}_sentinel.conf; cd ${SENTINEL_BASE} && ${SENTINEL_ENV}/bin/python ${SENTINEL_BASE}/bin/sentinel.py >> /var/log/sentinel/sentinel-cron.log$(tput sgr0) 2>&1" } # # /* no parameters, creates a minimal set of firewall rules that allows INBOUND masternode p2p & SSH ports */ # function configure_firewall() { - echo "* Configuring firewall rules" - # disallow everything except ssh and masternode inbound ports - ufw default deny &>> ${SCRIPT_LOGFILE} - ufw logging on &>> ${SCRIPT_LOGFILE} - ufw allow ${SSH_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} - # KISS, its always the same port for all interfaces - ufw allow ${MNODE_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} - # This will only allow 6 connections every 30 seconds from the same IP address. - ufw limit OpenSSH &>> ${SCRIPT_LOGFILE} - ufw --force enable &>> ${SCRIPT_LOGFILE} - echo "* Firewall ufw is active and enabled on system startup" + + echo "* Configuring firewall rules" + # disallow everything except ssh and masternode inbound ports + ufw default deny &>> ${SCRIPT_LOGFILE} + ufw logging on &>> ${SCRIPT_LOGFILE} + ufw allow ${SSH_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} + # KISS, its always the same port for all interfaces + ufw allow ${MNODE_INBOUND_PORT}/tcp &>> ${SCRIPT_LOGFILE} + # This will only allow 6 connections every 30 seconds from the same IP address. + ufw limit OpenSSH &>> ${SCRIPT_LOGFILE} + ufw --force enable &>> ${SCRIPT_LOGFILE} + echo "* Firewall ufw is active and enabled on system startup" + } # # /* no parameters, checks if the choice of networking matches w/ this VPS installation */ # function validate_netchoice() { - echo "* Validating network rules" - # break here of net isn't 4 or 6 - if [ ${net} -ne 4 ] && [ ${net} -ne 6 ]; then - echo "invalid NETWORK setting, can only be 4 or 6!" - exit 1; - fi + echo "* Validating network rules" + + # break here of net isn't 4 or 6 + if [ ${net} -ne 4 ] && [ ${net} -ne 6 ]; then + echo "invalid NETWORK setting, can only be 4 or 6!" + exit 1; + fi + + # Generate IPv4 Address + if [ "${net}" -eq 4 ]; then + IPV6_INT_BASE="#NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER" + IPV4_ADDRESS=$(curl -s inet-ip.info) + echo "IPv4 address: ${IPV4_ADDRESS} was configured with inet-ip.info. You can't host multiple ${CODENAME} masternodes with same IPv4 address: ${IPV4_ADDRESS}." &>> ${SCRIPT_LOGFILE} + fi # end ifneteq4 - # generate the required ipv6 config - if [ "${net}" -eq 4 ]; then - IPV6_INT_BASE="#NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER" - echo "IPv4 address generation needs to be done manually atm!" &>> ${SCRIPT_LOGFILE} - fi # end ifneteq4 } # @@ -263,164 +287,232 @@ function validate_netchoice() { # directory (eg. /etc/masternodes/${CODENAME} and replaces the existing placeholders if possible */ # function create_mn_configuration() { - # always return to the script root - cd ${SCRIPTPATH} - # store private keys - for NUM in $(seq 1 ${count}); do - if [ -n "${PRIVKEY[${NUM}]}" ]; then - echo ${PRIVKEY[${NUM}]} >> tmp.txt - fi - done - - # check whether masternode private keys are duplicated - if [ -f tmp.txt ]; then - dup=$(sort -t 8 tmp.txt | uniq -c | sort -nr | head -1 | awk '{print substr($0, 7, 1)}') - if [ 1 -ne "$dup" ]; then - echo "Private key was duplicated. Please restart this script." - rm -r /etc/masternodes - rm tmp.txt - exit 1 - fi - rm tmp.txt - fi - - # create one config file per masternode - for NUM in $(seq 1 ${count}); do - PASS=$(date | md5sum | cut -c1-24) - - # we dont want to overwrite an existing config file - if [ ! -f ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf ]; then - echo "individual masternode config doesn't exist, generate it!" &>> ${SCRIPT_LOGFILE} - # if a template exists, use this instead of the default - if [ -e config/${CODENAME}/${CODENAME}.conf ]; then - echo "custom configuration template for ${CODENAME} found, use this instead" &>> ${SCRIPT_LOGFILE} - cp ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} - else - echo "No ${CODENAME} template found, using the default configuration template" &>> ${SCRIPT_LOGFILE} - cp ${SCRIPTPATH}/config/default.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} - fi - # replace placeholders - echo "running sed on file ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" &>> ${SCRIPT_LOGFILE} - fi + # always return to the script root + cd ${SCRIPTPATH} - # replace masternode private keys - if [ -n "${PRIVKEY[${NUM}]}" ]; then - if [ ${#PRIVKEY[${NUM}]} -eq 51 ]; then - sed -e "s/HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_XXX_GIT_PROJECT_XXX_XXX_NUM_XXX/${PRIVKEY[${NUM}]}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - else - echo "input private key ${PRIVKEY[${NUM}]} was invalid. Please check the key, and restart this script." - rm -r /etc/masternodes - exit 1 - fi - else : - fi - sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY/${NUM}]/" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV6_INT_BASE}/" -e "s/XXX_NETWORK_BASE_TAG_XXX/${NETWORK_BASE_TAG}/" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - if [ -z "${PRIVKEY[${NUM}]}" ]; then - if [ "$startnodes" -eq 1 ]; then - # uncomment masternode= and masternodeprivkey= so the node can autostart and sync - sed 's/\(^.*masternode\(\|privkey\)=.*$\)/#\1/' -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf - fi + # recode inputed private key to tmp.txt, check the keys + for NUM in $(seq 1 ${count}); do + if [ -n "${PRIVKEY[${NUM}]}" ]; then + echo ${PRIVKEY[${NUM}]} >> tmp.txt + fi + done + + if [ -f tmp.txt ]; then + dup=$(sort -t 8 tmp.txt | uniq -c | sort -nr | head -1 | awk '{print substr($0, 7, 1)}') + if [ 1 -ne "$dup" ]; then + echo "Private key was duplicated. Please restart this script." + rm -r /etc/masternodes + rm tmp.txt + exit 1 + fi + rm tmp.txt fi - done + + # create one config file per masternode + for NUM in $(seq 1 ${count}); do + PASS=$(date | md5sum | cut -c1-24) + + # we dont want to overwrite an existing config file + if [ ! -f ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf ]; then + echo "individual masternode config doesn't exist, generate it!" &>> ${SCRIPT_LOGFILE} + + # if a template exists, use this instead of the default + if [ -e config/${CODENAME}/${CODENAME}.conf ]; then + echo "custom configuration template for ${CODENAME} found, use this instead" &>> ${SCRIPT_LOGFILE} + cp ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} + else + echo "No ${CODENAME} template found, using the default configuration template" &>> ${SCRIPT_LOGFILE} + cp ${SCRIPTPATH}/config/default.conf ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf &>> ${SCRIPT_LOGFILE} + fi + + # replace placeholders + echo "running sed on file ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf" &>> ${SCRIPT_LOGFILE} + fi + + # Write inputed private key to project.conf + if [ -n "${PRIVKEY[${NUM}]}" ]; then + if [ ${#PRIVKEY[${NUM}]} -eq 51 ]; then + sed -e "s/HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_XXX_GIT_PROJECT_XXX_XXX_NUM_XXX/${PRIVKEY[${NUM}]}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + else + echo "input private key ${PRIVKEY[${NUM}]} was invalid. Please check the key, and restart this script." + rm -r /etc/masternodes + exit 1 + fi + else : + fi + if [ ${net} -eq 4 ]; then + sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY//" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV4_ADDRESS}/" -e "s/:XXX_NETWORK_BASE_TAG_XXX:://" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + else + sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY/${NUM}]/" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV6_INT_BASE}/" -e "s/XXX_NETWORK_BASE_TAG_XXX/${NETWORK_BASE_TAG}/" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + fi + if [ -z "${PRIVKEY[${NUM}]}" ]; then + if [ "$startnodes" -eq 1 ]; then + #uncomment masternode= and masternodeprivkey= so the node can autostart and sync + sed 's/\(^.*masternode\(\|privkey\)=.*$\)/#\1/' -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + fi + fi + done + } # # /* no parameters, generates a masternode configuration file per masternode in the default */ # function create_control_configuration() { - # delete any old stuff that's still around - rm -f /tmp/${CODENAME}_masternode.conf &>> ${SCRIPT_LOGFILE} - - # create one line per masternode with the data we have - for NUM in $(seq 1 ${count}); do - if [ -n "${PRIVKEY[${NUM}]}" ]; then - PRIVKEY[${NUM}]=$(cat ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf | grep masternodeprivkey) - PRIVKEY[${NUM}]=${PRIVKEY[${NUM}]:18} - echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} ${PRIVKEY[${NUM}]} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf - else - echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} MASTERNODE_PRIVKEY_FOR_${CODENAME}MN${NUM} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf - fi - done + + # delete any old stuff that's still around + rm -f /tmp/${CODENAME}_masternode.conf &>> ${SCRIPT_LOGFILE} + + # create one line per masternode with the data we have + for NUM in $(seq 1 ${count}); do + if [ -n "${PRIVKEY[${NUM}]}" ]; then + PRIVKEY[${NUM}]=$(cat ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf | grep masternodeprivkey) + PRIVKEY[${NUM}]=${PRIVKEY[${NUM}]:18} + echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} ${PRIVKEY[${NUM}]} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf + else + echo ${CODENAME}MN${NUM} [${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}]:${MNODE_INBOUND_PORT} MASTERNODE_PRIVKEY_FOR_${CODENAME}MN${NUM} COLLATERAL_TX_FOR_${CODENAME}MN${NUM} OUTPUT_NO_FOR_${CODENAME}MN${NUM} >> /tmp/${CODENAME}_masternode.conf + fi + done + + # add well layout text for GUI Configuration + rm -f /tmp/${CODENAME}_gui.conf &>> ${SCRIPT_LOGFILE} + + for NUM in $(seq 1 ${count}); do + if [ -n "${PRIVKEY[${NUM}]}" ]; then + PRIVKEY[${NUM}]=$(cat ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf | grep masternodeprivkey) + PRIVKEY[${NUM}]=${PRIVKEY[${NUM}]:18} + if [ "${net}" -eq 4 ]; then + cat >> /tmp/${CODENAME}_gui.conf <> /tmp/${CODENAME}_gui.conf <> /tmp/${CODENAME}_gui.conf <> /tmp/${CODENAME}_gui.conf <> ${SCRIPT_LOGFILE} - cat > ${SYSTEMD_CONF}/${CODENAME}_n${NUM}.service <<-EOF - [Unit] - Description=${CODENAME} distributed currency daemon - After=network.target - - [Service] - User=${MNODE_USER} - Group=${MNODE_USER} - - Type=forking - PIDFile=${MNODE_DATA_BASE}/${CODENAME}${NUM}/${CODENAME}.pid - ExecStart=${MNODE_DAEMON} -daemon -pid=${MNODE_DATA_BASE}/${CODENAME}${NUM}/${CODENAME}.pid -conf=${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}${NUM} - - Restart=always - RestartSec=5 - PrivateTmp=true - TimeoutStopSec=60s - TimeoutStartSec=5s - StartLimitInterval=120s - StartLimitBurst=15 - - [Install] - WantedBy=multi-user.target - EOF - done + + echo "* (over)writing systemd config files for masternodes" + # create one config file per masternode + for NUM in $(seq 1 ${count}); do + PASS=$(date | md5sum | cut -c1-24) + echo "* (over)writing systemd config file ${SYSTEMD_CONF}/${CODENAME}_n${NUM}.service" &>> ${SCRIPT_LOGFILE} + cat > ${SYSTEMD_CONF}/${CODENAME}_n${NUM}.service <> ${SCRIPT_LOGFILE} - chown -R ${MNODE_USER}:${MNODE_USER} ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel ${SENTINEL_BASE}/database &>> ${SCRIPT_LOGFILE} - # make group permissions same as user, so vps-user can be added to masternode group - chmod -R g=u ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel &>> ${SCRIPT_LOGFILE} &>> ${SCRIPT_LOGFILE} + + # maybe add a sudoers entry later + mkdir -p /var/log/sentinel &>> ${SCRIPT_LOGFILE} + chown -R ${MNODE_USER}:${MNODE_USER} ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel ${SENTINEL_BASE}/database &>> ${SCRIPT_LOGFILE} + # make group permissions same as user, so vps-user can be added to masternode group + chmod -R g=u ${MNODE_CONF_BASE} ${MNODE_DATA_BASE} /var/log/sentinel &>> ${SCRIPT_LOGFILE} + } # # /* wipe all files and folders generated by the script for a specific project */ # function wipe_all() { - echo "Deleting all ${project} related data!" - rm -f /etc/masternodes/${project}_n*.conf - rmdir --ignore-fail-on-non-empty -p /var/lib/masternodes/${project}* - rm -f /etc/systemd/system/${project}_n*.service - rm -f ${MNODE_DAEMON} - echo "DONE!" - exit 0 + + echo "Deleting all ${project} related data!" + rm -f /etc/masternodes/${project}_n*.conf + rmdir --ignore-fail-on-non-empty -p /var/lib/masternodes/${project}* + rm -f /etc/systemd/system/${project}_n*.service + rm -f ${MNODE_DAEMON} + echo "DONE!" + exit 0 + } # -#Generate masternode private key +# /* +# Generate masternode private key +# */ # function generate_privkey() { - echo -e "rpcuser=test\nrpcpassword=passtest" >> ${MNODE_CONF_BASE}/${CODENAME}_test.conf - mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test - ${CODENAME}d -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test - sleep 15 - - for NUM in $(seq 1 ${count}); do - if [ -z "${PRIVKEY[${NUM}]}" ]; then - PRIVKEY[${NUM}]=$(${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) - fi - done - ${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop - sleep 5 - rm -r ${MNODE_CONF_BASE}/${CODENAME}_test.conf ${MNODE_DATA_BASE}/${CODENAME}_test + + echo -e "rpcuser=test\nrpcpassword=passtest" >> ${MNODE_CONF_BASE}/${CODENAME}_test.conf + mkdir -p ${MNODE_DATA_BASE}/${CODENAME}_test + ${CODENAME}d -daemon -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test + sleep 20 + + for NUM in $(seq 1 ${count}); do + if [ -z "${PRIVKEY[${NUM}]}" ]; then + PRIVKEY[${NUM}]=$(${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test masternode genkey) + fi + done + ${CODENAME}-cli -conf=${MNODE_CONF_BASE}/${CODENAME}_test.conf -datadir=${MNODE_DATA_BASE}/${CODENAME}_test stop + sleep 5 + rm -r ${MNODE_CONF_BASE}/${CODENAME}_test.conf ${MNODE_DATA_BASE}/${CODENAME}_test + } # @@ -430,23 +522,25 @@ function generate_privkey() { # */ # function cleanup_after() { - #apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoremove - apt-get -qqy -o=Dpkg::Use-Pty=0 --allow-downgrades --allow-change-held-packages autoclean - - echo "kernel.randomize_va_space=1" > /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.rp_filter=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.accept_source_route=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.log_martians=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.default.log_martians=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.accept_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv6.conf.all.accept_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.conf.all.send_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "kernel.sysrq=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.tcp_timestamps=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - echo "net.ipv4.icmp_ignore_bogus_error_responses=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} - sysctl -p + + #apt-get -qqy -o=Dpkg::Use-Pty=0 --force-yes autoremove + apt-get -qqy -o=Dpkg::Use-Pty=0 --allow-downgrades --allow-change-held-packages autoclean + + echo "kernel.randomize_va_space=1" > /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.rp_filter=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.accept_source_route=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.log_martians=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.default.log_martians=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.accept_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv6.conf.all.accept_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.conf.all.send_redirects=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "kernel.sysrq=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.tcp_timestamps=0" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + echo "net.ipv4.icmp_ignore_bogus_error_responses=1" >> /etc/sysctl.conf &>> ${SCRIPT_LOGFILE} + sysctl -p + } # @@ -455,332 +549,340 @@ function cleanup_after() { # source the default and desired crypto configuration files function source_config() { - SETUP_CONF_FILE="${SCRIPTPATH}/config/${project}/${project}.env" - - # first things first, to break early if things are missing or weird - check_distro - - if [ -f ${SETUP_CONF_FILE} ]; then - echo "Script version ${SCRIPT_VERSION}, you picked: $(tput bold)$(tput setaf 2) ${project} $(tput sgr0), running on Ubuntu ${VERSION_ID}" - echo "apply config file for ${project}" &>> ${SCRIPT_LOGFILE} - source "${SETUP_CONF_FILE}" - - # count is from the default config but can ultimately be - # overwritten at runtime - if [ -z "${count}" ] - then - count=${SETUP_MNODES_COUNT} - echo "No number given, installing default number of nodes: ${SETUP_MNODES_COUNT}" &>> ${SCRIPT_LOGFILE} - fi - # release is from the default project config but can ultimately be - # overwritten at runtime - if [ -z "$release" ] - then - release=${SCVERSION} - echo "release empty, setting to project default: ${SCVERSION}" &>> ${SCRIPT_LOGFILE} - fi + SETUP_CONF_FILE="${SCRIPTPATH}/config/${project}/${project}.env" - # net is from the default config but can ultimately be - # overwritten at runtime - if [ -z "${net}" ]; then - net=${NETWORK_TYPE} - echo "net EMPTY, setting to default: ${NETWORK_TYPE}" &>> ${SCRIPT_LOGFILE} - fi + # first things first, to break early if things are missing or weird + check_distro - # main block of function logic starts here - # if update flag was given, delete the old daemon binary first & proceed - if [ "$update" -eq 1 ]; then - if [ ! -f ${MNODE_DAEMON} ]; then - echo "UPDATE FAILED! Daemon hasn't been found. Please try the normal installation process by omitting the upgrade parameter." - exit 1 - fi - if [ ! -f ${MNODE_HELPER}_${CODENAME} ]; then - echo "UPDATE FAILED! Masternode activation file ${MNODE_HELPER}_${CODENAME} hasn't been found. Please try the normal installation process by omitting the upgrade parameter." - exit 1 - fi - if [ ! -d ${MNODE_DATA_BASE} ]; then - echo "UPDATE FAILED! ${MNODE_DATA_BASE} hasn't been found. Please try the normal installation process by omitting the upgrade parameter." - exit 1 - fi - fi + if [ -f ${SETUP_CONF_FILE} ]; then + echo "Script version ${SCRIPT_VERSION}, you picked: $(tput bold)$(tput setaf 2) ${project} $(tput sgr0), running on Ubuntu ${VERSION_ID}" + echo "apply config file for ${project}" &>> ${SCRIPT_LOGFILE} + source "${SETUP_CONF_FILE}" - echo "************************* Installation Plan *****************************************" - echo "" - if [ "$update" -eq 1 ]; then - echo "I am going to update your existing " - echo "$(tput bold)$(tput setaf 2) => ${project} masternode(s) in version ${release} $(tput sgr0)" - else - echo "I am going to install and configure " - echo "$(tput bold)$(tput setaf 2) => ${count} ${project} masternode(s) in version ${release} $(tput sgr0)" - fi - echo "for you now." - echo "" - if [ "$update" -eq 0 ]; then - # only needed if fresh installation - echo "You have to add your masternode private key to the individual config files afterwards" - echo "" - fi - echo "Stay tuned!" - echo "" + # count is from the default config but can ultimately be + # overwritten at runtime + if [ -z "${count}" ] + then + count=${SETUP_MNODES_COUNT} + echo "No number given, installing default number of nodes: ${SETUP_MNODES_COUNT}" &>> ${SCRIPT_LOGFILE} + fi - # show a hint for MANUAL IPv4 configuration - if [ "${net}" -eq 4 ]; then - NETWORK_TYPE=4 - echo "WARNING:" - echo "You selected IPv4 for networking but there is no automatic workflow for this part." - echo "This means you will have some mamual work to do to after this configuration run." - echo "" - echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" - echo "${IPV4_DOC_LINK}" - fi + # release is from the default project config but can ultimately be + # overwritten at runtime + if [ -z "$release" ] + then + release=${SCVERSION} + echo "release empty, setting to project default: ${SCVERSION}" &>> ${SCRIPT_LOGFILE} + fi - # sentinel setup - if [ "$sentinel" -eq 1 ]; then - echo "I will also generate a Sentinel configuration for you." - fi + # net is from the default config but can ultimately be + # overwritten at runtime + if [ -z "${net}" ]; then + net=${NETWORK_TYPE} + echo "net EMPTY, setting to default: ${NETWORK_TYPE}" &>> ${SCRIPT_LOGFILE} + fi - # start nodes after setup - if [ "$startnodes" -eq 1 ]; then - echo "I will start your masternodes after the installation." - fi - echo "" - echo "A logfile for this run can be found at the following location:" - echo "${SCRIPT_LOGFILE}" - echo "" - echo "*************************************************************************************" - sleep 5 + # main block of function logic starts here + # if update flag was given, delete the old daemon binary first & proceed + if [ "$update" -eq 1 ]; then + if [ ! -f ${MNODE_DAEMON} ]; then + echo "UPDATE FAILED! Daemon hasn't been found. Please try the normal installation process by omitting the upgrade parameter." + exit 1 + fi + if [ ! -f ${MNODE_HELPER}_${CODENAME} ]; then + echo "UPDATE FAILED! Masternode activation file ${MNODE_HELPER}_${CODENAME} hasn't been found. Please try the normal installation process by omitting the upgrade parameter." + exit 1 + fi + if [ ! -d ${MNODE_DATA_BASE} ]; then + echo "UPDATE FAILED! ${MNODE_DATA_BASE} hasn't been found. Please try the normal installation process by omitting the upgrade parameter." + exit 1 + fi + fi - # main routine - if [ "$update" -eq 0 ]; then - prepare_mn_interfaces - swaphack - fi - install_packages - print_logo - build_mn_from_source - if [ "$update" -eq 0 ]; then - create_mn_user - create_mn_dirs - - # private key initialize - if [ "$generate" -eq 1 ]; then - echo "Generating masternode private key" &>> ${SCRIPT_LOGFILE} - generate_privkey - fi - - # sentinel setup - if [ "$sentinel" -eq 1 ]; then - echo "* Sentinel setup chosen" &>> ${SCRIPT_LOGFILE} - create_sentinel_setup - fi - configure_firewall - create_mn_configuration - create_control_configuration - create_systemd_configuration + echo "************************* Installation Plan *****************************************" + echo "" + if [ "$update" -eq 1 ]; then + echo "I am going to update your existing" + echo "$(tput bold)$(tput setaf 2) => ${project} masternode(s) in version ${release} $(tput sgr0)" + else + echo "I am going to install and configure" + echo "$(tput bold)$(tput setaf 2) => ${count} ${project} masternode(s) in version ${release} $(tput sgr0)" + fi + echo "for you now." + echo "" + if [ "$update" -eq 0 ]; then + # only needed if fresh installation + echo "If you didn't set generate, key option, you have to add your masternode private key to the individual config files afterwards." + echo "" + fi + echo "" + echo "Stay tuned!" + echo "" + + # show a hint for MANUAL IPv4 configuration + if [ "${net}" -eq 4 ]; then + NETWORK_TYPE=4 + echo "CAUTION:" + echo "You selected IPv4 for networking. If you want to use 2nd IPv4 address, please edit each configuration file manually. Because this script only uses primary IPv4 address." + echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" + echo "${IPV4_DOC_LINK}" + fi + + # sentinel setup + if [ "$sentinel" -eq 1 ]; then + echo "I will also generate a Sentinel configuration for you." + fi + + # start nodes after setup + if [ "$startnodes" -eq 1 ]; then + echo "I will start your masternodes after the installation." + fi + echo "" + echo "A logfile for this run can be found at the following location:" + echo "${SCRIPT_LOGFILE}" + echo "" + echo "*************************************************************************************" + sleep 5 + + # main routine + if [ "$update" -eq 0 ]; then + prepare_mn_interfaces + swaphack + fi + install_packages + print_logo + build_mn_from_source + if [ "$update" -eq 0 ]; then + create_mn_user + create_mn_dirs + + # private key initialize + if [ "$generate" -eq 1 ]; then + echo "Generating masternode private key" &>> ${SCRIPT_LOGFILE} + generate_privkey + fi + + # sentinel setup + if [ "$sentinel" -eq 1 ]; then + echo "* Sentinel setup chosen" &>> ${SCRIPT_LOGFILE} + create_sentinel_setup + fi + configure_firewall + create_mn_configuration + create_control_configuration + create_systemd_configuration + fi + set_permissions + cleanup_after + showbanner + final_call + else + echo "required file ${SETUP_CONF_FILE} does not exist, abort!" + exit 1 fi - set_permissions - cleanup_after - showbanner - final_call - #if [ "$update" -eq 1 ]; then - # need to update the systemctl daemon, else an error will occur when running `systemctl enable` on a changed systemd process - # systemctl daemon-reload - #fi - else - echo "required file ${SETUP_CONF_FILE} does not exist, abort!" - exit 1 - fi + } function print_logo() { - # print ascii banner if a logo exists - echo -e "* Starting the compilation process for ${CODENAME}, stay tuned" - if [ -f "${SCRIPTPATH}/assets/$CODENAME.jpg" ]; then - jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/${CODENAME}.jpg - else - jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/default.jpg - fi + + # print ascii banner if a logo exists + echo -e "* Starting the compilation process for ${CODENAME}, stay tuned" + if [ -f "${SCRIPTPATH}/assets/$CODENAME.jpg" ]; then + jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/${CODENAME}.jpg + else + jp2a -b --colors --width=56 ${SCRIPTPATH}/assets/default.jpg + fi + } # # /* no parameters, builds the required masternode binary from sources. Exits if already exists and "update" not given */ # function build_mn_from_source() { - # daemon not found compile it - if [ ! -f ${MNODE_DAEMON} ] || [ "$update" -eq 1 ]; then - # create code directory if it doesn't exist - if [ ! -d ${SCRIPTPATH}/${CODE_DIR} ]; then - mkdir -p ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} - fi - # if coin directory (CODENAME) exists, we remove it, to make a clean git clone - if [ -d ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} ]; then - echo "deleting ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} for clean cloning" &>> ${SCRIPT_LOGFILE} - rm -rf ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} + # daemon not found compile it + if [ ! -f ${MNODE_DAEMON} ] || [ "$update" -eq 1 ]; then + # create code directory if it doesn't exist + if [ ! -d ${SCRIPTPATH}/${CODE_DIR} ]; then + mkdir -p ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} + fi + # if coin directory (CODENAME) exists, we remove it, to make a clean git clone + if [ -d ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} ]; then + echo "deleting ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} for clean cloning" &>> ${SCRIPT_LOGFILE} + rm -rf ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} + fi + mkdir -p ${CODE_DIR} && cd ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} + git clone ${GIT_URL} ${CODENAME} &>> ${SCRIPT_LOGFILE} + cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} + echo "* Checking out desired GIT tag: ${release}" + git checkout ${release} &>> ${SCRIPT_LOGFILE} + + if [ "$update" -eq 1 ]; then + echo "update given, deleting the old daemon NOW!" &>> ${SCRIPT_LOGFILE} + rm -f ${MNODE_DAEMON} + # old daemon must be removed before compilation. Would be better to remove it afterwards, however not possible with current structure + if [ -f ${MNODE_DAEMON} ]; then + echo "UPDATE FAILED! Daemon ${MNODE_DAEMON} couldn't be removed. Please open an issue at https://github.com/masternodes/vps/issues. Thank you!" + exit 1 + fi + fi + + # compilation starts here + source ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.compile | pv -t -i0.1 + else + echo "* Daemon already in place at ${MNODE_DAEMON}, not compiling" fi - mkdir -p ${CODE_DIR} && cd ${SCRIPTPATH}/${CODE_DIR} &>> ${SCRIPT_LOGFILE} - git clone ${GIT_URL} ${CODENAME} &>> ${SCRIPT_LOGFILE} - cd ${SCRIPTPATH}/${CODE_DIR}/${CODENAME} &>> ${SCRIPT_LOGFILE} - echo "* Checking out desired GIT tag: ${release}" - git checkout ${release} &>> ${SCRIPT_LOGFILE} - - if [ "$update" -eq 1 ]; then - echo "update given, deleting the old daemon NOW!" &>> ${SCRIPT_LOGFILE} - rm -f ${MNODE_DAEMON} - # old daemon must be removed before compilation. Would be better to remove it afterwards, however not possible with current structure - if [ -f ${MNODE_DAEMON} ]; then - echo "UPDATE FAILED! Daemon ${MNODE_DAEMON} couldn't be removed. Please open an issue at https://github.com/masternodes/vps/issues. Thank you!" + + # if it's not available after compilation, theres something wrong + if [ ! -f ${MNODE_DAEMON} ]; then + echo "COMPILATION FAILED! Please open an issue at https://github.com/phoreproject/vps/issues. Thank you!" exit 1 - fi fi - # compilation starts here - source ${SCRIPTPATH}/config/${CODENAME}/${CODENAME}.compile | pv -t -i0.1 - else - echo "* Daemon already in place at ${MNODE_DAEMON}, not compiling" - fi - - # if it's not available after compilation, theres something wrong - if [ ! -f ${MNODE_DAEMON} ]; then - echo "COMPILATION FAILED! Please open an issue at https://github.com/masternodes/vps/issues. Thank you!" - exit 1 - fi } # # /* no parameters, print some (hopefully) helpful advice */ # function final_call() { - # note outstanding tasks that need manual work - echo "************! ALMOST DONE !******************************" - if [ "$update" -eq 0 ]; then - echo "There is still work to do in the configuration templates." - echo "These are located at ${MNODE_CONF_BASE}, one per masternode." - echo "Add your masternode private keys now." - echo "eg in /etc/masternodes/${CODENAME}_n1.conf" - else - echo "Your ${CODENAME} masternode daemon has been updated! (but not yet activated)" - fi - echo "" - echo "=> $(tput bold)$(tput setaf 2) All configuration files are in: ${MNODE_CONF_BASE} $(tput sgr0)" - echo "=> $(tput bold)$(tput setaf 2) All Data directories are in: ${MNODE_DATA_BASE} $(tput sgr0)" - echo "" - echo "$(tput bold)$(tput setaf 1)Important:$(tput sgr0) run $(tput setaf 2) /usr/local/bin/activate_masternodes_${CODENAME} $(tput sgr0) as root to activate your nodes." - - # place future helper script accordingly on fresh install - if [ "$update" -eq 0 ]; then - cp ${SCRIPTPATH}/scripts/activate_masternodes.sh ${MNODE_HELPER}_${CODENAME} - echo "" >> ${MNODE_HELPER}_${CODENAME} + # note outstanding tasks that need manual work + echo "************! ALMOST DONE !******************************" + if [ "$update" -eq 0 ]; then + echo "There is still work to do in the configuration templates." + echo "These are located at ${MNODE_CONF_BASE}, one per masternode." + echo "If you didn't set generate or key option, add your masternode private keys now." + echo "eg in /etc/masternodes/${CODENAME}_n1.conf" + else + echo "Your ${CODENAME} masternode daemon has been updated! (but not yet activated)" + fi + echo "" + echo "=> $(tput bold)$(tput setaf 2) All configuration files are in: ${MNODE_CONF_BASE} $(tput sgr0)" + echo "=> $(tput bold)$(tput setaf 2) All Data directories are in: ${MNODE_DATA_BASE} $(tput sgr0)" + echo "" + echo "$(tput bold)$(tput setaf 1)Important:$(tput sgr0) run $(tput setaf 2) /usr/local/bin/activate_masternodes_${CODENAME} $(tput sgr0) as root to activate your nodes." - for NUM in $(seq 1 ${count}); do - echo "systemctl daemon-reload" >> ${MNODE_HELPER}_${CODENAME} - echo "systemctl enable ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} - echo "systemctl restart ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} - done + # place future helper script accordingly + if [ "$update" -eq 0 ]; then + cp ${SCRIPTPATH}/scripts/activate_masternodes.sh ${MNODE_HELPER}_${CODENAME} + echo "">> ${MNODE_HELPER}_${CODENAME} - chmod u+x ${MNODE_HELPER}_${CODENAME} - fi + for NUM in $(seq 1 ${count}); do + echo "systemctl enable ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} + echo "systemctl restart ${CODENAME}_n${NUM}" >> ${MNODE_HELPER}_${CODENAME} + done - if [ "$startnodes" -eq 1 ]; then - echo "" - echo "** Your nodes are starting up. If you haven't set masternode private key, Don't forget to change the masternodeprivkey later." - ${MNODE_HELPER}_${CODENAME} - fi - if [ "$update" -eq 0 ]; then + chmod u+x ${MNODE_HELPER}_${CODENAME} + fi + + if [ "$startnodes" -eq 1 ]; then + echo "" + echo "** Your nodes are starting up. If you haven't set masternode private key, Don't forget to change the masternodeprivkey later." + ${MNODE_HELPER}_${CODENAME} + fi echo "**ALL YOUR MASTERNODE CONFIGURATION IS HERE. INPUT THESE LINES TO YOUR MASTERNODE.CONF**" + echo "" cat /tmp/${CODENAME}_masternode.conf + echo "" echo "**This configuration lines are on /tmp/${CODENAME}_masternode.conf. You can check this file with**" + echo "" echo "cat /tmp/${CODENAME}_masternode.conf" + cat /tmp/${CODENAME}_gui.conf echo "" - fi - tput sgr0 + echo "**For GUI Installation user, configuration files are on /tmp/${CODENAME}_gui.conf. You can check this file with**" + echo "" + echo "cat /tmp/${CODENAME}_gui.conf" + echo "" + tput sgr0 + } # # /* no parameters, create the required network configuration. IPv6 is auto. */ # function prepare_mn_interfaces() { - # this allows for more flexibility since every provider uses another default interface - # current default is: - # * ens3 (vultr) w/ a fallback to "eth0" (Hetzner, DO & Linode w/ IPv4 only) - # - - # check for the default interface status - if [ ! -f /sys/class/net/${ETH_INTERFACE}/operstate ]; then - echo "Default interface doesn't exist, switching to eth0" - export ETH_INTERFACE="eth0" - fi - - # check for the nuse case <3 - if [ -f /sys/class/net/ens160/operstate ]; then - export ETH_INTERFACE="ens160" - fi - - # get the current interface state - ETH_STATUS=$(cat /sys/class/net/${ETH_INTERFACE}/operstate) - - # check interface status - if [[ "${ETH_STATUS}" = "down" ]] || [[ "${ETH_STATUS}" = "" ]]; then - echo "Default interface is down, fallback didn't work. Break here." - exit 1 - fi - - # DO ipv6 fix, are we on DO? - # check for DO network config file - if [ -f ${DO_NET_CONF} ]; then - # found the DO config - if ! grep -q "::8888" ${DO_NET_CONF}; then - echo "ipv6 fix not found, applying!" - sed -i '/iface eth0 inet6 static/a dns-nameservers 2001:4860:4860::8844 2001:4860:4860::8888 8.8.8.8 127.0.0.1' ${DO_NET_CONF} &>> ${SCRIPT_LOGFILE} - ifdown ${ETH_INTERFACE}; ifup ${ETH_INTERFACE}; &>> ${SCRIPT_LOGFILE} + + # this allows for more flexibility since every provider uses another default interface + # current default is: + # * ens3 (vultr) w/ a fallback to "eth0" (Hetzner, DO & Linode w/ IPv4 only) + # + + # check for the default interface status + if [ ! -f /sys/class/net/${ETH_INTERFACE}/operstate ]; then + echo "Default interface doesn't exist, switching to eth0" + export ETH_INTERFACE="eth0" fi - fi - IPV6_INT_BASE="$(ip -6 addr show dev ${ETH_INTERFACE} | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^fe80 | grep -v ^::1 | cut -f1-4 -d':' | head -1)" &>> ${SCRIPT_LOGFILE} + # check for the nuse case <3 + if [ -f /sys/class/net/ens160/operstate ]; then + export ETH_INTERFACE="ens160" + fi - validate_netchoice - echo "IPV6_INT_BASE AFTER : ${IPV6_INT_BASE}" &>> ${SCRIPT_LOGFILE} + # get the current interface state + ETH_STATUS=$(cat /sys/class/net/${ETH_INTERFACE}/operstate) - # user opted for ipv6 (default), so we have to check for ipv6 support - # check for vultr ipv6 box active - if [ -z "${IPV6_INT_BASE}" ] && [ ${net} -ne 4 ]; then - echo "No IPv6 support on the VPS but IPv6 is the setup default. Please switch to ipv4 with flag \"-n 4\" if you want to continue." - echo "" - echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" - echo "${IPV4_DOC_LINK}" - exit 1 - fi + # check interface status + if [[ "${ETH_STATUS}" = "down" ]] || [[ "${ETH_STATUS}" = "" ]]; then + echo "Default interface is down, fallback didn't work. Break here." + exit 1 + fi - # generate the required ipv6 config - if [ "${net}" -eq 6 ]; then - # vultr specific, needed to work - sed -ie '/iface ${ETH_INTERFACE} inet6 auto/s/^/#/' ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} + # DO ipv6 fix, are we on DO? + # check for DO network config file + if [ -f ${DO_NET_CONF} ]; then + # found the DO config + if ! grep -q "::8888" ${DO_NET_CONF}; then + echo "ipv6 fix not found, applying!" + sed -i '/iface eth0 inet6 static/a dns-nameservers 2001:4860:4860::8844 2001:4860:4860::8888 8.8.8.8 127.0.0.1' ${DO_NET_CONF} + ifdown ${ETH_INTERFACE}; ifup ${ETH_INTERFACE}; + fi + fi - # move current config out of the way first - cp ${NETWORK_CONFIG} ${NETWORK_CONFIG}.${DATE_STAMP}.bkp &>> ${SCRIPT_LOGFILE} + IPV6_INT_BASE="$(ip -6 addr show dev ${ETH_INTERFACE} | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^fe80 | grep -v ^::1 | cut -f1-4 -d':' | head -1)" &>> ${SCRIPT_LOGFILE} - # create the additional ipv6 interfaces, rc.local because it's more generic - for NUM in $(seq 1 ${count}); do + validate_netchoice + echo "IPV6_INT_BASE AFTER : ${IPV6_INT_BASE}" &>> ${SCRIPT_LOGFILE} + + # user opted for ipv6 (default), so we have to check for ipv6 support + # check for vultr ipv6 box active + if [ -z "${IPV6_INT_BASE}" ] && [ ${net} -ne 4 ]; then + echo "No IPv6 support on the VPS but IPv6 is the setup default. Please switch to ipv4 with flag \"-n 4\" if you want to continue." + echo "" + echo "See the following link for instructions how to add multiple ipv4 addresses on vultr:" + echo "${IPV4_DOC_LINK}" + exit 1 + fi + + # generate the required ipv6 config + if [ "${net}" -eq 6 ]; then + # vultr specific, needed to work + sed -ie '/iface ${ETH_INTERFACE} inet6 auto/s/^/#/' ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} + + # move current config out of the way first + cp ${NETWORK_CONFIG} ${NETWORK_CONFIG}.${DATE_STAMP}.bkp &>> ${SCRIPT_LOGFILE} + + # create the additional ipv6 interfaces, rc.local because it's more generic + for NUM in $(seq 1 ${count}); do + + # check if the interfaces exist + ip -6 addr | grep -qi "${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}" + if [ $? -eq 0 ] + then + echo "IP for masternode already exists, skipping creation" &>> ${SCRIPT_LOGFILE} + else + echo "Creating new IP address for ${CODENAME} masternode nr ${NUM}" &>> ${SCRIPT_LOGFILE} + if [ "${NETWORK_CONFIG}" = "/etc/rc.local" ]; then + # need to put network config in front of "exit 0" in rc.local + sed -e '$i ip -6 addr add '"${IPV6_INT_BASE}"':'"${NETWORK_BASE_TAG}"'::'"${NUM}"'/64 dev '"${ETH_INTERFACE}"'\n' -i ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} + else + # if not using rc.local, append normally + echo "ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE}" >> ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} + fi + sleep 2 + ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE} &>> ${SCRIPT_LOGFILE} + fi + done # end forloop + fi # end ifneteq6 - # check if the interfaces exist - ip -6 addr | grep -qi "${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}" - if [ $? -eq 0 ] - then - echo "IP for masternode already exists, skipping creation" &>> ${SCRIPT_LOGFILE} - else - echo "Creating new IP address for ${CODENAME} masternode nr ${NUM}" &>> ${SCRIPT_LOGFILE} - if [ "${NETWORK_CONFIG}" = "/etc/rc.local" ]; then - # need to put network config in front of "exit 0" in rc.local - sed -e '$i ip -6 addr add '"${IPV6_INT_BASE}"':'"${NETWORK_BASE_TAG}"'::'"${NUM}"'/64 dev '"${ETH_INTERFACE}"'\n' -i ${NETWORK_CONFIG} - else - # if not using rc.local, append normally - echo "ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE}" >> ${NETWORK_CONFIG} - fi - sleep 2 - ip -6 addr add ${IPV6_INT_BASE}:${NETWORK_BASE_TAG}::${NUM}/64 dev ${ETH_INTERFACE} &>> ${SCRIPT_LOGFILE} - fi - done # end forloop - fi # end ifneteq6 } ##################------------Menu()---------##################################### @@ -799,172 +901,171 @@ ARGS=$(getopt -o "hp:n:c:r:wsudxgk:k2:k3:k4:k5:k6:k7:k8:k9:k10:" -l "help,projec #Bad arguments if [ $? -ne 0 ]; then - help; + help; fi eval set -- "$ARGS"; while true; do - case "$1" in - -h |--help) - shift; - help; - ;; - -p |--project) - shift; - if [ -n "$1" ]; - then - project="$1"; - shift; - fi - ;; - -n |--net) - shift; - if [ -n "$1" ]; - then - net="$1"; - shift; - fi - ;; - -c |--count) - shift; - if [ -n "$1" ]; - then - count="$1"; - shift; - fi - ;; - -r |--release) - shift; - if [ -n "$1" ]; - then - release="$1"; - SCVERSION="$1" - shift; - fi - ;; - -w |--wipe) - shift; - wipe="1"; - ;; - -s |--sentinel) - shift; - sentinel="1"; - ;; - -u |--update) - shift; - update="1"; - ;; - -d |--debug) - shift; - debug="1"; - ;; - -x|--startnodes) - shift; - startnodes="1"; - ;; - - -g | --generate) - shift; - generate="1"; - ;; - -k |--key) - shift; - if [ -n "$1" ]; - then - PRIVKEY[1]="$1"; - shift; - fi - ;; - -k2 |--key2) - shift; - if [ -n "$1" ]; - then - PRIVKEY[2]="$1"; - shift; - fi - ;; - -k3 |--key3) - shift; - if [ -n "$1" ]; - then - PRIVKEY[3]="$1"; - shift; - fi - ;; - -k4 |--key4) - shift; - if [ -n "$1" ]; - then - PRIVKEY[4]="$1"; - shift; - fi - ;; - -k5 |--key5) - shift; - if [ -n "$1" ]; - then - PRIVKEY[5]="$1"; - shift; - fi - ;; - -k6 |--key6) - shift; - if [ -n "$1" ]; - then - PRIVKEY[6]="$1"; - shift; - fi - ;; - -k7 |--key7) - shift; - if [ -n "$1" ]; - then - PRIVKEY[7]="$1"; - shift; - fi - ;; - -k8 |--key8) - shift; - if [ -n "$1" ]; - then - PRIVKEY[8]="$1"; - shift; - fi - ;; - -k9 |--key9) - shift; - if [ -n "$1" ]; - then - PRIVKEY[9]="$1"; - shift; - fi - ;; - -k10 |--key10) - shift; - if [ -n "$1" ]; - then - PRIVKEY[10]="$1"; - shift; - fi - ;; - --) - shift; - break; - ;; - esac + case "$1" in + -h |--help) + shift; + help; + ;; + -p |--project) + shift; + if [ -n "$1" ]; + then + project="$1"; + shift; + fi + ;; + -n |--net) + shift; + if [ -n "$1" ]; + then + net="$1"; + shift; + fi + ;; + -c |--count) + shift; + if [ -n "$1" ]; + then + count="$1"; + shift; + fi + ;; + -r |--release) + shift; + if [ -n "$1" ]; + then + release="$1"; + SCVERSION="$1" + shift; + fi + ;; + -w |--wipe) + shift; + wipe="1"; + ;; + -s |--sentinel) + shift; + sentinel="1"; + ;; + -u |--update) + shift; + update="1"; + ;; + -d |--debug) + shift; + debug="1"; + ;; + -x|--startnodes) + shift; + startnodes="1"; + ;; + -g | --generate) + shift; + generate="1"; + ;; + -k |--key) + shift; + if [ -n "$1" ]; + then + PRIVKEY[1]="$1"; + shift; + fi + ;; + -k2 |--key2) + shift; + if [ -n "$1" ]; + then + PRIVKEY[2]="$1"; + shift; + fi + ;; + -k3 |--key3) + shift; + if [ -n "$1" ]; + then + PRIVKEY[3]="$1"; + shift; + fi + ;; + -k4 |--key4) + shift; + if [ -n "$1" ]; + then + PRIVKEY[4]="$1"; + shift; + fi + ;; + -k5 |--key5) + shift; + if [ -n "$1" ]; + then + PRIVKEY[5]="$1"; + shift; + fi + ;; + -k6 |--key6) + shift; + if [ -n "$1" ]; + then + PRIVKEY[6]="$1"; + shift; + fi + ;; + -k7 |--key7) + shift; + if [ -n "$1" ]; + then + PRIVKEY[7]="$1"; + shift; + fi + ;; + -k8 |--key8) + shift; + if [ -n "$1" ]; + then + PRIVKEY[8]="$1"; + shift; + fi + ;; + -k9 |--key9) + shift; + if [ -n "$1" ]; + then + PRIVKEY[9]="$1"; + shift; + fi + ;; + -k10 |--key10) + shift; + if [ -n "$1" ]; + then + PRIVKEY[10]="$1"; + shift; + fi + ;; + --) + shift; + break; + ;; + esac done # Check required arguments if [ -z "$project" ] then - show_help; + show_help; fi # Check required arguments if [ "$wipe" -eq 1 ]; then - get_confirmation "Would you really like to WIPE ALL DATA!? YES/NO y/n" && wipe_all - exit 0 + get_confirmation "Would you really like to WIPE ALL DATA!? YES/NO y/n" && wipe_all + exit 0 fi ################################################# @@ -973,57 +1074,60 @@ source ${SCRIPTPATH}/config/default.env ################################################# main() { - echo "starting" &> ${SCRIPT_LOGFILE} - showbanner - - # debug - if [ "$debug" -eq 1 ]; then - echo "********************** VALUES AFTER CONFIG SOURCING: ************************" - echo "START DEFAULTS => " - echo "SCRIPT_VERSION: $SCRIPT_VERSION" - echo "SSH_INBOUND_PORT: ${SSH_INBOUND_PORT}" - echo "SYSTEMD_CONF: ${SYSTEMD_CONF}" - echo "NETWORK_CONFIG: ${NETWORK_CONFIG}" - echo "NETWORK_TYPE: ${NETWORK_TYPE}" - echo "ETH_INTERFACE: ${ETH_INTERFACE}" - echo "MNODE_CONF_BASE: ${MNODE_CONF_BASE}" - echo "MNODE_DATA_BASE: ${MNODE_DATA_BASE}" - echo "MNODE_USER: ${MNODE_USER}" - echo "MNODE_HELPER: ${MNODE_HELPER}" - echo "MNODE_SWAPSIZE: ${MNODE_SWAPSIZE}" - echo "CODE_DIR: ${CODE_DIR}" - echo "SCVERSION: ${SCVERSION}" - echo "RELEASE: ${release}" - echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" - echo "END DEFAULTS => " - fi - - # source project configuration - source_config ${project} - - # debug - if [ "$debug" -eq 1 ]; then - echo "START PROJECT => " - echo "CODENAME: $CODENAME" - echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" - echo "MNODE_DAEMON: ${MNODE_DAEMON}" - echo "MNODE_INBOUND_PORT: ${MNODE_INBOUND_PORT}" - echo "GIT_URL: ${GIT_URL}" - echo "SCVERSION: ${SCVERSION}" - echo "RELEASE: ${release}" - echo "NETWORK_BASE_TAG: ${NETWORK_BASE_TAG}" - echo "END PROJECT => " - - echo "START OPTIONS => " - echo "RELEASE: ${release}" - echo "PROJECT: ${project}" - echo "SETUP_MNODES_COUNT: ${count}" - echo "NETWORK_TYPE: ${NETWORK_TYPE}" - echo "NETWORK_TYPE: ${net}" - - echo "END OPTIONS => " - echo "********************** VALUES AFTER CONFIG SOURCING: ************************" - fi + + echo "starting" &> ${SCRIPT_LOGFILE} + showbanner + + # debug + if [ "$debug" -eq 1 ]; then + echo "********************** VALUES AFTER CONFIG SOURCING: ************************" + echo "START DEFAULTS => " + echo "SCRIPT_VERSION: $SCRIPT_VERSION" + echo "SSH_INBOUND_PORT: ${SSH_INBOUND_PORT}" + echo "SYSTEMD_CONF: ${SYSTEMD_CONF}" + echo "NETWORK_CONFIG: ${NETWORK_CONFIG}" + echo "NETWORK_TYPE: ${NETWORK_TYPE}" + echo "ETH_INTERFACE: ${ETH_INTERFACE}" + echo "MNODE_CONF_BASE: ${MNODE_CONF_BASE}" + echo "MNODE_DATA_BASE: ${MNODE_DATA_BASE}" + echo "MNODE_USER: ${MNODE_USER}" + echo "MNODE_HELPER: ${MNODE_HELPER}" + echo "MNODE_SWAPSIZE: ${MNODE_SWAPSIZE}" + echo "NETWORK_BASE_TAG: ${NETWORK_BASE_TAG}" + echo "CODE_DIR: ${CODE_DIR}" + echo "SCVERSION: ${SCVERSION}" + echo "RELEASE: ${release}" + echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" + echo "END DEFAULTS => " + fi + + # source project configuration + source_config ${project} + + # debug + if [ "$debug" -eq 1 ]; then + echo "START PROJECT => " + echo "CODENAME: $CODENAME" + echo "SETUP_MNODES_COUNT: ${SETUP_MNODES_COUNT}" + echo "MNODE_DAEMON: ${MNODE_DAEMON}" + echo "MNODE_INBOUND_PORT: ${MNODE_INBOUND_PORT}" + echo "GIT_URL: ${GIT_URL}" + echo "SCVERSION: ${SCVERSION}" + echo "RELEASE: ${release}" + echo "NETWORK_BASE_TAG: ${NETWORK_BASE_TAG}" + echo "END PROJECT => " + + echo "START OPTIONS => " + echo "RELEASE: ${release}" + echo "PROJECT: ${project}" + echo "SETUP_MNODES_COUNT: ${count}" + echo "NETWORK_TYPE: ${NETWORK_TYPE}" + echo "NETWORK_TYPE: ${net}" + + echo "END OPTIONS => " + echo "********************** VALUES AFTER CONFIG SOURCING: ************************" + fi + } main "$@" From 5602789920e2e15105b43ebced3a8f58ad89961d Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sat, 15 Dec 2018 02:35:16 +0900 Subject: [PATCH 36/43] Update masternode guide Update for new GUI feature c556fce --- README.md | 312 ++++++++---------- .../masternode_vps/check-blocks-number.png | Bin 3952 -> 2524 bytes .../check-masternode-status.png | Bin 30120 -> 7563 bytes .../masternode_vps/end-of-installation.png | Bin 33073 -> 18731 bytes ...tall-the-desired-masternode-and-amount.png | Bin 50599 -> 34206 bytes docs/images/masternode_vps/rewards.png | Bin 16137 -> 3137 bytes .../masternode_vps/step1-newaddress.png | Bin 23431 -> 15070 bytes .../step1-newmasternodealias.png | Bin 0 -> 17936 bytes .../step1-newmasternodealias_inputed.png | Bin 0 -> 15827 bytes .../masternode_vps/step1-send10kphr.png | Bin 49136 -> 24870 bytes 10 files changed, 140 insertions(+), 172 deletions(-) create mode 100644 docs/images/masternode_vps/step1-newmasternodealias.png create mode 100644 docs/images/masternode_vps/step1-newmasternodealias_inputed.png diff --git a/README.md b/README.md index 098c3305..17b6d446 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,9 @@ This masternode installation script vastly simplifies the setup of a Phore masternode running on a virtual private server (VPS), and it also adds a number of other powerful features, including: -* IPv6 Support -* Installs 1-100 (or more!) Phore masternodes in parallel on one VPS, with individual phore.conf and data directories +* IPv6/IPv4 Support +* With IPv6 Installs 1-100 (or more!) Phore masternodes in parallel on one VPS, with individual phore.conf and data directories +* With IPv4, You can install 1 Phore masternodes per IPv4 address * It can install masternodes for other coins on the same VPS as Phore * 100% auto-compilation and 99% of configuration on the masternode side of things * Automatically compiling from the latest Phore release tag, or another tag can be specified @@ -13,8 +14,8 @@ This masternode installation script vastly simplifies the setup of a Phore maste Some notes and requirements: * Script has only been tested on a Vultr VPS, but should work almost anywhere where IPv6 addresses are available -* Currently only Ubuntu 16.04, 18.04 LTS Linux is supported -* This script needs to run as root or with sudo, the masternodes will and should not! +* Currently only Ubuntu 16.04, 18.04 LTS is supported +* This script needs to run as root! This project was forked from https://github.com/masternodes/vps. @marsmensch (Florian) is the primary author behind this VPS installation script for masternodes. If you would like to donate to him, you can use the BTC address below @@ -28,7 +29,7 @@ BTC 33ENWZ9RCYBG7nv6ac8KxBUSuQX64Hx3x3 ## How to get VPS server -For new masternode owners, **Vultr** is recommended as a VPS hosting provider, but other providers that allow direct root SSH login access and offer Ubuntu 16.04, 18.04 LTS may work. +For new masternode owners, **Vultr** is recommended as a VPS hosting provider, but other providers that allow direct root SSH login access and offer Ubuntu 16.04, 18.04 may work. You can use the following referral link to sign up with Vultr for VPS hosting: @@ -46,9 +47,9 @@ You can choose any location. You may wish to have it hosted in a city/country ne VPS location choice -## Linux distribution (Ubuntu 16.04 LTS) +## Linux distribution (Ubuntu 16.04/18.04 LTS) -Select Ubuntu 16.04. +Select Ubuntu 16.04/18.04. VPS location choice @@ -106,198 +107,131 @@ For Mac users, open Terminal (e.g., Press Command-Space and type Terminal and pr ``` ssh -l root ``` + ## Install Masternode Login to your newly installed node as "root". VPS sizing -Enter this command to copy the Masternode installation script and install a single Phore Masternode: +### Install One Phore Masternode +Enter this command to copy the Masternode installation script and install a single Phore Masternode with IPv6: ```bash -git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore +git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -g -x ``` -This prepares the system and installs the Phore Masternode daemon. This includes downloading the latest Phore masternode release, creating a swap file, configuring the firewall, and compiling the Phore Masternode from source code. This process takes about 10-15 minutes. +With IPv4 address: +```bash +git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -n 4 -g -x +``` +This prepares the system and installs the Phore Masternode daemon. This includes downloading the latest Phore masternode release, creating a swap file, configuring the firewall, and compiling the Phore Masternode from source code, generate configuration file and masternode privkey. This process takes about 20-30 minutes. VPS configuration While that is underway, go back to your local desktop and open phore-qt. -### Preinput masternode private key within installation (you can generate masternode private key with Step 2 below). - In these cases, you can skip "Configure masternode configuration files" below. -- If you already generated masternode private key - Enter this command. +### Install Multiple Phore Masternode +Enter this command to copy the Masternode installation script and install a single Phore Masternode with IPv6: +```bash +git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 -g -x +``` +`-c 3` term means 3 phore masternodes. + +IPv4: You can't install automatically with multiple IPv4 address with this script. + +## Update Mastenode + You should first remove the old version of the VPS script so that the new one you download is tagged with the latest version, and then you add a -u parameter to upgrade existing nodes: + ```bash - git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -k **PRIVATE KEY** + rm -rf /root/vps ``` - **PRIVATE KEY** means your generated masternode private key. For example, ```bash - git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -k 87AqVXXXXXERNJxqBGdSS9LDS2vXXXXX5RdiiNd1zM7YAM7SHWX + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -u ``` - In this script, you can find configuration in masternode.conf in your PC. - enter this to check it. + + The project is configured to use the latest official release of the Phore masternode code, and we will update this project each time a new release is issued, but without downloading the latest version of this project and using the -u parameter, the script will not update an existing Phore node that is already installed. + +### Complex Situations +- In single masternode installation, if you already generated masternode private key + Enter this command. ```bash - cat /tmp/phore_masternode.conf + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -x -k **PRIVATE KEY** ``` - and add these lines to your masternode.conf. -- If you want to generate masternode private key within masternode installation - Use this command + **PRIVATE KEY** means your generated masternode private key. For example, ```bash - git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -g + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -x -k 87AqVXXXXXERNJxqBGdSS9LDS2vXXXXX5RdiiNd1zM7YAM7SHWX ``` - And you can check generated private key in PuTTY. In this script, you can find configuration in masternode.conf in your PC. + In this script, you can find configuration in masternode.conf in your PC. enter this to check it. ```bash cat /tmp/phore_masternode.conf ``` and add these lines to your masternode.conf. -### More complex situations (ignore if you are installing a single masternode on a new VPS) +- In multiple masternodes installation and if you already have your masternode private keys, you can add them as shown below (all entered on one line): -If you wish to install more than one masternode on the same VPS, you can add a -c parameter to tell the script how many to configure, so for example this would install three Phore masternodes (all entered on one line): - -```bash -git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 -``` - -If you already have your masternode private keys, you can add them as shown below (all entered on one line): + ```bash + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 -x --key **PRIVATE KEY 01** --key2 **PRIVATE KEY 02** --key3 **PRIVATE KEY 03** + ``` + Using this command, you can skip the step for "Configure masternode configuration files", because the command above adds the masternode private keys to the masternode configuration files. -```bash -git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 --key **PRIVATE KEY 01** --key2 **PRIVATE KEY 02** --key3 **PRIVATE KEY 03** -``` +- If you are adding new masternode, (and if you installed 2 masternodes already) + ``` + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -x -c 3 + ``` + if you want to use --key option, add --key3 **MASTERNODE PRIVKEY 03**. You are able to use + ``` + git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 -g -x + ``` + for new 3rd masternode. -Using this command, you can skip the step for "Configure masternode configuration files", because the command above adds the masternode private keys to the masternode configuration files. +## End of installations -If you are adding new masternode, (and if you installed 2 masternodes already) +When the script finishes, it will look similar to this: -``` -git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 -``` -if you want to use --key option, add --key3 **MASTERNODE PRIVKEY 03**. You are able to use -``` -git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -c 3 -g -x -``` -for new 3rd masternode. +installation ended -If you are upgrading your masternode(s) to a new release, you should first remove the old version of the VPS script so that the new one you download is tagged with the latest version, and then you add a -u parameter to upgrade existing nodes: +Copy **VPS IP** and **Priv Key** to a text file. It will be needed for configuration in Phore wallet(in this example, VPS IP is [2001:19f0:7001:fd4:e2b7::1]:11771, Priv Key is 87KsYyqumG9HJjG000008jtpSEQUKSuEWkBG9xov19cuEsXH5vB). -```bash -rm -rf /root/ -``` -```bash -git clone https://github.com/phoreproject/vps.git && cd vps && ./install.sh -p phore -u -``` +*Tips*: If you installed multiple masternode, copy each *VPS IP*, *Priv Key*. -The project is configured to use the latest official release of the Phore masternode code, and we will update this project each time a new release is issued, but without downloading the latest version of this project and using the -u parameter, the script will not update an existing Phore node that is already installed. +You only have a few steps remaining to complete your masternode configuration. ## Configure Phore Wallet ### Step1 - Create Collateral Transaction -Once the wallet is open on your local computer, generate a new receive address and label it however you want to identify your masternode rewards (e.g., Phore-MN-1). This label will show up in your transactions each time you receive a block reward. + +Once the wallet is open on your local computer, generate a new receive address in *Receive* tab and label it however you want to identify your masternode rewards (e.g., Phore-MN-1). This label will show up in your transactions each time you receive a block reward. Click the Request payment button, and copy the address. making new address -Now go to the Send tab, paste the copied address, and send *exactly* 10,000 PHR to it in a single transaction. Wait for it to confirm on the blockchain. This is the collateral transaction that will be locked and paired with your new masternode. If you are setting up more than one masternode at one time, repeat this process for each one. +Now go to the *Send* tab, paste the copied address, and send *exactly* 10,000 PHR to it in a single transaction. Wait for it to confirm on the blockchain. This is the collateral transaction that will be locked and paired with your new masternode. If you are setting up more than one masternode at one time, repeat this process for each one. sending 10kPHR -### Step 2 - Generate Masternode Private Key -Go to the **[Tools > Debug Console]** and enter these commands below: - -```bash -masternode genkey -``` -This will produce a masternode private key: - -generating masternode private key +### Step 2 - Make New Masternode Configuration +Go to the *Masternodes* Tab and click **ADD MASTERNODE** button. -Copy this value to a text file. It will be needed for both the phore configuration file on the masternode VPS, and the masternode configuration file on the computer with the controlling Phore wallet. +This will open *New Masternode Alias* window. +New Masternode Alias window -If you are setting up multiple masternodes, repeat this step for each one. Each time you run the masternode genkey command it will give you a new private key--it doesn't matter which one you use, but it is important that it is unique for each masternode and that the VPS phore configuration file and wallet masternode configuration file match (see below). +Click **AUTOFIL OUTPUTS** button. It autofills Priv Key, Output, Output ID. +If Output(ID) isn't filled, wait 1~2 mins. +Then enter *Alias Name*, *VPS IP*, *Priv Key*. +*Alias Name* means your masternode name(Only for identify), *VPS IP* is your VPS server IP which was copied in [End of installations](#End-of-installations). +In this example, *Alias Name* is phore-mn01 and *VPS IP* is [2001:19f0:7001:fd4:e2b7::1]:11771, *Priv Key* is 87KsYyqumG9HJjG000008jtpSEQUKSuEWkBG9xov19cuEsXH5vB. -### Step 3 - Masternode Outputs -This will give you the rest of the information you need to configure your masternode in your Phore wallet--the transaction ID and the output index. +New Masternode Alias inputed -```bash -masternode outputs -``` +If you are setting up multiple masternodes, repeat this step for each one. -getting transaction id - -The long string of characters is the *Transaction ID* for your masternode collateral transaction. The number after the long string is the *Index*. Copy and paste these into the text file next to the private key you generated in Step 2. - -If you have multiple masternodes in the same wallet and have done the 10,000 PHR transactions for each of them, masternode outputs will display transaction IDs and indexes for each one. You can choose which private key to go with each transaction ID and index, as long as they are all different, and you make sure the corresponding lines in masternode.conf and the VPS phore configuration files match (see below). - -## End of installations -When the script finishes, it will look similar to this: - -installation ended - -You only have a few steps remaining to complete your masternode configuration. - -## Configure masternode configuration files -Since this installation method supports multiple masternodes, the phore configuration files have a node number added to them (e.g., phore_n1.conf, phore_n2.conf), stored in the /etc/masternodes directory. If you have a single masternode on the VPS, you will only need to edit /etc/masternodes/phore_n1.conf. - -To open phore_n1.conf for editing, enter these commands: -```bash -sudo apt-get install nano -nano /etc/masternodes/phore_n1.conf -``` -The next step adds your masternode private key. - -## Add masternode private key -What you need to change is only masternode private key. -(We recommend using IPv6 which is the default, but if you choose IPv4 when you ran the installation script, please edit #NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER to your VPS IP address). -After typing the nano command, you will see something similar to this. - -add private key - -Copy the masternode private key from the text file you saved it in, and replace HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_phore_1 with that private key (this typically begins with an 8). - -While you have this file opened, copy the information that follows after masternodeaddr=, starting with the open bracket. This is the masternode's IPv6 address and port, and will be needed for the wallet's masternode.conf file. - -Once you have your masternode private key entered, press Ctrl+X . -Then press Y to save, and press Enter to exit. - -Finally, close and restart your Phore wallet so that it will have the new masternode configuration. - -## Start your masternodes -A script for starting all masternodes on the VPS has been created at /usr/local/bin/activate_masternodes_phore.sh. -Run this command after your masternode configuration written above. - -```bash -/usr/local/bin/activate_masternodes_phore -``` - -The masternode daemons will start and begin loading the Phore blockchain. - -## Finishing Wallet Configuration & Activate Masternode -To activate your nodes from your wallet, one of the last steps is to add a line for the masternode in the masternode.conf file. This file has the following format, with each value separated with a space: - -* alias IP:Port masternodeprivatekey collateral_transaction_ID collateral_output_index -* alias - A short name you use to identify the masternode, you can choose this name as long as it is without spaces (e.g., Phore-MN-1) -* IP:Port - The IP address (either IPv6 or IPv4) and the Port where the masternode is running, separated by a colon (:). You copied this from the phore.conf file on the VPS. -* collateral_transaction_ID: This is the transaction ID you copied from masternode outputs. -* collateral_output_index: This is the index you copied from masternode outputs. - -From the wallet menu, edit the local wallet **masternode.conf** file. **[Tools > Open Masternode Configuration File]** -Add the MN conf line, like the example below to the masternode.conf file. Save it, and close the file. It will look like the following example, using your values for each of the fields above. A common mistake is mixing up the private key and the collateral transaction ID--to make this easier, the private key usually begins with an 8. - -example. -``` -Phore-MN-1 [2001:19f0:5001:ca6:2085::1]:11771 88xrxxxxxxxxxxxxxxxxxxxxxxx7K 6b4c9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7ee23 0 -``` - -The image below shows another example using an IPv4 IP address. If you followed this guide you are probably using an IPv6 address that looks like the line above. - -editing masternode.conf - -If you are running multiple masternodes, you need to add one of these lines for each masternode, and make sure the private key on each line matches the corresponding private key you entered in the VPS phore configuration file for that masternode. +*Tips:* If you want, you can generate Priv Key here, but you will need to edit masternode configuration file manually on VPS(See [Add masternode private key](#Add-masternode-private-key)). ## Check syncing status of masternode + The masternode cannot complete activation until it is fully synced with the Phore blockchain network. To check the status of your masternode, please enter this command in the VPS terminal. If you have multiple masternodes on the same VPS, you can change n1 to n2 etc. below to check the status of each one. @@ -308,12 +242,12 @@ To check the status of your masternode, please enter this command in the VPS ter The output will look like this: ``` { - "version": 1040500, - "protocolversion": 70005, + "version": 1050100, + "protocolversion": 70006, "walletversion": 61000, "balance": 0.00000000, "privatesend_balance": 0.00000000, - "blocks": 506209, + "blocks": 606209, "timeoffset": 0, "connections": 44, "proxy": "", @@ -347,7 +281,10 @@ We're looking at the *blocks*, and need that to be the latest block in the block Once your masternode has synced up to the latest block, go to next step. The syncing process may take 15-30 minutes or more as the Phore blockchain grows. You can keep checking progress with the command above, by pressing the up arrow and Enter to repeat it. ## Start Masternode -Go to the debug console of your Phore wallet **[Tools->Debug Console]** and enter the following command, replacing **mn-alias** with the name of the masternode in the Alias column of the Masternodes tab: + +Go *Masternodes* tab and click each masternode then click **START ALIAS** button. If you get "successful started", your masternode was finally activated! + +Tips: Sometimes you get *error*, go to the debug console of your Phore wallet **[Tools->Debug Console]** and enter the following command, replacing **mn-alias** with the name of the masternode in the Alias column of the Masternodes tab: ``` startmasternode alias false mn-alias @@ -370,44 +307,72 @@ If you are setting up multiple masternodes, repeat this for each one. You can no It should say ENABLED, and within an hour, the timer in the Active column should start increasing. -Your Phore masternode is now set up and running! Depending on how many masternodes there are, it may take 12-24 hours before you see your first masternode reward--this is normal and rewards should come at more regular intervals after the first one. +Your Phore masternode is now set up and running! Depending on how many masternodes there are, it may take 24-30 hours before you see your first masternode reward--this is normal and rewards should come at more regular intervals after the first one. rewards +## With Manually installation +## Configure masternode configuration files + +Since this installation method supports multiple masternodes, the phore configuration files have a node number added to them (e.g., phore_n1.conf, phore_n2.conf), stored in the /etc/masternodes directory. If you have a single masternode on the VPS, you will only need to edit /etc/masternodes/phore_n1.conf. + +To open phore_n1.conf for editing, enter these commands: +```bash +sudo apt-get install nano +nano /etc/masternodes/phore_n1.conf +``` +The next step adds your masternode private key. + +## Add masternode private key + +What you need to change is only masternode private key. +(We recommend using IPv6 which is the default, but if you choose IPv4 when you ran the installation script, please edit #NEW_IPv4_ADDRESS_FOR_MASTERNODE_NUMBER to your VPS IP address). +After typing the nano command, you will see something similar to this. + +add private key + +Copy the masternode private key from the text file you saved it in, and replace HERE_GOES_YOUR_MASTERNODE_KEY_FOR_MASTERNODE_phore_1 with that private key (this typically begins with an 8). + +While you have this file opened, copy the information that follows after masternodeaddr=, starting with the open bracket. This is the masternode's IPv6 address and port, and will be needed for the wallet's masternode.conf file. + +Once you have your masternode private key entered, press Ctrl+X . +Then press Y to save, and press Enter to exit. + +Finally, close and restart your Phore wallet so that it will have the new masternode configuration. + ## Tips - You can start and stop masternode client manually. Enter this commands. ### Check masternode status on VPS Server You can check your masternode status on VPS server. Use this command. +``` +/usr/local/bin/phore-cli -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 masternode status +``` +If it returns +``` +{ + "txhash": "a7eba991be786ce80948e9099e26f6a816317b2142f9e5e12abea357f885d0f2", + "outputidx": 1, + "netaddr": "[2001:19f0:5c01:457:2044::6]:11771", + "addr": "PEtMbHEuqo1QHs7Xy2wCTTmugAuemyd2mU", + "status": 4, + "message": "Masternode successfully started" +} +``` +like this, Your masternode is successfully started(Please check txhash, outputidx are same as your masternode.conf). - ``` - /usr/local/bin/phore-cli -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 masternode status - ``` - If it returns - ``` - { - "txhash": "a7eba991be786ce80948e9099e26f6a816317b2142f9e5e12abea357f885d0f2", - "outputidx": 1, - "netaddr": "[2001:19f0:5c01:457:2044::6]:11771", - "addr": "PEtMbHEuqo1QHs7Xy2wCTTmugAuemyd2mU", - "status": 4, - "message": "Masternode successfully started" - } - ``` - - like this, Your masternode is successfully started(Please check txhash, outputidx are same as your masternode.conf). - +You can start and stop masternode client manually. Enter this commands. ### To stop ``` /usr/local/bin/phore-cli -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 stop ``` -if use above command, masternode client will restart automatically in 5sec. + +if use this command, masternode client will restart automatically in 5sec. To stop completely, ``` service phore_n1 stop ``` - ### To start +### To start ``` /usr/local/bin/phored -daemon -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 ``` @@ -417,9 +382,11 @@ If you stopped service "phore_n1", use service phore_n1 start ``` - ## Options of this script - The _install.sh_ script support the following parameters: - | Long Option | Short Option | Values | Description | +## Options of this script + +The _install.sh_ script support the following parameters: + +| Long Option | Short Option | Values | Description | | :----------- | :----------- | ------------------- | ------------------------------------------------------------------- | | --project | -p | project, ex. "phore"| shortname for the project | | --net | -n | "4" / "6" | ip type for masternode. (ipv)6 is default | @@ -434,9 +401,10 @@ service phore_n1 start | --generate | -g | -- | generate and preinput masternode private key | ## Issues and Questions + Please open a GitHub Issue if there are problems with this installation method. Many Phore team members activel support people installing masternodes and can provide assistance in the Phore Discord channel. Here is a Discord invitation: -https://discord.gg/sbgdcdv +https://discord.gg/Aucncz5 If you would like to make a donation to Phore's ongoing development, you can send Phore to the core team at this address: PDjGJMDzvJnvbxxgR1bgPm77fFLxn3KAg8 diff --git a/docs/images/masternode_vps/check-blocks-number.png b/docs/images/masternode_vps/check-blocks-number.png index 2293e785685a8ff7b9d19e4f10b5baddbd29c6b6..0c8f93ef66a9e5111728319638cd3c18c9ce91e5 100644 GIT binary patch delta 2500 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 M48Z!;x({Oh2Z*l0FaQ7m diff --git a/docs/images/masternode_vps/check-masternode-status.png b/docs/images/masternode_vps/check-masternode-status.png index 2b53d359fd13b9c9d415e84dd8fc23a5f08a0b58..976d74a90f264a0c4f616b8cea914d96b309e7af 100644 GIT binary patch literal 7563 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 X9cSzieFcYOI{=jBHRLK}-hKHm#)RJ$ literal 30120 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 diff --git a/docs/images/masternode_vps/end-of-installation.png b/docs/images/masternode_vps/end-of-installation.png index 9c7c3be3235be5ef9826e82086448c7db048be1c..04f45bbf24726616e1712365f67ebd128ce4ca76 100644 GIT binary patch literal 18731 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 udH+ZX%St`xwqXmW!f$Jd77XEno=l=(sXVmEc literal 50599 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 Qz%7uJn7n9(@W(Iz56|>P`2YX_ literal 0 HcmV?d00001 diff --git a/docs/images/masternode_vps/step1-send10kphr.png b/docs/images/masternode_vps/step1-send10kphr.png index dfcb898fd2b206a8592b77af41ac1765f91e2146..8f3619524f05fd0052f6cc2fbbd941379d729034 100644 GIT binary patch literal 24870 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 Nl;qT9^JSj<{y#G&VNw79 literal 49136 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 P6OfdcylAzsLE!%e_&x{b From f5c2ae07b70da0746bf5de612ac71a9d93c48179 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sat, 15 Dec 2018 02:36:15 +0900 Subject: [PATCH 37/43] Use v1.5.1 Co-Authored-By: tohsnoom <34115755+tohsnoom@users.noreply.github.com> --- config/phore/phore.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/phore/phore.env b/config/phore/phore.env index 2680364e..4f6ee08a 100644 --- a/config/phore/phore.env +++ b/config/phore/phore.env @@ -2,5 +2,5 @@ CODENAME=phore MNODE_DAEMON=${MNODE_DAEMON:-/usr/local/bin/phored} MNODE_INBOUND_PORT=${MNODE_INBOUND_PORT:-11771} GIT_URL=https://github.com/phoreproject/Phore.git -SCVERSION="tags/v1.4.5" +SCVERSION="tags/v1.5.1" NETWORK_BASE_TAG="2044" From c7832aaece3d9572b928d950618e7405d1d44bde Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sat, 15 Dec 2018 02:45:30 +0900 Subject: [PATCH 38/43] Fix bug within IPv4 installation * delete extra [ to fix falling parse conf lines --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index d4f6b5b8..2a702e23 100755 --- a/install.sh +++ b/install.sh @@ -342,7 +342,7 @@ function create_mn_configuration() { else : fi if [ ${net} -eq 4 ]; then - sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY//" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV4_ADDRESS}/" -e "s/:XXX_NETWORK_BASE_TAG_XXX:://" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf + sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY//" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/${IPV4_ADDRESS}/" -e "s/:XXX_NETWORK_BASE_TAG_XXX:://" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf else sed -e "s/XXX_GIT_PROJECT_XXX/${CODENAME}/" -e "s/XXX_NUM_XXY/${NUM}]/" -e "s/XXX_NUM_XXX/${NUM}/" -e "s/XXX_PASS_XXX/${PASS}/" -e "s/XXX_IPV6_INT_BASE_XXX/[${IPV6_INT_BASE}/" -e "s/XXX_NETWORK_BASE_TAG_XXX/${NETWORK_BASE_TAG}/" -e "s/XXX_MNODE_INBOUND_PORT_XXX/${MNODE_INBOUND_PORT}/" -i ${MNODE_CONF_BASE}/${CODENAME}_n${NUM}.conf fi From eb3e53b4af6fc704092b57592eee913c8769051d Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Thu, 20 Dec 2018 22:39:59 +0900 Subject: [PATCH 39/43] Add another network interface option for scaleway --- install.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/install.sh b/install.sh index 2a702e23..563057e0 100755 --- a/install.sh +++ b/install.sh @@ -817,6 +817,11 @@ function prepare_mn_interfaces() { export ETH_INTERFACE="ens160" fi + # check for scaleway + if [ -f /sys/class/net/ens2/operstate ]; then + export ETH_INTERFACE="ens2" + fi + # get the current interface state ETH_STATUS=$(cat /sys/class/net/${ETH_INTERFACE}/operstate) From 97616013c6599aadce2858df0c1b3871e2a92afc Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Fri, 21 Dec 2018 01:09:37 +0900 Subject: [PATCH 40/43] Fix typo in IP generation --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 563057e0..e1a6d360 100755 --- a/install.sh +++ b/install.sh @@ -874,7 +874,7 @@ function prepare_mn_interfaces() { then echo "IP for masternode already exists, skipping creation" &>> ${SCRIPT_LOGFILE} else - echo "Creating new IP address for ${CODENAME} masternode nr ${NUM}" &>> ${SCRIPT_LOGFILE} + echo "Creating new IP address for ${CODENAME} masternode ${NUM}" &>> ${SCRIPT_LOGFILE} if [ "${NETWORK_CONFIG}" = "/etc/rc.local" ]; then # need to put network config in front of "exit 0" in rc.local sed -e '$i ip -6 addr add '"${IPV6_INT_BASE}"':'"${NETWORK_BASE_TAG}"'::'"${NUM}"'/64 dev '"${ETH_INTERFACE}"'\n' -i ${NETWORK_CONFIG} &>> ${SCRIPT_LOGFILE} From 53649a837395a31a354e3f9f8ac96d3ec40bb869 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Fri, 21 Dec 2018 01:10:28 +0900 Subject: [PATCH 41/43] Fix mispurse NETWORK_BASE_TAG Fix generation feature NETWORK_BASE_TAG --- install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/install.sh b/install.sh index e1a6d360..b847a2dd 100755 --- a/install.sh +++ b/install.sh @@ -30,7 +30,6 @@ declare -r SCRIPT_VERSION="v1.0.0" declare -r SCRIPT_LOGFILE="/tmp/nodemaster_${DATE_STAMP}_out.log" declare -r IPV4_DOC_LINK="https://www.vultr.com/docs/add-secondary-ipv4-address" declare -r DO_NET_CONF="/etc/network/interfaces.d/50-cloud-init.cfg" -declare -r NETWORK_BASE_TAG="$(dd if=/dev/urandom bs=2 count=1 2>/dev/null | od -x -A n | sed -e 's/^[[:space:]]*//g')" function showbanner() { From 3c9a6b196336b6d3efe6db4e398afabb6ccd5ced Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Wed, 26 Dec 2018 23:41:23 +0900 Subject: [PATCH 42/43] Revert IPv6 generation method for scaleway Move TODO --- install.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/install.sh b/install.sh index b847a2dd..a5c43b67 100755 --- a/install.sh +++ b/install.sh @@ -816,10 +816,10 @@ function prepare_mn_interfaces() { export ETH_INTERFACE="ens160" fi - # check for scaleway - if [ -f /sys/class/net/ens2/operstate ]; then - export ETH_INTERFACE="ens2" - fi + # check for scaleway - TODO + #if [ -f /sys/class/net/ens2/operstate ]; then + # export ETH_INTERFACE="ens2" + #fi # get the current interface state ETH_STATUS=$(cat /sys/class/net/${ETH_INTERFACE}/operstate) From 822252708efb91263d9139bb60c3bab01afa82f2 Mon Sep 17 00:00:00 2001 From: liray-unendlich Date: Sat, 29 Dec 2018 15:37:30 +0900 Subject: [PATCH 43/43] Add description about resyncing --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 17b6d446..7303a37e 100644 --- a/README.md +++ b/README.md @@ -341,7 +341,6 @@ Then press Y to save, and press Enter to exit. Finally, close and restart your Phore wallet so that it will have the new masternode configuration. ## Tips - ### Check masternode status on VPS Server You can check your masternode status on VPS server. Use this command. ``` @@ -382,6 +381,20 @@ If you stopped service "phore_n1", use service phore_n1 start ``` +### To resync +``` +service phore_n1 stop +``` +then start phore daemon with resync mode +``` +/usr/local/bin/phored -pid=/var/lib/masternodes/phore1/phore.pid -conf=/etc/masternodes/phore_n1.conf -datadir=/var/lib/masternodes/phore1 -resync +``` + +You can check syncing status with +``` +phore-cli -conf=/etc/masternodes/phore_n1.conf getinfo +``` + ## Options of this script The _install.sh_ script support the following parameters: