Skip to content

Commit 178a2a3

Browse files
committed
Create installer.sh
1 parent d4e0225 commit 178a2a3

1 file changed

Lines changed: 268 additions & 0 deletions

File tree

installer.sh

Lines changed: 268 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,268 @@
1+
#!/bin/bash
2+
3+
# Installer for OpenPod, for more information see https://github.com/blokbot-io/OpenBlok/blob/master/install.sh
4+
5+
6+
# ---------------------------------------------------------------------------- #
7+
# Disable Prompts #
8+
# ---------------------------------------------------------------------------- #
9+
export DEBIAN_FRONTEND=noninteractive
10+
sed -i "/#\$nrconf{restart} = 'i';/s/.*/\$nrconf{restart} = 'a';/" /etc/needrestart/needrestart.conf
11+
12+
13+
# ---------------------------------------------------------------------------- #
14+
# Help #
15+
# ---------------------------------------------------------------------------- #
16+
Help()
17+
{
18+
# Display Help
19+
echo "OpenPod instalation script"
20+
echo
21+
echo "h Display this help"
22+
echo "b Set custom branch for OpenPod"
23+
echo "u Set custom URL for OpenPod"
24+
echo "d Enable debug mode"
25+
}
26+
27+
# TO FIX: ARGS VS OPTS
28+
29+
# ---------------------------------------------------------------------------- #
30+
# Defaults #
31+
# ---------------------------------------------------------------------------- #
32+
DEBUG=flase # -d
33+
REPO='https://github.com/RecursionSpace/OpenPod'
34+
35+
# ---------------------------------------------------------------------------- #
36+
# Options #
37+
# ---------------------------------------------------------------------------- #
38+
while getopts ":hbdu" flags; do
39+
case "${flags}" in
40+
h) # display Help
41+
Help
42+
exit;;
43+
b) # Custom branch
44+
BRANCH="${OPTARG}";;
45+
d) # Enable debug mode
46+
DEBUG=true ;;
47+
u) # Custom URL endpoint
48+
URL="${OPTARG}";;
49+
\?) echo "Invalid option: -${OPTARG}" >&2;
50+
exit 1 ;;
51+
esac
52+
done
53+
54+
if [ $DEBUG ]; then
55+
BRANCH='dev-release'
56+
URL='dev.recursion.space'
57+
API_URL='dev.api.recursion.space'
58+
elif [ ! $DEBUG ]; then
59+
BRANCH='release'
60+
URL='recursion.space'
61+
API_URL='api.recursion.space'
62+
fi
63+
64+
echo "Installing OpenPod with the following options:"
65+
echo "Debug | $DEBUG"
66+
echo "Repo | $REPO"
67+
echo "Branch | $BRANCH"
68+
echo "URL | $URL"
69+
echo "API_URL | $API_URL"
70+
71+
# -------------------------------- Verify Root ------------------------------- #
72+
if [ "$EUID" -ne 0 ]
73+
then echo "Please run as root with sudo."
74+
exit
75+
fi
76+
77+
# --------------------------------- SSH User --------------------------------- #
78+
echo "Verifying SSH user 'openpod'"
79+
80+
if ! id -u "openpod" >/dev/null 2>&1; then
81+
echo "Creating user 'openpod'"
82+
useradd -m -s /bin/bash openpod
83+
usermod -aG sudo openpod
84+
mkdir -p ~openpod/.ssh/ && touch ~openpod/.ssh/authorized_keys
85+
echo "openpod ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers > /dev/null
86+
else
87+
echo "User 'openpod' already exists, skipping..."
88+
mkdir -p ~openpod/.ssh/ && touch ~openpod/.ssh/authorized_keys
89+
fi
90+
91+
# ---------------------------- Update System Time ---------------------------- #
92+
sudo timedatectl set-timezone UTC
93+
94+
95+
# ---------------------------------------------------------------------------- #
96+
# Dependencies #
97+
# ---------------------------------------------------------------------------- #
98+
99+
# ------------------------------ build-essential ----------------------------- #
100+
# Required to install RPi.GPIO - https://github.com/ynsta/steamcontroller/issues/42
101+
REQUIRED_PKG="build-essential"
102+
PKG_OK=$(dpkg-query -W --showformat='${Status}\n' $REQUIRED_PKG|grep "install ok installed")
103+
if [ "" = "$PKG_OK" ]; then
104+
echo "No $REQUIRED_PKG. Setting up $REQUIRED_PKG..."
105+
sudo apt-get install build-essential -y
106+
else
107+
echo "build-essential already installed, skipping..."
108+
fi
109+
110+
# ---------------------------------- chrony ---------------------------------- #
111+
REQUIRED_PKG="chrony"
112+
PKG_OK=$(dpkg-query -W --showformat='${Status}\n' $REQUIRED_PKG|grep "install ok installed")
113+
if [ "" = "$PKG_OK" ]; then
114+
echo "No $REQUIRED_PKG. Setting up $REQUIRED_PKG..."
115+
sudo apt-get install chrony -y
116+
sudo chronyd -q
117+
else
118+
echo "chrony already installed, skipping..."
119+
fi
120+
121+
# ----------------------------------- unzip ---------------------------------- #
122+
REQUIRED_PKG="unzip"
123+
PKG_OK=$(dpkg-query -W --showformat='${Status}\n' $REQUIRED_PKG|grep "install ok installed")
124+
if [ "" = "$PKG_OK" ]; then
125+
echo "No $REQUIRED_PKG. Setting up $REQUIRED_PKG..."
126+
sudo apt-get install unzip -y
127+
else
128+
echo "unzip already installed, skipping..."
129+
fi
130+
131+
# ------------------------------------ jq ------------------------------------ #
132+
REQUIRED_PKG="jq"
133+
PKG_OK=$(dpkg-query -W --showformat='${Status}\n' $REQUIRED_PKG|grep "install ok installed")
134+
if [ "" = "$PKG_OK" ]; then
135+
echo "No $REQUIRED_PKG. Setting up $REQUIRED_PKG..."
136+
sudo apt-get install jq -y
137+
else
138+
echo "jq already installed, skipping..."
139+
fi
140+
141+
# -------------------------------- Python 3.11 ------------------------------- #
142+
pytohn_version=$(python -c 'import sys; print(".".join(map(str, sys.version_info[0:2])))')
143+
if [ "$pytohn_version" != "3.11" ]; then
144+
sudo apt install software-properties-common -y
145+
yes '' | sudo add-apt-repository ppa:deadsnakes/ppa
146+
sudo apt-get install python3.11 -y
147+
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.11 1
148+
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1
149+
else
150+
echo "Python 3.11 already installed"
151+
fi
152+
153+
# -------------------------------- Python-Dev -------------------------------- #
154+
REQUIRED_PKG="python3.11-dev"
155+
PKG_OK=$(dpkg-query -W --showformat='${Status}\n' $REQUIRED_PKG|grep "install ok installed")
156+
if [ "" = "$PKG_OK" ]; then
157+
echo "No $REQUIRED_PKG. Setting up $REQUIRED_PKG..."
158+
sudo apt-get install python3.11-dev -y
159+
else
160+
echo "python3.11-dev already installed, skipping..."
161+
fi
162+
163+
# ------------------------ Python Virtual Environment ------------------------ #
164+
REQUIRED_PKG="python3.11-venv"
165+
PKG_OK=$(dpkg-query -W --showformat='${Status}\n' $REQUIRED_PKG|grep "install ok installed")
166+
if [ "" = "$PKG_OK" ]; then
167+
echo "No $REQUIRED_PKG. Setting up $REQUIRED_PKG..."
168+
sudo apt-get install python3.11-venv -y
169+
else
170+
echo "python3.11-venv already installed, skipping..."
171+
fi
172+
173+
# ---------------------------------------------------------------------------- #
174+
# OpenPod #
175+
# ---------------------------------------------------------------------------- #
176+
177+
# -------------------------- Clear Previous Install -------------------------- #
178+
sudo rm -rf /opt/OpenPod
179+
sudo systemctl stop openpod.service
180+
181+
# ------------------------------- Clone OpenPod ------------------------------ #
182+
set -e # Exit when any command fails.
183+
sudo mkdir -p /opt
184+
cd /opt
185+
sudo git clone --single-branch --branch $BRANCH "${REPO}".git
186+
cd OpenPod
187+
188+
# ----------------------------- Setup Enviroment ----------------------------- #
189+
sudo python3.11 -m venv /opt/OpenPod/env
190+
source /opt/OpenPod/env/bin/activate
191+
pip install --no-input -U -r /opt/OpenPod/requirements.txt
192+
193+
# ---------------------------- Create Directories ---------------------------- #
194+
sudo mkdir -p /opt/OpenPod/logs
195+
sudo mkdir -p /opt/OpenPod/data
196+
197+
# ------------------------------- Create Files ------------------------------- #
198+
# Log Location
199+
sudo touch /opt/OpenPod/logs/RecursionLog.log
200+
sudo touch /opt/OpenPod/logs/System.Snapshot
201+
202+
# Data Location
203+
sudo touch /opt/OpenPod/data/dump.json
204+
sudo touch /opt/OpenPod/data/nodes.json
205+
sudo touch /opt/OpenPod/data/owners.json
206+
sudo touch /opt/OpenPod/data/permissions.json
207+
208+
# -------------------------------- system.json ------------------------------- #
209+
sudo touch /opt/OpenPod/system.json
210+
serial_uuid=$(cat /proc/sys/kernel/random/uuid)
211+
serial=${serial_uuid//-}
212+
xbee_uuid=$(cat /proc/sys/kernel/random/uuid)
213+
openpod_version=$(git rev-parse HEAD)
214+
echo '{
215+
"uuid": "'"$serial_uuid"'",
216+
"debug": '$DEBUG',
217+
"serial": "'"$serial"'",
218+
"timezone": "UTC",
219+
"url": "'"$URL"'",
220+
"api_url": "'"$API_URL"'",
221+
"XBEE": {
222+
"KY": "'"$xbee_uuid"'",
223+
"OP": false
224+
},
225+
"GPIO": {
226+
"LED_IO": 23,
227+
"LED_STAT": 17
228+
},
229+
"version": "'"$openpod_version"'",
230+
"OpenPod": {
231+
"repo": "'"$REPO"'",
232+
"branch": "'"$BRANCH"'",
233+
"commit": "'"$openpod_version"'"
234+
}
235+
}' > /opt/OpenPod/system.json
236+
237+
# --------------------------- Create Version Folder -------------------------- #
238+
mkdir -p /opt/OpenPod/versions/"$openpod_version"
239+
sudo cp -a /opt/OpenPod/openpod/. /opt/OpenPod/versions/"$openpod_version"/
240+
sudo rm -rf /opt/OpenPod/openpod
241+
242+
# --------------------------- Setup OpenPod Service -------------------------- #
243+
cat <<EOF > /etc/systemd/system/openpod.service
244+
[Unit]
245+
Description=OpenPod | Recursion.Space
246+
After=network.target
247+
StartLimitIntervalSec=0
248+
249+
[Service]
250+
Type=simple
251+
User=root
252+
WorkingDirectory=/opt/OpenPod
253+
254+
ExecStart = /bin/bash -c "exec /opt/OpenPod/env/bin/python3.11 \\
255+
/opt/OpenPod/versions/\$(jq '.version' /opt/OpenPod/system.json | xargs)/pod.py"
256+
257+
Restart=always
258+
RestartSec=10
259+
260+
[Install]
261+
WantedBy=multi-user.target
262+
EOF
263+
264+
sudo systemctl enable --now openpod.service
265+
sudo systemctl daemon-reload
266+
267+
echo "- OpenPod is now installed -"
268+
exit 0

0 commit comments

Comments
 (0)