Skip to content
This repository was archived by the owner on Apr 12, 2020. It is now read-only.

Commit 01d01eb

Browse files
author
南琴浪
authored
big upgrade
1 parent fe646b6 commit 01d01eb

File tree

1 file changed

+308
-0
lines changed

1 file changed

+308
-0
lines changed

tcp_nanqinlang_2.9.sh

+308
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,308 @@
1+
#!/bin/bash
2+
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
3+
export PATH
4+
Green_font="\033[32m" && Yellow_font="\033[33m" && Red_font="\033[31m" && Font_suffix="\033[0m"
5+
Info="${Green_font}[Info]${Font_suffix}"
6+
Error="${Red_font}[Error]${Font_suffix}"
7+
reboot="${Yellow_font}reboot${Font_suffix}"
8+
echo -e "${Green_font}
9+
#======================================
10+
# Project: tcp_nanqinlang
11+
# Version: 2.9
12+
# Author: nanqinlang
13+
# Blog: https://www.nanqinlang.com
14+
# Github: https://github.com/nanqinlang
15+
#======================================${Font_suffix}"
16+
17+
#check system
18+
check_system(){
19+
cat /etc/issue | grep -q -E -i "debian" && release="debian"
20+
21+
if [[ "${release}" = "debian" ]]; then
22+
echo -e "${Info} system is debian "
23+
else echo -e "${Error} not support!" && exit 1
24+
fi
25+
}
26+
27+
#check root
28+
check_root(){
29+
if [[ "`id -u`" = "0" ]]; then
30+
echo -e "${Info} user is root"
31+
else echo -e "${Error} must be root user" && exit 1
32+
fi
33+
}
34+
35+
#check ovz
36+
check_ovz(){
37+
apt-get update && apt-get install virt-what -y
38+
virt=`virt-what`
39+
if [[ "${virt}" = "openvz" ]]; then
40+
echo -e "${Error} OpenVZ is not support!" && exit 1
41+
else echo -e "${Info} virt is ${virt}"
42+
fi
43+
}
44+
45+
#required workplace directory
46+
directory(){
47+
[[ ! -d /home/tcp_nanqinlang ]] && mkdir -p /home/tcp_nanqinlang
48+
cd /home/tcp_nanqinlang
49+
}
50+
51+
#required kernel version
52+
get_version(){
53+
echo -e "${Info} input required kernel version (defaultly use 4.10.2):"
54+
read -p "(eg. 4.10.2):" required_version
55+
[[ -z "${required_version}" ]] && required_version=4.10.2
56+
}
57+
58+
get_url(){
59+
get_version
60+
headers_all_name=`wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${required_version}/ | grep "linux-headers" | awk -F'\">' '/all.deb/{print $2}' | cut -d'<' -f1 | head -1`
61+
headers_all_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v${required_version}/${headers_all_name}"
62+
bit=`uname -m`
63+
if [[ "${bit}" = "x86_64" ]]; then
64+
image_name=`wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${required_version}/ | grep "linux-image" | grep "lowlatency" | awk -F'\">' '/amd64.deb/{print $2}' | cut -d'<' -f1 | head -1`
65+
image_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v${required_version}/${image_name}"
66+
headers_bit_name=`wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${required_version}/ | grep "linux-headers" | grep "lowlatency" | awk -F'\">' '/amd64.deb/{print $2}' | cut -d'<' -f1 | head -1`
67+
headers_bit_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v${required_version}/${headers_bit_name}"
68+
elif [[ "${bit}" = "i386" ]]; then
69+
image_name=`wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${required_version}/ | grep "linux-image" | grep "lowlatency" | awk -F'\">' '/i386.deb/{print $2}' | cut -d'<' -f1 | head -1`
70+
image_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v${required_version}/${image_name}"
71+
headers_bit_name=`wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${required_version}/ | grep "linux-headers" | grep "lowlatency" | awk -F'\">' '/i386.deb/{print $2}' | cut -d'<' -f1 | head -1`
72+
headers_bit_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v${required_version}/${headers_bit_name}"
73+
else echo -e "${Error} not support bit !" && exit 1
74+
fi
75+
}
76+
77+
#delete surplus image
78+
delete_surplus_image(){
79+
if [[ "${surplus_total_image}" != "0" ]]; then
80+
for((integer = 1; integer <= ${surplus_total_image}; integer++))
81+
do
82+
surplus_sort_image=`dpkg -l|grep linux-image | awk '{print $2}' | grep -v "${required_version}" | head -${integer}`
83+
apt-get purge ${surplus_sort_image} -y
84+
done
85+
apt-get autoremove -y
86+
if [[ "${surplus_total_image}" = "0" ]]; then
87+
echo -e "${Info} uninstall all surplus images successfully, continuing"
88+
fi
89+
else echo -e "${Error} check image failed, please check!" && exit 1
90+
fi
91+
}
92+
93+
#delete surplus headers
94+
delete_surplus_headers(){
95+
for((integer = 1; integer <= ${surplus_total_headers}; integer++))
96+
do
97+
surplus_sort_headers=`dpkg -l|grep linux-headers | awk '{print $2}' | grep -v "${required_version}" | head -${integer}`
98+
apt-get purge ${surplus_sort_headers} -y
99+
done
100+
apt-get autoremove -y
101+
if [[ "${surplus_total_headers}" = "0" ]]; then
102+
echo -e "${Info} uninstall all surplus headers successfully, continuing"
103+
fi
104+
}
105+
106+
install_image(){
107+
if [[ -e "${image_name}" ]]; then
108+
echo -e "${Info} deb file exist"
109+
else echo -e "${Info} downloading image" && wget ${image_url}
110+
fi
111+
if [[ -e "${image_name}" ]]; then
112+
echo -e "${Info} installing image" && dpkg -i ${image_name}
113+
else echo -e "${Error} image download failed, please check!" && exit 1
114+
fi
115+
}
116+
117+
install_headers(){
118+
if [[ -e ${headers_all_name} ]]; then
119+
echo -e "${Info} deb file exist"
120+
else echo -e "${Info} downloading headers_all" && wget ${headers_all_url}
121+
fi
122+
if [[ -e ${headers_all_name} ]]; then
123+
echo -e "${Info} installing headers_all" && dpkg -i ${headers_all_name}
124+
else echo -e "${Error} headers_all download failed, please check!" && exit 1
125+
fi
126+
if [[ -e ${headers_bit_name} ]]; then
127+
echo -e "${Info} deb file exist"
128+
else echo -e "${Info} downloading headers_bit" && wget ${headers_bit_url}
129+
fi
130+
if [[ -e ${headers_bit_name} ]]; then
131+
echo -e "${Info} installing headers_bit" && dpkg -i ${headers_bit_name}
132+
else echo -e "${Error} headers_bit download failed, please check!" && exit 1
133+
fi
134+
}
135+
136+
#check/install required version and remove surplus kernel
137+
check_kernel(){
138+
get_url
139+
#when kernel version = required version, response required version digital number.
140+
digit_ver_image=`dpkg -l | grep linux-image | awk '{print $2}' | awk -F '-' '{print $3}' | grep "${required_version}"`
141+
digit_ver_headers=`dpkg -l | grep linux-headers | awk '{print $2}' | awk -F '-' '{print $3}' | grep "${required_version}"`
142+
#total digit of kernel without required version
143+
surplus_total_image=`dpkg -l|grep linux-image | awk '{print $2}' | grep -v "${required_version}" | wc -l`
144+
surplus_total_headers=`dpkg -l|grep linux-headers | awk '{print $2}' | grep -v "${required_version}" | wc -l`
145+
146+
if [[ -z "${digit_ver_image}" ]]; then
147+
echo -e "${Info} installing required image" && install_image
148+
else
149+
echo -e "${Info} image already have a required version"
150+
fi
151+
152+
if [[ "${surplus_total_image}" != "0" ]]; then
153+
echo -e "${Info} removing surplus image" && delete_surplus_image
154+
else
155+
echo -e "${Info} no surplus image need to remove"
156+
fi
157+
158+
if [[ "${surplus_total_headers}" != "0" ]]; then
159+
echo -e "${Info} removing surplus headers" && delete_surplus_headers
160+
else
161+
echo -e "${Info} no surplus headers need to remove"
162+
fi
163+
164+
if [[ "${required_version}" != "4.10.2" ]]; then
165+
if [[ -z "${digit_ver_headers}" ]]; then
166+
echo -e "${Info} installing required headers" && install_headers
167+
else
168+
echo -e "${Info} headers already have a required version"
169+
fi
170+
else
171+
echo -e "${Info} required is 4.10.2, noneed to install headers"
172+
fi
173+
174+
update-grub
175+
}
176+
177+
dpkg_list(){
178+
dpkg -l|grep linux-image | awk '{print $2}'
179+
dpkg -l|grep linux-headers | awk '{print $2}'
180+
echo -e "${Info} please ensure above kernel list is the same as the following:\nlinux-image-${required_version}-lowlatency\nlinux-headers-${required_version}\nlinux-headers-${required_version}-lowlatency"
181+
}
182+
183+
#(1)while kernel is 4.10.2
184+
ver_4.10.2(){
185+
[[ ! -e /lib/modules/`uname -r`/kernel/net/ipv4/tcp_nanqinlang.ko ]] && echo -e "${Info} loading mod" && cd /lib/modules/`uname -r`/kernel/net/ipv4 && wget -O tcp_nanqinlang.ko "https://raw.githubusercontent.com/nanqinlang-tcp/tcp_nanqinlang/master/mod/tcp_nanqinlang_for_4.10.2.ko" && insmod tcp_nanqinlang.ko && depmod -a
186+
[[ ! -e /lib/modules/`uname -r`/kernel/net/ipv4/tcp_nanqinlang.ko ]] && echo -e "${Error} download mod failed,please check!" && exit 1
187+
}
188+
189+
#(2)while kernel isn't 4.10.2
190+
ver_current(){
191+
[[ ! -e /lib/modules/`uname -r`/kernel/net/ipv4/tcp_nanqinlang.ko ]] && compiler
192+
[[ ! -e /lib/modules/`uname -r`/kernel/net/ipv4/tcp_nanqinlang.ko ]] && echo -e "${Error} load mod failed, please check!" && exit 1
193+
}
194+
195+
gcc-4.9(){
196+
if [[ "${sys_ver}" = "7" ]]; then
197+
apt-get update && mv /etc/apt/sources.list /etc/sources.list
198+
wget -P /home/tcp_nanqinlang https://raw.githubusercontent.com/nanqinlang/sources.list/master/us.sources.list && mv /home/tcp_nanqinlang/us.sources.list /etc/apt/sources.list
199+
apt-get update && apt-get install build-essential -y && apt-get update
200+
rm /etc/apt/sources.list && mv /etc/sources.list /etc/apt/sources.list && apt-get update
201+
else
202+
apt-get update && apt-get install build-essential -y && apt-get update
203+
fi
204+
}
205+
206+
libssl1.0.0(){
207+
if [[ "${sys_ver}" = "9" ]]; then
208+
echo "deb http://ftp.de.debian.org/debian jessie main" >> /etc/apt/sources.list
209+
apt-get update && apt-get install libssl1.0.0 -y
210+
sed -i '/deb http://ftp\.de\.debian\.org/debian jessie main/d' /etc/apt/sources.list
211+
fi
212+
}
213+
214+
compiler(){
215+
mkdir make && cd make
216+
217+
# kernel source code:https://www.kernel.org/pub/linux/kernel #
218+
ver_4_13=`dpkg -l | grep linux-image | awk '{print $2}' | awk -F '-' '{print $3}' | grep "4.13"`
219+
if [[ -z "${ver_4_13}" ]]; then
220+
wget https://raw.githubusercontent.com/nanqinlang-tcp/tcp_nanqinlang/master/general/tcp_nanqinlang.c
221+
else
222+
wget https://raw.githubusercontent.com/nanqinlang-tcp/tcp_nanqinlang/master/kernel-v4.13/tcp_nanqinlang.c
223+
fi
224+
225+
sys_ver=`grep -oE "[0-9.]+" /etc/issue`
226+
if [[ "${sys_ver}" = "9" ]]; then
227+
wget -O Makefile https://raw.githubusercontent.com/nanqinlang-tcp/tcp_nanqinlang/master/make/Makefile-debian9
228+
else
229+
wget -O Makefile https://raw.githubusercontent.com/nanqinlang-tcp/tcp_nanqinlang/master/make/Makefile-debian7or8
230+
fi
231+
232+
make && make install
233+
}
234+
235+
check_status(){
236+
status_sysctl=`sysctl net.ipv4.tcp_available_congestion_control | awk '{print $3}'`
237+
status_lsmod=`lsmod | grep nanqinlang`
238+
if [[ "${status_lsmod}" != "" ]]; then
239+
echo -e "${Info} tcp_nanqinlang is installed!"
240+
if [[ "${status_sysctl}" = "nanqinlang" ]]; then
241+
echo -e "${Info} tcp_nanqinlang is running"
242+
else echo -e "${Error} tcp_nanqinlang is installed not running!"
243+
fi
244+
else echo -e "${Error} tcp_nanqinlang not installed"
245+
fi
246+
}
247+
248+
install(){
249+
check_system
250+
check_root
251+
check_ovz
252+
directory
253+
sys_ver=`grep -oE "[0-9.]+" /etc/issue` && gcc-4.9 && libssl1.0.0
254+
check_kernel
255+
dpkg_list
256+
echo -e "${Info} please check kernel version and ${reboot}, then run 'start' command to enable tcp_nanqinlang"
257+
}
258+
259+
start(){
260+
check_system
261+
check_root
262+
check_ovz
263+
directory
264+
current_version=`dpkg -l | grep linux-image | awk '{print $2}' | awk -F '-' '{print $3}'`
265+
if [[ "${current_version}" = "4.10.2" ]]; then
266+
ver_4.10.2
267+
else
268+
ver_current
269+
fi
270+
echo -e "\nnet.ipv4.tcp_congestion_control=nanqinlang\c" >> /etc/sysctl.conf && sysctl -p
271+
check_status
272+
}
273+
274+
status(){
275+
check_root
276+
check_status
277+
}
278+
279+
uninstall(){
280+
check_root
281+
sed -i '/net\.ipv4\.tcp_congestion_control=nanqinlang/d' /etc/sysctl.conf
282+
sysctl -p
283+
rm -rf /home/tcp_nanqinlang
284+
rm /lib/modules/`uname -r`/kernel/net/ipv4/tcp_nanqinlang.ko
285+
echo -e "${Info} please remember ${reboot} to stop tcp_nanqinlang"
286+
}
287+
288+
289+
290+
echo -e "${Info} 选择你要使用的功能: "
291+
echo -e "1.更换内核版本\n2.安装并开启 tcp_nanqinlang\n3.检查 tcp_nanqinlang 运行状态\n4.卸载 tcp_nanqinlang"
292+
read -p "输入数字以选择:" function
293+
294+
while [[ ! "${function}" =~ ^[1-4]$ ]]
295+
do
296+
echo -e "${Error} 无效输入"
297+
echo -e "${Info} 请重新选择" && read -p "输入数字以选择:" function
298+
done
299+
300+
if [[ "${function}" == "1" ]]; then
301+
install
302+
elif [[ "${function}" == "2" ]]; then
303+
start
304+
elif [[ "${function}" == "3" ]]; then
305+
status
306+
else
307+
uninstall
308+
fi

0 commit comments

Comments
 (0)