Last active
August 29, 2015 14:04
-
-
Save Tschrock/0c6f51a8cbae23b2d5a5 to your computer and use it in GitHub Desktop.
Some scripts to maintain and search a personal archive of pocketmine crash reports.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
showHelp() { | |
echo 'Options: | |
-d DIRECTORY download to a specific directory | |
(defaults to ~/Documents/pocketmineCrashes) | |
-h show this help.' | |
} | |
DCR_DOWNLOAD_DIRECTORY=~/Documents/pocketmineCrashes | |
while getopts d:h opt; do | |
case $opt in | |
d) | |
DCR_DOWNLOAD_DIRECTORY=$OPTARG | |
;; | |
h) | |
showHelp | |
exit | |
;; | |
esac | |
done | |
cd $DCR_DOWNLOAD_DIRECTORY || { | |
mkdir -p $DCR_DOWNLOAD_DIRECTORY && cd $DCR_DOWNLOAD_DIRECTORY || { | |
echo "Error: Couldn't find or make archive location '$DCR_DOWNLOAD_DIRECTORY'" | |
exit 1 | |
} | |
echo | |
} | |
SPC_LASTARCHIVED=$(ls | grep -o -P "(?<=PMcrash\.)[0-9]*(?=\.json)" | sort -n | tail -1) | |
[[ "$SPC_LASTARCHIVED" = "" ]] && SPC_LASTARCHIVED=0 | |
echo "Last archived crash is #$SPC_LASTARCHIVED." | |
if [[ "$SPC_LASTARCHIVED" = "0" ]]; then | |
echo | |
echo "Downloading most recent zip archive..." | |
wget -nv http://home.tschrock.net/PMcrashes.zip -O "PMcrash.zip" | |
echo "Extracting archive..." | |
unzip -q PMcrash.zip | |
echo | |
SPC_LASTARCHIVED=$(ls | grep -o -P "(?<=PMcrash\.)[0-9]*(?=\.json)" | sort -n | tail -1) | |
echo "Last archived crash is #$SPC_LASTARCHIVED." | |
fi | |
SPC_LASTCRASH=$(wget -qO- http://crash.pocketmine.net/api | grep -o -P "(?<=\"lastId\": ).*") | |
echo "Most recent crash is #$SPC_LASTCRASH." | |
if [[ $SPC_LASTARCHIVED -lt $SPC_LASTCRASH ]]; then | |
echo | |
echo "Getting new crash reports..." | |
for ((i=$(( 1 + $SPC_LASTARCHIVED)); i<=$SPC_LASTCRASH; i++)); do | |
wget -nv http://crash.pocketmine.net/view/$i/api -O "PMcrash.$i.json" | |
sleep 0.1 | |
done | |
echo "Retrieved all new crash reports." | |
fi | |
echo "Done downloading crash reports." |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# You need fdupes installed for this one!!! | |
# | |
showHelp() { | |
echo 'Usage: getPMCrashStats.sh [OPTIONS] [EXTRA_STATS...] | |
Options: | |
-d DIRECTORY where to look for crash reports. | |
(defaults to ~/Documents/pocketmineCrashes) | |
-n CRASH_NUMBER dislpay stats related to this crash report. | |
-e display stats on common errors | |
-u display stats on duplicates | |
-p display stats on common plugins | |
-m display stats on common namespaces | |
-c display stats on common classes | |
-s display stats on operating systems | |
-t NUMBER when displaying common stats, show the top NUMBER of them. (defaults to 5) | |
-k include pocketmine classes in common stats | |
-v VERSION filter by PocketMine version. | |
-a VERSION filter by api version. | |
-l ERROR_LEVEL filter by error level. ("error", "warning", "notice", "other") | |
-h show this help.' | |
} | |
SCR_DOWNLOAD_DIRECTORY=~/Documents/pocketmineCrashes | |
SCR_OPT_n=false | |
SCR_OPT_e=false | |
SCR_OPT_p=false | |
SCR_OPT_m=false | |
SCR_OPT_v=false | |
SCR_OPT_a=false | |
SCR_OPT_l=false | |
SCR_OPT_c=false | |
SCR_OPT_t=5 | |
SCR_OPT_k=false | |
SCR_OPT_u=false | |
SCR_OPT_s=false | |
while getopts d:en:pmt:cuskv:a:l:h opt; do | |
case $opt in | |
d) | |
SCR_DOWNLOAD_DIRECTORY=$OPTARG | |
;; | |
e) | |
SCR_OPT_e=true | |
;; | |
n) | |
SCR_OPT_n=$OPTARG | |
;; | |
p) | |
SCR_OPT_p=true | |
;; | |
m) | |
SCR_OPT_m=true | |
;; | |
c) | |
SCR_OPT_c=true | |
;; | |
k) | |
SCR_OPT_k=true | |
;; | |
u) | |
SCR_OPT_u=true | |
;; | |
s) | |
SCR_OPT_s=true | |
;; | |
v) | |
SCR_OPT_v=$OPTARG | |
;; | |
a) | |
SCR_OPT_a=$OPTARG | |
;; | |
l) | |
SCR_OPT_l=$OPTARG | |
;; | |
t) | |
SCR_OPT_t=$OPTARG | |
;; | |
h) | |
showHelp | |
exit | |
;; | |
\?) | |
echo "Invalid option: -$OPTARG" >&2 | |
exit | |
;; | |
:) | |
echo "Option -$OPTARG requires an argument." >&2 | |
exit 1 | |
;; | |
esac | |
done | |
shift $(($OPTIND - 1)) | |
SOURCE="${BASH_SOURCE[0]}" | |
while [ -h "$SOURCE" ]; do | |
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" | |
SOURCE="$(readlink "$SOURCE")" | |
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" | |
done | |
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" | |
$DIR/downloadCrashReports.sh -d $SCR_DOWNLOAD_DIRECTORY | |
cd $SCR_DOWNLOAD_DIRECTORY &> /dev/null || { | |
mkdir -p $SCR_DOWNLOAD_DIRECTORY && cd $SCR_DOWNLOAD_DIRECTORY || { | |
echo "Error: Couldn't find or make archive location '$SCR_DOWNLOAD_DIRECTORY'" | |
exit 1 | |
} | |
} | |
SEARCH_FLAGS="" | |
[[ !( $SCR_OPT_v = false ) ]] && SEARCH_FLAGS="$SEARCH_FLAGS -v $SCR_OPT_v" | |
[[ !( $SCR_OPT_a = false ) ]] && SEARCH_FLAGS="$SEARCH_FLAGS -a $SCR_OPT_a" | |
[[ !( $SCR_OPT_l = false ) ]] && SEARCH_FLAGS="$SEARCH_FLAGS -l $SCR_OPT_l" | |
grepCrashes(){ | |
if [[ "$SEARCH_FLAGS" = "" ]]; then | |
$DIR/searchCrashReports.sh -w -p -R -d $(pwd) -q "$1" | |
else | |
$DIR/searchCrashReports.sh -w -p -R -d $(pwd) $SEARCH_FLAGS -q "$1" | |
fi | |
#grep -P -i --color=always "$1" PMcrash.*.json | sort -V | grep -o -P '(?<=PMcrash\.)[0-9]+(?=\.json.*?:)' | sort -n | uniq | |
} | |
filterCrashes(){ | |
echo -en "$1\n$2" | sort -n | uniq -c | awk '{print $2 " " $1}' | sort -n | grep -P '[0-9]+ [0-9]*[2-9]' | awk '{print $1}' | |
} | |
getProperty(){ | |
grep -i -P -o "(?<=\"$2\": \").*(?=\")" PMcrash.$1.json | |
} | |
GPMCS_REPORTS_ERRORS=$(grepCrashes '("level": "E_ERROR")|("level": "error")') | |
GPMCS_REPORTS_WARNING=$(grepCrashes '("level": "E_WARNING")') | |
GPMCS_REPORTS_NOTICE=$(grepCrashes '("level": "E_NOTICE")|("level": "notice")') | |
GPMCS_REPORTS_OTHER=$(grepCrashes '("level": "E_COMPILE_ERROR")|("level": "E_PARSE")') | |
getErrors(){ | |
filterCrashes "$1" "$GPMCS_REPORTS_ERRORS" | wc -l | |
} | |
getWarnings(){ | |
filterCrashes "$1" "$GPMCS_REPORTS_WARNING" | wc -l | |
} | |
getNotices(){ | |
filterCrashes "$1" "$GPMCS_REPORTS_NOTICE" | wc -l | |
} | |
getOthers(){ | |
filterCrashes "$1" "$GPMCS_REPORTS_OTHER" | wc -l | |
} | |
getSearchStats(){ | |
if [[ "$2" = "" ]]; then | |
SEARCH=$(echo "$1" | sed -e 's/<|\[space\]|>/ /g') | |
NAME=$(echo "$1" | sed -e 's/<|\[space\]|>/ /g') | |
else | |
NAME=$(echo "$1" | sed -e 's/<|\[space\]|>/ /g') | |
SEARCH=$(echo "$2" | sed -e 's/<|\[space\]|>/ /g') | |
fi | |
GPMCS_TMP=$(grepCrashes "$SEARCH") | |
GPMCS_TMP2="" | |
GPMCS_TMP_ER=$(getErrors "$GPMCS_TMP") | |
if [[ !( "$GPMCS_TMP_ER" = "0" || "$GPMCS_TMP_ER" = "" ) ]];then | |
GPMCS_TMP2="$GPMCS_TMP_ER errors" | |
fi | |
GPMCS_TMP_WN=$(getWarnings "$GPMCS_TMP") | |
if [[ !( "$GPMCS_TMP_WN" = "0" || "$GPMCS_TMP_WN" = "" ) ]];then | |
if [[ "$GPMCS_TMP2" = "" ]]; then | |
GPMCS_TMP2="$GPMCS_TMP_WN warnings" | |
else | |
GPMCS_TMP2="$GPMCS_TMP2, $GPMCS_TMP_WN warnings" | |
fi | |
fi | |
GPMCS_TMP_NT=$(getNotices "$GPMCS_TMP") | |
if [[ !( "$GPMCS_TMP_NT" = "0" || "$GPMCS_TMP_NT" = "" ) ]];then | |
if [[ "$GPMCS_TMP2" = "" ]]; then | |
GPMCS_TMP2="$GPMCS_TMP_NT notices" | |
else | |
GPMCS_TMP2="$GPMCS_TMP2, $GPMCS_TMP_NT notices" | |
fi | |
fi | |
GPMCS_TMP_OT=$(getOthers "$GPMCS_TMP") | |
if [[ !( "$GPMCS_TMP_OT" = "0" || "$GPMCS_TMP_OT" = "" ) ]];then | |
if [[ "$GPMCS_TMP2" = "" ]]; then | |
GPMCS_TMP2="$GPMCS_TMP_OT others" | |
else | |
GPMCS_TMP2="$GPMCS_TMP2, and $GPMCS_TMP_OT others" | |
fi | |
fi | |
if [[ "$GPMCS_TMP" = "" ]]; then | |
GPMCS_TMP3=0 | |
else | |
GPMCS_TMP3=$(echo "$GPMCS_TMP" | wc -l) | |
fi | |
echo "$NAME: $GPMCS_TMP3 ($GPMCS_TMP2)" | |
} | |
getCommonErrors(){ | |
rm -r -f ./dupetest &> /dev/null | |
mkdir ./dupetest &> /dev/null | |
cp PMcrash.*.json ./dupetest &> /dev/null | |
cd ./dupetest &> /dev/null || exit | |
sed -i -e '2,3d' PMcrash.*.json &> /dev/null | |
echo | |
echo "Common Errors:" | |
echo | |
sed -i -e '4,7d' PMcrash.*.json &> /dev/null | |
sed -i -e '12,16d' PMcrash.*.json &> /dev/null | |
DUPE_ERRORS=$(fdupes -r ./) | |
DUPE_ERROR_NUMS=$(echo "$DUPE_ERRORS" | sed -e ':a;N;$!ba;s/\.json\n/ /g' -e 's/\.\/PMcrash\.//g' -e 's/\.json//g') | |
DUPE_NUMS=$(echo "$DUPE_ERROR_NUMS" | awk '{print $1}') | |
DUPE_NUMS_AND_COUNT=$(echo "$DUPE_ERROR_NUMS" | awk '{print NF ":" $0}' | sed 's/ /{space}/g' | sort -r -V) | |
DUPE_COUNT=0 | |
for i in $DUPE_NUMS_AND_COUNT; do | |
let DUPE_COUNT=DUPE_COUNT+1 | |
[[ "$DUPE_COUNT" -gt "$SCR_OPT_t" ]] && break | |
AMOUNT=$(echo "$i" | sed 's/:.*//g') | |
CRASHES=$(echo "$i" | sed -e 's/.*://g' -e 's/{space}/ /g') | |
FIRSTCRASH=$(echo "$CRASHES" | sed -e 's/ .*//g') | |
echo " "$(getProperty "$FIRSTCRASH" "message")" (#$FIRSTCRASH): $AMOUNT" | |
done | |
cd ../ | |
rm -r -f ./dupetest | |
} | |
getFiles(){ | |
grep -i -P -o '(?<="file": ").*/src/.*(?=")' PMcrash.*.json | sed -e 's/ /<|space|>/g' -e 's/PMcrash\..*\.json://g' -e 's/^"\//"/g' | sort | |
} | |
getCommonNamespaces(){ | |
NAMESPACES=$(getFiles) | |
[[ $SCR_OPT_k = false ]] && NAMESPACES=$(echo "$NAMESPACES" | grep -v 'src/pocketmine/' | grep -v 'src/spl') | |
NAMESPACES=$(echo "$NAMESPACES" | sed -e 's/.*\/src\///' | rev | cut -d/ -f2- | rev | sort | uniq -c | sort -nr | sed -e 's/ /<|space|>/g') | |
echo | |
echo "Common namespaces:" | |
echo | |
TMP_COUNT=0 | |
for i in $NAMESPACES; do | |
let TMP_COUNT=TMP_COUNT+1 | |
[[ "$TMP_COUNT" -gt "$SCR_OPT_t" ]] && break | |
AMOUNT=$(echo "$i" | sed -e 's/<|space|>/ /g' -e 's/^ *//' -e 's/ .*//g') | |
NAMESPACE=$(echo "$i" | sed -e 's/<|space|>/ /g' -e 's/^ *//' -e 's/^[0-9]* //') | |
echo " $NAMESPACE: $AMOUNT" | |
done | |
} | |
getCommonClasses() { | |
CLASSES=$(getFiles) | |
[[ $SCR_OPT_k = false ]] && CLASSES=$(echo "$CLASSES" | grep -v 'src/pocketmine/' | grep -v 'src/spl') | |
CLASSES=$(echo "$CLASSES" | sed -e 's/.*\/src\///g') | |
CLASSES=$(echo "$CLASSES" | sort | uniq -c | sort -nr | sed -e 's/ /<|space|>/g') | |
echo | |
echo "Common classes:" | |
echo | |
TMP_COUNT=0 | |
for i in $CLASSES; do | |
let TMP_COUNT=TMP_COUNT+1 | |
[[ "$TMP_COUNT" -gt "$SCR_OPT_t" ]] && break | |
AMOUNT=$(echo "$i" | sed -e 's/<|space|>/ /g' -e 's/^ *//' -e 's/ .*//g') | |
CLASS=$(echo "$i" | sed -e 's/<|space|>/ /g' -e 's/^ *//' -e 's/^[0-9]* //') | |
echo " $CLASS: $AMOUNT" | |
done | |
} | |
getCommonPlugins(){ | |
CLASSES=$(getFiles) | |
CLASSES=$(echo "$CLASSES" | grep -v 'src/pocketmine/' | grep -v 'src/spl') | |
CLASSES=$(echo "$CLASSES" | sed -e 's/\/src\/.*//' -e 's/^\///g' -e 's/\// /g' | rev | awk '{print $1}' | rev | sed -e 's/ /<|space|>/g' -e 's/.phar//g' -e 's/_v[0-9]*.*//g' -e 's/-[0-9]*\.[0-9]*.*//g' -e 's/<|space|>([0-9]*)//g') | |
CLASSES=$(echo "$CLASSES" | sort | uniq -c | sort -nr | sed -e 's/ /<|[space]|>/g') | |
echo | |
echo "Common plugins:" | |
echo | |
TMP_COUNT=0 | |
for i in $CLASSES; do | |
let TMP_COUNT=TMP_COUNT+1 | |
[[ "$TMP_COUNT" -gt "$SCR_OPT_t" ]] && break | |
AMOUNT=$(echo "$i" | sed -e 's/<|\[space\]|>/ /g' -e 's/^ *//' -e 's/ .*//g') | |
PLUGIN=$(echo "$i" | sed -e 's/<|\[space\]|>/ /g' -e 's/^ *//' -e 's/^[0-9]* //' -e 's/<|space|>/ /g') | |
echo " $PLUGIN: $AMOUNT" | |
done | |
} | |
getCommonHosts() { | |
#OPERATINGSYSTEMS=$(grep -i -P -o '(?<="os": ").*(?=")' PMcrash.*.json | sed -e 's/PMcrash\..*\.json://g' | sort | uniq -c) | |
ARCHITECTURES=$(grep -i -P -o '(?<="banner": ").*(?=")' PMcrash.*.json | sed -e 's/PMcrash\..*\.json://g' | awk '{print $1 "<|space|>" $NF}' | sed -e 's/<|space|>/ /g' | sort | uniq -c | sed -e 's/^ *//' -e 's/ /<|[space]|>/g' | sort -nr) | |
echo | |
echo Common operating systems: | |
echo | |
TMP_COUNT=0 | |
for i in $ARCHITECTURES; do | |
let TMP_COUNT=TMP_COUNT+1 | |
[[ "$TMP_COUNT" -gt "$SCR_OPT_t" ]] && break | |
AMOUNT=$(echo "$i" | sed -e 's/<|\[space\]|>/ /g' -e 's/^ *//' -e 's/ .*//g') | |
HOST=$(echo "$i" | sed -e 's/<|\[space\]|>/ /g' -e 's/^ *//' -e 's/^[0-9]* //') | |
echo " $HOST: $AMOUNT" | |
done | |
} | |
ALLARGS="" | |
for ARG in "$@"; do | |
ARG=$(echo "$ARG" | sed -e 's/ /<|[space]|>/g') | |
ALLARGS="$ALLARGS $ARG" | |
done | |
getCustomStats() { | |
echo | |
echo "Custom searches:" | |
echo | |
for i in $ALLARGS; do | |
i=$(echo "$i" | sed -e 's/ /<|[space]|>/g' -e 's/<|>/ /g') | |
echo " "$(getSearchStats $i) | |
done | |
} | |
echo | |
echo "-----With exact duplicates-----" | |
echo | |
echo "Total crash reports: $(ls PMcrash.*.json | wc -l)" | |
ARG1="$1" | |
doSearch(){ | |
[[ "$ARG1" = "" ]] || getCustomStats | |
[[ $SCR_OPT_m = true ]] && getCommonNamespaces | |
[[ $SCR_OPT_c = true ]] && getCommonClasses | |
[[ $SCR_OPT_p = true ]] && getCommonPlugins | |
[[ $SCR_OPT_s = true ]] && getCommonHosts | |
[[ $SCR_OPT_e = true ]] && getCommonErrors | |
} | |
doSearch | |
echo | |
if [[ $SCR_OPT_u = true ]]; then | |
cd $SCR_DOWNLOAD_DIRECTORY &> /dev/null || exit 1 | |
rm -r -f ./dupetest &> /dev/null | |
mkdir ./dupetest &> /dev/null | |
cp PMcrash.*.json ./dupetest &> /dev/null | |
cd ./dupetest &> /dev/null || exit | |
sed -i -e '2,3d' PMcrash.*.json &> /dev/null | |
GPMCS_DUPES=$(fdupes -mrq ./) | |
echo | |
echo "**$(echo -n $GPMCS_DUPES | awk '{print $1}') duplicates found. "$(echo $GPMCS_DUPES | grep -o -P '\(.*\)') | |
echo | |
echo | |
echo "-----Without exact duplicates-----" | |
echo | |
fdupes -rdN ./ &> /dev/null | |
echo "Total crash reports: $(ls PMcrash.*.json | wc -l)" | |
doSearch | |
echo | |
cd $SCR_DOWNLOAD_DIRECTORY | |
rm -r -f ./dupetest | |
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
showHelp() { | |
echo 'Usage: searchCrashReports.sh [OPTION] QUERY | |
Options: | |
-d DIRECTORY where to look for crash reports. | |
(defaults to ~/Documents/pocketmineCrashes) | |
-w don'"'"'t try downloading new reports | |
-n CRASH_NUMBER dislpay info from this report instead of searching. | |
-v VERSION filter by PocketMine version. | |
-a VERSION filter by api version. | |
-l ERROR_LEVEL filter by error level. ("error", "warning", "notice", "other") | |
-R use advanced RegEx. | |
-e print detailed error information. | |
-q only print search results. | |
-f print where match was found. | |
-p only print result numbers (faster, implies -q, excludes -e -f) | |
-h show this help.' | |
} | |
if [[ "$@" = "" ]]; then | |
showHelp | |
exit | |
fi | |
SCR_DOWNLOAD_DIRECTORY=~/Documents/pocketmineCrashes | |
SCR_OPT_v=false | |
SCR_OPT_a=false | |
SCR_OPT_l=false | |
SCR_OPT_e=false | |
SCR_OPT_q=false | |
SCR_OPT_f=false | |
SCR_OPT_n=false | |
SCR_OPT_w=false | |
SCR_OPT_p=false | |
SCR_OPT_R=false | |
while getopts d:n:v:a:l:cewqpRfh opt; do | |
case $opt in | |
d) | |
SCR_DOWNLOAD_DIRECTORY=$OPTARG | |
;; | |
v) | |
SCR_OPT_v=$OPTARG | |
;; | |
a) | |
SCR_OPT_a=$OPTARG | |
;; | |
l) | |
SCR_OPT_l=$OPTARG | |
;; | |
e) | |
SCR_OPT_e=true | |
;; | |
q) | |
SCR_OPT_q=true | |
;; | |
f) | |
SCR_OPT_f=true | |
;; | |
w) | |
SCR_OPT_w=true | |
;; | |
R) | |
SCR_OPT_R=true | |
;; | |
p) | |
SCR_OPT_p=true | |
SCR_OPT_q=true | |
;; | |
n) | |
SCR_OPT_n=$OPTARG | |
;; | |
h) | |
showHelp | |
exit | |
;; | |
\?) | |
echo "Invalid option: -$OPTARG" >&2 | |
exit | |
;; | |
:) | |
echo "Option -$OPTARG requires an argument." >&2 | |
exit 1 | |
;; | |
esac | |
done | |
shift $(($OPTIND - 1)) | |
if [[ $SCR_OPT_w = false ]]; then | |
SOURCE="${BASH_SOURCE[0]}" | |
while [ -h "$SOURCE" ]; do | |
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" | |
SOURCE="$(readlink "$SOURCE")" | |
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" | |
done | |
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" | |
if [[ $SCR_OPT_q = true ]]; then | |
$DIR/downloadCrashReports.sh -d $SCR_DOWNLOAD_DIRECTORY &> /dev/null | |
else | |
$DIR/downloadCrashReports.sh -d $SCR_DOWNLOAD_DIRECTORY | |
echo | |
fi | |
fi | |
cd $SCR_DOWNLOAD_DIRECTORY &> /dev/null || { | |
mkdir -p $SCR_DOWNLOAD_DIRECTORY && cd $SCR_DOWNLOAD_DIRECTORY || { | |
echo "Error: Couldn't find or make archive location '$SCR_DOWNLOAD_DIRECTORY'" | |
exit 1 | |
} | |
} | |
GREP_FLAGS="-i" | |
[[ $SCR_OPT_R = true ]] && GREP_FLAGS="-i -P" | |
grepCrashes(){ | |
grep $GREP_FLAGS --color=always "$1" PMcrash.*.json | sort -V | grep -o -P '(?<=PMcrash\.)[0-9]+(?=\.json.*?:)' | sort -n | uniq | |
} | |
filterCrashes(){ | |
echo -en "$1\n$2" | sort -n | uniq -c | awk '{print $2 " " $1}' | sort -n | grep -P '[0-9]+ [0-9]*[2-9]' | awk '{print $1}' | |
} | |
getProperty(){ | |
grep -i -P -o "(?<=\"$2\": \").*(?=\")" PMcrash.$1.json | |
} | |
if [[ !( $SCR_OPT_n = false ) ]]; then | |
echo "$SCR_OPT_n: "$(getProperty "$SCR_OPT_n" "errorTitle") | |
echo | |
echo "level: "$(getProperty "$SCR_OPT_n" "level") | |
echo "file: "$(getProperty "$SCR_OPT_n" "file") | |
echo "line: "$(getProperty "$SCR_OPT_n" "line") | |
echo "message: "$(getProperty "$SCR_OPT_n" "message") | |
echo | |
echo | |
exit | |
fi | |
SEARCH_MATCHES=$(grepCrashes "$1") | |
if [[ !( $SCR_OPT_l = false ) ]];then | |
if grep -i -q "error" <<<$SCR_OPT_l; then | |
SCR_FILTER_ERRORS=$(grepCrashes '("level": "E_ERROR")|("level": "error")') | |
SEARCH_MATCHES=$(filterCrashes "$SEARCH_MATCHES" "$SCR_FILTER_ERRORS") | |
elif grep -i -q "warning" <<<$SCR_OPT_l; then | |
SCR_FILTER_WARNING=$(grepCrashes '("level": "E_WARNING")') | |
SEARCH_MATCHES=$(filterCrashes "$SEARCH_MATCHES" "$SCR_FILTER_WARNING") | |
elif grep -i -q "notice" <<<$SCR_OPT_l; then | |
SCR_FILTER_NOTICE=$(grepCrashes '("level": "E_NOTICE")|("level": "notice")') | |
SEARCH_MATCHES=$(filterCrashes "$SEARCH_MATCHES" "$SCR_FILTER_NOTICE") | |
elif grep -i -q "other" <<<$SCR_OPT_l; then | |
SCR_FILTER_OTHER=$(grepCrashes '("level": "E_COMPILE_ERROR")|("level": "E_PARSE")') | |
SEARCH_MATCHES=$(filterCrashes "$SEARCH_MATCHES" "$SCR_FILTER_OTHER") | |
fi | |
fi | |
if [[ !( $SCR_OPT_v = false ) ]];then | |
SCR_FILTER_VERSION=$(grepCrashes '"version": "'$SCR_OPT_v'"') | |
SEARCH_MATCHES=$(filterCrashes "$SEARCH_MATCHES" "$SCR_FILTER_VERSION") | |
fi | |
if [[ !( $SCR_OPT_a = false ) ]];then | |
SCR_FILTER_APIVERSION=$(grepCrashes '"api_version": "'$SCR_OPT_a'"') | |
SEARCH_MATCHES=$(filterCrashes "$SEARCH_MATCHES" "$SCR_FILTER_APIVERSION") | |
fi | |
[[ $SCR_OPT_q = false ]] && echo $(echo "$SEARCH_MATCHES" | wc -l)" results found!" && echo | |
if [[ $SCR_OPT_p = true ]]; then | |
echo "$SEARCH_MATCHES" | |
else | |
for match in $SEARCH_MATCHES; do | |
echo -n "$match: "$(getProperty "$match" "errorTitle") | |
if [[ $SCR_OPT_e = true ]]; then | |
echo | |
echo " level: "$(getProperty "$match" "level") | |
echo " file: "$(getProperty "$match" "file") | |
echo " line: "$(getProperty "$match" "line") | |
echo " message: "$(getProperty "$match" "message") | |
fi | |
if [[ $SCR_OPT_f = true ]]; then | |
echo | |
echo | |
echo " Found in line: " $(grep -P -i --color=always "$@" PMcrash.$match.json) | |
fi | |
echo | |
done | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment