For anyone that is running a Linux system with systemd, I updated my safe_systemd script from the last Testnet. Feel free to try it. I added a check to make sure the specified directories have write access. It is looking for the safenode binary in /usr/local/bin. I didn’t include a download and unzip because I don’t want to do a bunch of checks for different tools in case people don’t have curl/wget/unzip/etc.
#!/bin/bash
if [ "$EUID" -ne 0 ]
then echo "Please run using sudo"
exit
fi
[ -f /usr/local/bin/safenode ] || { echo "Error: Please make sure the safenode executable is in /usr/local/bin"; exit 1;}
read -p "Enter the desired number of nodes: " nodenum
re='^[0-9]+$'
if ! [[ $nodenum =~ $re ]] ; then
echo "Error: Not a valid integer" >&2; exit 1
fi
if [[ $nodenum < 1 ]] ; then
echo "Error: A number greater than 1 must be entered"
fi
echo ""
echo "Directories will be created for the Safe data and logs."
read -p "Enter the desired parent directory for Safe data: " rootdir
read -p "Enter the desired parent directory for Safe logs: " logdir
echo "$nodenum Safe nodes will be created."
read -p "Continue (Y/N) " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1
if ! [[ $(getent group safenode) ]]; then
groupadd -g 10500 safenode
fi
if ! [[ $(getent passwd safenode) ]]; then
useradd -u 10500 -g safenode -c "SafeNode User" -M safenode
usermod -L safenode
fi
if read -a rootVals < <(stat -Lc "%U %G %A" $rootdir) && (
( [ "$rootVals" == "safenode" ] && [ "${rootVals[2]:2:1}" == "w" ] ) ||
( [ "${rootVals[2]:8:1}" == "w" ] ) ||
( [ "${rootVals[2]:5:1}" == "w" ] && (
gMember=($(groups safenode)) &&
[[ "${gMember[*]:2}" =~ ^(.* |)${rootVals[1]}( .*|)$ ]]
) ) )
then
:
else
echo 'Safe user does not have access to the root directory. Before running again, make sure uid or gid 10500 has access to the directory. Cleaning up.'
userdel safenode
exit 1
fi
if read -a logVals < <(stat -Lc "%U %G %A" $logdir) && (
( [ "$logVals" == "safenode" ] && [ "${logVals[2]:2:1}" == "w" ] ) ||
( [ "${logVals[2]:8:1}" == "w" ] ) ||
( [ "${logVals[2]:5:1}" == "w" ] && (
gMember=($(groups safenode)) &&
[[ "${gMember[*]:2}" =~ ^(.* |)${logVals[1]}( .*|)$ ]]
) ) )
then
:
else
echo 'Safe user does not have access to the log directory. Before running again, make sure uid or gid 10500 has access to the directory. Cleaning up.'
userdel safenode
exit 1
fi
while [[ $nodenum > 0 ]]
do
cat >> /etc/systemd/system/safenode$nodenum.service << END
[Unit]
Description="Safe Node $nodenum"
[Service]
ExecStart=/usr/local/bin/safenode --root-dir=$rootdir/safenode$nodenum --log-dir=$logdir/safenode$nodenum
User=safenode
Group=safenode
Environment="SAFE_PEERS=/ip4/52.56.104.157/udp/12000/quic-v1/p2p/12D3KooWGxWnfChkZTLTqFCkDMafTkpteBvSdJd3bYdA29q3H7GB,/ip4/3.9.177.176/udp/12000/quic-v1/p2p/12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU,/ip4/13.40.28.114/udp/12000/quic-v1/p2p/12D3KooWBsWbQPhZYCJgCDn4iYqk8AArnmPrkzUBcEzDYkAjR3md,/ip4/13.40.72.208/udp/12000/quic-v1/p2p/12D3KooWFr9Df8o8tpj2WZvfUU4p3xsTteYdEsi26rwBmwBvjSDF"
[Install]
WantedBy=multi-user.target
END
systemctl daemon-reload
systemctl enable safenode$nodenum
systemctl start safenode$nodenum
((nodenum--))
done
echo "Your Safe Node(s) should now be running."
echo "You can view their status using 'systemctl status safenode<number>'"
exit 0
Here is the cleanup script:
#!/bin/bash
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit
fi
echo "This will stop and remove all nodes from systemd."
read -p "Continue (Y/N) " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1
nodesrem=true
node=1
while [ "$nodesrem" = "true" ]
do
systemctl list-unit-files |grep -q "^safenode$node.service" || nodesrem=false
if [ "$nodesrem" = "true" ]
then
((node++))
fi
done
((node--))
while [[ $node > 0 ]]
do
systemctl stop safenode$node
systemctl disable safenode$node
rm /etc/systemd/system/safenode$node.service
((node--))
done
systemctl daemon-reload
userdel safenode
echo "The nodes should be stopped and the user removed. You will need to manually remove the data and log directories if desired."
exit 0
rm -rf /tmp/safenode && ./safenode --root-dir=/tmp/safenode
./safenode: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./safenode)
./safenode: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by ./safenode)
./safenode: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./safenode)
This is unfortunately a bug in the client code, which expects all the nodes in the close group (8 of them) to return with a thumbs up. Even if one of the request fails, we get this error.
There is a PR that should get in for the next testnet, and it will address this issue.
It seems all my nodes stopped again. They all timed out or something. I was receiving put requests and storing data, so my nodes were active and working before the timeouts.
safe --peer=/ip4/52.56.104.157/udp/12000/quic-v1/p2p/12D3KooWGxWnfChkZTLTqFCkDMafTkpteBvSdJd3bYdA29q3H7GB files upload minion3.jpg
Removed old logs from directory: "/tmp/safe-client.log"
Starting logging to directory: "/tmp/safe-client.log"
Instantiating a SAFE client...
Edit - that’s from a cloud Ubuntu client. Works fine from home Mint client.
Home network do not equals NAT!
Also still no answer to my question about how to check if node is connected fine (if my firewall settings are ok).
Where is my dislike button?
Well it worked once (client uploading a dir) and now it’s back to hanging again. Strange.
This?
[2023-05-16T17:20:15.209361Z TRACE safenode::client::event] Error occurred when trying to broadcast a client event (ConnectedToNetwork): channel closed
[2023-05-16T17:20:15.203875Z INFO safenode::peers_acquisition] Using contact peers from $SAFE_PEERS env var to intitiate contact with the network: ["/ip4/3.9.177.176/udp/12000/quic-v1/p2p/12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU"]
[2023-05-16T17:20:15.204560Z INFO safenode::client::api] Starting Kad swarm in client mode...
[2023-05-16T17:20:15.204750Z INFO safenode::network] Node (PID: 33667) with PeerId: 12D3KooWKVbdBqXcK6qYK1nGLvpjWPCZUe7LT2w2rU8DZQV1dqc4
[2023-05-16T17:20:15.207644Z INFO safenode::client::api] Client constructed network and swarm_driver
[2023-05-16T17:20:15.207693Z TRACE safenode::client::api] Starting up client swarm_driver
[2023-05-16T17:20:15.208983Z INFO safenode::client::api] Client waiting for a network event
[2023-05-16T17:20:15.209029Z TRACE safenode::client::api] Client dialing network
[2023-05-16T17:20:15.209330Z TRACE safenode::client::api] Client recevied a network event PeerAdded(PeerId("12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU"))
[2023-05-16T17:20:15.209354Z DEBUG safenode::client::api] PeerAdded: 12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU
[2023-05-16T17:20:15.209361Z TRACE safenode::client::event] Error occurred when trying to broadcast a client event (ConnectedToNetwork): channel closed
[2023-05-16T17:20:15.209364Z INFO safenode::client::api] Client waiting for a network event
[2023-05-16T17:20:15.218400Z INFO safenode::network::event] Connected with PeerId("12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU")
[2023-05-16T17:20:15.727841Z INFO safenode::network::event] IdentifyEvent: Received { peer_id: PeerId("12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU"), info: Info { public_key: Ed25519(PublicKey(compressed): 1e1a73496ccb40c8d7775bba125fe8d3eea732979e9dcc3d40814c6a4155af), protocol_version: "safe/0.1.0", agent_version: "safe/node/0.1.0", listen_addrs: ["/ip4/127.0.0.1/udp/12000/quic-v1", "/ip4/10.0.0.237/udp/12000/quic-v1", "/ip4/3.9.177.176/udp/12000/quic-v1", "/ip4/10.0.0.237/udp/12000/quic-v1/p2p/12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU", "/ip4/10.0.0.237/udp/12000/quic-v1", "/ip4/3.9.177.176/udp/12000/quic-v1/p2p/12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU"], protocols: ["/safe/1", "/ipfs/kad/1.0.0", "/ipfs/id/1.0.0", "/ipfs/id/push/1.0.0"], observed_addr: "/ip4/139.162.240.13/udp/41874/quic-v1" } }
[2023-05-16T17:20:15.728471Z INFO safenode::network::event] Adding peer to routing table, based on received identify info from PeerId("12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU"): Info { public_key: Ed25519(PublicKey(compressed): 1e1a73496ccb40c8d7775bba125fe8d3eea732979e9dcc3d40814c6a4155af), protocol_version: "safe/0.1.0", agent_version: "safe/node/0.1.0", listen_addrs: ["/ip4/127.0.0.1/udp/12000/quic-v1", "/ip4/10.0.0.237/udp/12000/quic-v1", "/ip4/3.9.177.176/udp/12000/quic-v1", "/ip4/10.0.0.237/udp/12000/quic-v1/p2p/12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU", "/ip4/10.0.0.237/udp/12000/quic-v1", "/ip4/3.9.177.176/udp/12000/quic-v1/p2p/12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU"], protocols: ["/safe/1", "/ipfs/kad/1.0.0", "/ipfs/id/1.0.0", "/ipfs/id/push/1.0.0"], observed_addr: "/ip4/139.162.240.13/udp/41874/quic-v1" }
[2023-05-16T17:20:15.729334Z INFO safenode::network::event] IdentifyEvent: Sent { peer_id: PeerId("12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU") }
[2023-05-16T17:20:35.219540Z INFO safenode::network::event] Connection closed to Peer 12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU - Dialer { address: "/ip4/3.9.177.176/udp/12000/quic-v1/p2p/12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU/p2p/12D3KooWBqsnvR5R4d7xn8ZPUX8skuYvXnJbsf6VPR729qEi9JZU", role_override: Dialer } - Some(KeepAliveTimeout)
➜ Desktop ./safe files upload -- ~/Desktop/RICE.png
Removed old logs from directory: "/var/folders/z_/n_9kwvnn5f11q35z7m18c8sm0000gn/T/safe-client.log"
Starting logging to directory: "/var/folders/z_/n_9kwvnn5f11q35z7m18c8sm0000gn/T/safe-client.log"
Instantiating a SAFE client...
Storing file "RICE.png" of 221754 bytes..
Did not store file "RICE.png" to all nodes in the close group! Network Error Could not get enough peers (8) to satisfy the request, found 0.
Writing 8 bytes to "/Users/x/.safe/client/uploaded_files/file_names_2023-05-16_19-35-07"
➜ Desktop ./safe files download -- testnet.exe 332f45ae9482a8e03b5d5579f15fd9c8806fe4a2b30da2bc6e5ebb9a98fe4095
Removed old logs from directory: "/var/folders/z_/n_9kwvnn5f11q35z7m18c8sm0000gn/T/safe-client.log"
Starting logging to directory: "/var/folders/z_/n_9kwvnn5f11q35z7m18c8sm0000gn/T/safe-client.log"
Instantiating a SAFE client...
Downloading file "testnet.exe" with address 332f45ae9482a8e03b5d5579f15fd9c8806fe4a2b30da2bc6e5ebb9a98fe4095
Did not get file "testnet.exe" from the network! Network Error Record was not found locally.