p.sh 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. #!/bin/bash
  2. # Function to print items with a box
  3. print_box() {
  4. local item="$1"
  5. local value="$2"
  6. printf " %-20s %-47s\n" "$item" "$value"
  7. }
  8. # Function to print multiline values with a box
  9. print_multiline_box() {
  10. local item="$1"
  11. local value="$2"
  12. local line
  13. printf " %-20s %-47s\n" "$item" "$(echo "$value" | head -n 1)"
  14. echo "$value" | tail -n +2 | while IFS= read -r line; do
  15. printf " %-20s %-47s\n" "" "$line"
  16. done
  17. }
  18. # Function to print separator line
  19. print_separator() {
  20. printf "+----------------------+---------------------------------------------\n"
  21. }
  22. # Function to test network speed to a given URL using wget
  23. test_network_speed() {
  24. local region="$1"
  25. local url="$2"
  26. # Check if output is being redirected to a file
  27. if [ -t 1 ]; then
  28. # Terminal output
  29. printf "| %-20s | " "$region"
  30. printf "Progress: 0%%\r"
  31. wget --progress=dot "$url" 2>&1 | \
  32. grep --line-buffered "%" | \
  33. awk -v region="$region" '
  34. {
  35. split($0, a, /%/);
  36. progress = a[1];
  37. gsub(/.* /, "", progress);
  38. printf "\r| %-20s | Progress: %-3s", region, progress "%";
  39. fflush(stdout);
  40. }
  41. END {
  42. printf "\r| %-20s | Progress: 100%%\n", region;
  43. }
  44. '
  45. else
  46. # Output to file
  47. {
  48. wget --progress=dot "$url" 2>&1 | \
  49. grep --line-buffered "%" | \
  50. awk -v region="$region" '
  51. END {
  52. printf "| %-20s | Progress: 100%%\n", region;
  53. }
  54. '
  55. }
  56. fi
  57. }
  58. # Collecting system information
  59. hostname=$(hostname)
  60. os=$(lsb_release -d | awk -F"\t" '{print $2}')
  61. kernel=$(uname -r)
  62. uptime=$(uptime -p)
  63. memory=$(free -h | awk '/Mem:/ {print $3 "/" $2}')
  64. disk_root=$(df -h / | awk 'NR==2 {print $3 "/" $2}')
  65. cpu=$(lscpu | grep 'Model name:' | awk -F: '{print $2}' | xargs)
  66. vendor=$(lscpu | grep 'Vendor ID:' | awk -F: '{print $2}' | xargs)
  67. virtual=$(lscpu | grep 'Virtualization:' | awk -F: '{print $2}' | xargs)
  68. hypervisor=$(lscpu | grep 'Hypervisor vendor:' | awk -F: '{print $2}' | xargs)
  69. lcache=$(lscpu | grep 'L2 cache:' | awk -F: '{print $2}' | xargs)
  70. cache=$(lscpu | grep 'L3 cache:' | awk -F: '{print $2}' | xargs)
  71. clock="$(nproc) @ $(awk -F: '/cpu MHz/ {print $2; exit}' /proc/cpuinfo | xargs) MHz"
  72. aesni=$(grep -q "aes" /proc/cpuinfo && echo "Enabled" || echo "Disabled")
  73. vmxav=$(grep -qE "(vmx|svm)" /proc/cpuinfo && echo "Enabled" || echo "Disabled")
  74. vm=$([ -d /proc/vz ] && echo "OpenVZ" || (grep -q "KVM" /proc/cpuinfo && echo "KVM" || (grep -q "QEMU" /proc/cpuinfo && echo "QEMU" || (dmesg | grep -q "Xen" && echo "Xen" || (grep -q "Standard PC (i440FX + PIIX, 1996)" /sys/class/dmi/id/product_name && echo "QEMU" || cat /sys/class/dmi/id/product_name)))))
  75. mainboard=$(sudo dmidecode -t baseboard 2>/dev/null | grep 'Product Name:' | awk -F: '{print $2}' | xargs)
  76. ip_address=$(hostname -I | awk '{print $1}')
  77. interfaces=$(ip -o -4 addr show | awk '{print $2 " - " $4}')
  78. # Disk I/O Benchmark with smaller buffer size
  79. #io_test=$(dd if=/dev/zero of=testfile bs=64M count=16 oflag=direct 2>&1 | grep -o "[0-9.]\+ MB/s")
  80. # Printing the collected information
  81. clear
  82. print_separator
  83. printf "| %-60s\n" "Little Ops Script"
  84. print_separator
  85. print_box "Hostname" "$hostname"
  86. print_box "Operating System" "$os"
  87. print_box "Kernel Version" "$kernel"
  88. print_box "Uptime" "$uptime"
  89. print_box "Memory Usage" "$memory"
  90. print_box "Disk Usage (Root)" "$disk_root"
  91. print_box "CPU Model" "$cpu"
  92. print_box "CPU Vendor" "$vendor"
  93. print_box "CPU Cache" "$cache"
  94. print_box "L2 Cache" "${lcache:-N/A}"
  95. print_box "CPU Clock" "$clock"
  96. print_box "CPU Virtualization" "$virtual"
  97. print_box "CPU Hypervisor" "$hypervisor"
  98. print_box "AES-NI" "$aesni"
  99. print_box "VM-x/AMD-V" "$vmxav"
  100. print_box "VM Type" "$vm"
  101. print_box "Mainboard" "${mainboard:-N/A}"
  102. print_box "IP Address" "$ip_address"
  103. print_multiline_box "Network Interfaces" "$interfaces"
  104. #print_box "Disk I/O Speed" "${io_test:-N/A}"
  105. #print_separator
  106. # Network speed tests
  107. #print_box "Network Test" "Speed to Different Regions"
  108. #print_separator
  109. # Perform each test and update progress
  110. #test_network_speed "North America" "http://speedtest-nyc1.digitalocean.com/10mb.test"
  111. #test_network_speed "South America" "http://speedtest-gru1.digitalocean.com/10mb.test"
  112. #test_network_speed "Africa" "http://speedtest-cpt1.digitalocean.com/10mb.test"
  113. #test_network_speed "Europe" "http://speedtest-ams2.digitalocean.com/10mb.test"
  114. #test_network_speed "Middle East" "http://speedtest-fra1.digitalocean.com/10mb.test"
  115. #test_network_speed "Russia" "http://speedtest-lon1.digitalocean.com/10mb.test"
  116. #test_network_speed "China" "http://speedtest-sgp1.digitalocean.com/10mb.test"
  117. #test_network_speed "Australia" "http://speedtest-syd1.digitalocean.com/10mb.test"
  118. #print_separator
  119. # Function definitions
  120. get_ip_info() {
  121. IP=$(dig +short myip.opendns.com @resolver1.opendns.com)
  122. echo "$IP"
  123. }
  124. get_hostname() {
  125. local ip="$1"
  126. HOSTNAME=$(dig +short -x "$ip" | sed 's/\.$//')
  127. if [[ -n "$HOSTNAME" ]]; then
  128. echo "$HOSTNAME"
  129. else
  130. echo "$ip"
  131. fi
  132. }
  133. get_rdns() {
  134. local ip="$1"
  135. RDNS=$(dig +short -x "$ip" | sed 's/\.$//')
  136. if [[ -n "$RDNS" ]]; then
  137. echo "$RDNS confirmed"
  138. else
  139. reverse_ip=$(echo "$ip" | awk -F. '{print $4"."$3"."$2"."$1}')
  140. RDNS="$reverse_ip.in-addr.arpa"
  141. echo "$RDNS unconfirmed"
  142. fi
  143. }
  144. check_fcrdns() {
  145. local ip="$1"
  146. local rdns="$2"
  147. resolved_ip=$(dig +short "$rdns" | tail -n1)
  148. if [[ "$resolved_ip" == "$ip" ]]; then
  149. echo "confirmed"
  150. else
  151. reverse_ip=$(echo "$ip" | awk -F. '{print $4"."$3"."$2"."$1}')
  152. if [[ "$rdns" == "$reverse_ip.in-addr.arpa" ]]; then
  153. echo "confirmed"
  154. else
  155. echo "unconfirmed"
  156. fi
  157. fi
  158. }
  159. get_asn_info() {
  160. local ip="$1"
  161. ASN=$(whois -h whois.cymru.com " -v $ip" | tail -n1 | awk '{print $1}')
  162. echo "$ASN"
  163. }
  164. # Main execution
  165. ip=$(get_ip_info)
  166. hostname=$(get_hostname "$ip")
  167. RDNS=$(get_rdns "$ip")
  168. RDNS_NO_STATUS="${RDNS%% *}"
  169. fcrdns=$(check_fcrdns "$ip" "$RDNS_NO_STATUS") # Use RDNS for confirmation check
  170. asn=$(get_asn_info "$ip")
  171. asp=$(whois -h whois.cymru.com " -v $ip" | tail -n1 | awk -F'|' '{print $7}' | xargs)
  172. # Get WHOIS information
  173. WHOIS_INFO=$(whois $ip)
  174. # Capture CustName, if available
  175. ISP=$(echo "$WHOIS_INFO" | grep -i "OrgName\|Org" | head -n 1 | cut -d':' -f2 | xargs)
  176. # If CustName is blank, fall back to capturing NetName
  177. if [ -z "$ISP" ]; then
  178. ISP=$(echo "$WHOIS_INFO" | grep -i "NetName" | head -n 1 | cut -d':' -f2 | xargs)
  179. fi
  180. ORG=$(echo "$WHOIS_INFO" | grep -i "OrgName" | head -n 1 | cut -d':' -f2 | xargs)
  181. COUNTRY=$(echo "$WHOIS_INFO" | grep -i "Country" | head -n 1 | cut -d':' -f2 | xargs)
  182. ADDRESS=$(echo "$WHOIS_INFO" | grep -i "Address" | head -n 1 | cut -d':' -f2 | xargs)
  183. REGION=$(echo "$WHOIS_INFO" | grep -i "State\|Region\|Province" | head -n 1 | cut -d':' -f2 | xargs)
  184. ssh=$(grep -E '^Port ' /etc/ssh/sshd_config | awk '{print $2}' || echo 22)
  185. mail=$(if [ -x /usr/sbin/sendmail ]; then echo Yes; else echo N/A; fi)
  186. http=$(netstat -tnl | grep -q ':80 ' && echo Yes || echo N/A)
  187. httpalt=$(netstat -tnl | grep -q ':8080 ' && echo Yes || echo N/A)
  188. pop3=$(netstat -tnl | grep -q ':110 ' && echo Yes || echo N/A)
  189. imap=$(netstat -tnl | grep -q ':143 ' && echo Yes || echo N/A)
  190. https=$(netstat -tnl | grep -q ':443 ' && echo Yes || echo N/A)
  191. mysql=$(netstat -tnl | grep -q ':3306 ' && echo Yes || echo N/A)
  192. smtp=$(netstat -tnl | grep -q ':25 ' && echo Yes || echo N/A)
  193. dns=$(netstat -tnl | grep -q ':53 ' && echo Yes || echo N/A)
  194. firewall=$(if [ -x /usr/sbin/iptables ] || [ -x /usr/sbin/ufw ] || [ -x /usr/sbin/firewalld ]; then echo Yes; else echo N/A; fi)
  195. www=$(if [ -d /var/www/html ]; then echo Yes; else echo N/A; fi)
  196. #users=$(getent passwd | awk -F: '{print $1}' | grep -E '^root$|^' | sort | uniq | tr '\n' ' ')
  197. #users=$(getent passwd | awk -F: '{print $1}' | grep -E '^root$|^' | sort | uniq)
  198. users=$(awk -F: '($6 == "/root") {print $1}' /etc/passwd; awk -F: '($6 ~ /^\/home\/[^\/]+$/) {print $1}' /etc/passwd | sort | uniq)
  199. login=$(last -a | head -n 5 | awk '{print $1","$NF}')
  200. ping1=$(ping -c 10 ipv4.download.thinkbroadband.com | tail -1 | awk -F '/' '{if ($5 == "") print "busy"; else print int($5)"ms"}')
  201. ping2=$(ping -c 10 www.baidu.com 2>&1 | tail -1 | awk -F '/' '{if ($5 ~ /^[0-9.]+$/) print int($5)"ms"; else print "busy"}') # Example for China
  202. ping3=$(ping -c 10 www.google.co.in 2>&1 | tail -1 | awk -F '/' '{if ($5 ~ /^[0-9.]+$/) print int($5)"ms"; else print "busy"}') # Example for India
  203. ping4=$(ping -c 10 www.akamai.com 2>&1 | tail -1 | awk -F '/' '{if ($5 ~ /^[0-9.]+$/) print int($5)"ms"; else print "busy"}') # Example for Middle East (Akamai has a significant presence)
  204. ping5=$(ping -c 10 www.google.com.eg 2>&1 | tail -1 | awk -F '/' '{if ($5 ~ /^[0-9.]+$/) print int($5)"ms"; else print "busy"}') # Example for Egypt
  205. ping6=$(ping -c 10 www.yandex.ru 2>&1 | tail -1 | awk -F '/' '{if ($5 ~ /^[0-9.]+$/) print int($5)"ms"; else print "busy"}') # Example for Moscow
  206. ping7=$(ping -c 10 www.google.co.uk 2>&1 | tail -1 | awk -F '/' '{if ($5 ~ /^[0-9.]+$/) print int($5)"ms"; else print "busy"}') # Example for London
  207. ping8=$(ping -c 10 www.google.com 2>&1 | tail -1 | awk -F '/' '{if ($5 ~ /^[0-9.]+$/) print int($5)"ms"; else print "busy"}') # Example for Los Angeles
  208. ping9=$(ping -c 10 www.google.com 2>&1 | tail -1 | awk -F '/' '{if ($5 ~ /^[0-9.]+$/) print int($5)"ms"; else print "busy"}') # Example for Philadelphia
  209. perf1=$(iperf3 -c 160.242.19.254 -p 9201-9240 | awk '/sender/ {send=$7} /receiver/ {recv=$7} END {print "Send " int(send) "Mbits/sec\nRecv " int(recv) "Mbits/sec\nAverageTime 0 seconds"}')
  210. perf2=$(iperf3 -c speedtest.myrepublic.net.id -p 9200-9240 | awk '/sender/ {send=$7} /receiver/ {recv=$7} END {print "Send " int(send) "Mbits/sec\nRecv " int(recv) "Mbits/sec\nAverageTime 0 seconds"}')
  211. perf3=$(iperf3 -c speedtest.shinternet.ch -p 5200-5209 | awk '/sender/ {send=$7} /receiver/ {recv=$7} END {print "Send " int(send) "Mbits/sec\nRecv " int(recv) "Mbits/sec\nAverageTime 0 seconds"}')
  212. perf4=$(iperf3 -c speedtest.sao1.edgoo.net -p 9204-9240 | awk '/sender/ {send=$7} /receiver/ {recv=$7} END {print "Send " int(send) "Mbits/sec\nRecv " int(recv) "Mbits/sec\nAverageTime 0 seconds"}')
  213. perf5=$(iperf3 -c speedtest.optusnet.com.au -p 5201-5203 | awk '/sender/ {send=$7} /receiver/ {recv=$7} END {print "Send " int(send) "Mbits/sec\nRecv " int(recv) "Mbits/sec\nAverageTime 0 seconds"}')
  214. # Outputting the information in an organized way
  215. #print_separator
  216. print_box "SSH" "$ssh"
  217. print_box "IP Address" "$ip"
  218. print_box "Hostname" "$hostname"
  219. print_box "ASN" "$asn"
  220. print_box "ASP" "$asp"
  221. print_box "ISP" "$ISP"
  222. print_box "Host" "$ORG"
  223. print_box "Region" "$REGION"
  224. print_box "Country" "$COUNTRY"
  225. print_box "Address" "$ADDRESS"
  226. print_box "Reverse DNS" "${RDNS#* }"
  227. print_box "Forward DNS" "$fcrdns"
  228. print_box "DNS" "$dns"
  229. print_box "HTTP" "$http"
  230. print_box "HTTPalt" "$httpalt"
  231. print_box "HTTPS" "$https"
  232. print_box "Sendmail" "$mail"
  233. print_box "SMTP" "$smtp"
  234. print_box "POP3" "$pop3"
  235. print_box "IMAP" "$imap"
  236. print_box "MYSQL" "$mysql"
  237. print_box "Firewall" "$firewall"
  238. print_box "WWW" "$www"
  239. print_multiline_box "Users" "$users"
  240. print_multiline_box "Last Login attempts" "$login"
  241. print_box "Test (China)" "$ping1"
  242. print_box "Test (China)" "$ping2"
  243. print_box "Test (India)" "$ping3"
  244. print_box "Test (Middle East)" "$ping4"
  245. print_box "Test (Egypt)" "$ping5"
  246. print_box "Test (Moscow)" "$ping6"
  247. print_box "Test (London)" "$ping7"
  248. print_box "Test (Los Angeles)" "$ping8"
  249. print_box "Test (Philadelphia)" "$ping9"
  250. print_multiline_box "Iperf (Africa)" "$perf1"
  251. print_multiline_box "Iperf (Asia)" "$perf2"
  252. print_multiline_box "Iperf (Europe)" "$perf3"
  253. print_multiline_box "Iperf (Latin)" "$perf4"
  254. print_multiline_box "Iperf (Oceania)" "$perf5"
  255. #print_separator
  256. print_separator
  257. # Clean up test file
  258. rm -f testfile