refactor: simplify the parse

This commit is contained in:
SukkaW 2018-08-19 22:41:07 +08:00
parent 251429e274
commit c028a4a997
5 changed files with 81 additions and 42 deletions

135
util/checker.sh Normal file
View file

@ -0,0 +1,135 @@
echo '-------------------------------------'
echo 'Start Checking Chrome ......'
echo '-------------------------------------'
echo 'Checking Chrome Stable x86 ......'
curl -s "https://tools.google.com/service/update2" --data "<?xml version='1.0' encoding='UTF-8'?>
<request protocol='3.0' version='1.3.23.9' shell_version='1.3.21.103' ismachine='0'
sessionid='{3597644B-2952-4F92-AE55-D315F45F80A5}' installsource='ondemandcheckforupdate'
requestid='{CD7523AD-A40D-49F4-AEEF-8C114B804658}' dedup='cr'>
<hw sse='1' sse2='1' sse3='1' ssse3='1' sse41='1' sse42='1' avx='1' physmemory='12582912' />
<os platform='win' version='6.3' arch='x86'/>
<app appid='{8A69D345-D564-463C-AFF1-A69D9E530F96}' ap='-multi-chrome' version='' nextversion='' lang='' brand='GGLS' client=''>
<updatecheck/>
</app>
</request>" > ./tmp/checker/stable-x86.xml
echo ''
sleep 1
echo 'Checking Chrome Stable x64 ......'
curl -s "https://tools.google.com/service/update2" --data "<?xml version='1.0' encoding='UTF-8'?>
<request protocol='3.0' version='1.3.23.9' shell_version='1.3.21.103' ismachine='0'
sessionid='{3597644B-2952-4F92-AE55-D315F45F80A5}' installsource='ondemandcheckforupdate'
requestid='{CD7523AD-A40D-49F4-AEEF-8C114B804658}' dedup='cr'>
<hw sse='1' sse2='1' sse3='1' ssse3='1' sse41='1' sse42='1' avx='1' physmemory='12582912' />
<os platform='win' version='6.3' arch='x64'/>
<app appid='{8A69D345-D564-463C-AFF1-A69D9E530F96}' ap='x64-stable-multi-chrome' version='' nextversion='' lang='' brand='GGLS' client=''>
<updatecheck/>
</app>
</request>" > ./tmp/checker/stable-x64.xml
echo ''
sleep 1
echo 'Checking Chrome Beta x86 ......'
curl -s "https://tools.google.com/service/update2" --data "<?xml version='1.0' encoding='UTF-8'?>
<request protocol='3.0' version='1.3.23.9' shell_version='1.3.21.103' ismachine='0'
sessionid='{3597644B-2952-4F92-AE55-D315F45F80A5}' installsource='ondemandcheckforupdate'
requestid='{CD7523AD-A40D-49F4-AEEF-8C114B804658}' dedup='cr'>
<hw sse='1' sse2='1' sse3='1' ssse3='1' sse41='1' sse42='1' avx='1' physmemory='12582912' />
<os platform='win' version='6.3' arch='x86'/>
<app appid='{8A69D345-D564-463C-AFF1-A69D9E530F96}' ap='1.1-beta' version='' nextversion='' lang='' brand='GGLS' client=''>
<updatecheck/>
</app>
</request>" > ./tmp/checker/beta-x86.xml
echo ''
sleep 1
echo 'Checking Chrome Beta x64 ......'
curl -s "https://tools.google.com/service/update2" --data "<?xml version='1.0' encoding='UTF-8'?>
<request protocol='3.0' version='1.3.23.9' shell_version='1.3.21.103' ismachine='0'
sessionid='{3597644B-2952-4F92-AE55-D315F45F80A5}' installsource='ondemandcheckforupdate'
requestid='{CD7523AD-A40D-49F4-AEEF-8C114B804658}' dedup='cr'>
<hw sse='1' sse2='1' sse3='1' ssse3='1' sse41='1' sse42='1' avx='1' physmemory='12582912' />
<os platform='win' version='6.3' arch='x64'/>
<app appid='{8A69D345-D564-463C-AFF1-A69D9E530F96}' ap='x64-beta-multi-chrome' version='' nextversion='' lang='' brand='GGLS' client=''>
<updatecheck/>
</app>
</request>" > ./tmp/checker/beta-x64.xml
echo ''
sleep 1
echo 'Checking Chrome Dev x86 ......'
curl -s "https://tools.google.com/service/update2" --data "<?xml version='1.0' encoding='UTF-8'?>
<request protocol='3.0' version='1.3.23.9' shell_version='1.3.21.103' ismachine='0'
sessionid='{3597644B-2952-4F92-AE55-D315F45F80A5}' installsource='ondemandcheckforupdate'
requestid='{CD7523AD-A40D-49F4-AEEF-8C114B804658}' dedup='cr'>
<hw sse='1' sse2='1' sse3='1' ssse3='1' sse41='1' sse42='1' avx='1' physmemory='12582912' />
<os platform='win' version='6.3' arch='x86'/>
<app appid='{8A69D345-D564-463C-AFF1-A69D9E530F96}' ap='2.0-dev' version='' nextversion='' lang='' brand='GGLS' client=''>
<updatecheck/>
</app>
</request>" > ./tmp/checker/dev-x86.xml
echo ''
sleep 1
echo 'Checking Chrome Dev x64 ......'
curl -s "https://tools.google.com/service/update2" --data "<?xml version='1.0' encoding='UTF-8'?>
<request protocol='3.0' version='1.3.23.9' shell_version='1.3.21.103' ismachine='0'
sessionid='{3597644B-2952-4F92-AE55-D315F45F80A5}' installsource='ondemandcheckforupdate'
requestid='{CD7523AD-A40D-49F4-AEEF-8C114B804658}' dedup='cr'>
<hw sse='1' sse2='1' sse3='1' ssse3='1' sse41='1' sse42='1' avx='1' physmemory='12582912' />
<os platform='win' version='6.3' arch='x64'/>
<app appid='{8A69D345-D564-463C-AFF1-A69D9E530F96}' ap='x64-dev-multi-chrome' version='' nextversion='' lang='' brand='GGLS' client=''>
<updatecheck/>
</app>
</request>" > ./tmp/checker/dev-x64.xml
echo ''
sleep 1
echo 'Checking Chrome Canary x86 ......'
curl -s "https://tools.google.com/service/update2" --data "<?xml version='1.0' encoding='UTF-8'?>
<request protocol='3.0' version='1.3.23.9' shell_version='1.3.21.103' ismachine='0'
sessionid='{3597644B-2952-4F92-AE55-D315F45F80A5}' installsource='ondemandcheckforupdate'
requestid='{CD7523AD-A40D-49F4-AEEF-8C114B804658}' dedup='cr'>
<hw sse='1' sse2='1' sse3='1' ssse3='1' sse41='1' sse42='1' avx='1' physmemory='12582912' />
<os platform='win' version='6.3' arch='x86'/>
<app appid='{4EA16AC7-FD5A-47C3-875B-DBF4A2008C20}' ap='' version='' nextversion='' lang='' brand='GGLS' client=''>
<updatecheck/>
</app>
</request>" > ./tmp/checker/canary-x86.xml
echo ''
sleep 1
echo 'Checking Chrome Canary x64 ......'
curl -s "https://tools.google.com/service/update2" --data "<?xml version='1.0' encoding='UTF-8'?>
<request protocol='3.0' version='1.3.23.9' shell_version='1.3.21.103' ismachine='0'
sessionid='{3597644B-2952-4F92-AE55-D315F45F80A5}' installsource='ondemandcheckforupdate'
requestid='{CD7523AD-A40D-49F4-AEEF-8C114B804658}' dedup='cr'>
<hw sse='1' sse2='1' sse3='1' ssse3='1' sse41='1' sse42='1' avx='1' physmemory='12582912' />
<os platform='win' version='6.3' arch='x64'/>
<app appid='{4EA16AC7-FD5A-47C3-875B-DBF4A2008C20}' ap='x64-canary' version='' nextversion='' lang='' brand='GGLS' client=''>
<updatecheck/>
</app>
</request>" > ./tmp/checker/canary-x64.xml

24
util/parse.sh Normal file
View file

@ -0,0 +1,24 @@
for i in $@
do
echo 'Parsing '${i}' data ......'
xmllint --format ./tmp/checker/${i}.xml > ./tmp/checker/${i}.format.xml
./util/xmlparser.sh ./tmp/checker/${i}.format.xml > ./tmp/parse/${i}.info
sed -i 's| ELEMENT=manifest ATTRIBUTE=version VALUE=||g' ./tmp/parse/${i}.info
sed -i 's| ELEMENT=url ATTRIBUTE=codebase VALUE=||g' ./tmp/parse/${i}.info
sed -i 's| ATTRIBUTE=hash |\n|g' ./tmp/parse/${i}.info
sed -i 's| ATTRIBUTE=name VALUE=|\n|g' ./tmp/parse/${i}.info
sed -i 's| ATTRIBUTE=required VALUE=true ATTRIBUTE=size VALUE=|\n|g' ./tmp/parse/${i}.info
sed -i 's| ATTRIBUTE=hash_sha256 VALUE=|\n|g' ./tmp/parse/${i}.info
sed -i 's| ELEMENT=time ATTRIBUTE=checktime VALUE=||g' ./tmp/parse/${i}.info
sed -i 's|https://||g' ./tmp/parse/${i}.info
sed -i 's| ||g' ./tmp/parse/${i}.info
sed -n '8p' ./tmp/parse/${i}.info > ./tmp/parse/${i}-result.info
sed -n '10p' ./tmp/parse/${i}.info >> ./tmp/parse/${i}-result.info
sed -n '14p' ./tmp/parse/${i}.info >> ./tmp/parse/${i}-result.info
sed -n '23p' ./tmp/parse/${i}.info >> ./tmp/parse/${i}-result.info
sed -n '22p' ./tmp/parse/${i}.info >> ./tmp/parse/${i}-result.info
sed -n '24p' ./tmp/parse/${i}.info >> ./tmp/parse/${i}-result.info
done

