mirror of
https://github.com/aquatix/dotfiles.git
synced 2025-12-06 20:35:11 +01:00
955 lines
32 KiB
Bash
Executable File
955 lines
32 KiB
Bash
Executable File
#!/bin/sh
|
|
# -------------------------------------------------------------------------
|
|
# The New Linux Counter Project
|
|
# Copyright (c) 2011 LinuxCounter project
|
|
# This script is licensed under GNU GPL version 2.0 or above
|
|
# For more info, please visit:
|
|
# https://linuxcounter.net
|
|
# -------------------------------------------------------------------------
|
|
|
|
scriptversion="lico-update.sh version 0.3.20"
|
|
|
|
# -------------------------------------------------------------------------
|
|
|
|
export LANG=C
|
|
export PATH="${HOME}/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
|
|
|
|
if [ -x /bin/egrep ]; then
|
|
EGREP="/bin/egrep"
|
|
elif [ -x /usr/bin/egrep ]; then
|
|
EGREP="/usr/bin/egrep"
|
|
elif [ -x /usr/local/bin/egrep ]; then
|
|
EGREP="/usr/local/bin/egrep"
|
|
fi
|
|
|
|
if [ -x /bin/grep ]; then
|
|
GREP="/bin/grep"
|
|
elif [ -x /usr/bin/grep ]; then
|
|
GREP="/usr/bin/grep"
|
|
elif [ -x /usr/local/bin/grep ]; then
|
|
GREP="/usr/local/bin/grep"
|
|
fi
|
|
|
|
if [ -x /bin/head ]; then
|
|
HEAD="/bin/head"
|
|
elif [ -x /usr/bin/head ]; then
|
|
HEAD="/usr/bin/head"
|
|
elif [ -x /usr/local/bin/head ]; then
|
|
HEAD="/usr/local/bin/head"
|
|
fi
|
|
|
|
if [ -x /bin/which ]; then
|
|
WHICH="/bin/which"
|
|
elif [ -x /usr/bin/which ]; then
|
|
WHICH="/usr/bin/which"
|
|
elif [ -x /usr/local/bin/which ]; then
|
|
WHICH="/usr/local/bin/which"
|
|
fi
|
|
|
|
# Bins
|
|
WHICH=$( which which 2>/dev/null )
|
|
if [ "${WHICH}" = "" ]; then
|
|
WHICH=$( type type 2>/dev/null | ${HEAD} -n 1 )
|
|
if [ "${WHICH}" = "" ]; then
|
|
WHICH=$( locate locate 2>/dev/null | ${EGREP} "bin/locate$" | ${HEAD} -n 1 )
|
|
if [ "${WHICH}" = "" ]; then
|
|
WHICH=$( find /usr/ -name find 2>/dev/null | ${EGREP} "bin/find$" | ${HEAD} -n 1 )
|
|
if [ "${WHICH}" = "" ]; then
|
|
echo "> No tool to locate the needed binaries found! I can not continue here!"
|
|
exit 1
|
|
else
|
|
WHICH="${WHICH} / -name"
|
|
HOW="find"
|
|
fi
|
|
else
|
|
HOW="locate"
|
|
fi
|
|
else
|
|
HOW="type"
|
|
fi
|
|
else
|
|
HOW="which"
|
|
fi
|
|
|
|
getBin() {
|
|
binary="${1}"
|
|
case "${HOW}" in
|
|
"which")
|
|
echo $( ${WHICH} ${binary} 2>/dev/null )
|
|
;;
|
|
"type")
|
|
# type is a shell builtin, so we don't have a path
|
|
echo $( type -p ${binary} 2>/dev/null )
|
|
;;
|
|
"locate")
|
|
echo $( ${WHICH} ${binary} 2>/dev/null | ${EGREP} "bin/${binary}$" | ${GREP} -v proc | ${HEAD} -n 1 )
|
|
;;
|
|
"find")
|
|
for d in ${SPTH}; do
|
|
f=$( ${WHICH} ${d} -name ${binary} | ${EGREP} "bin/${binary}$" | ${GREP} -v proc | ${HEAD} -n 1 )
|
|
[[ ! "${f}" = "" ]] && break
|
|
done
|
|
echo "${f}"
|
|
;;
|
|
*)
|
|
echo $( ${WHICH} ${binary} 2>/dev/null )
|
|
;;
|
|
esac
|
|
}
|
|
|
|
scriptJob() {
|
|
s0=`echo ${SCRIPTNAME} | ${CUT} -d '.' -f 1`
|
|
echo $s0
|
|
}
|
|
|
|
AT=$( getBin at 2>/dev/null )
|
|
AWK=$( getBin awk 2>/dev/null )
|
|
BASENAME=$( getBin basename 2>/dev/null )
|
|
CAT=$( getBin cat 2>/dev/null )
|
|
CRONTAB=$( getBin crontab 2>/dev/null )
|
|
CURL=$( getBin curl 2>/dev/null )
|
|
CUT=$( getBin cut 2>/dev/null )
|
|
DATE=$( getBin date 2>/dev/null )
|
|
DF=$( getBin df 2>/dev/null )
|
|
DIFF=$( getBin diff 2>/dev/null )
|
|
DIRNAME=$( getBin dirname 2>/dev/null )
|
|
DMESG=$( getBin dmesg 2>/dev/null )
|
|
ECHO=$( getBin echo 2>/dev/null )
|
|
EGREP=$( getBin egrep 2>/dev/null )
|
|
FILE=$( getBin file 2>/dev/null )
|
|
FIND=$( getBin find 2>/dev/null )
|
|
GREP=$( getBin grep 2>/dev/null )
|
|
HEAD=$( getBin head 2>/dev/null )
|
|
ID=$( getBin id 2>/dev/null )
|
|
IFCONFIG=$( getBin ifconfig 2>/dev/null )
|
|
IOSTAT=$( getBin iostat 2>/dev/null )
|
|
KLDSTAT=$( getBin kldstat 2>/dev/null )
|
|
LAST=$( getBin last 2>/dev/null )
|
|
LASTLOG=$( getBin lastlog 2>/dev/null )
|
|
LASTLOGIN=$( getBin lastlogin 2>/dev/null )
|
|
LINKS=$( getBin links 2>/dev/null )
|
|
LS=$( getBin ls 2>/dev/null )
|
|
LSB_RELEASE=$( getBin lsb_release 2>/dev/null )
|
|
LSMOD=$( getBin lsmod 2>/dev/null )
|
|
MD5SUM=$( getBin md5sum 2>/dev/null )
|
|
NETCAT=$( getBin netcat 2>/dev/null )
|
|
NETSTAT=$( getBin netstat 2>/dev/null )
|
|
OD=$( getBin od 2>/dev/null )
|
|
PS=$( getBin ps 2>/dev/null )
|
|
PERL=$( getBin perl 2>/dev/null )
|
|
RUNLEVEL=$( getBin runlevel 2>/dev/null )
|
|
SED=$( getBin sed 2>/dev/null )
|
|
SOCAT=$( getBin socat 2>/dev/null )
|
|
SORT=$( getBin sort 2>/dev/null )
|
|
SYSCTL=$( getBin sysctl 2>/dev/null )
|
|
TAIL=$( getBin tail 2>/dev/null )
|
|
UNAME=$( getBin uname 2>/dev/null )
|
|
W=$( getBin w 2>/dev/null )
|
|
WC=$( getBin wc 2>/dev/null )
|
|
WGET=$( getBin wget 2>/dev/null )
|
|
WHOAMI=$( getBin whoami 2>/dev/null )
|
|
|
|
HOSTNAME=$( getBin hostname 2>/dev/null )
|
|
PING=$( getBin ping 2>/dev/null )
|
|
UPTIME=$( getBin uptime 2>/dev/null )
|
|
|
|
if [ "${NETCAT}" = "" ]; then
|
|
NETCAT=$( getBin nc 2>/dev/null )
|
|
fi
|
|
|
|
if [ "${HOME}" = "" ]; then
|
|
if [ "${home}" = "" ]; then
|
|
if [ "${WHOAMI}" != "" ]; then
|
|
user=$( ${WHOAMI} )
|
|
userhome="/home/${user}"
|
|
else
|
|
userhome="~"
|
|
fi
|
|
else
|
|
userhome="${home}"
|
|
fi
|
|
else
|
|
userhome="${HOME}"
|
|
fi
|
|
|
|
export PATH="${userhome}/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
|
|
SPTH="${userhome}/bin /bin /usr/bin /sbin /usr/sbin /usr/local/bin /usr/local/sbin"
|
|
CONFDIR="${userhome}/.linuxcounter"
|
|
SPATH=$( pwd 2>/dev/null )
|
|
mypath="$( cd -P "$( ${DIRNAME} "$0" )" && pwd )"
|
|
SHADOW_FILE="/etc/shadow"
|
|
PASSWD_FILE="/etc/passwd"
|
|
LOGINDEFS_FILE="/etc/login.defs"
|
|
LSB_FILE="/etc/lsb-release"
|
|
myversion=$( echo ${scriptversion} | ${CUT} -d " " -f 3 )
|
|
SCRIPTNAME=$( ${BASENAME} ${0} )
|
|
SCRIPTJOB=$( scriptJob )
|
|
SCRIPT="${mypath}/${SCRIPTNAME}"
|
|
|
|
TMPDIR=""
|
|
if [ -w /tmp ]; then
|
|
TMPDIR="/tmp"
|
|
elif [ -w /var/tmp ]; then
|
|
TMPDIR="/var/tmp"
|
|
elif [ -w ${userhome}/tmp ]; then
|
|
TMPDIR="${userhome}/tmp"
|
|
fi
|
|
if [ "${TMPDIR}" = "" ]; then
|
|
TMPDIR="${CONFDIR}/tmp"
|
|
if [ ! -d ${TMPDIR} ]; then
|
|
mkdir -p ${TMPDIR}
|
|
fi
|
|
fi
|
|
|
|
if [ -z "${1}" ]; then
|
|
echo " Usage: ${SCRIPTNAME} [--allow-root] [-i|-s|-m|-ci|-cu|-h|-v|-update]"
|
|
echo " Use -h to get more help."
|
|
exit 1
|
|
fi
|
|
|
|
allowroot=0
|
|
interactive=0
|
|
showdata=0
|
|
senddata=0
|
|
installcron=0
|
|
uninstallcron=0
|
|
showhelp=0
|
|
showversion=0
|
|
doupdate=0
|
|
wrongcmd=0
|
|
while [ $# -gt 0 ]
|
|
do
|
|
case "x${1}x" in
|
|
x-ix) interactive=1;;
|
|
x-sx) showdata=1;;
|
|
x-mx) senddata=1;;
|
|
x-cix) installcron=1;;
|
|
x-cux) uninstallcron=1;;
|
|
x-hx) showhelp=1;;
|
|
x-vx) showversion=1;;
|
|
x-updatex) doupdate=1;;
|
|
x--allow-rootx) allowroot=1;;
|
|
*) wrongcmd=1;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ ${wrongcmd} -eq 1 ]; then
|
|
echo " Usage: ${SCRIPTNAME} [--allow-root] [-i|-s|-m|-ci|-cu|-h|-v|-update]"
|
|
echo " Use -h to get more help."
|
|
exit 1
|
|
fi
|
|
|
|
|
|
if [ "${CRONTAB}" = "" ]; then
|
|
CRONTAB=$( getBin fcrontab 2>/dev/null )
|
|
if [ "${CRONTAB}" = "" ]; then
|
|
echo "> No cron daemon found! Only cron or fcron are supported!"
|
|
echo "> Automatic machine updates through cron would not be possible!"
|
|
else
|
|
USECRON="fcrontab"
|
|
fi
|
|
else
|
|
USECRON="crontab"
|
|
fi
|
|
|
|
releasefile=""
|
|
releasefile=$( ${FIND} /etc -depth -mindepth 1 -maxdepth 1 -type f -iname "*-release" | ${GREP} -v lsb | ${GREP} -i -v strato )
|
|
if [ "${releasefile}" = "" ]; then
|
|
releasefile=$( ${FIND} /etc -depth -mindepth 1 -maxdepth 1 -type f -iname "*version" )
|
|
fi
|
|
|
|
if [ "${UNAME}" = "" ]; then
|
|
echo "> Program \"uname\" is needed to run this script!"
|
|
exit 1
|
|
fi
|
|
|
|
OS=$( ${UNAME} )
|
|
if [ "${OS}" != "Linux" ]; then
|
|
echo "This script actually supports only Linux!"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -r "${LSB_FILE}" -a "${LSB_RELEASE}" = "" -a "${releasefile}" = "" ]; then
|
|
echo "> Program \"lsb_release\" is needed to run this script!"
|
|
echo " If this program is not available in your distribution repositories, then"
|
|
echo " Please create the file \"${LSB_FILE}\" with the following content:"
|
|
echo "DISTRIB_ID=\"Your Distribution Name\""
|
|
echo "DISTRIB_RELEASE=\"The version string of your distribution\""
|
|
exit 1
|
|
fi
|
|
if [ "${GREP}" = "" ]; then
|
|
echo "> Program \"grep\" is needed to run this script!"
|
|
exit 1
|
|
fi
|
|
if [ "${CAT}" = "" ]; then
|
|
echo "> Program \"cat\" is needed to run this script!"
|
|
exit 1
|
|
fi
|
|
if [ "${HEAD}" = "" ]; then
|
|
echo "> Program \"head\" is needed to run this script!"
|
|
exit 1
|
|
fi
|
|
if [ "${TAIL}" = "" ]; then
|
|
echo "> Program \"tail\" is needed to run this script!"
|
|
exit 1
|
|
fi
|
|
if [ "${AWK}" = "" ]; then
|
|
echo "> Program \"awk\" is needed to run this script!"
|
|
exit 1
|
|
fi
|
|
if [ "${PING}" = "" ]; then
|
|
echo "> Program \"ping\" is needed to run this script!"
|
|
exit 1
|
|
fi
|
|
if [ "${SED}" = "" -a "${OS}" = "Linux" ]; then
|
|
echo "> Program \"sed\" is needed to run this script!"
|
|
exit 1
|
|
fi
|
|
|
|
|
|
if [ "${LSB_RELEASE}" = "" ]; then
|
|
if [ -r "${LSB_FILE}" ]; then
|
|
. ${LSB_FILE}
|
|
distribution="${DISTRIB_ID}"
|
|
distribversion="${DISTRIB_RELEASE}"
|
|
else
|
|
release=""
|
|
if [ "${releasefile}" = "" ]; then
|
|
if [ -d "/var/smoothwall" ]; then
|
|
release="Smoothwall Linux"
|
|
elif [ -n "$( getBin sorcery 2>/dev/null | ${GREP} -v ' ' )" -a -n "$( getBin gaze 2>/dev/null | ${GREP} -v ' ' )" ]; then
|
|
release="Source Mage Linux"
|
|
else
|
|
release=""
|
|
fi
|
|
else
|
|
case "${releasefile}" in
|
|
/etc/gentoo-release)
|
|
if [ -h /etc/make.profile ]; then
|
|
release="Gentoo `${LS} -l /etc/make.profile 2>/dev/null | ${SED} -e 's;^.*/\([^/]*/[^/]*\)$;\1;' | tr '/' ' '`"
|
|
else
|
|
release="Gentoo"
|
|
fi
|
|
;;
|
|
/var/ipcop/general-functions.pl)
|
|
release=`${GREP} 'version *=' ${releasefile} | ${HEAD} -n 1`
|
|
;;
|
|
/etc/debian_version)
|
|
release="Debian `${CAT} ${releasefile}`"
|
|
;;
|
|
/etc/GoboLinuxVersion)
|
|
release="GoboLinux `${CAT} ${releasefile}`"
|
|
;;
|
|
/etc/knoppix-version)
|
|
release="Knoppix `${CAT} ${releasefile}`"
|
|
;;
|
|
/etc/zenwalk-version)
|
|
release="Zenwalk `${CAT} ${releasefile}`"
|
|
;;
|
|
*)
|
|
release=$( ${CAT} ${releasefile} 2>/dev/null | ${HEAD} -n 1 )
|
|
;;
|
|
esac
|
|
fi
|
|
if [ "${release}" = "" ]; then
|
|
distribution=""
|
|
distribversion=""
|
|
else
|
|
distribution=$( echo ${release} | ${AWK} '{print $1}' )
|
|
distribversion=$( echo ${release} | ${AWK} '{print $2}' )
|
|
fi
|
|
fi
|
|
else
|
|
distribution=$(${LSB_RELEASE} -is)
|
|
distribversion=$(${LSB_RELEASE} -rs)
|
|
fi
|
|
|
|
# OpenWrt
|
|
if [ "${distribution}" = "IPCop" -o "${distribution}" = "OpenWrt" ]; then
|
|
if [ "$(${ID} -u)" != "0" ]; then
|
|
echo "Your distribution needs to run this script as user \"root\"!"
|
|
exit 1
|
|
fi
|
|
else
|
|
if [ "$(${ID} -u)" = "0" ]; then
|
|
if [ ${allowroot} -eq 0 ]; then
|
|
echo "DO NOT RUN THIS SCRIPT WITH USER \"root\"!!!"
|
|
exit 1
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Displays OS name for example FreeBSD, Linux etc
|
|
getOs(){
|
|
echo "$(${UNAME})"
|
|
}
|
|
|
|
# Display hostname
|
|
# host (FQDN hostname), for example, vivek (vivek.text.com)
|
|
getHostName(){
|
|
# try 'hostname -f'
|
|
myhostname=$(${HNAME} -f 2>/dev/null || echo "")
|
|
if [ "${OS}" = "Linux" ]; then
|
|
if [ "${HOSTNAME}" = "" ]; then
|
|
if [ -e /etc/hostname ] ; then
|
|
myhostname=$( ${CAT} /etc/hostname 2>/dev/null )
|
|
else
|
|
myhostname=$( ${CAT} /proc/sys/kernel/hostname 2>/dev/null )
|
|
mydomname=$( ${CAT} /proc/sys/kernel/domainname 2>/dev/null )
|
|
if [ "${mydomname}" = "(none)" ]; then
|
|
mydomname="unknown-domain"
|
|
fi
|
|
myhostname=${myhostname}.${mydomname}
|
|
fi
|
|
else
|
|
myhostname=$( ${HOSTNAME} )
|
|
fi
|
|
fi
|
|
if [ "${myhostname}" = "" ]; then
|
|
echo "The hostname of this machine couldn't be found."
|
|
echo "Please install the \"inetutils\" (a.k.a. net-tools) package."
|
|
exit 1
|
|
else
|
|
echo ${myhostname}
|
|
fi
|
|
}
|
|
|
|
# Display CPU information such as Make, speed
|
|
getAccounts(){
|
|
if [ "${OS}" = "Linux" ]; then
|
|
UID_MIN=""
|
|
UID_MAX=""
|
|
if [ -r "${LOGINDEFS_FILE}" ]; then
|
|
UID_MIN=$( ${EGREP} "^UID_MIN" ${LOGINDEFS_FILE} | ${AWK} '{print $2}' )
|
|
UID_MAX=$( ${EGREP} "^UID_MAX" ${LOGINDEFS_FILE} | ${AWK} '{print $2}' )
|
|
fi
|
|
if [ "${UID_MIN}" = "" ]; then
|
|
UID_MIN=1000
|
|
fi
|
|
if [ "${UID_MAX}" = "" ]; then
|
|
UID_MAX=10000
|
|
fi
|
|
echo $(${CAT} ${PASSWD_FILE} 2>/dev/null | ${AWK} -F':' '{ if($3 >= '${UID_MIN}' && $3 <= '${UID_MAX}') print $0 }' | ${WC} -l)
|
|
fi
|
|
}
|
|
|
|
# Get CPU model name
|
|
getCpuInfo(){
|
|
if [ "${distribution}" = "OpenWrt" ]; then
|
|
[ "${OS}" = "Linux" ] && echo $(${GREP} -i "cpu model" /proc/cpuinfo | ${HEAD} -n 1 | ${SED} "s/.*: \(.*\)/\1/") || :
|
|
else
|
|
[ "${OS}" = "Linux" ] && echo $(${GREP} -i "model name" /proc/cpuinfo | ${HEAD} -n 1 | ${SED} "s/.*: \(.*\)/\1/") || :
|
|
fi
|
|
}
|
|
|
|
# Get CPU MHz
|
|
getCpuFreq(){
|
|
[ "${OS}" = "Linux" ] && echo $(${GREP} -i "cpu mhz" /proc/cpuinfo | ${HEAD} -n 1 | ${SED} "s/.*: \(.*\)/\1/") || :
|
|
}
|
|
|
|
# get CPU flags
|
|
getCpuFlags(){
|
|
[ "${OS}" = "Linux" ] && echo $(${GREP} -i "flags" /proc/cpuinfo | ${HEAD} -n 1 | ${SED} "s/.*: \(.*\)/\1/") || :
|
|
}
|
|
|
|
# get CPU Cores
|
|
getNumCPUCores(){
|
|
if [ "${distribution}" = "OpenWrt" ]; then
|
|
[ "${OS}" = "Linux" ] && echo $(${GREP} -i "cpu model" /proc/cpuinfo | ${WC} -l) || :
|
|
else
|
|
[ "${OS}" = "Linux" ] && echo $(${GREP} -i "model name" /proc/cpuinfo | ${WC} -l) || :
|
|
fi
|
|
}
|
|
|
|
# Display total RAM in system
|
|
getTotalRam(){
|
|
[ "${OS}" = "Linux" ] && echo $(${GREP} -i "memtotal" /proc/meminfo | ${HEAD} -n 1 | ${SED} "s/.*: *\(.*\) kB/\1/") || :
|
|
}
|
|
|
|
# Display free RAM in system
|
|
getFreeRam(){
|
|
[ "${OS}" = "Linux" ] && echo $(${GREP} -i "memfree" /proc/meminfo | ${HEAD} -n 1 | ${SED} "s/.*: *\(.*\) kB/\1/") || :
|
|
}
|
|
|
|
# Display total Swap in system
|
|
getTotalSwap(){
|
|
[ "${OS}" = "Linux" ] && echo $(${GREP} -i "swaptotal" /proc/meminfo | ${HEAD} -n 1 | ${SED} "s/.*: *\(.*\) kB/\1/") || :
|
|
}
|
|
|
|
# Display free Swap in system
|
|
getFreeSwap(){
|
|
[ "${OS}" = "Linux" ] && echo $(${GREP} -i "swapfree" /proc/meminfo | ${HEAD} -n 1 | ${SED} "s/.*: *\(.*\) kB/\1/") || :
|
|
}
|
|
|
|
# Display system load for last 5,10,15 minutes
|
|
getSystemLoad(){
|
|
[ "${OS}" = "Linux" ] && echo "$(${UPTIME} | ${AWK} -F'load average:' '{ print $2 }')" || :
|
|
}
|
|
|
|
# List total number of users logged in (both Linux and FreeBSD)
|
|
getNumberOfLoggedInUsers(){
|
|
[ "${OS}" = "Linux" ] && echo "$(${W} -h | ${CUT} -d " " -f 1 | ${SORT} -u | ${WC} -l)" || :
|
|
}
|
|
|
|
getTotalDiskSpace() {
|
|
if [ "${OS}" = "Linux" ]; then
|
|
olddf=$( [ -z "$( ${DF} --help | ${GREP} -- "-P" )" ] && echo "1" || echo "0" )
|
|
if [ "${olddf}" = "1" ]; then
|
|
space=$( ${DF} 2>/dev/null | ${EGREP} "^/dev/" | ${SED} "s/ */\ /g" | ${CUT} -d " " -f 2 | ${AWK} '{s+=$1} END {printf "%f", s}' )
|
|
else
|
|
space=$( ${DF} -l -P 2>/dev/null | ${EGREP} "^/dev/" | ${SED} "s/ */\ /g" | ${CUT} -d " " -f 2 | ${AWK} '{s+=$1} END {printf "%f", s}' )
|
|
fi
|
|
echo ${space}
|
|
fi
|
|
}
|
|
|
|
getFreeDiskSpace() {
|
|
[ "${OS}" = "Linux" ] && echo $(${DF} -l -P 2>/dev/null | ${EGREP} "^/dev/" | ${SED} "s/ */\ /g" | ${CUT} -d " " -f 4 | ${AWK} '{s+=$1} END {printf "%f", s}') || :
|
|
}
|
|
|
|
getUptime() {
|
|
[ "${OS}" = "Linux" ] && echo $(${UPTIME} | ${SED} "s/.* up \([^,]*\), .*/\1/g") || :
|
|
}
|
|
|
|
getOnlineStatus() {
|
|
if [ "${OS}" = "Linux" ]; then
|
|
pingstatus=$( ${PING} -q -c 1 linuxcounter.net 2>&1 | ${GREP} -i packet | ${CUT} -d " " -f 1 )
|
|
[ "${pingstatus}" = "" ] && echo "offline"
|
|
[ "${pingstatus}" -gt 0 ] && echo "online"
|
|
fi
|
|
}
|
|
|
|
# Encode argument as application/x-www-form-urlencoded
|
|
urlEncode(){
|
|
echo "${1}" | ${AWK} '
|
|
BEGIN { RS = sprintf("%c", 0) } # operate on whole text including newlines
|
|
{ gsub(/%/,"%25")
|
|
for (i = 1; i < 10; ++i) gsub(sprintf("%c", i),"%" sprintf("%.2X", i) )
|
|
gsub(/\013/,"%0B"); gsub(/\014/,"%0C")
|
|
for (i = 14; i < 32; ++i) gsub(sprintf("%c", i),"%" sprintf("%.2X", i) )
|
|
gsub(/\041/,"%21"); gsub(/\042/,"%22"); gsub(/\043/,"%23")
|
|
gsub(/\$/,"%24"); gsub(/\046/,"%26"); gsub(/\047/,"%27")
|
|
gsub(/\(/,"%28"); gsub(/\)/,"%29"); gsub(/\*/,"%2A")
|
|
gsub(/\+/,"%2B"); gsub(/\054/,"%2C"); gsub(/\057/,"%2F")
|
|
gsub(/\072/,"%3A"); gsub(/\073/,"%3B"); gsub(/\074/,"%3C")
|
|
gsub(/\075/,"%3D"); gsub(/\076/,"%3E"); gsub(/\?/,"%3F")
|
|
gsub(/\100/,"%40"); gsub(/\[/,"%5B"); gsub(/\\/,"%5C")
|
|
gsub(/\135/,"%5D"); gsub(/\^/,"%5E"); gsub(/\140/,"%60")
|
|
gsub(/\{/,"%7B"); gsub(/\|/,"%7C"); gsub(/\175/,"%7D")
|
|
for (i = 126; i < 256; ++i) gsub(sprintf("%c", i),"%" sprintf("%.2X", i) )
|
|
gsub(/\040/,"+"); gsub(/\012/,"%0D%0A") # convert LF to CR LF
|
|
gsub(/\015%0D/,"%0D") # do not double CR when already part of CR LF
|
|
gsub(/\015/,"%0D"); sub(/%0D%0A$/,"") # remove trailing CR LF
|
|
print } '
|
|
}
|
|
|
|
if [ ${showhelp} -eq 1 ]; then
|
|
echo ""
|
|
echo "# -------------------------------------------------------------------- #"
|
|
echo "# LiCo - The New Linux Counter Project #"
|
|
echo "# Copyright (c) 2011 LiCo - The New Linux Counter Project #"
|
|
echo "# This script is licensed under GNU GPL version 2.0 or above #"
|
|
echo "# For more info, please visit: https://linuxcounter.net #"
|
|
echo "# -------------------------------------------------------------------- #"
|
|
echo ""
|
|
echo " Usage: ${SCRIPTNAME} [--allow-root] [-i|-s|-m|-ci|-cu|-h|-v|-update]"
|
|
echo ""
|
|
echo " -i Use this switch to enter interactive mode. The script will"
|
|
echo " then ask you a few questions related your counter"
|
|
echo " membership. Your entered data will be stored in"
|
|
echo " ${CONFDIR}/<hostname>"
|
|
echo ""
|
|
echo " -s This will show you what will be sent to the counter, without"
|
|
echo " sending anything. The script will only send with -m."
|
|
echo ""
|
|
echo " -m Use this switch to let the script send the collected data"
|
|
echo " to the counter project. If the machine entry does not exist,"
|
|
echo " it will be created."
|
|
echo ""
|
|
echo " -ci Use this switch to automatically create a cronjob (or at job)"
|
|
echo " for this script. The data will then get sent once per week."
|
|
echo ""
|
|
echo " -cu Use this to uninstall the cronjob (or at job)"
|
|
echo ""
|
|
echo " -h Well, you've just used that switch, no?"
|
|
echo " -v This gives you the version of this script"
|
|
echo ""
|
|
echo " -update Get and install the most recent version (may need sudo!)"
|
|
echo ""
|
|
echo " Additional options:"
|
|
echo ""
|
|
echo " --allow-root Allow the script to run as user \"root\"."
|
|
echo ""
|
|
echo ""
|
|
echo " ATTENTION:"
|
|
echo " You NEED to rerun \"${SCRIPTNAME} -i\" and enter your number and the"
|
|
echo " number of the machine it has to update. Otherwise, the script would"
|
|
echo " create a new machine on each run!"
|
|
echo ""
|
|
echo ""
|
|
echo " More information here: https://linuxcounter.net/script.html"
|
|
echo ""
|
|
fi
|
|
if [ ${showversion} -eq 1 ]; then
|
|
echo ""
|
|
echo "# -------------------------------------------------------------------- #"
|
|
echo "# LiCo - The New Linux Counter Project #"
|
|
echo "# Copyright (c) 2011 LiCo - The New Linux Counter Project #"
|
|
echo "# This script is licensed under GNU GPL version 2.0 or above #"
|
|
echo "# For more info, please visit: https://linuxcounter.net #"
|
|
echo "# -------------------------------------------------------------------- #"
|
|
echo ""
|
|
echo " ${scriptversion}"
|
|
echo ""
|
|
fi
|
|
if [ ${installcron} -eq 1 ]; then
|
|
${CRONTAB} -l > ${TMPDIR}/crontab.tmp
|
|
isset=$( ${GREP} "${SCRIPTJOB}" ${TMPDIR}/crontab.tmp )
|
|
if [ "${isset}" != "" ]; then
|
|
echo "The cronjob already is active!"
|
|
exit 1
|
|
else
|
|
min=$((`${CAT} /dev/urandom | ${OD} -N1 -An -i` % 59))
|
|
hour=$((`${CAT} /dev/urandom | ${OD} -N1 -An -i` % 23))
|
|
dow=$((`${CAT} /dev/urandom | ${OD} -N1 -An -i` % 7))
|
|
echo "# added by ${scriptversion}" >> ${TMPDIR}/crontab.tmp
|
|
echo "${min} ${hour} * * ${dow} ${SCRIPT} -m" >> ${TMPDIR}/crontab.tmp
|
|
${CRONTAB} ${TMPDIR}/crontab.tmp
|
|
rm ${TMPDIR}/crontab.tmp
|
|
echo "The cronjob was successfully activated!"
|
|
fi
|
|
fi
|
|
if [ ${uninstallcron} -eq 1 ]; then
|
|
${CRONTAB} -l > ${TMPDIR}/crontab.tmp
|
|
isset=$( ${GREP} "${SCRIPTJOB}" ${TMPDIR}/crontab.tmp )
|
|
if [ "${isset}" = "" ]; then
|
|
echo "The cronjob is not active!"
|
|
exit 1
|
|
else
|
|
${SED} -e "/${SCRIPTJOB}/d" -e "/${scriptversion}/d" -i ${TMPDIR}/crontab.tmp
|
|
${CRONTAB} ${TMPDIR}/crontab.tmp
|
|
status=$?
|
|
rm ${TMPDIR}/crontab.tmp
|
|
if [ ${status} -ne 0 ]; then
|
|
echo "> cron encountered a problem and exited with status ${status}"
|
|
exit ${status}
|
|
fi
|
|
echo "The cronjob was successfully removed!"
|
|
fi
|
|
fi
|
|
|
|
script=${scriptversion}
|
|
hostname=$(getHostName)
|
|
version=$(${UNAME} -r)
|
|
machine=$(${UNAME} -m)
|
|
processor=$(getCpuInfo)
|
|
cpunum=$(getNumCPUCores)
|
|
flags=$(getCpuFlags)
|
|
totalram=$(getTotalRam)
|
|
freeram=$(getFreeRam)
|
|
totalswap=$(getTotalSwap)
|
|
freeswap=$(getFreeSwap)
|
|
load=$(getSystemLoad)
|
|
date=$(${DATE})
|
|
numusers=$(getNumberOfLoggedInUsers)
|
|
accounts=$(getAccounts)
|
|
totaldisk=$(getTotalDiskSpace)
|
|
freedisk=$(getFreeDiskSpace)
|
|
uptime=$(getUptime)
|
|
cpufreq=$(getCpuFreq)
|
|
update_key=""
|
|
online=$(getOnlineStatus)
|
|
|
|
if [ -r ${CONFDIR}/${hostname} ]; then
|
|
if [ "$( ${FILE} ${CONFDIR}/${hostname} | ${CUT} -d " " -f 2)" = "ASCII" ]; then
|
|
if [ ${interactive} -eq 0 ]; then
|
|
echo "Host information file in wrong (old) format!"
|
|
echo "Please run \"${SCRIPTNAME} -i\" first."
|
|
exit 1
|
|
fi
|
|
else
|
|
. ${CONFDIR}/${hostname}
|
|
fi
|
|
else
|
|
if [ ${interactive} -eq 0 ]; then
|
|
echo "Host information file not found!"
|
|
echo "Please run \"${SCRIPTNAME} -i\" first."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ ${interactive} -eq 0 ]; then
|
|
if [ "${machine_number}" != "" -a "${update_key}" = "" ]; then
|
|
echo "ATTENTION: You have still not entered your LiCo Machine Update Key!"
|
|
echo "Please login to your account, go to your profile edit the machine in question and get"
|
|
echo "the update_key from the form (directly below the hostname field)."
|
|
echo "Then run \"${SCRIPTNAME} -i\" and enter your counter number, the"
|
|
echo "number for the machine this script has to update and the update_key for"
|
|
echo "this machine."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
string="${script}##${hostname}##${counter_number}##${machine_number}##${processor}##${cpunum}##${accounts}##${totaldisk}##${totalram}##${numusers}##${freedisk}##${freeram}##${totalswap}##${freeswap}##${flags}##${machine}##${version}##${uptime}##${load}##${cpufreq}##${distribution}##${distribversion}##${online}##${update_key}"
|
|
if [ ${senddata} -eq 1 ]; then
|
|
if [ "${machine_number}" = "" ]; then
|
|
echo "ATTENTION: You have still not entered a machine number!"
|
|
echo "Please run \"${SCRIPTNAME} -i\" and enter your counter number and the"
|
|
echo "number for the machine this script has to update. Otherwise this script"
|
|
echo "will create a new machine on each run!"
|
|
echo ""
|
|
echo "Continue anyway? [N/y]"
|
|
read confirm
|
|
if [ "${confirm}" = "" ]; then
|
|
exit 1
|
|
elif [ "${confirm}" = "y" -o "${confirm}" = "Y" ]; then
|
|
true
|
|
elif [ "${confirm}" = "n" -o "${confirm}" = "N" ]; then
|
|
exit 1
|
|
else
|
|
exit 1
|
|
fi
|
|
fi
|
|
if [ "${machine_number}" != "" -a "${update_key}" = "" ]; then
|
|
echo "ATTENTION: You have still not entered your LiCo Machine Update Key!"
|
|
echo "Please login to your account, go to your profile edit the machine in question and get"
|
|
echo "the update_key from the form (directly below the hostname field)."
|
|
echo "Then run \"${SCRIPTNAME} -i\" and enter your counter number, the"
|
|
echo "number for the machine this script has to update and the update_key for"
|
|
echo "this machine."
|
|
exit 1
|
|
fi
|
|
date=$( date +%Y%m%d%H%M%S )
|
|
tmpfile="${TMPDIR}/lico-update.${counter_number}.${date}.tmp"
|
|
sendstring=$( urlEncode "${string}" )
|
|
|
|
wgetold="0"
|
|
wgetnopost="1"
|
|
curlnopost="1"
|
|
if [ "${WGET}" != "" ]; then
|
|
wgetold=$( [ -z "$( ${WGET} --help | ${GREP} -- "--no-check-certificate" )" ] && echo "1" || echo "0" )
|
|
wgetnopost=$( [ -z "$( ${WGET} --help | ${GREP} -- "--post-data" )" ] && echo "1" || echo "0" )
|
|
fi
|
|
if [ "${CURL}" != "" ]; then
|
|
curlold=$( [ -z "$( ${CURL} --help | ${GREP} -- "--insecure" )" ] && echo "1" || echo "0" )
|
|
curlnopost=$( [ -z "$( ${CURL} --help | ${GREP} -- "-data" )" ] && echo "1" || echo "0" )
|
|
fi
|
|
|
|
if [ "${wgetnopost}" = "0" ]; then
|
|
if [ "${wgetold}" = "1" ]; then
|
|
${WGET} -q -O ${tmpfile} --post-data "senddata=${sendstring}" http://linuxcounter.net/api.php >/dev/null 2>&1
|
|
else
|
|
${WGET} -q -O ${tmpfile} --no-check-certificate --post-data "senddata=${sendstring}" https://linuxcounter.net/api.php >/dev/null 2>&1
|
|
fi
|
|
output=$( ${CAT} ${tmpfile} )
|
|
rm ${tmpfile}
|
|
if [ "${output}" != "" ]; then
|
|
echo ${output}
|
|
fi
|
|
elif [ "${curlnopost}" = "0" ]; then
|
|
if [ "${curlold}" = "1" ]; then
|
|
${CURL} -d 'senddata='${sendstring}'' http://linuxcounter.net/api.php >/dev/null 2>&1
|
|
else
|
|
${CURL} --insecure -d 'senddata='${sendstring}'' https://linuxcounter.net/api.php >/dev/null 2>&1
|
|
fi
|
|
elif [ "${NETCAT}" != "" ]; then
|
|
echo "Trying to send the data with netcat."
|
|
sendthis="POST /api.php HTTP/1.0\r\nHost: linuxcounter.net\r\nContent-type: application/x-www-form-urlencoded\r\nConnection: Close\r\nContent-Length: `expr ${#sendstring} + 9`\r\nUser-Agent: netcat\r\n\r\nsenddata=${sendstring}"
|
|
${ECHO} -ne "${sendthis}" | ${NETCAT} linuxcounter.net 80
|
|
elif [ "${SOCAT}" != "" ]; then
|
|
echo "Trying to send the data with socat."
|
|
sendthis="POST /api.php HTTP/1.0\r\nHost: linuxcounter.net\r\nContent-type: application/x-www-form-urlencoded\r\nConnection: Close\r\nContent-Length: `expr ${#sendstring} + 9`\r\nUser-Agent: socat\r\n\r\nsenddata=${sendstring}"
|
|
${ECHO} -ne "${sendthis}" | ${SOCAT} - tcp:linuxcounter.net:80
|
|
elif [ "${PERL}" != "" ]; then
|
|
echo "Trying to send the data with Perl LWP."
|
|
${PERL} -we 'use strict; use LWP::UserAgent; my $ua = new LWP::UserAgent(timeout => 30); $ua->agent("lico-update/0.3");$ua->post("http://linuxcounter.net/api.php", [senddata => '"\"${string}\""'] );'
|
|
else
|
|
echo "Trying to send the data with /dev/tcp. This is only supported with bash!!!"
|
|
sendthis="POST /api.php HTTP/1.0\r\nHost: linuxcounter.net\r\nContent-type: application/x-www-form-urlencoded\r\nConnection: Close\r\nContent-Length: `expr ${#sendstring} + 9`\r\nUser-Agent: bash\r\n\r\nsenddata=${sendstring}"
|
|
# exec is a bash builtin, so we don't have a path
|
|
exec 3<>/dev/tcp/linuxcounter.net/80
|
|
${ECHO} -ne "${sendthis}" >&3
|
|
while read LINE <&3; do
|
|
echo ${LINE}
|
|
done
|
|
exec 3>&-
|
|
fi
|
|
fi
|
|
|
|
|
|
if [ ${interactive} -eq 1 ]; then
|
|
echo "> entering interactive mode..."
|
|
echo ""
|
|
echo "In order to assign the data sent by this script to the correct user"
|
|
echo "account, I will need your counter user number."
|
|
echo "Please enter your counter number:"
|
|
echo -n " [${counter_number}] "
|
|
read counter_numbern
|
|
if [ "${counter_numbern}" != "" ]; then
|
|
counter_number=${counter_numbern}
|
|
fi
|
|
echo ""
|
|
echo ""
|
|
echo "If this machine already exists in your counter profile, then"
|
|
echo "I will also need the machine counter number in order to assign"
|
|
echo "the data to the correct machine."
|
|
echo "Please enter the machine number (if any): "
|
|
echo -n " [${machine_number}] "
|
|
read machine_numbern
|
|
if [ "${machine_numbern}" != "" ]; then
|
|
machine_number=${machine_numbern}
|
|
fi
|
|
echo ""
|
|
echo ""
|
|
echo "In order to be able to update this machine, I will need the"
|
|
echo "machine update_key. "
|
|
echo "Please login to your account, go to your profile edit the machine in question and get"
|
|
echo "the update_key from the form (directly below the hostname field)."
|
|
echo "Please enter your update_key for this machine (if any): "
|
|
echo -n " [${update_key}] "
|
|
read update_keyn
|
|
if [ "${update_keyn}" != "" ]; then
|
|
update_key=${update_keyn}
|
|
fi
|
|
if [ "${machine_number}" != "" -a "${update_key}" = "" ]; then
|
|
echo "Without the update_key for this machine, I can not continue. Sorry."
|
|
exit 1
|
|
fi
|
|
echo ""
|
|
echo ""
|
|
if [ "${distribution}" = "" ]; then
|
|
echo "I was not able to detect your distribution on this machine."
|
|
echo "Please enter the name of the distribution (without version!): "
|
|
echo -n " [${distribution}] "
|
|
read distributionn
|
|
if [ "${distributionn}" != "" ]; then
|
|
distribution=${distributionn}
|
|
fi
|
|
echo ""
|
|
echo ""
|
|
fi
|
|
if [ "${distribversion}" = "" ]; then
|
|
echo "I was not able to detect the version of your distribution."
|
|
echo "Please enter only the version information of this distribution: "
|
|
echo " [${distribversion}] "
|
|
read distribversionn
|
|
if [ "${distribversionn}" != "" ]; then
|
|
distribversion=${distribversionn}
|
|
fi
|
|
echo ""
|
|
echo ""
|
|
fi
|
|
if [ ! -d ${CONFDIR} ]; then
|
|
mkdir ${CONFDIR}
|
|
chmod 700 ${CONFDIR}
|
|
fi
|
|
rm ${CONFDIR}/${hostname} 2>/dev/null
|
|
echo "#!/bin/bash" > ${CONFDIR}/${hostname}
|
|
echo "scriptversion='${scriptversion}'" >> ${CONFDIR}/${hostname}
|
|
echo "hostname='${hostname}'" >> ${CONFDIR}/${hostname}
|
|
echo "counter_number='${counter_number}'" >> ${CONFDIR}/${hostname}
|
|
echo "update_key='${update_key}'" >> ${CONFDIR}/${hostname}
|
|
echo "machine_number='${machine_number}'" >> ${CONFDIR}/${hostname}
|
|
echo "distribution='${distribution}'" >> ${CONFDIR}/${hostname}
|
|
echo "distribversion='${distribversion}'" >> ${CONFDIR}/${hostname}
|
|
chmod 600 ${CONFDIR}/${hostname}
|
|
echo "Host file created: ${CONFDIR}/${hostname}"
|
|
echo "Thanks!"
|
|
fi
|
|
|
|
if [ ${showdata} -eq 1 ]; then
|
|
echo " The following data will be sent to the counter:"
|
|
echo ""
|
|
echo " ================================================================"
|
|
echo " Script: ${script}"
|
|
echo " Hostname: ${hostname}"
|
|
echo " update_key: ${update_key}"
|
|
echo " onlinestatus: ${online}"
|
|
echo " Distribution: ${distribution}"
|
|
echo " Distrib Version: ${distribversion}"
|
|
echo " Counter Num: ${counter_number}"
|
|
echo " Machine Num: ${machine_number}"
|
|
echo " Processor: ${processor}"
|
|
echo " CPU Frequency: ${cpufreq}"
|
|
echo " CPU flags: ${flags}"
|
|
echo " Num cores: ${cpunum}"
|
|
echo " Num of Accounts: ${accounts}"
|
|
echo " Num of users: ${numusers}"
|
|
echo " Total diskspace: ${totaldisk}"
|
|
echo " Free diskspace: ${freedisk}"
|
|
echo " Total RAM: ${totalram}"
|
|
echo " Free RAM: ${freeram}"
|
|
echo " Total Swap: ${totalswap}"
|
|
echo " Free Swap: ${freeswap}"
|
|
echo " Architecture: ${machine}"
|
|
echo " Kernel: ${version}"
|
|
echo " Uptime: ${uptime}"
|
|
echo " Load: ${load}"
|
|
echo " ================================================================"
|
|
echo " The string that sends the data consists of all information mentioned above"
|
|
echo " separated by \"##\"."
|
|
echo ""
|
|
echo " Actually nothing was sent to the counter! Use -m to send the data."
|
|
fi
|
|
|
|
if [ ${doupdate} -eq 1 ]; then
|
|
if [ ! -d ${CONFDIR}/old ]; then
|
|
echo " > Creating backup dir ${CONFDIR}/old..."
|
|
mkdir -p ${CONFDIR}/old
|
|
fi
|
|
cd ${TMPDIR}
|
|
echo " > Getting last version of ${SCRIPTNAME}..."
|
|
wgetbusybox=$( [ -z "$( ${WGET} --help | ${GREP} -- "-N" )" ] && echo "1" || echo "0" )
|
|
wgetwoprefix=$( [ -z "$( ${WGET} --help | ${GREP} -- "prefix" )" ] && echo "1" || echo "0" )
|
|
wgopt=""
|
|
if [ "${wgetwoprefix}" = "0" ]; then
|
|
wgopt=" -P ${TMPDIR}"
|
|
fi
|
|
if [ "${wgetbusybox}" = "1" ]; then
|
|
${WGET}${wgopt} -q http://linuxcounter.net/script/lico-update.sh
|
|
else
|
|
${WGET}${wgopt} -q -N --no-cache http://linuxcounter.net/script/lico-update.sh
|
|
fi
|
|
if [ "${DIFF}" != "" ]; then
|
|
isnew=$( ${DIFF} -u ${TMPDIR}/lico-update.sh ${mypath}/${SCRIPTNAME} )
|
|
if [ "${isnew}" = "" ]; then
|
|
rm ${TMPDIR}/lico-update.sh
|
|
echo " ! You already have the most recent version installed!"
|
|
exit 0
|
|
fi
|
|
fi
|
|
cd ${SPATH}
|
|
echo " ! New version detected! Installing..."
|
|
if [ -r ${mypath}/${SCRIPTNAME} ]; then
|
|
echo " > Copying ${SCRIPTNAME} to ${CONFDIR}/old/lico-update-${myversion}.sh..."
|
|
cp -fp ${mypath}/${SCRIPTNAME} ${CONFDIR}/old/lico-update-${myversion}.sh
|
|
fi
|
|
echo " > Moving ${TMPDIR}/lico-update.sh to \"${SCRIPTNAME}\"..."
|
|
echo " (if you get an error, use \"sudo\"!)"
|
|
if [ -w ${mypath}/${SCRIPTNAME} ]; then
|
|
mv ${TMPDIR}/lico-update.sh ${mypath}/${SCRIPTNAME}
|
|
chmod +x ${mypath}/${SCRIPTNAME}
|
|
echo " ! Update finished!"
|
|
else
|
|
rm ${TMPDIR}/lico-update.sh 2>/dev/null
|
|
echo " ! I was not able to copy ${TMPDIR}/lico-update.sh to ${mypath}/${SCRIPTNAME}!"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exit 0
|
|
# end
|