#!/bin/bash
#-------------------
#LiveDomains
#SIMPLY CHECKS WHICH DOMAINS ARE LIVE ON THE SERVER AND WHICH ARE NOT
#Apache Only
#Author: Jeremy J Butler
LDVersion=16
#Initial Commit - Jeremy Butler - Version 0.6 - 8/12/2013
#Code Clean up and standerdized - Jeremy Butler - 8/31/2013
#added --short flag - Greg Martin - 4/4/2014
#nginx support and various bug fixes - Jeremy Butler - 7/13/2014
#rev 9 - more bug fixes for nginx support - Jeremy Butler 7/27/2014
#rev 10 - added --only flag for testing a single domain and getting document root when its apache 7/27/2014
#rev 11 - added --show-hacked option which will additionally check google safe browsing if each site has been reported as comprimised 8/21/2014
#rev 12 - bugfix for issue 100 found solved by Paul, code updated by Jeremy Butler
#rev 13 - bugfix to add support for cent7 by parsing ifconfig differently for checklocalip variables; thanks Ted Duncan
#rev 14 - another c7 bugfix for ifconfig parsing
#rev 15 - changed to use ip addr show instead of ifconfig for checking for ips so in the event multiple ips are on one interface they are still detected (issue #188)
#rev 16 - highlight CloudFlare IPs. requires /mojo/cidr2iplist
#rev 17 - highlight Highwinds/Stackpath IPs. ASN 20446 - MojoShield
###########################################################################
if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then
echo "LiveDomains Version : $LDVersion";
echo "--help or -h : display this help screen";
echo "--live : display only live domains";
echo "--short: display only domain ip. Only works with --live";
echo "--only: tests just one domain and shows the document root if its apache";
echo "--show-hacked: checks google safe browsing for reports of compromise";
fi
#################################################################################
#Main
#
##################################################################################
Main() {
declare -a thedoms
local checkforapache=$(pgrep -x httpd|wc -w);
local checkfornginx=$(pgrep -x nginx|wc -w);
RNDM=${RANDOM}
#######Start check which web daemons are running############
if [ "${checkforapache}" -eq 0 ] && [ "${checkfornginx}" -eq 0 ];
then
apacherunning=0;
nginxrunning=0;
echo "[Critical Error] Apache/Nginx not running here or you do not have permission to check the pids. "
exit 1;
fi
if [ "$checkfornginx" -gt 0 ];
then
nginxrunning=1
else
nginxrunning=0;
fi
if [ "$checkforapache" -gt 0 ];
then
apacherunning=1;
else
apacherunning=0;
fi
checkforothersvcs=$(netstat -lnp| egrep '(lighttpd|named|wowza)'|wc -l) #check other
######END Check running Web Daemons############################
echo "Warning: Domains in servers other then apache are not currently recognized fully - lighttpd, wowza, named, etc...";
echo "This script does check NGINX but does not confirm nginx is configured properly for the domain, only that the domain configured in nginx resolves to this box";
echo "Always Triple Check before pulling any IP addresses"
if [ "$checkforothersvcs" -gt 0 ];
then
echo "It appears that lighttpd/named/wowza is in fact running here be very cautious";
fi
echo "-------------------------------------------------------------------------------------"
local APACHE=$(ps aux|awk '{print $11}'|grep -v lightt|grep httpd|head -1)
#if apache is running get the configured vhost and append to thedoms array
if [ "$apacherunning" -eq 1 ]; then
for x in `netstat -an|grep -qw :443
if [ $? -gt 0 ];
then
$APACHE -S 2>&1 | grep -oP '\(.+\)' | tr -d '()' | cut -d: -f1 | sort | uniq
else
$APACHE -S -DSSL -DHAVE_SSL -DHAVESSL 2>&1 | grep -oP '\(.+\)' | tr -d '()' | cut -d: -f1 | sort | uniq
fi`
do
for i in `cat $x|sed 's/^[ \t]*//'|egrep -i 'ServerAlias|servername' | grep -v ^\#|tr 'A-Z' 'a-z' | sed 's/serveralias //' | sed 's/servername //'|sed -e 's/www\.//g'|sort|uniq`;
do thedoms=("${thedoms[@]}" $i); ##For Bash 3.0 and below (centos 4 compatibillity)
##we have to do it this way in violation of bashims and at cost of speed
done
done
fi
if [ "$nginxrunning" -eq 1 ] && [ "$apacherunning" -eq 1 ]; then #apache and nginx are both running
nginxdoms=($(awk '/server_name/ {f=1} f {p=$NF;sub(/;$/,"",p);print p} /;$/ {f=0}' /usr/local/nginx/conf/vhost.conf|sed -r -e "s~^\.~~g"|sed "/^$/d")) #get the nginx vhosts and assign each a value in nginxdoms array
#combine nginxdoms and apache doms array, remove duplicates and clean it up
OLDIFS="$IFS" IFS=$'\n' combined=(`for R in "${thedoms[@]}" "${nginxdoms[@]}"; do echo "$R" ; done | sort -du`) IFS="$OLDIFS"
elif [ "$nginxrunning" -eq 1 ] && [ "$apacherunning" -eq 0 ]; then #nginx is running but apache isnt
nginxdoms=($(awk '/server_name/ {f=1} f {p=$NF;sub(/;$/,"",p);print p} /;$/ {f=0}' /usr/local/nginx/conf/vhost.conf|sed -r -e "s~^\.~~g"))
OLDIFS="$IFS" IFS=$'\n' combined=(`for R in "${nginxdoms[@]}"; do echo "$R" ; done | sort -du`) IFS="$OLDIFS" #just clean up duplicates from nginx array values and only check these
elif [ "$nginxrunning" -eq 0 ] && [ "$apacherunning" -eq 1 ]; #apache is running but nginx is not
then
OLDIFS="$IFS" IFS=$'\n' combined=(`for R in "${thedoms[@]}"; do echo "$R" ; done | sort -du`) IFS="$OLDIFS" #just clean up duplicates for apache array and check these
fi
#Get Cloudflare IPs
wget -q -O /tmp/cf_cidr_${RNDM} 'https://www.cloudflare.com/ips-v4' > /dev/null 2>&1
CFGET=$?
if [ ${CFGET} -ne "0" ]; then
echo "Could not get CloudFlare IPs. Continuing without CloudFlare identification."
else
/usr/local/mojo/bin/cidr2iplist -i /tmp/cf_cidr_${RNDM} > /tmp/cf_ips_${RNDM}
fi
#Get Highwinds/Stackpath IPs (ASN 20446)
curl -s 'https://ipinfo.io/AS20446' | egrep '^[[:blank:]]*([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))' | awk '{print $1}' > /tmp/hw_cidr_${RNDM}
HWGET=$?
if [[ ${HWGET} -ne "0" ]] || [[ ! -f /tmp/hw_cidr_${RNDM} ]] || [[ $(cat /tmp/hw_cidr_${RNDM} 2> /dev/null | wc -l) -lt 1 ]]; then
echo "Could not get Highwinds IPs. Continuing without MojoShield identification."
else
/usr/local/mojo/bin/cidr2iplist -i /tmp/hw_cidr_${RNDM} > /tmp/hw_ips_${RNDM}
fi
for r in "${!combined[@]}"
do
##Check if its a CNAME or not to determine how we will parse the output of dig
if [ `dig cname @8.8.8.8 "${combined[$r]}" +short|wc -l` -gt 0 ]; #If its a cname
then
local thedigger=$(dig @8.8.8.8 "${combined[$r]}" +short|tail -n1|sed -e 's/^[ \t]*//'|sed '/^$/d');
##its a cname so instead of first line from dig +short we grab the last(the destination A record)
else
local thedigger=$(dig @8.8.8.8 "${combined[$r]}" +short|head -n1|sed -e 's/^[ \t]*//'|sed '/^$/d')
fi ##else parse dig normally
local checkdigger=$(echo "${thedigger}"|wc -l)
local checklocalip=$(ip addr show|grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"|grep "${thedigger}"|wc -l)
if [ ${CFGET} -ne "0" ]; then
local checkcfip=0
else
checkcfip=0
checkhwip=0
if [ -f /tmp/cf_ips_${RNDM} ]; then local checkcfip=$(grep "${thedigger}" /tmp/cf_ips_${RNDM}|wc -l); fi
if [ -f /tmp/hw_ips_${RNDM} ]; then local checkhwip=$(grep "${thedigger}" /tmp/hw_ips_${RNDM}|wc -l); fi
fi
#Check that we have actually gotten a valid IP Address
if [[ "${thedigger}" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
checkdigger2=1;
else
checkdigger2=2;
fi
if [ "${checkdigger}" -eq 0 ] || [ "${checkdigger2}" -eq 2 ];
then
printf "\e[31m%20s - \e[1m %s\e[0m\n" "[ERROR] "${combined[$r]}" is not resolving returned" "${thedigger}" ;
##If we don't have a valid IP or dig returned nothing at all then call it a day before we do anything else
elif [ $checkcfip -gt "0" ] && [ "${checkdigger2}" -eq 1 ];
then
printf "\e[33m%20s - %s\e[0m\n" ""${combined[$r]}" is using CloudFlare @" "${thedigger}";
elif [ $checkhwip -gt "0" ] && [ "${checkdigger2}" -eq 1 ];
then
printf "\e[33m%20s - %s\e[0m\n" ""${combined[$r]}" is using StackPath (MojoShield) @" "${thedigger}";
elif [ $checklocalip -gt "0" ] && [ "${checkdigger2}" -eq 1 ];
then
printf "\e[36m%20s - %s\e[0m\n" ""${combined[$r]}" is live here @" "${thedigger}";
elif [ $checklocalip -eq "0" ] && [ "${checkdigger2}" -eq 1 ];
then
printf "\e[0m%20s - \e[1m %s\e[0m\n" ""${combined[$r]}" is NOT live here its @" "${thedigger}";
else
##Not sure how someone can make it this far with all the checks and sedding the crap out of everything
##only plausible reason I can come up with
echo "a severe error has occured for "${combined[$r]}", by some Miracle you made it to this Error, You have attained the GoatWizard level of 99"
fi
done
rm -f /tmp/cf_cidr_${RNDM}
rm -f /tmp/cf_ips_${RNDM}
rm -f /tmp/hw_cidr_${RNDM}
rm -f /tmp/hw_ips_${RNDM}
}
function onlylive()
{
declare -a thedoms
local checkforapache=$(pgrep -x httpd|wc -w)
if [ "${checkforapache}" -eq 0 ];
then
echo "Apache is not running here, I am too dumb to figure this out, quitting"
exit 1;
fi
echo "Warning: Domains in servers other then apache are not currently recognized fully - nginx, lighttpd, wowza, named, etc...";
echo "Always Check before pulling any IP addresses"
checkforothersvcs=$(netstat -lnp| egrep '(nginx|lighttpd|named|wowza)'|wc -l)
if [ $checkforothersvcs -gt 0 ];
then
echo "It appears that nginx/lighttpd/named/wowza is in fact running here be very cautious";
fi
echo "-------------------------------------------------------------------------------------"
local APACHE=$(ps aux|awk '{print $11}'|grep -v lightt|grep httpd|head -1)
for x in `netstat -an|grep -qw :443
if [ $? -gt 0 ];
then
$APACHE -S 2>&1 | grep -oP '\(.+\)' | tr -d '()' | cut -d: -f1 | sort | uniq
else
$APACHE -S -DSSL -DHAVE_SSL -DHAVESSL 2>&1 | grep -oP '\(.+\)' | tr -d '()' | cut -d: -f1 | sort | uniq
fi`
do
for i in `cat $x|sed 's/^[ \t]*//'|egrep -i 'ServerAlias|servername' | grep -v ^\#|tr 'A-Z' 'a-z' | sed 's/serveralias //' | sed 's/servername //'|sed -e 's/www\.//g'|sort|uniq`;
do thedoms=("${thedoms[@]}" $i); ##For Bash 3.0 and below (centos 4 compatibillity)
##we have to do it this way in violation of bashims and at cost of speed
done
done
OLDIFS="$IFS" IFS=$'\n' combined=(`for R in "${thedoms[@]}"; do echo "$R" ; done | sort -du`) IFS="$OLDIFS"
for r in "${!combined[@]}"
do
##Check if its a CNAME or not to determine how we will parse the output of dig
if [ `dig cname @8.8.8.8 "${combined[$r]}" +short|wc -l` -gt 0 ]; #If its a cname
then
local thedigger=$(dig @8.8.8.8 "${combined[$r]}" +short|tail -n1|sed -e 's/^[ \t]*//'|sed '/^$/d');
##its a cname so instead of first line from dig +short we grab the last(the destination A record)
else
local thedigger=$(dig @8.8.8.8 "${combined[$r]}" +short|head -n1|sed -e 's/^[ \t]*//'|sed '/^$/d')
fi ##else parse dig normally
local checkdigger=$(echo "${thedigger}"|wc -l)
local checklocalip=$(ip addr show|grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"|grep "${thedigger}"|wc -l)
#Check that we have actually gotten a valid IP Address
if [[ "${thedigger}" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
checkdigger2=1;
else
checkdigger2=2;
fi
if [ $checklocalip -gt "0" ] && [ "${checkdigger2}" -eq 1 ];
then
if [ $SHORT ]
then
echo ""${combined[$r]}" "${thedigger}"" #dig returned valid Ip and its on the box
else
echo ""${combined[$r]}" is live here @ "${thedigger}"" #dig returned valid Ip and its on the box
fi
fi
done
}
function onlyonedomain()
{
local APACHE=$(ps aux|awk '{print $11}'|grep -v lightt|grep httpd|head -1)
for x in `netstat -an|grep -qw :443
if [ $? -gt 0 ];
then
$APACHE -S 2>&1 | grep -oP '\(.+\)' | tr -d '()' | cut -d: -f1 | sort | uniq
else
$APACHE -S -DSSL -DHAVE_SSL -DHAVESSL 2>&1 | grep -oP '\(.+\)' | tr -d '()' | cut -d: -f1 | sort | uniq
fi`
do
for i in `cat $x|sed 's/^[ \t]*//'|egrep -i 'ServerAlias|servername' | grep -v ^\#|tr 'A-Z' 'a-z' | sed 's/serveralias //' | sed 's/servername //'|sed -e 's/www\.//g'|grep "${1}"| sort|uniq`;
do thedoms=("${thedoms[@]}" $i); ##For Bash 3.0 and below (centos 4 compatibillity)
##we have to do it this way in violation of bashims and at cost of speed
done
done
if [ -f "/usr/local/nginx/conf/vhost.conf" ] && [ `/usr/bin/pgrep -x nginx|wc -l` -eq 1 ];
then
nginxdoms=($(awk '/server_name/ {f=1} f {p=$NF;sub(/;$/,"",p);print p} /;$/ {f=0}' /usr/local/nginx/conf/vhost.conf|sed -r -e "s~^\.~~g"|sed "/^$/d"|grep "${1}")) #get the nginx vhosts and assign each a value in nginxdoms array
#combine nginxdoms and apache doms array, remove duplicates and clean it up
OLDIFS="$IFS" IFS=$'\n' combined=(`for R in "${thedoms[@]}" "${nginxdoms[@]}"; do echo "$R" ; done | sort -du`) IFS="$OLDIFS"
else
OLDIFS="$IFS" IFS=$'\n' combined=(`for R in "${thedoms[@]}"; do echo "$R" ; done | sort -du`) IFS="$OLDIFS"
fi
if [ "${#combined[@]}" -ne 0 ];
then
for r in "${!combined[@]}"
do
##Check if its a CNAME or not to determine how we will parse the output of dig
if [ `dig cname @8.8.8.8 "${combined[$r]}" +short|wc -l` -gt 0 ]; #If its a cname
then
local thedigger=$(dig @8.8.8.8 "${combined[$r]}" +short|tail -n1|sed -e 's/^[ \t]*//'|sed '/^$/d');
##its a cname so instead of first line from dig +short we grab the last(the destination A record)
else
local thedigger=$(dig @8.8.8.8 "${combined[$r]}" +short|head -n1|sed -e 's/^[ \t]*//'|sed '/^$/d')
fi ##else parse dig normally
local checkdigger=$(echo "${thedigger}"|wc -l)
local checklocalip=$(ip addr show|grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"|grep "${thedigger}"|wc -l)
#Check that we have actually gotten a valid IP Address
if [[ "${thedigger}" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
checkdigger2=1;
else
checkdigger2=2;
fi
if [ "${checkdigger}" -eq 0 ] || [ "${checkdigger2}" -eq 2 ];
then
printf "\e[31m%20s - \e[1m %s\e[0m\n" "[ERROR] "${combined[$r]}" is not resolving returned" "${thedigger}" ;
##If we don't have a valid IP or dig returned nothing at all then call it a day before we do anything else
elif [ $checklocalip -gt "0" ] && [ "${checkdigger2}" -eq 1 ];
then
printf "\e[36m%20s - %s\e[0m\n" ""${combined[$r]}" is live here @" "${thedigger}";
elif [ $checklocalip -eq "0" ] && [ "${checkdigger2}" -eq 1 ];
then
printf "\e[0m%20s - \e[1m %s\e[0m\n" ""${combined[$r]}" is NOT live here its @" "${thedigger}";
else
##Not sure how someone can make it this far with all the checks and sedding the crap out of everything
##only plausible reason I can come up with
echo "a severe error has occured for "${combined[$r]}", by some Miracle you made it to this Error, You have attained the GoatWizard level of 99"
fi
done
else
echo ""${1}" does not appear to be live here but double check";
fi
#run getdocroot if its a live apache domain and getdocroot is on the box
if [ -f "/mojo/getdocroot" ] && [ "${#thedoms[@]}" -ne 0 ];
then
/mojo/getdocroot "${1}" "${thedigger}"
fi
}
ShowHacked() {
declare -a thedoms
local checkforapache=$(pgrep -x httpd|wc -w);
local checkfornginx=$(pgrep -x nginx|wc -w);
#######Start check which web daemons are running############
if [ "${checkforapache}" -eq 0 ] && [ "${checkfornginx}" -eq 0 ];
then
apacherunning=0;
nginxrunning=0;
echo "[Critical Error] Apache/Nginx not running here or you do not have permission to check the pids. "
exit 1;
fi
if [ "$checkfornginx" -gt 0 ];
then
nginxrunning=1
else
nginxrunning=0;
fi
if [ "$checkforapache" -gt 0 ];
then
apacherunning=1;
else
apacherunning=0;
fi
checkforothersvcs=$(netstat -lnp| egrep '(lighttpd|named|wowza)'|wc -l) #check other
######END Check running Web Daemons############################
echo "Warning: Domains in servers other then apache are not currently recognized fully - lighttpd, wowza, named, etc...";
echo "This script does check NGINX but does not confirm nginx is configured properly for the domain, only that the domain configured in nginx resolves to this box";
echo "Always Triple Check before pulling any IP addresses"
echo "Domains reported as [Hacked] Indicates google reports the site as unsafe"
if [ "$checkforothersvcs" -gt 0 ];
then
echo "It appears that lighttpd/named/wowza is in fact running here be very cautious";
fi
echo "-------------------------------------------------------------------------------------"
local APACHE=$(ps aux|awk '{print $11}'|grep -v lightt|grep httpd|head -1)
#if apache is running get the configured vhost and append to thedoms array
if [ "$apacherunning" -eq 1 ]; then
for x in `netstat -an|grep -qw :443
if [ $? -gt 0 ];
then
$APACHE -S 2>&1 | grep -oP '\(.+\)' | tr -d '()' | cut -d: -f1 | sort | uniq
else
$APACHE -S -DSSL -DHAVE_SSL -DHAVESSL 2>&1 | grep -oP '\(.+\)' | tr -d '()' | cut -d: -f1 | sort | uniq
fi`
do
for i in `cat $x|sed 's/^[ \t]*//'|egrep -i 'ServerAlias|servername' | grep -v ^\#|tr 'A-Z' 'a-z' | sed 's/serveralias //' | sed 's/servername //'|sed -e 's/www\.//g'|sort|uniq`;
do thedoms=("${thedoms[@]}" $i); ##For Bash 3.0 and below (centos 4 compatibillity)
##we have to do it this way in violation of bashims and at cost of speed
done
done
fi
if [ "$nginxrunning" -eq 1 ] && [ "$apacherunning" -eq 1 ]; then #apache and nginx are both running
nginxdoms=($(awk '/server_name/ {f=1} f {p=$NF;sub(/;$/,"",p);print p} /;$/ {f=0}' /usr/local/nginx/conf/vhost.conf|sed -r -e "s~^\.~~g"|sed "/^$/d")) #get the nginx vhosts and assign each a value in nginxdoms array
#combine nginxdoms and apache doms array, remove duplicates and clean it up
OLDIFS="$IFS" IFS=$'\n' combined=(`for R in "${thedoms[@]}" "${nginxdoms[@]}"; do echo "$R" ; done | sort -du`) IFS="$OLDIFS"
elif [ "$nginxrunning" -eq 1 ] && [ "$apacherunning" -eq 0 ]; then #nginx is running but apache isnt
nginxdoms=($(awk '/server_name/ {f=1} f {p=$NF;sub(/;$/,"",p);print p} /;$/ {f=0}' /usr/local/nginx/conf/vhost.conf|sed -r -e "s~^\.~~g"))
OLDIFS="$IFS" IFS=$'\n' combined=(`for R in "${nginxdoms[@]}"; do echo "$R" ; done | sort -du`) IFS="$OLDIFS" #just clean up duplicates from nginx array values and only check these
elif [ "$nginxrunning" -eq 0 ] && [ "$apacherunning" -eq 1 ]; #apache is running but nginx is not
then
OLDIFS="$IFS" IFS=$'\n' combined=(`for R in "${thedoms[@]}"; do echo "$R" ; done | sort -du`) IFS="$OLDIFS" #just clean up duplicates for apache array and check these
fi
for r in "${!combined[@]}"
do
##Check if its a CNAME or not to determine how we will parse the output of dig
if [ `dig cname @8.8.8.8 "${combined[$r]}" +short|wc -l` -gt 0 ]; #If its a cname
then
local thedigger=$(dig @8.8.8.8 "${combined[$r]}" +short|tail -n1|sed -e 's/^[ \t]*//'|sed '/^$/d');
##its a cname so instead of first line from dig +short we grab the last(the destination A record)
else
local thedigger=$(dig @8.8.8.8 "${combined[$r]}" +short|head -n1|sed -e 's/^[ \t]*//'|sed '/^$/d')
fi ##else parse dig normally
local checkdigger=$(echo "${thedigger}"|wc -l)
local checklocalip=$(ip addr show|grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"|grep "${thedigger}"|wc -l)
#Check that we have actually gotten a valid IP Address
if [[ "${thedigger}" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
checkdigger2=1;
else
checkdigger2=2;
fi
if [ "${checkdigger}" -eq 0 ] || [ "${checkdigger2}" -eq 2 ];
then
printf "\e[31m%20s - \e[1m %s\e[0m\n" "[ERROR] "${combined[$r]}" is not resolving returned" "${thedigger}" ;
##If we don't have a valid IP or dig returned nothing at all then call it a day before we do anything else
elif [ $checklocalip -gt "0" ] && [ "${checkdigger2}" -eq 1 ];
then
if [ `wget -qO- http://www.google.com/safebrowsing/diagnostic?site="${combined[$r]}"|grep "This site is not currently listed as suspicious"|wc -l` -gt 0 ]
then
printf "\e[36m%20s - %s\e[0m\n" ""${combined[$r]}" is live here @" "${thedigger}";
else
printf "\e[36m%20s - %s\e[0m\n" ""${combined[$r]}" [HACKED] is live here @" "${thedigger}";
fi
elif [ $checklocalip -eq "0" ] && [ "${checkdigger2}" -eq 1 ];
then
printf "\e[0m%20s - \e[1m %s\e[0m\n" ""${combined[$r]}" is NOT live here its @" "${thedigger}";
else
##Not sure how someone can make it this far with all the checks and sedding the crap out of everything
##only plausible reason I can come up with
echo "a severe error has occured for "${combined[$r]}", by some Miracle you made it to this Error, You have attained the GoatWizard level of 99"
fi
done
}
if [ "$#" -eq 0 ]
then
Main
fi
if [ "$1" == "--live" ];
then
if [ "$2" == "--short" ]
then
SHORT=true
fi
onlylive
fi
if [ "$1" == "--only" ];
then
onlyonedomain "$2"
fi
if [ "$1" == "--show-hacked" ];
then
ShowHacked
fi
I am Miss Fanny Jayne, Arizona girl born and raised, wife and mother of 2 beautiful kiddos. By day, I work in interior design specializing in residential remodel but outside of that my hobbies include hiking, paddle boarding and thrift shopping. I LOVE pinup and the pinup community. I volunteer and give back as much as I can. Thanks for taking the time to get to know me and thanks for the support 💋
Full Bio
I am Miss Fanny Jayne, an Arizona native whose heart beats with the rhythm of retro glamour. By day, I have the privilege of channeling my creativity through my career of interior design, crafting unique spaces for clients across the valley. As a wife and mother of two, I love spending time with the fam while still pursuing my passion for pinup. My obsession for fashion shines through daily in my unique and eclectic vintage-inspired wardrobe. Beyond work, family and pageants, my hobbies include thrifting, anything outdoors and collecting tattoos. No matter the adventure, I try to live life to the absolute fullest.
You are not currently logged in. Please login or register first. When registering, you will receive an activation email. Be sure to check your spam if you don't see it in your email within 60 minutes.