#!/bin/bash

http_server='http://{mirror1.cloud.idcsmart.com,mirror2.cloud.idcsmart.com,mirror.cloud.idcsmart.com}/cloud/compute'

if [ `grep oneMinute.php /var/spool/cron/root |wc -l` -eq 0 ];then
	sed -i 's/cloudGetChart/oneMinute/g' /var/spool/cron/root
fi

conf_header=$(cat /usr/local/zjmf/conf/zjmf.conf|head -n1)
if [ "$conf_header" != "[default]" ];then
   sed -i '1 i\[default]' /usr/local/zjmf/conf/zjmf.conf
fi

if [ `rpm -qa |grep libguestfs-winsupport |wc -l` -eq 0 -o `rpm -qa |grep ntfs-3g |wc -l` -eq 0 ];then
	aria2c -x 5 -k 1M -c http://mirror.cloud.idcsmart.com/cloud/compute/202_packages.tar.gz -d /tmp
	cd /tmp
	tar xf 202_packages.tar.gz
	cd 202_packages
	for package in `ls *.rpm`;do
		rpm -ivh $package --nodeps > /dev/null 2>&1
	done
	rm -rf /tmp/202_packages*
fi

if [ ! -f "/etc/modprobe.d/nbd.conf" ];then
aria2c -x 5 -k 1M -c http://mirror.cloud.idcsmart.com/cloud/compute/nbd.ko.xz -d /tmp
\mv /tmp/nbd.ko.xz /lib/modules/$(uname -r)/kernel/drivers/block/
cat > /etc/modprobe.d/nbd.conf << EOF
options nbd max_part=8
EOF
depmod -a
modprobe nbd
fi

# version 2.0.9
if [ `ovs-vsctl list Bridge |grep name |grep ovs-tun |wc -l` -eq 0 ];then
	ovs-vsctl add-br ovs-tun
	ovs-vsctl set Bridge ovs-tun other_config=disable-in-band=true,datapath-id=0000fe9f17664a43
	ovs-vsctl set-controller ovs-tun tcp:127.0.0.1:6653
	ovs-vsctl add-port ovs-ext oext-to-otun -- set interface oext-to-otun type=patch options:peer=otun-to-oext
	ovs-vsctl add-port ovs-tun otun-to-oext -- set interface otun-to-oext type=patch options:peer=oext-to-otun
fi

# version 2.1.0
if [ `grep Before /usr/lib/systemd/system/supervisord.service |wc -l` -eq 0 ];then
  sed -i '/After/iBefore=rc-local.service' /usr/lib/systemd/system/supervisord.service
  sed -i 's/rc-local.service nss-user-lookup.target/nss-user-lookup.target/g' /usr/lib/systemd/system/supervisord.service
  systemctl daemon-reload
fi

if [ ! -f "/etc/sysconfig/network-scripts/ifcfg-ovs-tun" ];then
cat > /etc/sysconfig/network-scripts/ifcfg-ovs-tun << EOF
DEVICE=ovs-tun
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSIntPort
EOF
ifup ovs-tun >/dev/null 2>&1
fi

