forked from free5gc/free5gc
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathquick-setup.sh
More file actions
executable file
·381 lines (309 loc) · 10.4 KB
/
Copy pathquick-setup.sh
File metadata and controls
executable file
·381 lines (309 loc) · 10.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
#!/bin/bash
GO_VERSION="1.25.5"
GOLANGCI_LINT_VERSION="2.7.2"
NETWORK_INTERFACE=""
IP_ADDRESS=""
LINT=false
DOCKER=false
GTP5G_PATH="$HOME/gtp5g"
GTP5G_VERSION="v0.9.16"
SUCCESS_COUNT=0
FAIL_COUNT=0
SKIP_COUNT=0
COLOR_RED="\033[31m"
COLOR_GREEN="\033[32m"
COLOR_YELLOW="\033[33m"
COLOR_BLUE="\033[36m"
COLOR_RESET="\033[0m"
log_info() {
echo -e "${COLOR_BLUE}[.]${COLOR_RESET} $1"
}
log_success() {
echo -e "${COLOR_GREEN}[+]${COLOR_RESET} $1"
}
log_warn() {
echo -e "${COLOR_YELLOW}[!]${COLOR_RESET} $1"
}
log_question() {
echo -e "${COLOR_YELLOW}[?]${COLOR_RESET} $1"
}
log_error() {
echo -e "${COLOR_RED}[-]${COLOR_RESET} $1"
}
separate_stars() {
local cols=$(tput cols 2>/dev/null || echo 10)
printf "%*s\n" "$cols" "" | tr ' ' '*'
}
usage() {
echo "Usage: $0 [options]"
echo ""
echo "Options:"
echo " -i, --interface <network interface> Setup the network interface for N2/N3/N6"
echo " -l, --lint Enable golangci-lint installation"
echo " -d, --docker Enable docker installation"
echo " -h, --help Show this help message"
echo
echo "Example:"
echo " $0 -i eno1 -l -d"
echo
}
check_interface_and_get_ip() {
if ! ip link show "$1" &>/dev/null; then
log_error "Interface $1 does not exist."
return 1
fi
NETWORK_INTERFACE=$1
IP_ADDRESS=$(ip addr show "$1" | grep -oP '(?<=inet )\S+' | head -n 1 | cut -d/ -f1)
log_info "Use interface $1 as N2/N3/N6 interface with IP address $IP_ADDRESS."
}
network_config() {
log_info "Configuring network..."
sudo systemctl stop ufw
sudo systemctl disable ufw
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o ${NETWORK_INTERFACE} -j MASQUERADE
sudo iptables -I FORWARD 1 -j ACCEPT
log_success "Network configured with interface ${NETWORK_INTERFACE}"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}
install_golang() {
log_info "Installing golang..."
if go version > /dev/null 2>&1; then
current_version=$(go version | awk '{print $3}' | sed 's/^go//')
log_info "Go $current_version already installed."
if [[ $current_version != $GO_VERSION ]]; then
log_question "Go $current_version is already installed. Do you want to upgrade to $GO_VERSION? [Y/n] "
read upgrade
upgrade=${upgrade:-Y}
if [[ $upgrade == "Y" || $upgrade == "y" ]]; then
sudo rm -rf /usr/local/go
wget https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz
sudo tar -C /usr/local -zxvf go${GO_VERSION}.linux-amd64.tar.gz
rm go${GO_VERSION}.linux-amd64.tar.gz
fi
log_success "Golang upgraded"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
else
SKIP_COUNT=$((SKIP_COUNT + 1))
fi
return
fi
wget https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz
sudo tar -C /usr/local -zxvf go${GO_VERSION}.linux-amd64.tar.gz
mkdir -p ~/go/{bin,pkg,src}
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
echo 'export PATH=$PATH:$GOPATH/bin:$GOROOT/bin' >> ~/.bashrc
echo 'export GO111MODULE=auto' >> ~/.bashrc
source ~/.bashrc
rm go${GO_VERSION}.linux-amd64.tar.gz
log_success "Golang installed"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}
install_golangci_lint() {
log_info "Installing golangci-lint..."
if golangci-lint version > /dev/null 2>&1; then
log_info "Golangci-lint already installed"
SKIP_COUNT=$((SKIP_COUNT + 1))
return
fi
curl -sSfL https://golangci-lint.run/install.sh | sh -s -- -b $(go env GOPATH)/bin $GOLANGCI_LINT_VERSION
log_success "Golangci-lint installed"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}
install_mongodb() {
log_info "Installing mongoDB..."
if mongosh --version > /dev/null 2>&1; then
log_info "MongoDB already installed"
SKIP_COUNT=$((SKIP_COUNT + 1))
return
fi
sudo apt-get install gnupg curl
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor
ubuntu_version=$(lsb_release -rs)
case $ubuntu_version in
20.04)
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/8.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.2.list
;;
22.04)
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/8.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.2.list
;;
24.04)
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.2.list
;;
25.04)
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.2.list
;;
*)
log_error "Unsupported Ubuntu version: $ubuntu_version"
FAIL_COUNT=$((FAIL_COUNT + 1))
return 1
;;
esac
sudo apt-get update
sudo apt-get install -y mongodb-org
sudo systemctl enable --now mongod
log_success "MongoDB installed"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}
install_gtp5g() {
log_info "Installing gtp5g..."
if lsmod | grep -q gtp5g; then
log_info "GTP5G already installed"
SKIP_COUNT=$((SKIP_COUNT + 1))
return
fi
sudo apt -y update
sudo apt -y install gcc g++ cmake autoconf libtool pkg-config libmnl-dev libyaml-dev
git clone --branch ${GTP5G_VERSION} https://github.com/free5gc/gtp5g.git $GTP5G_PATH
pushd $GTP5G_PATH
make
sudo make install
popd
log_success "GTP5G installed"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}
install_yarn() {
log_info "Installing Yarn..."
if yarn --version > /dev/null 2>&1; then
log_info "Yarn already installed"
SKIP_COUNT=$((SKIP_COUNT + 1))
return
fi
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt update
sudo apt install -y nodejs
sudo corepack enable
echo 'export COREPACK_ENABLE_DOWNLOAD_PROMPT=0' >> ~/.bashrc
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
log_success "Yarn installed"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}
install_docker() {
log_info "Installing Docker..."
if docker --version > /dev/null 2>&1; then
log_info "Docker already installed"
SKIP_COUNT=$((SKIP_COUNT + 1))
return
fi
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo groupadd docker
sudo usermod -aG docker $USER
log_success "Docker installed"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}
submodule_init() {
log_info "Initializing submodules..."
git submodule update --init --recursive -j `nproc`
log_success "Submodules initialized"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}
make_free5gc() {
log_info "Making free5GC..."
make all
log_success "free5GC made"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}
substitute_ip() {
log_info "Substituting IP addresses in config files..."
sed -i -e '/ngapIpList:/!b;n;s/- .*/- '"$IP_ADDRESS"'/' config/amfcfg.yaml
sed -i -e '/endpoints:/!b;n;s/- .*/- '"$IP_ADDRESS"'/' config/smfcfg.yaml
sed -i -e '/ifList:/!b;n;s/addr: .*/addr: '"$IP_ADDRESS"'/' config/upfcfg.yaml
log_success "IP addresses substituted"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}
print_counts() {
log_info "Task Summary:"
log_success " Success: $SUCCESS_COUNT"
log_warn " Skip: $SKIP_COUNT"
log_error " Fail: $FAIL_COUNT"
}
main() {
while [[ $# -gt 0 ]]; do
case $1 in
-i|--interface)
if [[ -z $2 ]]; then
usage
return 1
fi
check_interface_and_get_ip "$2" || return 1
shift 2
;;
-l|--lint)
LINT=true
shift
;;
-d|--docker)
DOCKER=true
shift
;;
-h|--help)
usage
return 0
;;
*)
usage
return 1
;;
esac
done
if [[ ${NETWORK_INTERFACE} ]]; then
network_config
separate_stars
substitute_ip
separate_stars
else
log_warn "Network interface is not set. Skip network configuration."
separate_stars
fi
install_golang
separate_stars
if $LINT; then
install_golangci_lint
separate_stars
fi
install_mongodb || return 1
separate_stars
install_gtp5g
separate_stars
install_yarn
separate_stars
if $DOCKER; then
install_docker
separate_stars
fi
submodule_init
separate_stars
make_free5gc
separate_stars
if [[ ${NETWORK_INTERFACE} ]]; then
substitute_ip
separate_stars
else
log_warn "Network interface is not set. Skip N2/N3 IP substitution."
separate_stars
fi
print_counts
separate_stars
if $DOCKER; then
log_info "Docker is installed. Please log out and log in again to use Docker without sudo."
fi
log_info "Setup completed. Now you can run free5GC with these commands:"
log_info " NFs: ./run.sh"
log_info " Webconsole: cd webconsole && ./bin/webconsole"
log_info "To test with ue simulator, please refer to: https://free-ran-ue.github.io/doc-user-guide/02-free-ran-ue/"
}
main "$@"