commit 220d5ca32654f5bbef4797a1e6ca2ec32b046558 Author: Your Name Date: Wed Dec 7 10:33:29 2022 +0800 提交 diff --git a/config/k8s/deployment.yaml b/config/k8s/deployment.yaml new file mode 100644 index 0000000..a74097c --- /dev/null +++ b/config/k8s/deployment.yaml @@ -0,0 +1,94 @@ +apiVersion: extensions/v1beta1 # 指定api版本,此值必须在kubectl api-versions中 +kind: Deployment # 指定创建资源的角色/类型 +metadata: # 资源的元数据/属性 + name: demo # 资源的名字,在同一个namespace中必须唯一 + namespace: default # 部署在哪个namespace中 + labels: # 设定资源的标签 + app: nginx + version: v1 +spec: # 资源规范字段 + replicas: 1 # 声明副本数目 + revisionHistoryLimit: 3 # 保留历史版本 + selector: # 选择器 + matchLabels: # 匹配标签 + app: nginx + version: v1 + strategy: # 策略 + rollingUpdate: # 滚动更新 + maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数 + maxUnavailable: 30% # 示在更新过程中能够进入不可用状态的 Pod 的最大值,可以为百分比,也可以为整数 + type: RollingUpdate # 滚动更新策略 + template: # 模版 + metadata: # 资源的元数据/属性 + annotations: # 自定义注解列表 + sidecar.istio.io/inject: "false" # 自定义注解名字 + labels: # 设定资源的标签 + app: nginx + version: v1 + spec: # 资源规范字段 + containers: + - name: nginx# 容器的名字 + image: nginx:1.17.0 # 容器使用的镜像地址 + imagePullPolicy: IfNotPresent # 每次Pod启动拉取镜像策略,三个选择 Always、Never、IfNotPresent + # Always,每次都检查; + # Never,每次都不检查(不管本地是否有); + # IfNotPresent,如果本地有就不检查,如果没有就拉取(手动测试时,已经打好镜像存在docker容器中时, + # 使用存在不检查级别, 默认为每次都检查,然后会进行拉取新镜像,因镜像仓库不存在,导致部署失败) + volumeMounts: #文件挂载目录,容器内配置 + - mountPath: /data/ #容器内要挂载的目录 + name: share #定义的名字,需要与下面vloume对应 + resources: # 资源管理 + limits: # 最大使用 + cpu: 300m # CPU,1核心 = 1000m + memory: 500Mi # 内存,1G = 1000Mi + requests: # 容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行 + cpu: 100m + memory: 100Mi + livenessProbe: # pod 内部健康检查的设置 + httpGet: # 通过httpget检查健康,返回200-399之间,则认为容器正常 + path: /healthCheck # URI地址 + port: 8080 # 端口 + scheme: HTTP # 协议 + # host: 127.0.0.1 # 主机地址 + initialDelaySeconds: 30 # 表明第一次检测在容器启动后多长时间后开始 + timeoutSeconds: 5 # 检测的超时时间 + periodSeconds: 30 # 检查间隔时间 + successThreshold: 1 # 成功门槛 + failureThreshold: 5 # 失败门槛,连接失败5次,pod杀掉,重启一个新的pod + readinessProbe: # Pod 准备服务健康检查设置 + httpGet: + path: /healthCheck + port: 8080 + scheme: HTTP + initialDelaySeconds: 30 + timeoutSeconds: 5 + periodSeconds: 10 + successThreshold: 1 + failureThreshold: 5 + #也可以用这种方法 + #exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常 + # command: + # - cat + # - /tmp/health + #也可以用这种方法 + #tcpSocket: # 通过tcpSocket检查健康 + # port: number + ports: + - name: http # 名称 + containerPort: 8080 # 容器开发对外的端口 + protocol: TCP # 协议 + imagePullSecrets: # 镜像仓库拉取密钥 + - name: harbor-certification + volumes: #挂载目录在本机的路径 + - name: share #对应上面的名字 + hostPath: + path: /data #挂载本机的路径 + affinity: # 亲和性调试 + nodeAffinity: # 节点亲和力 + requiredDuringSchedulingIgnoredDuringExecution: # pod 必须部署到满足条件的节点上 + nodeSelectorTerms: # 节点满足任何一个条件就可以 + - matchExpressions: # 有多个选项,则只有同时满足这些逻辑选项的节点才能运行 pod + - key: beta.kubernetes.io/arch + operator: In + values: + - amd64 diff --git a/config/k8s/kube-flannel.yaml b/config/k8s/kube-flannel.yaml new file mode 100644 index 0000000..7025e9b --- /dev/null +++ b/config/k8s/kube-flannel.yaml @@ -0,0 +1,205 @@ +--- +kind: Namespace +apiVersion: v1 +metadata: + name: kube-flannel + labels: + pod-security.kubernetes.io/enforce: privileged +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: flannel +rules: +- apiGroups: + - "" + resources: + - pods + verbs: + - get +- apiGroups: + - "" + resources: + - nodes + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - nodes/status + verbs: + - patch +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: flannel +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: flannel +subjects: +- kind: ServiceAccount + name: flannel + namespace: kube-flannel +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: flannel + namespace: kube-flannel +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: kube-flannel-cfg + namespace: kube-flannel + labels: + tier: node + app: flannel +data: + cni-conf.json: | + { + "name": "cbr0", + "cniVersion": "0.3.1", + "plugins": [ + { + "type": "flannel", + "delegate": { + "hairpinMode": true, + "isDefaultGateway": true + } + }, + { + "type": "portmap", + "capabilities": { + "portMappings": true + } + } + ] + } + net-conf.json: | + { + "Network": "10.244.0.0/16", + "Backend": { + "Type": "vxlan" + } + } +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: kube-flannel-ds + namespace: kube-flannel + labels: + tier: node + app: flannel +spec: + selector: + matchLabels: + app: flannel + template: + metadata: + labels: + tier: node + app: flannel + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/os + operator: In + values: + - linux + hostNetwork: true + priorityClassName: system-node-critical + tolerations: + - operator: Exists + effect: NoSchedule + serviceAccountName: flannel + initContainers: + - name: install-cni-plugin + #image: flannelcni/flannel-cni-plugin:v1.1.0 for ppc64le and mips64le (dockerhub limitations may apply) + image: docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0 + command: + - cp + args: + - -f + - /flannel + - /opt/cni/bin/flannel + volumeMounts: + - name: cni-plugin + mountPath: /opt/cni/bin + - name: install-cni + #image: flannelcni/flannel:v0.20.2 for ppc64le and mips64le (dockerhub limitations may apply) + image: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.2 + command: + - cp + args: + - -f + - /etc/kube-flannel/cni-conf.json + - /etc/cni/net.d/10-flannel.conflist + volumeMounts: + - name: cni + mountPath: /etc/cni/net.d + - name: flannel-cfg + mountPath: /etc/kube-flannel/ + containers: + - name: kube-flannel + #image: flannelcni/flannel:v0.20.2 for ppc64le and mips64le (dockerhub limitations may apply) + image: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.2 + command: + - /opt/bin/flanneld + args: + - --ip-masq + - --kube-subnet-mgr + resources: + requests: + cpu: "100m" + memory: "50Mi" + limits: + cpu: "100m" + memory: "50Mi" + securityContext: + privileged: false + capabilities: + add: ["NET_ADMIN", "NET_RAW"] + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: EVENT_QUEUE_DEPTH + value: "5000" + volumeMounts: + - name: run + mountPath: /run/flannel + - name: flannel-cfg + mountPath: /etc/kube-flannel/ + - name: xtables-lock + mountPath: /run/xtables.lock + volumes: + - name: run + hostPath: + path: /run/flannel + - name: cni-plugin + hostPath: + path: /opt/cni/bin + - name: cni + hostPath: + path: /etc/cni/net.d + - name: flannel-cfg + configMap: + name: kube-flannel-cfg + - name: xtables-lock + hostPath: + path: /run/xtables.lock + type: FileOrCreate \ No newline at end of file diff --git a/config/k8s/service.yaml b/config/k8s/service.yaml new file mode 100644 index 0000000..010c846 --- /dev/null +++ b/config/k8s/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 # 版本 +kind: Service # 类型 +metadata: # 元数据 + name: # 资源名称 + namespace: # 命名空间 +spec: + selector: # 标签选择器,用于确定当前Service代理那些Pod + app: nginx + type: # Service的类型,指定Service的访问方式 + clusterIP: # 虚拟服务的IP地址 + sessionAffinity: # session亲和性,支持ClientIP、None两个选项,默认值为None + ports: # 端口信息 + - port: 8080 # Service端口 + protocol: TCP # 协议 + targetPort : # Pod端口 + nodePort: # 主机端口 \ No newline at end of file diff --git a/package/Python-3.10.4.tar.xz b/package/Python-3.10.4.tar.xz new file mode 100644 index 0000000..552f955 Binary files /dev/null and b/package/Python-3.10.4.tar.xz differ diff --git a/package/memtest.war b/package/memtest.war new file mode 100644 index 0000000..ae4c39d Binary files /dev/null and b/package/memtest.war differ diff --git a/package/openssl-1.1.1n.tar.gz b/package/openssl-1.1.1n.tar.gz new file mode 100644 index 0000000..4d2708d Binary files /dev/null and b/package/openssl-1.1.1n.tar.gz differ diff --git a/repo/centos7-repo b/repo/centos7-repo new file mode 100644 index 0000000..cc8b40f --- /dev/null +++ b/repo/centos7-repo @@ -0,0 +1,47 @@ +[mysql57] +name=mysql57 +baseurl=http://package.qf.com/mysql57-community +enabled=1 +gpgcheck=0 + +[mysql57-connectors-community] +name=mysql57-connectors-community +baseurl=http://package.qf.com/mysql-connectors-community +enabled=1 +gpgcheck=0 + +[mysql57-tools-community] +name=mysql57-tools-community +baseurl=http://package.qf.com/mysql-tools-community +enabled=1 +gpgcheck=0 + +[myxtrabackup] +name=myxtrabackup +baseurl=http://package.qf.com/xtrabackup +enabled=0 +gpgcheck=0 + +[mybase] +name=mybase +baseurl=http://package.qf.com/base +enabled=1 +gpgcheck=0 + +[myepel] +name=myepel +baseurl=http://package.qf.com/epel +enabled=1 +gpgcheck=0 + +[myextras] +name=myepel +baseurl=http://package.qf.com/extras +enabled=1 +gpgcheck=0 + +[myupdates] +name=myupdates +baseurl=http://package.qf.com/updates +enabled=1 +gpgcheck=0 \ No newline at end of file diff --git a/repo/pip.conf b/repo/pip.conf new file mode 100644 index 0000000..437789b --- /dev/null +++ b/repo/pip.conf @@ -0,0 +1,5 @@ +[global] +index-url = https://mirrors.aliyun.com/pypi/simple/ + +[install] +trusted-host=mirrors.aliyun.com \ No newline at end of file diff --git a/script/get-cmd-history.sh b/script/get-cmd-history.sh new file mode 100644 index 0000000..b71bcfc --- /dev/null +++ b/script/get-cmd-history.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +#history + +# 获取登录ip地址 +# USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` +USER_IP=$(env |grep SSH_CLIENT | awk '{print $1}' | sed 's/SSH_CLIENT=//' | awk -F " " '{print $1}') +# 指定历史命令路径 +HISTDIR=/usr/share/.history +if [ -z $USER_IP ] +then +USER_IP=`hostname` +fi +if [ ! -d $HISTDIR ] +then +mkdir -p $HISTDIR +chmod 777 $HISTDIR +fi +if [ ! -d $HISTDIR/${LOGNAME} ] +then +mkdir -p $HISTDIR/${LOGNAME} +chmod 300 $HISTDIR/${LOGNAME} +fi +# 设置历史命令条数 +export HISTSIZE=4000 +# 设置文件后缀 +DT=`date +%Y%m%d_%H%M%S` +export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT" #文件路径 +export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S] " #记录格式 +# 设置权限 +chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null diff --git a/script/get-docker-compose.sh b/script/get-docker-compose.sh new file mode 100644 index 0000000..7ccbe4c --- /dev/null +++ b/script/get-docker-compose.sh @@ -0,0 +1,8 @@ +#!/usr/bin/bash +echo "版本信息可查看 https://dn-dao-github-mirror.daocloud.io/docker/compose/releases/" +LEVEL=${DOCKER_COMPOSE_LEVEL:-1.20.1} +curl -L https://get.daocloud.io/docker/compose/releases/download/${LEVEL}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && chmod a+x /usr/local/bin/docker-compose + +if [ -z $DOCKER_COMPOSE_LEVEL ];then + echo "采用默认版本1.20.1,如需要指定版本,可以在终端执行 export DOCKER_COMPOSE_LEVEL=版本" +fi \ No newline at end of file diff --git a/script/get-docker-image.sh b/script/get-docker-image.sh new file mode 100644 index 0000000..3669da3 --- /dev/null +++ b/script/get-docker-image.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +TAG_PREFIX= + +save(){ + if [ ! -d "./images" ]; then + mkdir images + fi + cd images + docker images --format "{{.ID}} {{.Repository}}:{{.Tag}} {{.Size}}" |grep $TAG_PREFIX > images_pull.txt + while read line + do + image_id=`echo $line | awk '{print $1}'` + image_repository=`echo $line | awk '{print $2}'` + image_size=`echo $line | awk '{print $3}'` + docker save -o $image_id.tar $image_repository && \ + echo "Image $image_repository saved, size $image_size" + done < images_pull.txt +} + +load(){ + cd images + while read line + do + image_id=`echo $line | awk '{print $1}'` + image_repository=`echo $line | awk '{print $2}'` + docker load -i $image_id.tar && \ + echo "Image $image_repository loaded" + done < images_pull.txt +} +if [ -z "$1" ]; then + echo "Usage: image_operation.sh [save|load]" +fi + +eval $1 diff --git a/script/get-docker-latest.sh b/script/get-docker-latest.sh new file mode 100644 index 0000000..1e1e2df --- /dev/null +++ b/script/get-docker-latest.sh @@ -0,0 +1,34 @@ +#!/usr/bin/bash + +set -e +unset c +color(){ + declare -A c=([Error]=31 [Success]=32 [Warning]=33 [Info]=34) + #echo -e "\033[${c[$1]}m[`date +%T`]($1) $2\033[0m" + printf "\033[${c[$1]}m%-10s%-10s %-30s\033[0m\n" "[`date +%T`]" "($1)" "$2" + sleep 0.5 +} + +install(){ + color Info "开始安装docker服务" + yum install -y yum-utils device-mapper-persistent-data lvm2 git && \ + yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && \ + yum install -y docker-ce + mkdir -p /etc/docker + color Success "安装完成" + color Info "开始配置镜像加速器" + tee /etc/docker/daemon.json <<-'EOF' +{ + "registry-mirrors": ["https://pilvpemn.mirror.aliyuncs.com"] +} +EOF + cat >> /etc/sysctl.conf <> ~/.bashrc diff --git a/script/get-mysql57.sh b/script/get-mysql57.sh new file mode 100644 index 0000000..f34d7dd --- /dev/null +++ b/script/get-mysql57.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# by newrain +# time 2019-11-28 +# lv 2.0 +level=5.7 +password="QianFeng@123" +remote_user="remote" +remote_passwd="QianFeng@123" +unset c +color(){ + declare -A c=([Error]=31 [Success]=32 [Warning]=33 [Info]=34) + #echo -e "\033[${c[$1]}m[`date +%T`]($1) $2\033[0m" + printf "\033[${c[$1]}m%-10s%-10s %-30s\033[0m\n" "[`date +%T`]" "($1)" "$2" + sleep 0.5 +} + +color Info "此脚本用于yum 安装mysql" +color Warning "此脚本将删除所有mysql数据,如需备份请ctrl+c终止脚本,程序将在3秒后执行" +sleep 3 +if [[ $UID -ne 0 ]];then + color Warning "使用root 执行此脚本" + exit 1 +fi + +color Warning "清理环境" +systemctl stop mysqld mariadb &>/dev/null +yum erase -y `rpm -qa |grep mariadb` 2>/dev/null +yum erase -y `rpm -qa |grep mysql` 2>/dev/null +rm -rvf /etc/my.cnf /var/lib/mysql /var/log/mysql* +userdel -rf mysql &>/dev/null +ping -c1 -w1 www.baidu.com &>/dev/null +if [[ $? -eq 0 ]];then + if [ ! -f /tmp/.init ];then + yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm + fi +else + color Error "网络错误" + exit 22 +fi +yum -y install mysql-community-server mysql-community-devel --disablerepo mysql80 --enablerepo mysql57 --nogpgcheck +systemctl start mysqld +color Warning "启动成功,初始密码如下(mysql5.7前版本没有初始密码)" +passwd=$(grep -o 'root@localhost.*' /var/log/mysqld.log | awk 'END{print $NF}') +mysqladmin -uroot -p$passwd password $password && \ +mysql -uroot -p$password -e "grant all on *.* to \"$remote_user\"@'%' identified by \"$remote_passwd\"; flush privileges;" +color Success "安装完成 初始密码为$password" diff --git a/script/get-os-info.sh b/script/get-os-info.sh new file mode 100644 index 0000000..6339813 --- /dev/null +++ b/script/get-os-info.sh @@ -0,0 +1,82 @@ +#!/usr/bin/bash + +unset c +color(){ + declare -A c=([Error]=31 [Success]=32 [Warning]=33 [Info]=34) + #echo -e "\033[${c[$1]}m[`date +%T`]($1) $2\033[0m" + printf "\033[${c[$1]}m%-10s%-10s %-30s\033[0m\n" "[`date +%T`]" "($1)" "$2" + sleep 0.5 +} +cpu(){ + cpus=$(grep processor /proc/cpuinfo |wc -l) + cpuModel=$(grep "model name" /proc/cpuinfo | uniq | awk -F ':' '{print $2}') + cpuCache=$(grep "cache size" /proc/cpuinfo | uniq | awk -F ':' '{print $2}') + printf "%-10s\t%-50s\n" "[CPU]" "[Info]" + printf "%-10s\t%-50s\n" "cpu核心:" "${cpus/ /}核" + printf "%-10s\t%-50s\n" "cpu型号:" "${cpuModel/ /}" + printf "%-10s\t%-50s\n" "cpu缓存:" "${cpuCache/ /}" +} +memory(){ + memTotal=$(awk -F':' '/MemTotal:/{print $2}' /proc/meminfo | awk '{print $1,$2}') + memFree=$(awk -F':' '/MemFree:/{print $2}' /proc/meminfo | awk '{print $1,$2}') + memBuffer=$(awk -F':' '/Buffers:/{print $2}' /proc/meminfo | awk '{print $1,$2}') + memCached=$(awk -F':' '/^Cached:/{print $2}' /proc/meminfo | awk '{print $1,$2}') + swapTotal=$(awk -F':' '/SwapTotal:/{print $2}' /proc/meminfo | awk '{print $1,$2}') + swapFree=$(awk -F':' '/SwapFree:/{print $2}' /proc/meminfo | awk '{print $1,$2}') + memDevice=$(dmidecode |grep -P -A 5 "Memory Device"|grep Size|grep -v 'Range' | wc -l) + maxMem=$(dmidecode |grep "Maximum Capacity" | awk '{print $3,$4}') + maxHz=$(dmidecode |grep "Max Speed" |uniq | awk '{print $3,$4}') + printf "%-10s\t%-50s\n" "[Memory]" "[Info]" + printf "%-10s\t%-50s\n" "内存总量:" "$memTotal" + printf "%-10s\t%-50s\n" "内存剩余:" "$memFree" + printf "%-10s\t%-50s\n" "内存写缓:" "$memBuffer" + printf "%-10s\t%-50s\n" "内存读缓:" "$memCached" + printf "%-10s\t%-50s\n" "临时缓存总量:" "$swapTotal" + printf "%-10s\t%-50s\n" "临时缓存剩余:" "$swapFree" + printf "%-10s\t%-50s\n" "内存条数:" "$memDevice" + printf "%-10s\t%-50s\n" "最大支持内存:" "$maxMem" + printf "%-10s\t%-50s\n" "内存频率:" "$maxHz" +} +disk(){ + printf "%-10s\t%-15s\t%-30s\t%-5s\n" "[MountPoint]" "[Used]" "[FileSystem]" "[Size]" + df -Th | awk 'BEGIN{ORS="\n"}$2 ~ /(ext|xfs)/{printf "%-10s\t%-15s\t%-30s\t%-5s\n",$NF,$(NF-1),$1,$3}' +} + +os(){ + os_release=$(hostnamectl | awk -F': ' '/Operating System/{print $2}') + os_kernel=$(hostnamectl | awk -F': ' '/Kernel/{print $2}') + hostname=$(hostnamectl | awk -F': ' '/Static hostname/{print $2}') + printf "%-10s\t%-20s\n" "[Info]" "[Value]" + printf "%-20s\t%-20s\n" "系统版本:" "$os_release" + printf "%-20s\t%-20s\n" "内核版本:" "$os_kernel" + printf "%-20s\t%-20s\n" "主机名称:" "$hostname" + netIf=$(ip -f inet a | awk '/^[0-9]/{print $0}' |awk -F':' '{print $2}') + netIfs=$(echo netIf |wc -w) + printf "%-20s\t%-20s\t%-18s\n" "[InterFace]" "[IpAddress]" "[MacAddress]" + for i in $netIf + do + # 网卡ip + iname=$(ip -f inet a show dev $i | awk '/inet/{print $2}') + # 网卡mac + mname=$(ip -f link a show dev $i |awk '/link/{print $2}') + printf "%-20s\t%-20s\t%-18s\n" "$i" "$iname" "$mname" + done +} + +color Info "开始读取本地信息" + +main(){ + color Success "中央处理器信息" + # cpu 信息查询函数 + cpu + color Success "内存信息" + # 内存 信息查询函数 + memory + color Success "网络信息" + os + # 磁盘信息 + color Success "磁盘信息" + disk +} + +main \ No newline at end of file diff --git a/script/get-os-init.sh b/script/get-os-init.sh new file mode 100644 index 0000000..51153a0 --- /dev/null +++ b/script/get-os-init.sh @@ -0,0 +1,106 @@ +#!/usr/bin/bash + +color(){ + unset c + declare -A c=([Error]=31 [Success]=32 [Warning]=33 [Info]=34) + #echo -e "\033[${c[$1]}m[`date +%T`]($1) $2\033[0m" + printf "\033[${c[$1]}m%-10s%-10s %-30s\033[0m\n" "[`date +%T`]" "($1)" "$2" + sleep 0.5 +} + +static_addr(){ +ifname=$(ip -f inet a | awk '/^2/{print $2}') +ifname=$(echo ${ifname/:/}) +ipaddr=$(ip -f inet a show dev $ifname | awk '/inet/{print $2}' | awk -F'/' '{print $1}') +prefix=$(ip -f inet a show dev $ifname | awk '/inet/{print $2}' | awk -F'/' '{print $2}') +gateway=$(ip r |awk '/default/{print $3}') +cat > /etc/sysconfig/network-scripts/ifcfg-$ifname </dev/null && \ +return 10 || \ +return 20 +} + +local_yum_make(){ + cd /etc/yum.repos.d/ && \ + rename .repo .repo.bak *.repo &>/dev/null + grep '10.8.161.40 package.qf.com' /etc/hosts &>/dev/null + if [ $? -ne 0 ];then + cat >> /etc/hosts </dev/null + curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo + curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo + yum repolist && yum clean all && yum makecache && \ + color Success "阿里源配置完成" || color Error "yum配置错误,可以\ncd /etc/yum.repos.d/ && rm -rf centos7.repo && rename .repo.bak .repo *.repo.bak \n使用手动恢复历史yum" +} + +init(){ + color Success "开始配置静态ip" + static_addr + if [ $? -eq 10 ];then + color Success "静态ip配置并检测完成" + else + color Error "静态ip配置异常" + fi + color Info "正在关闭防火墙、selinux" + color Warning "注意,这将降低服务器安全性" + systemctl disable firewalld postfix --now && \ + setenforce 0 ; sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config && \ + color Success "配置完成" || color Error "配置异常,请检查" + color Info "配置yum源, 此操作将备份您的历史源" + ping -w 1 -c 1 10.8.161.40 &>/dev/null + if [ $? -eq 0 ];then + local_yum_make + else + remote_yum_make + fi + color Info "开始安装常用软件" + yum install -y wget unzip vim yum-utils httpd-tools psacct net-tools nc ntpdate jq htop && \ + color Success "安装完成" || color Warning "部分包可能失败" + color Info "开始进行时间校准" + ntpdate ntp.aliyun.com && \ + # 修改时间到硬件 + clock -w + #保存时间到硬件 + hwclock -s + color Success "时间校准完成" + # color Info "修改终端前缀显示" + # cat > /etc/profile.d/psdiy.sh < /tmp/.init +} +if [ -f /tmp/.init ];then + color Success "检测到此前已进行初始化,如需重新执行,请删除: rm -f /tmp/.init" + exit 0 +fi +init +color Success "初始化完成" diff --git a/script/get-py3104.sh b/script/get-py3104.sh new file mode 100644 index 0000000..dee8f79 --- /dev/null +++ b/script/get-py3104.sh @@ -0,0 +1,39 @@ +#!/usr/bin/bash + +path=/opt/py3104 +unset c +color(){ + declare -A c=([Error]=31 [Success]=32 [Warning]=33 [Info]=34) + #echo -e "\033[${c[$1]}m[`date +%T`]($1) $2\033[0m" + printf "\033[${c[$1]}m%-10s%-10s %-30s\033[0m\n" "[`date +%T`]" "($1)" "$2" + sleep 0.5 +} + +mkdir -pv $path +cd $path && \ +yum -y install gcc gcc-c++ zlib-devel bzip2-devel sqlite-devel readline-devel libffi-devel && \ +color Info "openssl 包下载,请稍等..." && \ +wget http://download.beyourself.org.cn/package/openssl-1.1.1n.tar.gz && \ +tar xf openssl-1.1.1n.tar.gz && \ +cd openssl-1.1.1n && \ +./config --prefix=/usr/local/openssl && \ +make -j $(cat /proc/cpuinfo | grep processor |wc -l) && make install && cd .. && \ +wget http://download.beyourself.org.cn/package/Python-3.10.4.tar.xz && \ +tar xf Python-3.10.4.tar.xz && \ +cd Python-3.10.4 && \ +./configure --enable-shared --prefix=/usr/local/python3.10.4 --with-openssl=/usr/local/openssl --with-openssl-rpath=auto && \ +make -j $(cat /proc/cpuinfo | grep processor |wc -l) && \ +make install && \ +echo "/usr/local/python3.10.4/lib" >> /etc/ld.so.conf && \ +ldconfig && \ +echo "export PATH=/usr/local/python3.10.4/bin:\$PATH" >> /etc/profile && \ +color Success "python安装完成" + +color Info "配置pip加速" +mkdir ~/.pip &>/dev/null +tee ~/.pip/pip.conf < +# +# System Required: CentOS 6+, Debian7+, Ubuntu12+ +# +# Reference URL: +# https://github.com/shadowsocks/shadowsocks +# https://github.com/shadowsocks/shadowsocks-go +# https://github.com/shadowsocks/shadowsocks-libev +# https://github.com/shadowsocks/shadowsocks-windows +# https://github.com/shadowsocksr-rm/shadowsocksr +# https://github.com/shadowsocksrr/shadowsocksr +# https://github.com/shadowsocksrr/shadowsocksr-csharp +# +# Thanks: +# @clowwindy +# @breakwa11 +# @cyfdecyf +# @madeye +# @linusyang +# @Akkariiin +# +# Intro: https://teddysun.com/486.html + +red='\033[0;31m' +green='\033[0;32m' +yellow='\033[0;33m' +plain='\033[0m' + +[[ $EUID -ne 0 ]] && echo -e "[${red}Error${plain}] This script must be run as root!" && exit 1 + +cur_dir=$( pwd ) +software=(Shadowsocks-Python ShadowsocksR Shadowsocks-Go Shadowsocks-libev) + +libsodium_file='libsodium-1.0.18' +libsodium_url='https://github.com/jedisct1/libsodium/releases/download/1.0.18-RELEASE/libsodium-1.0.18.tar.gz' + +mbedtls_file='mbedtls-2.16.12' +mbedtls_url='https://github.com/Mbed-TLS/mbedtls/archive/refs/tags/v2.16.12.tar.gz' + +shadowsocks_python_file='shadowsocks-master' +shadowsocks_python_url='https://github.com/shadowsocks/shadowsocks/archive/master.zip' +shadowsocks_python_init='/etc/init.d/shadowsocks-python' +shadowsocks_python_config='/etc/shadowsocks-python/config.json' +shadowsocks_python_centos='https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks' +shadowsocks_python_debian='https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-debian' + +shadowsocks_r_file='shadowsocksr-3.2.2' +shadowsocks_r_url='https://github.com/shadowsocksrr/shadowsocksr/archive/3.2.2.tar.gz' +shadowsocks_r_init='/etc/init.d/shadowsocks-r' +shadowsocks_r_config='/etc/shadowsocks-r/config.json' +shadowsocks_r_centos='https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR' +shadowsocks_r_debian='https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR-debian' + +shadowsocks_go_file_64='shadowsocks-server-linux64-1.2.2' +shadowsocks_go_url_64='https://dl.lamp.sh/shadowsocks/shadowsocks-server-linux64-1.2.2.gz' +shadowsocks_go_file_32='shadowsocks-server-linux32-1.2.2' +shadowsocks_go_url_32='https://dl.lamp.sh/shadowsocks/shadowsocks-server-linux32-1.2.2.gz' +shadowsocks_go_init='/etc/init.d/shadowsocks-go' +shadowsocks_go_config='/etc/shadowsocks-go/config.json' +shadowsocks_go_centos='https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go' +shadowsocks_go_debian='https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go-debian' + +shadowsocks_libev_init='/etc/init.d/shadowsocks-libev' +shadowsocks_libev_config='/etc/shadowsocks-libev/config.json' +shadowsocks_libev_centos='https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev' +shadowsocks_libev_debian='https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev-debian' + +# Stream Ciphers +common_ciphers=( +aes-256-gcm +aes-192-gcm +aes-128-gcm +aes-256-ctr +aes-192-ctr +aes-128-ctr +aes-256-cfb +aes-192-cfb +aes-128-cfb +camellia-128-cfb +camellia-192-cfb +camellia-256-cfb +xchacha20-ietf-poly1305 +chacha20-ietf-poly1305 +chacha20-ietf +chacha20 +salsa20 +rc4-md5 +) +go_ciphers=( +aes-256-cfb +aes-192-cfb +aes-128-cfb +aes-256-ctr +aes-192-ctr +aes-128-ctr +chacha20-ietf +chacha20 +salsa20 +rc4-md5 +) +r_ciphers=( +none +aes-256-cfb +aes-192-cfb +aes-128-cfb +aes-256-cfb8 +aes-192-cfb8 +aes-128-cfb8 +aes-256-ctr +aes-192-ctr +aes-128-ctr +chacha20-ietf +chacha20 +salsa20 +xchacha20 +xsalsa20 +rc4-md5 +) +# Reference URL: +# https://github.com/shadowsocksr-rm/shadowsocks-rss/blob/master/ssr.md +# https://github.com/shadowsocksrr/shadowsocksr/commit/a3cf0254508992b7126ab1151df0c2f10bf82680 +# Protocol +protocols=( +origin +verify_deflate +auth_sha1_v4 +auth_sha1_v4_compatible +auth_aes128_md5 +auth_aes128_sha1 +auth_chain_a +auth_chain_b +auth_chain_c +auth_chain_d +auth_chain_e +auth_chain_f +) +# obfs +obfs=( +plain +http_simple +http_simple_compatible +http_post +http_post_compatible +tls1.2_ticket_auth +tls1.2_ticket_auth_compatible +tls1.2_ticket_fastauth +tls1.2_ticket_fastauth_compatible +) +# libev obfuscating +obfs_libev=(http tls) +# initialization parameter +libev_obfs='' + +disable_selinux(){ + if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then + sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config + setenforce 0 + fi +} + +check_sys(){ + local checkType=$1 + local value=$2 + + local release='' + local systemPackage='' + + if [[ -f /etc/redhat-release ]]; then + release='centos' + systemPackage='yum' + elif grep -Eqi 'debian|raspbian' /etc/issue; then + release='debian' + systemPackage='apt' + elif grep -Eqi 'ubuntu' /etc/issue; then + release='ubuntu' + systemPackage='apt' + elif grep -Eqi 'centos|red hat|redhat' /etc/issue; then + release='centos' + systemPackage='yum' + elif grep -Eqi 'debian|raspbian' /proc/version; then + release='debian' + systemPackage='apt' + elif grep -Eqi 'ubuntu' /proc/version; then + release='ubuntu' + systemPackage='apt' + elif grep -Eqi 'centos|red hat|redhat' /proc/version; then + release='centos' + systemPackage='yum' + fi + + if [[ "${checkType}" == 'sysRelease' ]]; then + if [ "${value}" == "${release}" ]; then + return 0 + else + return 1 + fi + elif [[ "${checkType}" == 'packageManager' ]]; then + if [ "${value}" == "${systemPackage}" ]; then + return 0 + else + return 1 + fi + fi +} + +version_ge(){ + test "$(echo "$@" | tr ' ' '\n' | sort -rV | head -n 1)" == "$1" +} + +version_gt(){ + test "$(echo "$@" | tr ' ' '\n' | sort -V | head -n 1)" != "$1" +} + +check_kernel_version(){ + local kernel_version + kernel_version=$(uname -r | cut -d- -f1) + if version_gt "${kernel_version}" 3.7.0; then + return 0 + else + return 1 + fi +} + +check_kernel_headers(){ + if check_sys packageManager yum; then + if rpm -qa | grep -q headers-"$(uname -r)"; then + return 0 + else + return 1 + fi + elif check_sys packageManager apt; then + if dpkg -s linux-headers-"$(uname -r)" > /dev/null 2>&1; then + return 0 + else + return 1 + fi + fi + return 1 +} + +getversion(){ + if [[ -s /etc/redhat-release ]]; then + grep -oE '[0-9.]+' /etc/redhat-release + else + grep -oE '[0-9.]+' /etc/issue + fi +} + +centosversion(){ + if check_sys sysRelease centos; then + local code=$1 + local version + version="$(getversion)" + local main_ver=${version%%.*} + if [ "$main_ver" == "$code" ]; then + return 0 + else + return 1 + fi + else + return 1 + fi +} + +autoconf_version(){ + if [ ! "$(command -v autoconf)" ]; then + echo -e "[${green}Info${plain}] Starting install package autoconf" + if check_sys packageManager yum; then + yum install -y autoconf > /dev/null 2>&1 || echo -e "[${red}Error:${plain}] Failed to install autoconf" + elif check_sys packageManager apt; then + apt-get -y update > /dev/null 2>&1 + apt-get -y install autoconf > /dev/null 2>&1 || echo -e "[${red}Error:${plain}] Failed to install autoconf" + fi + fi + local autoconf_ver + autoconf_ver=$(autoconf --version | grep autoconf | grep -oE '[0-9.]+') + if version_ge "${autoconf_ver}" 2.67; then + return 0 + else + return 1 + fi +} + +get_ip(){ + local IP + IP=$( ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v '^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\.' | head -n 1 ) + [ -z "${IP}" ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com ) + [ -z "${IP}" ] && IP=$( wget -qO- -t1 -T2 ipinfo.io/ip ) + echo "${IP}" +} + +get_ipv6(){ + local ipv6 + ipv6=$(wget -qO- -t1 -T2 ipv6.icanhazip.com) + [ -z "${ipv6}" ] && return 1 || return 0 +} + +get_libev_ver(){ + libev_ver=$(wget --no-check-certificate -qO- https://api.github.com/repos/shadowsocks/shadowsocks-libev/releases/latest | grep 'tag_name' | cut -d\" -f4) + [ -z "${libev_ver}" ] && echo -e "[${red}Error${plain}] Get shadowsocks-libev latest version failed" && exit 1 +} + +get_opsy(){ + [ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return + [ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return + [ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return +} + +is_64bit(){ + if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '64' ] ; then + return 0 + else + return 1 + fi +} + +debianversion(){ + if check_sys sysRelease debian;then + local version + version=$( get_opsy ) + local code + code=${1} + local main_ver + main_ver=$( echo "${version}" | sed 's/[^0-9]//g') + if [ "${main_ver}" == "${code}" ];then + return 0 + else + return 1 + fi + else + return 1 + fi +} + +download(){ + local filename + filename=$(basename "$1") + if [ -f "${1}" ]; then + echo "${filename} [found]" + else + echo "${filename} not found, download now..." + wget --no-check-certificate -c -t3 -T60 -O "${1}" "${2}" + if [ $? -ne 0 ]; then + echo -e "[${red}Error${plain}] Download ${filename} failed." + exit 1 + fi + fi +} + +download_files(){ + cd "${cur_dir}" || exit + + if [ "${selected}" == '1' ]; then + download "${shadowsocks_python_file}.zip" "${shadowsocks_python_url}" + if check_sys packageManager yum; then + download "${shadowsocks_python_init}" "${shadowsocks_python_centos}" + elif check_sys packageManager apt; then + download "${shadowsocks_python_init}" "${shadowsocks_python_debian}" + fi + elif [ "${selected}" == '2' ]; then + download "${shadowsocks_r_file}.tar.gz" "${shadowsocks_r_url}" + if check_sys packageManager yum; then + download "${shadowsocks_r_init}" "${shadowsocks_r_centos}" + elif check_sys packageManager apt; then + download "${shadowsocks_r_init}" "${shadowsocks_r_debian}" + fi + elif [ "${selected}" == '3' ]; then + if is_64bit; then + download "${shadowsocks_go_file_64}.gz" "${shadowsocks_go_url_64}" + else + download "${shadowsocks_go_file_32}.gz" "${shadowsocks_go_url_32}" + fi + if check_sys packageManager yum; then + download "${shadowsocks_go_init}" "${shadowsocks_go_centos}" + elif check_sys packageManager apt; then + download "${shadowsocks_go_init}" "${shadowsocks_go_debian}" + fi + elif [ "${selected}" == '4' ]; then + get_libev_ver + shadowsocks_libev_file="shadowsocks-libev-$(echo "${libev_ver}" | sed -e 's/^[a-zA-Z]//g')" + shadowsocks_libev_url="https://github.com/shadowsocks/shadowsocks-libev/releases/download/${libev_ver}/${shadowsocks_libev_file}.tar.gz" + + download "${shadowsocks_libev_file}.tar.gz" "${shadowsocks_libev_url}" + if check_sys packageManager yum; then + download "${shadowsocks_libev_init}" "${shadowsocks_libev_centos}" + elif check_sys packageManager apt; then + download "${shadowsocks_libev_init}" "${shadowsocks_libev_debian}" + fi + fi + +} + +get_char(){ + SAVEDSTTY=$(stty -g) + stty -echo + stty cbreak + dd if=/dev/tty bs=1 count=1 2> /dev/null + stty -raw + stty echo + stty "$SAVEDSTTY" +} + +error_detect_depends(){ + local command=$1 + local depend + depend=$(echo "${command}" | awk '{print $4}') + echo -e "[${green}Info${plain}] Starting to install package ${depend}" + ${command} > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo -e "[${red}Error${plain}] Failed to install ${red}${depend}${plain}" + echo 'Please visit: https://teddysun.com/486.html and contact.' + exit 1 + fi +} + +config_firewall(){ + if centosversion 6; then + /etc/init.d/iptables status > /dev/null 2>&1 + if [ $? -eq 0 ]; then + iptables -L -n | grep -i "${shadowsocksport}" > /dev/null 2>&1 + if [ $? -ne 0 ]; then + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport "${shadowsocksport}" -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport "${shadowsocksport}" -j ACCEPT + /etc/init.d/iptables save + /etc/init.d/iptables restart + else + echo -e "[${green}Info${plain}] port ${green}${shadowsocksport}${plain} already be enabled." + fi + else + echo -e "[${yellow}Warning${plain}] iptables looks like not running or not installed, please enable port ${shadowsocksport} manually if necessary." + fi + elif centosversion 7; then + systemctl status firewalld > /dev/null 2>&1 + if [ $? -eq 0 ]; then + default_zone=$(firewall-cmd --get-default-zone) + firewall-cmd --permanent --zone="${default_zone}" --add-port="${shadowsocksport}"/tcp + firewall-cmd --permanent --zone="${default_zone}" --add-port="${shadowsocksport}"/udp + firewall-cmd --reload + else + echo -e "[${yellow}Warning${plain}] firewalld looks like not running or not installed, please enable port ${shadowsocksport} manually if necessary." + fi + fi +} + +config_shadowsocks(){ + +if [ "${selected}" == '1' ]; then + if [ ! -d "$(dirname ${shadowsocks_python_config})" ]; then + mkdir -p $(dirname ${shadowsocks_python_config}) + fi + cat > ${shadowsocks_python_config}<<-EOF +{ + "server":"0.0.0.0", + "server_port":${shadowsocksport}, + "local_address":"127.0.0.1", + "local_port":1080, + "password":"${shadowsockspwd}", + "timeout":300, + "method":"${shadowsockscipher}", + "fast_open":false +} +EOF +elif [ "${selected}" == '2' ]; then + if [ ! -d "$(dirname ${shadowsocks_r_config})" ]; then + mkdir -p $(dirname ${shadowsocks_r_config}) + fi + cat > ${shadowsocks_r_config}<<-EOF +{ + "server":"0.0.0.0", + "server_ipv6":"::", + "server_port":${shadowsocksport}, + "local_address":"127.0.0.1", + "local_port":1080, + "password":"${shadowsockspwd}", + "timeout":120, + "method":"${shadowsockscipher}", + "protocol":"${shadowsockprotocol}", + "protocol_param":"", + "obfs":"${shadowsockobfs}", + "obfs_param":"", + "redirect":"", + "dns_ipv6":false, + "fast_open":false, + "workers":1 +} +EOF +elif [ "${selected}" == '3' ]; then + if [ ! -d "$(dirname ${shadowsocks_go_config})" ]; then + mkdir -p $(dirname ${shadowsocks_go_config}) + fi + cat > ${shadowsocks_go_config}<<-EOF +{ + "server":"0.0.0.0", + "server_port":${shadowsocksport}, + "local_port":1080, + "password":"${shadowsockspwd}", + "method":"${shadowsockscipher}", + "timeout":300 +} +EOF +elif [ "${selected}" == '4' ]; then + local server_value="\"0.0.0.0\"" + if get_ipv6; then + server_value="[\"[::0]\",\"0.0.0.0\"]" + fi + + if [ ! -d "$(dirname ${shadowsocks_libev_config})" ]; then + mkdir -p $(dirname ${shadowsocks_libev_config}) + fi + + if [ "${libev_obfs}" == 'y' ] || [ "${libev_obfs}" == 'Y' ]; then + cat > ${shadowsocks_libev_config}<<-EOF +{ + "server":${server_value}, + "server_port":${shadowsocksport}, + "password":"${shadowsockspwd}", + "timeout":300, + "user":"nobody", + "method":"${shadowsockscipher}", + "fast_open":false, + "nameserver":"1.0.0.1", + "mode":"tcp_and_udp", + "plugin":"obfs-server", + "plugin_opts":"obfs=${shadowsocklibev_obfs}" +} +EOF + else + cat > ${shadowsocks_libev_config}<<-EOF +{ + "server":${server_value}, + "server_port":${shadowsocksport}, + "password":"${shadowsockspwd}", + "timeout":300, + "user":"nobody", + "method":"${shadowsockscipher}", + "fast_open":false, + "nameserver":"1.0.0.1", + "mode":"tcp_and_udp" +} +EOF + fi + +fi +} + +install_dependencies(){ + if check_sys packageManager yum; then + echo -e "[${green}Info${plain}] Checking the EPEL repository..." + if [ ! -f /etc/yum.repos.d/epel.repo ]; then + yum install -y epel-release > /dev/null 2>&1 + fi + [ ! -f /etc/yum.repos.d/epel.repo ] && echo -e "[${red}Error${plain}] Install EPEL repository failed, please check it." && exit 1 + [ ! "$(command -v yum-config-manager)" ] && yum install -y yum-utils > /dev/null 2>&1 + [ x"$(yum-config-manager epel | grep -w enabled | awk '{print $3}')" != x'True' ] && yum-config-manager --enable epel > /dev/null 2>&1 + echo -e "[${green}Info${plain}] Checking the EPEL repository complete..." + + yum_depends=( + unzip gzip openssl openssl-devel gcc python python-devel python-setuptools pcre pcre-devel libtool libevent + autoconf automake make curl curl-devel zlib-devel perl perl-devel cpio expat-devel gettext-devel + libev-devel c-ares-devel git qrencode + ) + for depend in ${yum_depends[@]}; do + error_detect_depends "yum -y install ${depend}" + done + elif check_sys packageManager apt; then + apt_depends=( + gettext build-essential unzip gzip python python-dev python-setuptools curl openssl libssl-dev + autoconf automake libtool gcc make perl cpio libpcre3 libpcre3-dev zlib1g-dev libev-dev libc-ares-dev git qrencode + ) + + apt-get -y update + for depend in ${apt_depends[@]}; do + error_detect_depends "apt-get -y install ${depend}" + done + fi +} + +install_check(){ + if check_sys packageManager yum || check_sys packageManager apt; then + if centosversion 5; then + return 1 + fi + return 0 + else + return 1 + fi +} + +install_select(){ + if ! install_check; then + echo -e "[${red}Error${plain}] Your OS is not supported to run it!" + echo 'Please change to CentOS 6+/Debian 7+/Ubuntu 12+ and try again.' + exit 1 + fi + + clear + while true + do + echo "Which Shadowsocks server you'd select:" + for ((i=1;i<=${#software[@]};i++ )); do + hint="${software[$i-1]}" + echo -e "${green}${i}${plain}) ${hint}" + done + read -p "Please enter a number (Default ${software[0]}):" selected + [ -z "${selected}" ] && selected='1' + case "${selected}" in + 1|2|3|4) + echo + echo "You choose = ${software[${selected}-1]}" + echo + break + ;; + *) + echo -e "[${red}Error${plain}] Please only enter a number [1-4]" + ;; + esac + done +} + +install_prepare_password(){ + echo "Please enter password for ${software[${selected}-1]}" + read -p '(Default password: teddysun.com):' shadowsockspwd + [ -z "${shadowsockspwd}" ] && shadowsockspwd='teddysun.com' + echo + echo "password = ${shadowsockspwd}" + echo +} + +install_prepare_port() { + while true + do + dport=$(shuf -i 9000-19999 -n 1) + echo -e "Please enter a port for ${software[${selected}-1]} [1-65535]" + read -p "(Default port: ${dport}):" shadowsocksport + [ -z "${shadowsocksport}" ] && shadowsocksport=${dport} + expr "${shadowsocksport}" + 1 &>/dev/null + if [ $? -eq 0 ]; then + if [ "${shadowsocksport}" -ge 1 ] && [ "${shadowsocksport}" -le 65535 ] && [ "${shadowsocksport:0:1}" != 0 ]; then + echo + echo "port = ${shadowsocksport}" + echo + break + fi + fi + echo -e "[${red}Error${plain}] Please enter a correct number [1-65535]" + done +} + +install_prepare_cipher(){ + while true + do + echo -e "Please select stream cipher for ${software[${selected}-1]}:" + + if [[ "${selected}" == '1' || "${selected}" == '4' ]]; then + for ((i=1;i<=${#common_ciphers[@]};i++ )); do + hint="${common_ciphers[$i-1]}" + echo -e "${green}${i}${plain}) ${hint}" + done + read -p "Which cipher you'd select(Default: ${common_ciphers[0]}):" pick + [ -z "$pick" ] && pick=1 + expr ${pick} + 1 &>/dev/null + if [ $? -ne 0 ]; then + echo -e "[${red}Error${plain}] Please enter a number" + continue + fi + if [[ "$pick" -lt 1 || "$pick" -gt ${#common_ciphers[@]} ]]; then + echo -e "[${red}Error${plain}] Please enter a number between 1 and ${#common_ciphers[@]}" + continue + fi + shadowsockscipher=${common_ciphers[$pick-1]} + elif [ "${selected}" == '2' ]; then + for ((i=1;i<=${#r_ciphers[@]};i++ )); do + hint="${r_ciphers[$i-1]}" + echo -e "${green}${i}${plain}) ${hint}" + done + read -p "Which cipher you'd select(Default: ${r_ciphers[1]}):" pick + [ -z "$pick" ] && pick=2 + expr ${pick} + 1 &>/dev/null + if [ $? -ne 0 ]; then + echo -e "[${red}Error${plain}] Please enter a number" + continue + fi + if [[ "$pick" -lt 1 || "$pick" -gt ${#r_ciphers[@]} ]]; then + echo -e "[${red}Error${plain}] Please enter a number between 1 and ${#r_ciphers[@]}" + continue + fi + shadowsockscipher=${r_ciphers[$pick-1]} + elif [ "${selected}" == '3' ]; then + for ((i=1;i<=${#go_ciphers[@]};i++ )); do + hint="${go_ciphers[$i-1]}" + echo -e "${green}${i}${plain}) ${hint}" + done + read -p "Which cipher you'd select(Default: ${go_ciphers[0]}):" pick + [ -z "$pick" ] && pick=1 + expr ${pick} + 1 &>/dev/null + if [ $? -ne 0 ]; then + echo -e "[${red}Error${plain}] Please enter a number" + continue + fi + if [[ "$pick" -lt 1 || "$pick" -gt ${#go_ciphers[@]} ]]; then + echo -e "[${red}Error${plain}] Please enter a number between 1 and ${#go_ciphers[@]}" + continue + fi + shadowsockscipher=${go_ciphers[$pick-1]} + fi + + echo + echo "cipher = ${shadowsockscipher}" + echo + break + done +} + +install_prepare_protocol(){ + while true + do + echo -e "Please select protocol for ${software[${selected}-1]}:" + for ((i=1;i<=${#protocols[@]};i++ )); do + hint="${protocols[$i-1]}" + echo -e "${green}${i}${plain}) ${hint}" + done + read -p "Which protocol you'd select(Default: ${protocols[0]}):" protocol + [ -z "$protocol" ] && protocol=1 + expr ${protocol} + 1 &>/dev/null + if [ $? -ne 0 ]; then + echo -e "[${red}Error${plain}] Please enter a number" + continue + fi + if [[ "$protocol" -lt 1 || "$protocol" -gt ${#protocols[@]} ]]; then + echo -e "[${red}Error${plain}] Please enter a number between 1 and ${#protocols[@]}" + continue + fi + shadowsockprotocol=${protocols[$protocol-1]} + echo + echo "protocol = ${shadowsockprotocol}" + echo + break + done +} + +install_prepare_obfs(){ + while true + do + echo -e "Please select obfs for ${software[${selected}-1]}:" + for ((i=1;i<=${#obfs[@]};i++ )); do + hint="${obfs[$i-1]}" + echo -e "${green}${i}${plain}) ${hint}" + done + read -p "Which obfs you'd select(Default: ${obfs[0]}):" r_obfs + [ -z "$r_obfs" ] && r_obfs=1 + expr ${r_obfs} + 1 &>/dev/null + if [ $? -ne 0 ]; then + echo -e "[${red}Error${plain}] Please enter a number" + continue + fi + if [[ "$r_obfs" -lt 1 || "$r_obfs" -gt ${#obfs[@]} ]]; then + echo -e "[${red}Error${plain}] Please enter a number between 1 and ${#obfs[@]}" + continue + fi + shadowsockobfs=${obfs[$r_obfs-1]} + echo + echo "obfs = ${shadowsockobfs}" + echo + break + done +} + +install_prepare_libev_obfs(){ + if autoconf_version || centosversion 6; then + while true + do + echo -e "Do you want install simple-obfs for ${software[${selected}-1]}? [y/n]" + read -p '(default: n):' libev_obfs + [ -z "$libev_obfs" ] && libev_obfs=n + case "${libev_obfs}" in + y|Y|n|N) + echo + echo "You choose = ${libev_obfs}" + echo + break + ;; + *) + echo -e "[${red}Error${plain}] Please only enter [y/n]" + ;; + esac + done + + if [ "${libev_obfs}" == 'y' ] || [ "${libev_obfs}" == 'Y' ]; then + while true + do + echo -e 'Please select obfs for simple-obfs:' + for ((i=1;i<=${#obfs_libev[@]};i++ )); do + hint="${obfs_libev[$i-1]}" + echo -e "${green}${i}${plain}) ${hint}" + done + read -p "Which obfs you'd select(Default: ${obfs_libev[0]}):" r_libev_obfs + [ -z "$r_libev_obfs" ] && r_libev_obfs=1 + expr ${r_libev_obfs} + 1 &>/dev/null + if [ $? -ne 0 ]; then + echo -e "[${red}Error${plain}] Please enter a number" + continue + fi + if [[ "$r_libev_obfs" -lt 1 || "$r_libev_obfs" -gt ${#obfs_libev[@]} ]]; then + echo -e "[${red}Error${plain}] Please enter a number between 1 and ${#obfs_libev[@]}" + continue + fi + shadowsocklibev_obfs=${obfs_libev[$r_libev_obfs-1]} + echo + echo "obfs = ${shadowsocklibev_obfs}" + echo + break + done + fi + else + echo -e "[${green}Info${plain}] autoconf version is less than 2.67, simple-obfs for ${software[${selected}-1]} installation has been skipped" + fi +} + +install_prepare(){ + + if [[ "${selected}" == '1' || "${selected}" == '3' || "${selected}" == '4' ]]; then + install_prepare_password + install_prepare_port + install_prepare_cipher + if [ "${selected}" == '4' ]; then + install_prepare_libev_obfs + fi + elif [ "${selected}" == '2' ]; then + install_prepare_password + install_prepare_port + install_prepare_cipher + install_prepare_protocol + install_prepare_obfs + fi + + echo + echo 'Press any key to start...or Press Ctrl+C to cancel' + char=$(get_char) + +} + +install_libsodium(){ + if [ ! -f /usr/lib/libsodium.a ]; then + cd "${cur_dir}" || exit + download "${libsodium_file}.tar.gz" "${libsodium_url}" + tar zxf ${libsodium_file}.tar.gz + cd ${libsodium_file} || exit + ./configure --prefix=/usr && make && make install + if [ $? -ne 0 ]; then + echo -e "[${red}Error${plain}] ${libsodium_file} install failed." + install_cleanup + exit 1 + fi + else + echo -e "[${green}Info${plain}] ${libsodium_file} already installed." + fi +} + +install_mbedtls(){ + if [ ! -f /usr/lib/libmbedtls.a ]; then + cd "${cur_dir}" || exit + download "${mbedtls_file}.tar.gz" "${mbedtls_url}" + tar zxf "${mbedtls_file}.tar.gz" + cd "${mbedtls_file}" || exit + make SHARED=1 CFLAGS=-fPIC + make DESTDIR=/usr install + if [ $? -ne 0 ]; then + echo -e "[${red}Error${plain}] ${mbedtls_file} install failed." + install_cleanup + exit 1 + fi + else + echo -e "[${green}Info${plain}] ${mbedtls_file} already installed." + fi +} + +install_shadowsocks_python(){ + cd "${cur_dir}" || exit + unzip -q ${shadowsocks_python_file}.zip + if [ $? -ne 0 ];then + echo -e "[${red}Error${plain}] unzip ${shadowsocks_python_file}.zip failed, please check unzip command." + install_cleanup + exit 1 + fi + + cd ${shadowsocks_python_file} || exit + python setup.py install --record /usr/local/shadowsocks_python.log + + if [ -f /usr/bin/ssserver ] || [ -f /usr/local/bin/ssserver ]; then + chmod +x ${shadowsocks_python_init} + local service_name + service_name=$(basename ${shadowsocks_python_init}) + if check_sys packageManager yum; then + chkconfig --add "${service_name}" + chkconfig "${service_name}" on + elif check_sys packageManager apt; then + update-rc.d -f "${service_name}" defaults + fi + else + echo + echo -e "[${red}Error${plain}] ${software[0]} install failed." + echo 'Please visit: https://teddysun.com/486.html and contact.' + install_cleanup + exit 1 + fi +} + +install_shadowsocks_r(){ + cd "${cur_dir}" || exit + tar zxf ${shadowsocks_r_file}.tar.gz + mv ${shadowsocks_r_file}/shadowsocks /usr/local/ + if [ -f /usr/local/shadowsocks/server.py ]; then + chmod +x ${shadowsocks_r_init} + local service_name + service_name=$(basename ${shadowsocks_r_init}) + if check_sys packageManager yum; then + chkconfig --add "${service_name}" + chkconfig "${service_name}" on + elif check_sys packageManager apt; then + update-rc.d -f "${service_name}" defaults + fi + else + echo + echo -e "[${red}Error${plain}] ${software[1]} install failed." + echo 'Please visit; https://teddysun.com/486.html and contact.' + install_cleanup + exit 1 + fi +} + +install_shadowsocks_go(){ + cd "${cur_dir}" || exit + if is_64bit; then + gzip -d ${shadowsocks_go_file_64}.gz + if [ $? -ne 0 ];then + echo -e "[${red}Error${plain}] Decompress ${shadowsocks_go_file_64}.gz failed." + install_cleanup + exit 1 + fi + mv -f ${shadowsocks_go_file_64} /usr/bin/shadowsocks-server + else + gzip -d ${shadowsocks_go_file_32}.gz + if [ $? -ne 0 ];then + echo -e "[${red}Error${plain}] Decompress ${shadowsocks_go_file_32}.gz failed." + install_cleanup + exit 1 + fi + mv -f ${shadowsocks_go_file_32} /usr/bin/shadowsocks-server + fi + + if [ -f /usr/bin/shadowsocks-server ]; then + chmod +x /usr/bin/shadowsocks-server + chmod +x ${shadowsocks_go_init} + + local service_name + service_name=$(basename ${shadowsocks_go_init}) + if check_sys packageManager yum; then + chkconfig --add "${service_name}" + chkconfig "${service_name}" on + elif check_sys packageManager apt; then + update-rc.d -f "${service_name}" defaults + fi + else + echo + echo -e "[${red}Error${plain}] ${software[2]} install failed." + echo 'Please visit: https://teddysun.com/486.html and contact.' + install_cleanup + exit 1 + fi +} + +install_shadowsocks_libev(){ + cd "${cur_dir}" || exit + tar zxf "${shadowsocks_libev_file}".tar.gz + cd "${shadowsocks_libev_file}" || exit + ./configure --disable-documentation && make && make install + if [ $? -eq 0 ]; then + chmod +x ${shadowsocks_libev_init} + local service_name + service_name=$(basename ${shadowsocks_libev_init}) + if check_sys packageManager yum; then + chkconfig --add "${service_name}" + chkconfig "${service_name}" on + elif check_sys packageManager apt; then + update-rc.d -f "${service_name}" defaults + fi + else + echo + echo -e "[${red}Error${plain}] ${software[3]} install failed." + echo 'Please visit: https://teddysun.com/486.html and contact.' + install_cleanup + exit 1 + fi +} + +install_shadowsocks_libev_obfs(){ + if [ "${libev_obfs}" == 'y' ] || [ "${libev_obfs}" == 'Y' ]; then + cd "${cur_dir}" || exit + git clone https://github.com/shadowsocks/simple-obfs.git + [ -d simple-obfs ] && cd simple-obfs || echo -e "[${red}Error:${plain}] Failed to git clone simple-obfs." + git submodule update --init --recursive + if centosversion 6; then + if [ ! "$(command -v autoconf268)" ]; then + echo -e "[${green}Info${plain}] Starting install autoconf268..." + yum install -y autoconf268 > /dev/null 2>&1 || echo -e "[${red}Error:${plain}] Failed to install autoconf268." + fi + # replace command autoreconf to autoreconf268 + sed -i 's/autoreconf/autoreconf268/' autogen.sh + # replace #include to #include + sed -i 's@^#include @#include @' src/local.h + sed -i 's@^#include @#include @' src/server.h + fi + ./autogen.sh + ./configure --disable-documentation + make + make install + if [ ! "$(command -v obfs-server)" ]; then + echo -e "[${red}Error${plain}] simple-obfs for ${software[${selected}-1]} install failed." + echo 'Please visit: https://teddysun.com/486.html and contact.' + install_cleanup + exit 1 + fi + [ -f /usr/local/bin/obfs-server ] && ln -s /usr/local/bin/obfs-server /usr/bin + fi +} + +install_completed_python(){ + clear + ${shadowsocks_python_init} start + echo + echo -e "Congratulations, ${green}${software[0]}${plain} server install completed!" + echo -e "Your Server IP : ${red} $(get_ip) ${plain}" + echo -e "Your Server Port : ${red} ${shadowsocksport} ${plain}" + echo -e "Your Password : ${red} ${shadowsockspwd} ${plain}" + echo -e "Your Encryption Method: ${red} ${shadowsockscipher} ${plain}" +} + +install_completed_r(){ + clear + ${shadowsocks_r_init} start + echo + echo -e "Congratulations, ${green}${software[1]}${plain} server install completed!" + echo -e "Your Server IP : ${red} $(get_ip) ${plain}" + echo -e "Your Server Port : ${red} ${shadowsocksport} ${plain}" + echo -e "Your Password : ${red} ${shadowsockspwd} ${plain}" + echo -e "Your Protocol : ${red} ${shadowsockprotocol} ${plain}" + echo -e "Your obfs : ${red} ${shadowsockobfs} ${plain}" + echo -e "Your Encryption Method: ${red} ${shadowsockscipher} ${plain}" +} + +install_completed_go(){ + clear + ${shadowsocks_go_init} start + echo + echo -e "Congratulations, ${green}${software[2]}${plain} server install completed!" + echo -e "Your Server IP : ${red} $(get_ip) ${plain}" + echo -e "Your Server Port : ${red} ${shadowsocksport} ${plain}" + echo -e "Your Password : ${red} ${shadowsockspwd} ${plain}" + echo -e "Your Encryption Method: ${red} ${shadowsockscipher} ${plain}" +} + +install_completed_libev(){ + clear + ldconfig + ${shadowsocks_libev_init} start + echo + echo -e "Congratulations, ${green}${software[3]}${plain} server install completed!" + echo -e "Your Server IP : ${red} $(get_ip) ${plain}" + echo -e "Your Server Port : ${red} ${shadowsocksport} ${plain}" + echo -e "Your Password : ${red} ${shadowsockspwd} ${plain}" + if [ "$(command -v obfs-server)" ]; then + echo -e "Your obfs : ${red} ${shadowsocklibev_obfs} ${plain}" + fi + echo -e "Your Encryption Method: ${red} ${shadowsockscipher} ${plain}" +} + +qr_generate_python(){ + if [ "$(command -v qrencode)" ]; then + local tmp + tmp=$(echo -n "${shadowsockscipher}:${shadowsockspwd}@$(get_ip):${shadowsocksport}" | base64 -w0) + local qr_code="ss://${tmp}" + echo + echo 'Your QR Code: (For Shadowsocks Windows, OSX, Android and iOS clients)' + echo -e "${green} ${qr_code} ${plain}" + echo -n "${qr_code}" | qrencode -s8 -o "${cur_dir}"/shadowsocks_python_qr.png + echo 'Your QR Code has been saved as a PNG file path:' + echo -e "${green} ${cur_dir}/shadowsocks_python_qr.png ${plain}" + fi +} + +qr_generate_r(){ + if [ "$(command -v qrencode)" ]; then + local tmp1 + tmp1=$(echo -n "${shadowsockspwd}" | base64 -w0 | sed 's/=//g;s/\//_/g;s/+/-/g') + local tmp2 + tmp2=$(echo -n "$(get_ip):${shadowsocksport}:${shadowsockprotocol}:${shadowsockscipher}:${shadowsockobfs}:${tmp1}/?obfsparam=" | base64 -w0) + local qr_code="ssr://${tmp2}" + echo + echo 'Your QR Code: (For ShadowsocksR Windows, Android clients only)' + echo -e "${green} ${qr_code} ${plain}" + echo -n "${qr_code}" | qrencode -s8 -o "${cur_dir}"/shadowsocks_r_qr.png + echo 'Your QR Code has been saved as a PNG file path:' + echo -e "${green} ${cur_dir}/shadowsocks_r_qr.png ${plain}" + fi +} + +qr_generate_go(){ + if [ "$(command -v qrencode)" ]; then + local tmp + tmp=$(echo -n "${shadowsockscipher}:${shadowsockspwd}@$(get_ip):${shadowsocksport}" | base64 -w0) + local qr_code="ss://${tmp}" + echo + echo 'Your QR Code: (For Shadowsocks Windows, OSX, Android and iOS clients)' + echo -e "${green} ${qr_code} ${plain}" + echo -n "${qr_code}" | qrencode -s8 -o "${cur_dir}"/shadowsocks_go_qr.png + echo 'Your QR Code has been saved as a PNG file path:' + echo -e "${green} ${cur_dir}/shadowsocks_go_qr.png ${plain}" + fi +} + +qr_generate_libev(){ + if [ "$(command -v qrencode)" ]; then + local tmp + tmp=$(echo -n "${shadowsockscipher}:${shadowsockspwd}@$(get_ip):${shadowsocksport}" | base64 -w0) + local qr_code="ss://${tmp}" + echo + echo 'Your QR Code: (For Shadowsocks Windows, OSX, Android and iOS clients)' + echo -e "${green} ${qr_code} ${plain}" + echo -n "${qr_code}" | qrencode -s8 -o "${cur_dir}"/shadowsocks_libev_qr.png + echo 'Your QR Code has been saved as a PNG file path:' + echo -e "${green} ${cur_dir}/shadowsocks_libev_qr.png ${plain}" + fi +} + +install_main(){ + install_libsodium + if ! ldconfig -p | grep -wq '/usr/lib'; then + echo '/usr/lib' > /etc/ld.so.conf.d/lib.conf + fi + ldconfig + + if [ "${selected}" == '1' ]; then + install_shadowsocks_python + install_completed_python + qr_generate_python + elif [ "${selected}" == '2' ]; then + install_shadowsocks_r + install_completed_r + qr_generate_r + elif [ "${selected}" == '3' ]; then + install_shadowsocks_go + install_completed_go + qr_generate_go + elif [ "${selected}" == '4' ]; then + install_mbedtls + install_shadowsocks_libev + install_shadowsocks_libev_obfs + install_completed_libev + qr_generate_libev + fi + + echo + echo 'Welcome to visit: https://teddysun.com/486.html' + echo 'Enjoy it!' + echo +} + +install_cleanup(){ + cd "${cur_dir}" || exit + rm -rf simple-obfs + rm -rf ${libsodium_file} ${libsodium_file}.tar.gz + rm -rf "${mbedtls_file}" "${mbedtls_file}"-apache.tgz + rm -rf ${shadowsocks_python_file} ${shadowsocks_python_file}.zip + rm -rf ${shadowsocks_r_file} ${shadowsocks_r_file}.tar.gz + rm -rf ${shadowsocks_go_file_64}.gz ${shadowsocks_go_file_32}.gz + rm -rf "${shadowsocks_libev_file}" "${shadowsocks_libev_file}".tar.gz +} + +install_shadowsocks(){ + disable_selinux + install_select + install_prepare + install_dependencies + download_files + config_shadowsocks + if check_sys packageManager yum; then + config_firewall + fi + install_main + install_cleanup +} + +uninstall_shadowsocks_python(){ + printf "Are you sure uninstall ${red}${software[0]}${plain}? [y/n]\n" + read -p '(default: n):' answer + [ -z "${answer}" ] && answer='n' + if [ "${answer}" == 'y' ] || [ "${answer}" == 'Y' ]; then + ${shadowsocks_python_init} status > /dev/null 2>&1 + if [ $? -eq 0 ]; then + ${shadowsocks_python_init} stop + fi + local service_name + service_name=$(basename ${shadowsocks_python_init}) + if check_sys packageManager yum; then + chkconfig --del "${service_name}" + elif check_sys packageManager apt; then + update-rc.d -f "${service_name}" remove + fi + + rm -fr $(dirname ${shadowsocks_python_config}) + rm -f ${shadowsocks_python_init} + rm -f /var/log/shadowsocks.log + if [ -f /usr/local/shadowsocks_python.log ]; then + cat /usr/local/shadowsocks_python.log | xargs rm -rf + rm -f /usr/local/shadowsocks_python.log + fi + echo -e "[${green}Info${plain}] ${software[0]} uninstall success" + else + echo + echo -e "[${green}Info${plain}] ${software[0]} uninstall cancelled, nothing to do..." + echo + fi +} + +uninstall_shadowsocks_r(){ + printf "Are you sure uninstall ${red}${software[1]}${plain}? [y/n]\n" + read -p '(default: n):' answer + [ -z "${answer}" ] && answer='n' + if [ "${answer}" == 'y' ] || [ "${answer}" == 'Y' ]; then + ${shadowsocks_r_init} status > /dev/null 2>&1 + if [ $? -eq 0 ]; then + ${shadowsocks_r_init} stop + fi + local service_name + service_name=$(basename ${shadowsocks_r_init}) + if check_sys packageManager yum; then + chkconfig --del "${service_name}" + elif check_sys packageManager apt; then + update-rc.d -f "${service_name}" remove + fi + rm -fr $(dirname ${shadowsocks_r_config}) + rm -f ${shadowsocks_r_init} + rm -f /var/log/shadowsocks.log + rm -fr /usr/local/shadowsocks + echo -e "[${green}Info${plain}] ${software[1]} uninstall success" + else + echo + echo -e "[${green}Info${plain}] ${software[1]} uninstall cancelled, nothing to do..." + echo + fi +} + +uninstall_shadowsocks_go(){ + printf "Are you sure uninstall ${red}${software[2]}${plain}? [y/n]\n" + read -p '(default: n):' answer + [ -z "${answer}" ] && answer='n' + if [ "${answer}" == 'y' ] || [ "${answer}" == 'Y' ]; then + ${shadowsocks_go_init} status > /dev/null 2>&1 + if [ $? -eq 0 ]; then + ${shadowsocks_go_init} stop + fi + local service_name + service_name=$(basename ${shadowsocks_go_init}) + if check_sys packageManager yum; then + chkconfig --del "${service_name}" + elif check_sys packageManager apt; then + update-rc.d -f "${service_name}" remove + fi + rm -fr $(dirname ${shadowsocks_go_config}) + rm -f ${shadowsocks_go_init} + rm -f /usr/bin/shadowsocks-server + echo -e "[${green}Info${plain}] ${software[2]} uninstall success" + else + echo + echo -e "[${green}Info${plain}] ${software[2]} uninstall cancelled, nothing to do..." + echo + fi +} + +uninstall_shadowsocks_libev(){ + printf "Are you sure uninstall ${red}${software[3]}${plain}? [y/n]\n" + read -p '(default: n):' answer + [ -z "${answer}" ] && answer='n' + if [ "${answer}" == 'y' ] || [ "${answer}" == 'Y' ]; then + ${shadowsocks_libev_init} status > /dev/null 2>&1 + if [ $? -eq 0 ]; then + ${shadowsocks_libev_init} stop + fi + local service_name + service_name=$(basename ${shadowsocks_libev_init}) + if check_sys packageManager yum; then + chkconfig --del "${service_name}" + elif check_sys packageManager apt; then + update-rc.d -f "${service_name}" remove + fi + rm -fr $(dirname ${shadowsocks_libev_config}) + rm -f /usr/local/bin/ss-local + rm -f /usr/local/bin/ss-tunnel + rm -f /usr/local/bin/ss-server + rm -f /usr/local/bin/ss-manager + rm -f /usr/local/bin/ss-redir + rm -f /usr/local/bin/ss-nat + rm -f /usr/local/bin/obfs-local + rm -f /usr/local/bin/obfs-server + rm -f /usr/local/lib/libshadowsocks-libev.a + rm -f /usr/local/lib/libshadowsocks-libev.la + rm -f /usr/local/include/shadowsocks.h + rm -f /usr/local/lib/pkgconfig/shadowsocks-libev.pc + rm -f /usr/local/share/man/man1/ss-local.1 + rm -f /usr/local/share/man/man1/ss-tunnel.1 + rm -f /usr/local/share/man/man1/ss-server.1 + rm -f /usr/local/share/man/man1/ss-manager.1 + rm -f /usr/local/share/man/man1/ss-redir.1 + rm -f /usr/local/share/man/man1/ss-nat.1 + rm -f /usr/local/share/man/man8/shadowsocks-libev.8 + rm -fr /usr/local/share/doc/shadowsocks-libev + rm -f ${shadowsocks_libev_init} + echo -e "[${green}Info${plain}] ${software[3]} uninstall success" + else + echo + echo -e "[${green}Info${plain}] ${software[3]} uninstall cancelled, nothing to do..." + echo + fi +} + +uninstall_shadowsocks(){ + while true + do + echo 'Which Shadowsocks server you want to uninstall?' + for ((i=1;i<=${#software[@]};i++ )); do + hint="${software[$i-1]}" + echo -e "${green}${i}${plain}) ${hint}" + done + read -p 'Please enter a number [1-4]:' un_select + case "${un_select}" in + 1|2|3|4) + echo + echo "You choose = ${software[${un_select}-1]}" + echo + break + ;; + *) + echo -e "[${red}Error${plain}] Please only enter a number [1-4]" + ;; + esac + done + + if [ "${un_select}" == '1' ]; then + if [ -f ${shadowsocks_python_init} ]; then + uninstall_shadowsocks_python + else + echo -e "[${red}Error${plain}] ${software[${un_select}-1]} not installed, please check it and try again." + echo + exit 1 + fi + elif [ "${un_select}" == '2' ]; then + if [ -f ${shadowsocks_r_init} ]; then + uninstall_shadowsocks_r + else + echo -e "[${red}Error${plain}] ${software[${un_select}-1]} not installed, please check it and try again." + echo + exit 1 + fi + elif [ "${un_select}" == '3' ]; then + if [ -f ${shadowsocks_go_init} ]; then + uninstall_shadowsocks_go + else + echo -e "[${red}Error${plain}] ${software[${un_select}-1]} not installed, please check it and try again." + echo + exit 1 + fi + elif [ "${un_select}" == '4' ]; then + if [ -f ${shadowsocks_libev_init} ]; then + uninstall_shadowsocks_libev + else + echo -e "[${red}Error${plain}] ${software[${un_select}-1]} not installed, please check it and try again." + echo + exit 1 + fi + fi +} + +# Initialization step +action=$1 +[ -z "$1" ] && action=install +case "${action}" in + install|uninstall) + ${action}_shadowsocks + ;; + *) + echo "Arguments error! [${action}]" + echo "Usage: $(basename "$0") [install|uninstall]" + ;; +esac \ No newline at end of file