scripts/old/ctc/ips.sh
2023-06-05 23:04:30 +08:00

397 lines
19 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 功能实现判定一个IP或者组是否是天翼平台的
# 依赖文件ip.group/lakes
# 存在问题:
# 整体逻辑:
# 1. 输入有四种可能IPv4/IPv6/英文标签/中文标签
# 2. 以上四种可能最终使用一个函数来完成——ipvx_check
# 3. ipvx_check的作用就是检查一个IP是否属于天翼
# 4. 首先根据IP找出所在的节点英文标签再根据英文标签后缀不同进行逐一判别
# 5. ip.group文件
# 对于缓存服务器(边缘/父层/中心)节点 - 第一列是RIP第二列是英文标签第三列是VIP第八列是LVS全都一样
# 对于LVS节点 - 第一列是IP。第二列是英文标签
# 对于其他节点同LVS
# 6. lakes文件文件开头有介绍每一列的含义
# 7. 英文标签的特点可以通过`cat ip.group | awk '{print $2}' | awk -F '_' '{print $4}' | sort | uniq`来筛选
# 自定义颜色显示
c_br="\e[1;31m" # bold red
c_bg="\e[1;32m" # bold green
c_by="\e[1;33m" # bold yellow
c_bp="\e[1;35m" # bold purple
c_iy="\e[3;33m" # italic yellow
c_bir='\e[1;3;31m' # * bold italic red
c_big='\e[1;3;32m' # bold italic cyan
c_bib='\e[1;3;34m' # * bold italic cyan
c_bip='\e[1;3;35m' # bold italic cyan
c_bic='\e[1;3;36m' # bold italic cyan
c_e="\e[0m" # reset
# 使用说明
function usage {
echo -e "${c_bg}1. 查找V(R)IP/集群中文名/集群英文名是否是归属天翼云平台${c_e}"
echo -e "${c_bg}2. 查询IP对应的内网IP和主机名只支持IPv4地址${c_e}"
echo -e "${c_iy}实例:${c_e}"
echo -e "${c_iy} ips 59.56.177.149${c_e}"
echo -e "${c_iy} ips ct_fj_fuzhou3_e1${c_e}"
echo -e "${c_iy} ips 福州3${c_e}"
echo -e "${c_iy} ips -m 59.56.177.149${c_e}\n"
echo -e "${c_bp}查询内网IP对应关系功能因线上IPv6的机器没有加白暂不支持获取IPv6主机内网IP...${c_e}"
exit 1
}
# 如果输入是IP则判断该IP是否属于天翼
# 入参-1IP
# 入参-2flg -- 0/1/2
# flg = 0 -- 脚本输入的是IPv4或者IPv6
# flg = 1 -- 脚本输入的是英文节点名
# flg = 2 -- 脚本输入的是中文节点名
function ipvx_check() {
ipvx=$1
if [[ $flg -eq 0 ]]; then
# 同一个IP可能会过滤出来多个英文节点
labels=`cat $data/ip.group | fgrep -w $ipvx | awk '{print $2}' | sort | uniq`
elif [[ $flg -eq 1 ]]; then
# 确保过滤出来的就是输入的节点名排除其他含有相同IP的节点
labels=`cat $data/ip.group | fgrep -w $ipvx | awk '$2=="'$tbd'" {print $2}' | sort | uniq`
elif [[ $flg -eq 2 ]]; then
# 中文节点名可能对应多个不同节点,全部输出
labels=`cat $data/ip.group | fgrep -w $ipvx | awk '$2=="'$label_single'" {print $2}' | sort | uniq`
fi
[[ $labels == '' ]] && { echo -e "${c_br}$tbd 不是天翼平台的节点/IP退出...${c_e}"; exit 44; }
for label in $labels; do
# 根据后缀输出
# 后缀如果是 -- e/c/n/lvs则输出对应的资源池vipriplvs信息如果一个lvs对应多个边缘节点则全部输出
# 其他后缀则只输出对应节点的信息
postfix=`echo $label | awk -F'_' '{print $4}'`
if [[ $postfix =~ ^c[0-9]{0,2}$ ]]; then
center_name_en=$label
rip=`cat $data/ip.group | awk '$2=="'$center_name_en'"' | awk '{print $1}' | sort`
vip=`cat $data/ip.group | awk '$2=="'$center_name_en'"' | awk '{print $3}' | sort | uniq`
lvs_name=`cat $data/ip.group | awk '$2=="'$center_name_en'"' | awk '{print $8}' | sort | uniq | awk -F ',' '{print $1}'`
lvs=`cat $data/ip.group | awk '$2=="'$lvs_name'"' | awk '{print $1}' | sort`
resource=`cat $data/lakes | grep $center_name_en | awk '{print $6}' | sort | uniq`
center_name_cn=`cat $data/lakes | grep $center_name_en | awk '{print $11}' | sort | uniq`
echo -e "$c_bp[$center_name_en: ${c_bg}RIP]$c_e"
echo $rip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'"&&"'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
echo
echo -e "$c_bp[$center_name_en: ${c_bg}VIP]$c_e"
echo $vip | awk -F ',' '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
echo -e "$c_bp[$lvs_name: ${c_bg}IP]$c_e"
echo $lvs | awk '{for(i=1;i<=NF;i++) print " ", $i}'
echo
echo -e "$c_by[$center_name_cn($center_name_en)所属资源池]$c_e"
echo $resource | awk '{for(i=1;i<=NF;i++) print " ", $i} END{print ""}'
elif [[ $postfix =~ ^dns[0-9]{0,2}$ ]]; then
dns_label=$label
dnsip=`cat $data/ip.group | awk '$2=="'$dns_label'"' | awk '{print $1}' | sort`
dnsrip=`cat $data/ip.group | awk '$2=="'$dns_label'"' | awk '{print $1}' | sort`
dnsvip=`cat $data/ip.group | awk '$2=="'$dns_label'"' | awk '{print $3}' | sort | uniq`
echo -e "$c_bp[$dns_label: ${c_bg}RIP]$c_e"
echo $dnsip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
echo -e "$c_bp[$dns_label: ${c_bg}VIP]$c_e"
echo $dnsvip | awk -F ',' '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
elif [[ $postfix =~ ^e[0-9]{0,2}$ ]]; then
edge_name_en=$label
rip=`cat $data/ip.group | awk '$2=="'$edge_name_en'"' | awk '{print $1}' | sort`
vip=`cat $data/ip.group | awk '$2=="'$edge_name_en'"' | awk '{print $3}' | sort | uniq`
lvs_name=`cat $data/ip.group | awk '$2=="'$edge_name_en'"' | awk '{print $8}' | sort | uniq | awk -F ',' '{print $1}'`
lvs=`cat $data/ip.group | awk '$2=="'$lvs_name'"' | awk '{print $1}' | sort`
resource=`cat $data/lakes | grep $edge_name_en | awk '{print $6}' | sort | uniq`
edge_name_cn=`cat $data/lakes | grep $edge_name_en | awk '{print $11}' | sort | uniq`
echo -e "$c_bp[$edge_name_en: ${c_bg}RIP]$c_e"
echo $rip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
echo
echo -e "$c_bp[$edge_name_en: ${c_bg}VIP]$c_e"
echo $vip | awk -F ',' '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
echo -e "$c_bp[$lvs_name: ${c_bg}IP]$c_e"
echo $lvs | awk '{for(i=1;i<=NF;i++) print " ", $i}'
echo
echo -e "$c_by[$edge_name_cn($edge_name_en)所属资源池]$c_e"
echo $resource | awk '{for(i=1;i<=NF;i++) print " ", $i} END{print ""}'
elif [[ $postfix =~ ^lvs[0-9]{0,2}$ ]]; then
lvs_name=$label
lvs=`cat $data/ip.group | awk '$2=="'$lvs_name'"' | awk '{print $1}' | sort`
level_unknown=`cat $data/ip.group | awk '$8 ~ "'$lvs_name'"' | awk '{print $2}' | sort | uniq`
for unknown_en in $level_unknown; do
rip=`cat $data/ip.group | awk '$8 ~ "'$lvs_name'" && $2 == "'$unknown_en'"' | awk '{print $1}' | sort`
vip=`cat $data/ip.group | awk '$8 ~ "'$lvs_name'" && $2 == "'$unknown_en'"' | awk '{print $3}' | sort | uniq`
resource=`cat $data/lakes | grep $unknown_en | awk '{print $6}' | sort | uniq`
unknown_cn=`cat $data/lakes | grep $unknown_en | awk '{print $11}' | sort | uniq`
echo -e "$c_bp[$unknown_en: ${c_bg}RIP]$c_e"
echo $rip | awk '{for(i=1;i<=NF;i++) print " ", $i}'
echo
echo -e "$c_bp[$unknown_en: ${c_bg}VIP]$c_e"
echo $vip | awk -F ',' '{for(i=1;i<=NF;i++) print " ", $i}'
echo -e "$c_by[$unknown_cn($unknown_en)所属资源池]$c_e"
echo $resource | awk '{for(i=1;i<=NF;i++) print " ", $i} END{print ""}'
done
echo -e "$c_bp[$lvs_name: ${c_bg}IP]$c_e"
echo $lvs | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
echo
elif [[ $postfix =~ ^m[0-9]{0,2}$ ]]; then
mgt_label=$label
mgtip=`cat $data/ip.group | awk '$2=="'$mgt_label'"' | awk '{print $1}' | sort`
echo -e "$c_bp[$mgt_label: ${c_bg}IP]$c_e"
echo $mgtip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
echo
elif [[ $postfix =~ ^mysql[0-9]{0,2}$ ]]; then
mysql_label=$label
mysqlip=`cat $data/ip.group | awk '$2=="'$mysql_label'"' | awk '{print $1}' | sort`
echo -e "$c_bp[$mysql_label: ${c_bg}IP]$c_e"
echo $mysqlip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
elif [[ $postfix =~ ^n[0-9]{0,2}$ ]]; then
nation_name_en=$label
rip=`cat $data/ip.group | awk '$2=="'$nation_name_en'"' | awk '{print $1}' | sort`
vip=`cat $data/ip.group | awk '$2=="'$nation_name_en'"' | awk '{print $3}' | sort | uniq`
lvs_name=`cat $data/ip.group | awk '$2=="'$nation_name_en'"' | awk '{print $8}' | sort | uniq | awk -F ',' '{print $1}'`
lvs=`cat $data/ip.group | awk '$2=="'$lvs_name'"' | awk '{print $1}' | sort`
resource=`cat $data/lakes | grep $nation_name_en | awk '{print $6}' | sort | uniq`
nation_name_cn=`cat $data/lakes | grep $nation_name_en | awk '{print $11}' | sort | uniq`
echo -e "$c_bp[$nation_name_en: ${c_bg}RIP]$c_e"
echo $rip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
echo
echo -e "$c_bp[$nation_name_en: ${c_bg}VIP]$c_e"
echo $vip | awk -F ',' '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
echo -e "$c_bp[$lvs_name: ${c_bg}IP]$c_e"
echo $lvs | awk '{for(i=1;i<=NF;i++) print " ", $i}'
echo
echo -e "$c_by[$nation_name_cn($nation_name_en)所属资源池]$c_e"
echo $resource | awk '{for(i=1;i<=NF;i++) print " ", $i} END{print ""}'
elif [[ $postfix =~ ^prets[0-9]{0,2}$ ]]; then
prets_label=$label
pretsip=`cat $data/ip.group | awk '$2=="'$prets_label'"' | awk '{print $1}' | sort`
echo -e "$c_bp[$prets_label: ${c_bg}IP]$c_e"
echo $pretsip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
elif [[ $postfix =~ ^pretw[0-9]{0,2}$ ]]; then
pretw_label=$label
pretwip=`cat $data/ip.group | awk '$2=="'$pretw_label'"' | awk '{print $1}' | sort`
echo -e "$c_bp[$pretw_label: ${c_bg}IP]$c_e"
echo $pretwip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
elif [[ $postfix =~ ^redis[0-9]{0,2}$ ]]; then
redis_label=$label
redisip=`cat $data/ip.group | awk '$2=="'$redis_label'"' | awk '{print $1}' | sort`
echo -e "$c_bp[$redis_label: ${c_bg}IP]$c_e"
echo $redisip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
elif [[ $postfix =~ ^testts[0-9]{0,2}$ ]]; then
testts_label=$label
testtsip=`cat $data/ip.group | awk '$2=="'$testts_label'"' | awk '{print $1}' | sort`
echo -e "$c_bp[$testts_label: ${c_bg}IP]$c_e"
echo $testtsip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
elif [[ $postfix =~ ^ts[0-9]{0,2}$ ]]; then
ts_label=$label
tsip=`cat $data/ip.group | awk '$2=="'$ts_label'"' | awk '{print $1}' | sort`
echo -e "$c_bp[$ts_label: ${c_bg}IP]$c_e"
echo $tsip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
elif [[ $postfix =~ ^tw[0-9]{0,2}$ ]]; then
tw_label=$label
twip=`cat $data/ip.group | awk '$2=="'$tw_label'"' | awk '{print $1}' | sort`
echo -e "$c_bp[$tw_label: ${c_bg}IP]$c_e"
echo $twip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
elif [[ $postfix =~ ^uatts[0-9]{0,2}$ ]]; then
uatts_label=$label
uattsip=`cat $data/ip.group | awk '$2=="'$uatts_label'"' | awk '{print $1}' | sort`
echo -e "$c_bp[$uatts_label: ${c_bg}IP]$c_e"
echo $uattsip | awk '{for(i=1;i<=NF;i++) if($i=="'$ipvx'" && "'$flg'"==0) print " \033[1;3;36m", $i, "\033[0m"; else print " ", $i}'
else
echo -e "${c_br}${ipvx}${c_e}不属于我司节点如有误判请联系fanmf11@chinatelecom.cn。\n"
exit 92
fi
done
}
function ip_search() {
# 判断如果是IPv4在判断是否合法
if [[ $tbd =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
ip_1234=`echo $tbd | awk -F '.' '{print $1, $2, $3, $4}'`
for num in $ip_1234; do
if [[ $num -gt 255 ]]; then
echo -e "${c_br}非法请输入有效的IPv4地址。${c_e}"
usage
fi
done
isInner=`echo $ip_1234 | awk '{print $1}'`
if [[ $isInner == '192' ]]; then
echo -e "${c_br}$tbd是内网IP非法请输入有效的外网IPv4地址。${c_e}"
usage
fi
flg=0
ipvx_check $tbd $flg
# 判断如果是IPv6粗略的匹配规则最短11最长39包含数字大小写字母以及英文冒号
elif [[ $tbd =~ ^[0-9a-fA-F:]{11,39}$ ]]; then
flg=0
ipvx_check $tbd $flg
# 判断如果是节点英文标签格式
elif [[ $tbd =~ ^(ct|cu|cm|bgp|ctbgp|cmbgp|cubgp|as|eu|sa|na|cbn|cern)_[a-z]{2,3}_[a-z]{2,20}[0-9]{1,2}_(c|dns|e|lvs|m|mysql|n|prets|pretw|redis|testts|ts|tw|uatts1)[0-9]{0,2}$ ]]; then
anyip=`cat $data/ip.group | awk '$2=="'$tbd'"' | head -n 1 | awk '{print $1}'`
if [[ $anyip == '' ]]; then
echo -e "${c_br}${tbd}${c_e}不属于我司节点如有误判请联系fanmf11@chinatelecom.cn。"
usage
exit 90
fi
flg=1
ipvx_check $anyip $flg
# 剩余的情况一律归结为中文标签格式
else
# 一个中文标签可能会对应着多个不同的节点
label_multi=`cat $data/lakes | awk '$11=="'$tbd'" {print $1}' | sort | uniq`
if [[ $label_multi == '' ]]; then
echo -e "${c_br}${tbd}${c_e}不属于我司节点如有误判请联系fanmf11@chinatelecom.cn。"
usage
exit 91
fi
flg=2
for label_single in $label_multi; do
anyip=`cat $data/ip.group | awk '$2=="'$label_single'"' | head -n 1 | awk '{print $1}'`
if [[ $anyip != '' ]]; then
ipvx_check $anyip $flg
else
echo -e "${c_br}${label_single}节点存在但是无法找到其下IP可使用rip命令尝试再次查询。${c_e}\n"
fi
done
fi
}
function ip_inner() {
> res.log
let number=`cat ips.log | tr -d ' ' | grep -Ev ']' | sed 's/^$/#/g' | awk 'BEGIN{RS="#"} {print NR}' | tail -1`
cat ips.log | tr -d ' ' | grep -Ev ']' | sed 's/^$/#/g' | awk 'BEGIN{RS="#"} {for(i=1;i<=NR;i++) if(i==NR) print $0 > i}'
for i in `seq $number`; do
cat $i | fgrep -q "$tbd"
[[ $? -ne 0 ]] && continue
cat $i | grep -Eo "[0-9a-fA-F:]{11,39}" > ip$i
cat $i | grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" >> ip$i
# 将每一块的IP重新放回文件i并将结果追加到res.log
cat ip$i > $i && cat ip$i >> res.log
done
ip_list=`cat res.log | sort | uniq`
for ipy in $ip_list; do
echo $ipy | grep -Eq "[0-9a-fA-F:]{11,39}"
if [[ $? -eq 0 ]]; then
echo "跳板机无IPv6出口暂不支持获取IPv6主机内网IP..." > inner_$ipy.log
else
ssh -o ConnectTimeout=30 $ipy "hostname; /usr/sbin/ifconfig | grep 'inet 192'" > inner_$ipy.log 2>&1 &
fi
done
wait
echo '-----------------------------------------------------------------------------------------'
printf "${c_bic}%-25s%-20s%-50s\n${c_e}" "IP" "Inner IP" "Hostname"
for ipy in $ip_list; do
cat inner_$ipy.log |grep -iq 'timed out'
res1=$?
cat inner_$ipy.log |grep -iq 'closed by'
res2=$?
cat inner_$ipy.log |grep -iq 'IPv6'
res3=$?
if [[ $res1 -eq 0 ]]; then
printf "${c_bir}%-25s%-20s%-40s${c_e}\n" $ipy "===========>" "Connection timed out during banner exchange"
continue
elif [[ $res2 -eq 0 ]]; then
printf "${c_bir}%-25s%-20s%-40s${c_e}\n" $ipy "===========>" "ssh_exchange_identification: Connection closed by remote host"
continue
elif [[ $res3 -eq 0 ]]; then
printf "${c_bir}%-25s%-20s%-40s${c_e}\n" $ipy "===========>" "IPv6的机器没有加白暂不支持获取IPv6主机内网IP..."
continue
else
host=`cat inner_$ipy.log | fgrep 'in.ctcdn.cn'`
[[ $host == '' ]] && host='-'
inner_ip=`cat inner_$ipy.log | grep 'inet 192' | awk '{print $2}'`
[[ $inner_ip == '' ]] && inner_ip='-'
printf "%-25s%-20s%-40s\n" $ipy $inner_ip $host
fi
done
printf "${c_bic}%-25s%-20s%-50s\n${c_e}" "IP" "Inner IP" "Hostname"
echo '-----------------------------------------------------------------------------------------'
}
toolbox='/usr/local/script/fanmf11/'
data='/usr/local/script/fanmf11/data'
label_single=''
TS=`date +%s%N`
host=`whoami` # * 判断执行用户
trash="/usr/local/script/fanmf11/trash/$host/$TS" # * 每个用户的临时文件存放处
if [[ -d $trash ]]; then
echo -e "${c_br}对于同一个用户,同一时间只能运行一个实例,请重新运行...${c_e}"
exit 245
else
mkdir -p $trash
cd $trash && cd ..
docs=`ls`
for doc in $docs; do
[[ -f $doc ]] && rm -rf $doc
done
folders=`ls -t`
while [[ `echo $folders | awk '{print NF}'` -gt 29 ]]; do
folder=`ls -t | tail -1`
rm -rf $folder
folders=`ls -t`
done
cd $trash && touch ips
fi
# 参数个数必须是一个并把第一个参数赋值给tbd
if [[ $# -eq 1 ]]; then
tbd=$1
ip_search
elif [[ $# -eq 2 && $1 == '-m' ]]; then
tbd=$2
ip_search > ips.log 2>&1
[[ $? -ne 0 ]] && { cat ips.log; exit 211; }
# 判断如果是IPv4在判断是否合法
if [[ $tbd =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
ip_inner
else
echo -e "${c_br}输入只能是IPv4不接受其他格式的内容。${c_e}\n"
exit 112
fi
else
usage
fi