128
util/xmlparser.sh Normal file
View file

@ -0,0 +1,128 @@
#!/usr/bin/env bash
#0.<?xml version="1.0" encoding="utf-8"?>
#1.<test>Only For Test</test>
#2.<application
# android:label="@string/app_name">
#3.<test/>
#4.<uses-permission android:name="android.permission.BLUETOOTH" />
#Attribute=Attribute Name
#VALUE=Attribute Value
#ELEMENT=Element Name
#CONTENT=Element Content
#接受一个int层级参数层级从0开始
echo_tabs() {
local tabs="";
for((i = 0; i < $1; i++)); do
tabs=$tabs' ' #4个空格
done
echo -n "$tabs" #一定要加双引号
}
read_dom() {
#备份IFS
local oldIFS=$IFS
local IFS=\> #字段分割符改为>
read -d \< ENTITY CONTENT #read分隔符改为<
local ret=$?
local ELEMENT=''
#第一次执行时,第一个字符为<.
#所以read执行完毕ENTITY和CONTENT都是空白符
if [[ $ENTITY =~ ^[[:space:]]*$ ]] && [[ $CONTENT =~ ^[[:space:]]*$ ]]; then
return $ret
fi
#第二次执行时,分为下面集中情况
#0.<?xml version="1.0" encoding="utf-8"?>
#此时read结果为?xml version="1.0" encoding="utf-8"?
#CONTENT=若干空白符
#1.<Size>1785</Size>
#此时read结果为Size所以ENTITY=SizeCONTENT='1785'
#第三次read结为/Size所以ENTITY=/SizeCONTENT=若干空白符
#2.<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
#此时read结果为ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"所以ENTITY=tListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"CONTENT=同#1
#3.<test/>
#此时read结果为test/所以ENTITY=test/CONTENT=若干空白符
#4.<test name="xyz" age="21"/>
#此时read结果为test name="xyz" age="21"/所以ENTITY=test name="xyz"/CONTENT=若干空白符
#5.<!--q1-->
#此时read结果为!--q1--所以ENTITY=!--q1--CONTENT=''
# ENTITY = ?xml version="1.0" encoding="utf-8"?
#解析xml声明并非普通节点闭合方式与节点不同
if [[ "$ENTITY" =~ ^\?xml[[:space:]]*(.*)\?$ ]]; then #使用正则去除问号和xml字符
ENTITY=''
ELEMENT='' #不是普通节点
ATTRIBUTES="${BASH_REMATCH[1]}" #获取声明中的属性
else #普通节点
ELEMENT=${ENTITY%% *} #获取节点名称如果ENTITY中有空格则第一个空格前面部分即为节点名称
ATTRIBUTES=${ENTITY#* } #获取节点所有属性如果ENTITY中有空格则第一个空格后面部分为所有属性(#2和#4#4情况下会多出/)
fi
if [[ "$ENTITY" = \!--*-- ]]; then #不检查注释(#5)
return 0
fi
if [[ "$ELEMENT" = /* ]]; then #节点末尾 #1第三步
tabCount=$[$tabCount - 1]
echo_tabs $tabCount
echo END ${ELEMENT#*/} #删除/
return 0
elif [[ "$ELEMENT" = */ ]] || [[ $ATTRIBUTES = */ ]]; then #3或#4
empty=true #节点没有子节点也没有value(自身为闭合标签)
if [[ $ATTRIBUTES = */ ]]; then #如果是#4情况
ATTRIBUTES=${ATTRIBUTES%*/} #将末尾的/删除,提取所有属性
fi
echo_tabs $tabCount
echo -n ELEMENT=${ELEMENT%*/}' '
elif [ ! "$ELEMENT" = '' ]; then #第一次执行时ENTITY和CONTENT都是空串
echo_tabs $tabCount
echo -n ELEMENT="$ELEMENT"' ' #输出节点名
tabCount=$[$tabCount + 1] #新节点
else
echo -n "XML declaration " #ELEMENT为空不计算层级
fi
local empty=false #没有子节点没有value
IFS=$oldIFS #属性之间由空白符分割恢复IFSIFS默认为空格/换行/制表符
local hasAttribute=false #节点是否有属性
for a in $ATTRIBUTES; do #循环所有属性
#echo ATTRIBUTES=$ATTRIBUTES ' -+-+-+- '
if [[ "$a" = *=* ]] #情况#2和#4
then
hasAttribute=true
ATTRIBUTE_NAME=${a%%=*} #提取属性名
ATTRIBUTE_VALUE=`tr -d '"' <<< ${a#*=}` #提取属性值并去掉双引号
echo -n ATTRIBUTE=$ATTRIBUTE_NAME VALUE=$ATTRIBUTE_VALUE' ' #输出属性名/属性值
fi
done
if [[ ! "$CONTENT" =~ ^[[:space:]]*$ ]]; then
echo -n CONTENT=$CONTENT
fi
if [ "$empty" = true ]; then
echo
echo_tabs $tabCount
echo -n END ${ELEMENT%/*} #删除/
# echo -n ' (empty node)'
fi
echo
return $ret
}
read_xml() {
local tabCount=0 #用来格式化输出,计算节点层级
while read_dom; do
:
done < "$1"
}
read_xml "$1"