# version 2.1.2
if [ `grep "/etc/supervisord.d.*ini" /etc/supervisord.conf |wc -l` -eq 0 ];then
cat > /etc/supervisord.conf << 'EOF'
[unix_http_server]
file=/var/run/supervisor/supervisor.sock
chmod=0777
[supervisord]
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/var/run/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor/supervisor.sock
[include]
files = /etc/supervisord.d/*.ini
EOF


if [ -d "/usr/local/zjmf/conf/supervisord.d" ];then
	\cp /usr/local/zjmf/conf/supervisord.d/*.ini /etc/supervisord.d
fi

if [ ! -f "/usr/local/zjmf/conf/aria2.conf" ];then
cat > /usr/local/zjmf/conf/aria2.conf << 'EOF'
# aria2 config
continue=true
file-allocation=trunc
parameterized-uri=true
max-connection-per-server=3
max-concurrent-downloads=5
max-overall-download-limit=0
max-download-limit=0
disable-ipv6=true
min-split-size=1M
enable-rpc=true
rpc-listen-port=6800
dir=/home/kvm/images
EOF
fi

if [ ! -f "/etc/supervisord.d/aria2.ini" ];then
cat > /etc/supervisord.d/aria2.ini << 'EOF'
[program:aria2]
command = /usr/local/zjmf/bin/aria2c --conf-path=/usr/local/zjmf/conf/aria2.conf
directory = /usr/local/zjmf/bin/
priority = 1
numprocs = 1
autostart = true
autorestart = true
startretries = 10
stopwaitsecs = 1
stopasgroup = true
killasgroup = true
stopsignal = KILL
redirect_stderr = true
EOF
fi

supervisorctl update
fi

if [ `supervisorctl status |grep ryu-manager |wc -l` -ne 0 ];then
	systemctl start supervisord
fi

# version 2.1.3
if [ `ovs-ofctl dump-flows ovs-tun |grep "00:00:00:00:00:00/01:00:00:00:00:00" |wc -l` -eq 0 ];then
  ovs-vsctl set-controller ovs-tun
  ovs-vsctl set-controller ovs-tun tcp:127.0.0.1:6653
fi

[ -f "/usr/local/zjmf/cloud/api/api.so" ] && rm -rf /usr/local/zjmf/cloud/api/api.so

# version 2.1.7
if [ ! -f /usr/lib/systemd/system/flowentryd.service ];then
cat > /usr/lib/systemd/system/flowentryd.service <<EOF
[Unit]
Description=OpenFlow Entries Daemon
After=openvswitch.service supervisord.service

[Service]
Type=forking -B
PIDFile=/tmp/flowentryd.pid
ExecStart=/usr/local/zjmf/cloud/apps/flowentryd
ExecReload=
ExecStop=/bin/kill -WINCH
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start flowentryd
systemctl enable flowentryd
fi

# version 2.2.0
for i in `ip netns list |grep -oE vpc_[0-9]+`;do
  ns_id=$(ip netns exec $i ip a show |grep int |grep 172.16 |head -n 1|awk '{print $NF}' |awk -F'_' '{print $2}')
  if [ -n "$ns_id" ];then
    if [ $(ip netns exec vpc_${ns_id} ip a show |grep ifb |wc -l) -eq 0 ];then
      ip netns exec vpc_${ns_id} ip link add ifb0 type ifb
      ip netns exec vpc_${ns_id} ip link set ifb0 up
    fi
  fi
done

if [ $(grep "chmod" /etc/supervisord.conf |wc -l) -eq 0 ];then
cat > /etc/supervisord.conf << 'EOF'
[unix_http_server]
file=/var/run/supervisor/supervisor.sock
chmod=0777
[supervisord]
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/var/run/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor/supervisor.sock
[include]
files = /etc/supervisord.d/*.ini
EOF
fi

function install_package(){
  rpm_package=$1
  rpm -ivh http://mirror.cloud.idcsmart.com/cloud/RPMS/$rpm_package --nodeps --force
}
yum list installed rsync || install_package "rsync-3.1.2-10.el7.x86_64.rpm"

pip3 list |grep aria2p || check="false"
if [ "$check" = "false" ]; then
    mkdir -p /home/zjmf/download
    aria2c -x 2 http://mirror.cloud.idcsmart.com/cloud/compute/python3-packages.tar.gz -d /home/zjmf/download
    tar zxf /home/zjmf/download/python3-packages.tar.gz -C /home/zjmf/download
    pip3 install /home/zjmf/download/python3-packages/*.whl
    rm -rf /home/zjmf/download
fi

# version 2.3.0
if [ `rpm -qa |grep haproxy |wc -l` -eq 0 ];then
  rpm -ivh http://mirror.cloud.idcsmart.com/cloud/compute/rpms/haproxy-1.5.18-9.el7.x86_64.rpm --nodeps > /dev/null 2>&1
fi

# version 2.3.1
if [ `ip netns |grep vpc_100101 |wc -l` -ne 0 ];then
  external_ip=`grep external_ip /usr/local/zjmf/conf/net.conf |awk -F'=' '{print $2}'`
  ip netns exec vpc_100101 iptables -t nat -D PREROUTING -d $external_ip/32 -j DNAT --to-destination 172.31.255.254
  ip netns exec vpc_100101 iptables -t nat -A PREROUTING -d $external_ip/32 -p tcp -m multiport ! --dport 80:443 -j DNAT --to-destination 172.31.255.254
fi

if [ `rpm -qa |grep pyOpenSSL |wc -l` -eq 0 ];then
  rpm -ivh http://mirror.cloud.idcsmart.com/cloud/compute/rpms/pyOpenSSL-0.13.1-4.el7.x86_64.rpm --nodeps > /dev/null 2>&1
fi

# version 2.3.6
if [ ! -f /usr/local/zjmf/bin/node_exporter ];then
  aria2c -x 2 http://mirror.cloud.idcsmart.com/cloud/compute/node_exporter -d /usr/local/zjmf/bin
  chmod +x /usr/local/zjmf/bin/node_exporter
  if [ ! -f /usr/lib/systemd/system/node_exporter.service ];then
cat > /usr/lib/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Prometheus node_exporter

[Service]
Type=forking -B
PIDFile=/tmp/node_exporter.pid
ExecStart=/usr/local/zjmf/bin/node_exporter
ExecReload=
ExecStop=/bin/kill -WINCH
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
  fi
fi

# version 2.3.9
cat > /var/spool/cron/root << EOF
# contab
0 * * * * ntpdate -u cn.pool.ntp.org > /dev/null 2>&1
* * * * * /usr/bin/php /usr/local/zjmf/php/oneMinute.php > /dev/null 2>&1
* * * * * /usr/local/zjmf/bin/ddnspod > /dev/null 2>&1
EOF

# version 2.4.4
if [ $(ovs-vsctl list Controller phy-ext |grep inactivity_probe |grep 60000 |wc -l) -eq 0 ];then
  ovs-vsctl set Controller phy-ext inactivity_probe=60000
  ovs-vsctl set Controller ovs-ext inactivity_probe=60000
  ovs-vsctl set Controller ovs-tun inactivity_probe=60000
  uuid=$(ovs-vsctl list Manager |grep uuid |awk '{print $3}')
  ovs-vsctl set Manager $uuid inactivity_probe=30000
fi

# version 2.4.8
if [ $(grep flowentryd_version /usr/local/zjmf/conf/zjmf.conf |wc -l) -ne 0 ];then
  echo "flowentryd_version = 2" >> /usr/local/zjmf/conf/zjmf.conf
  systemctl restart flowentryd
fi

# version 2.5.6
cat > /etc/supervisord.d/api-compute.ini <<EOF
[program:api-compute]
command=/usr/bin/python /usr/local/zjmf/cloud/api_load.py
directory=/usr/local/zjmf/cloud
priority=1
numprocs=1
autostart=true
autorestart=true
startretries=10
stopasgroup=true
stopsignal=KILL
stopwaitsecs=10
redirect_stderr=true
stdout_logfile=/var/log/supervisor/api-compute.log
EOF
supervisorctl update api-compute
supervisorctl restart api-compute

# version 2.9.1
supervisorctl stop api-go
cat > /etc/supervisord.d/api.ini << 'EOF'
[program:api-go]
command=/usr/local/zjmf/bin/api
directory=/usr/local/zjmf/bin
priority=1
numprocs=1
autostart=true
autorestart=true
startretries=10
stopasgroup=true
stopsignal=KILL
stopwaitsecs=10
redirect_stderr=true
EOF
supervisorctl update
supervisorctl restart api-go

if [ ! -f "/usr/local/zjmf/conf/ksmtuned.conf" ];then
cat > /usr/local/zjmf/conf/ksmtuned.conf << 'EOF'
KSM_THRES_COEF=95
KSM_SLEEP_MSEC=30
USE_ZERO_PAGES=0
EOF
fi

if [ ! -f "/etc/supervisord.d/ksmtuned.ini" ];then
chmod +x /usr/local/zjmf/bin/ksmtuned
cat > /etc/supervisord.d/ksmtuned.ini << 'EOF'
[program:ksmtuned]
command=/usr/local/zjmf/bin/ksmtuned
directory=/usr/local/zjmf/bin
priority=1
numprocs=1
autostart=true
autorestart=true
startretries=10
stopasgroup=true
stopsignal=KILL
stopwaitsecs=10
redirect_stderr=true
stdout_logfile=/var/log/supervisor/ksmtuned.log
EOF
supervisorctl update
fi

supervisorctl restart ksmtuned
supervisorctl restart api-go

sed -i '/^HWADDR.*/Id' /etc/sysconfig/network-scripts/ifcfg-phy-ext
sed -i '/^UUID/Id' /etc/sysconfig/network-scripts/ifcfg-phy-ext

if [ ! -f "/usr/local/zjmf/cloud/network/datapath.db" ];then
  aria2c -x 2 http://mirror.cloud.idcsmart.com/cloud/compute/datapath.db -d /usr/local/zjmf/cloud/network
  chown qemu.qemu /usr/local/zjmf/cloud/network/datapath.db
fi

# version 2.7.0
# ovs-ofctl add-flow ovs-ext "table=0,priority=4,in_port="oext-to-pext" actions=drop"

# version 2.8.5
if [ `ovs-vsctl get-fail-mode phy-ext |grep secure |wc -l` -eq 0 ];then
  ovs-vsctl set-fail-mode phy-ext secure
  ovs-vsctl set-fail-mode ovs-ext secure
  ovs-vsctl set-fail-mode ovs-tun secure
fi

rm -rf /usr/local/zjmf/update_scripts.sh