436 lines
14 KiB
Bash
436 lines
14 KiB
Bash
#!/bin/bash
|
|
# =============================================
|
|
# Welcome Script for Raspberry Pi/Debian Login
|
|
# Displays comprehensive system information in an appealing format
|
|
# =============================================
|
|
|
|
# Function to print separators
|
|
print_separator() {
|
|
printf "%*s\n" "${COLUMNS:-$(tput cols)}" '' | tr ' ' '='
|
|
}
|
|
|
|
# Function to print section titles
|
|
print_title() {
|
|
echo -e "\n\033[1;34m$1\033[0m" # Bold blue
|
|
print_separator
|
|
}
|
|
|
|
# Function to print labeled values
|
|
print_value() {
|
|
printf "\033[1;32m%-25s\033[0m %s\n" "$1:" "$2" # Bold green for label
|
|
}
|
|
|
|
# Function to detect system type
|
|
detect_system_type() {
|
|
local model=""
|
|
local system_type=""
|
|
|
|
# Check for Raspberry Pi
|
|
if [ -f /proc/device-tree/model ]; then
|
|
model=$(tr -d '\0' < /proc/device-tree/model)
|
|
if [[ "$model" == *"Raspberry Pi"* ]]; then
|
|
system_type="Raspberry Pi - $model"
|
|
else
|
|
system_type="ARM Device - $model"
|
|
fi
|
|
# Check for other common SBCs
|
|
elif grep -q "Orange Pi" /proc/cpuinfo 2>/dev/null; then
|
|
system_type="Orange Pi"
|
|
elif grep -q "Banana Pi" /proc/cpuinfo 2>/dev/null; then
|
|
system_type="Banana Pi"
|
|
elif grep -q "Odroid" /proc/cpuinfo 2>/dev/null; then
|
|
system_type="Odroid"
|
|
# Check for x86/x86_64 systems
|
|
elif grep -q "x86" /proc/cpuinfo 2>/dev/null; then
|
|
if grep -q "64" /proc/cpuinfo 2>/dev/null; then
|
|
system_type="x86_64 System"
|
|
else
|
|
system_type="x86 System"
|
|
fi
|
|
else
|
|
system_type="Unknown System"
|
|
fi
|
|
|
|
echo "$system_type"
|
|
}
|
|
|
|
# Function to get processor info
|
|
get_processor_info() {
|
|
local processor=""
|
|
local cores=""
|
|
local architecture=""
|
|
|
|
# Get processor model
|
|
if [ -f /proc/cpuinfo ]; then
|
|
processor=$(grep -m 1 "model name" /proc/cpuinfo | cut -d':' -f2 | sed 's/^ *//')
|
|
if [ -z "$processor" ]; then
|
|
processor=$(grep -m 1 "Processor" /proc/cpuinfo | cut -d':' -f2 | sed 's/^ *//')
|
|
fi
|
|
if [ -z "$processor" ]; then
|
|
processor=$(grep -m 1 "Hardware" /proc/cpuinfo | cut -d':' -f2 | sed 's/^ *//')
|
|
fi
|
|
fi
|
|
|
|
# Get number of cores
|
|
cores=$(grep -c "^processor" /proc/cpuinfo 2>/dev/null)
|
|
if [ -z "$cores" ] || [ "$cores" = "0" ]; then
|
|
cores=$(nproc 2>/dev/null)
|
|
fi
|
|
|
|
# Get architecture
|
|
architecture=$(uname -m 2>/dev/null)
|
|
|
|
# Format output
|
|
if [ -n "$processor" ]; then
|
|
echo "$processor ($cores cores, $architecture)"
|
|
else
|
|
echo "Unknown ($cores cores, $architecture)"
|
|
fi
|
|
}
|
|
|
|
# Function to get OS info
|
|
get_os_info() {
|
|
local os_name=""
|
|
local os_version=""
|
|
local kernel_version=""
|
|
|
|
# Get OS name and version
|
|
if [ -f /etc/os-release ]; then
|
|
os_name=$(grep "^PRETTY_NAME=" /etc/os-release | cut -d'"' -f2)
|
|
os_version=$(grep "^VERSION=" /etc/os-release | cut -d'"' -f2)
|
|
elif [ -f /etc/debian_version ]; then
|
|
os_name="Debian"
|
|
os_version=$(cat /etc/debian_version)
|
|
fi
|
|
|
|
# Get kernel version
|
|
kernel_version=$(uname -r)
|
|
|
|
# Format output
|
|
if [ -n "$os_name" ]; then
|
|
if [ -n "$os_version" ]; then
|
|
echo "$os_name $os_version (Kernel: $kernel_version)"
|
|
else
|
|
echo "$os_name (Kernel: $kernel_version)"
|
|
fi
|
|
else
|
|
echo "Unknown OS (Kernel: $kernel_version)"
|
|
fi
|
|
}
|
|
|
|
# Function to get GPU info (Raspberry Pi specific)
|
|
get_gpu_info() {
|
|
local gpu_mem=""
|
|
local gpu_model=""
|
|
|
|
# Check if vcgencmd is available (Raspberry Pi)
|
|
if command -v vcgencmd >/dev/null 2>&1; then
|
|
gpu_mem=$(vcgencmd get_mem gpu | cut -d'=' -f2)
|
|
gpu_model="VideoCore IV"
|
|
else
|
|
gpu_mem="Not available"
|
|
# Try to get GPU info from lspci
|
|
if command -v lspci >/dev/null 2>&1; then
|
|
gpu_model=$(lspci | grep -i vga | cut -d':' -f3 | sed 's/^ *//')
|
|
if [ -z "$gpu_model" ]; then
|
|
gpu_model="Unknown GPU"
|
|
fi
|
|
else
|
|
gpu_model="Unknown GPU"
|
|
fi
|
|
fi
|
|
|
|
echo "$gpu_model ($gpu_mem)"
|
|
}
|
|
|
|
# Function to get system load
|
|
get_system_load() {
|
|
local load_avg=""
|
|
local uptime_info=""
|
|
|
|
load_avg=$(uptime | awk -F'load average: ' '{print $2}')
|
|
uptime_info=$(uptime -p)
|
|
|
|
echo "Load: $load_avg | Uptime: $uptime_info"
|
|
}
|
|
|
|
# Function to get network connections
|
|
get_network_connections() {
|
|
local connections=""
|
|
|
|
if command -v ss >/dev/null 2>&1; then
|
|
connections=$(ss -s | grep "TCP:" | awk '{print $2 " connections"}')
|
|
elif command -v netstat >/dev/null 2>&1; then
|
|
connections=$(netstat -tun | grep -c ESTABLISHED)
|
|
connections="$connections active connections"
|
|
else
|
|
connections="Not available"
|
|
fi
|
|
|
|
echo "$connections"
|
|
}
|
|
|
|
# =============================================
|
|
# System Information
|
|
# =============================================
|
|
|
|
# Welcome header
|
|
clear
|
|
print_separator
|
|
echo -e "\033[1;36m" # Bold cyan
|
|
figlet -f small "Welcome to $(hostname)"
|
|
echo -e "\033[0m"
|
|
print_separator
|
|
|
|
# System Overview
|
|
print_title "System Overview"
|
|
print_value "System Type" "$(detect_system_type)"
|
|
print_value "Processor" "$(get_processor_info)"
|
|
print_value "Operating System" "$(get_os_info)"
|
|
print_value "GPU" "$(get_gpu_info)"
|
|
print_value "System Load" "$(get_system_load)"
|
|
|
|
# Current date and time
|
|
print_title "General Information"
|
|
print_value "Date/Time" "$(date '+%Y-%m-%d %H:%M:%S')"
|
|
print_value "User" "$(whoami)"
|
|
print_value "Hostname" "$(hostname)"
|
|
print_value "IP Address" "$(hostname -I | awk '{print $1}')"
|
|
print_value "Active Network Connections" "$(get_network_connections)"
|
|
|
|
# =============================================
|
|
# CPU Information
|
|
# =============================================
|
|
print_title "CPU Status"
|
|
|
|
# CPU Temperature
|
|
temp=$(vcgencmd measure_temp 2>/dev/null | awk -F'=' '{print $2}' | awk -F"'" '{print $1}')
|
|
if [ -n "$temp" ]; then
|
|
print_value "Temperature" "$temp°C"
|
|
else
|
|
# Try alternative method for non-RPi systems
|
|
if [ -f /sys/class/thermal/thermal_zone0/temp ]; then
|
|
temp=$(cat /sys/class/thermal/thermal_zone0/temp)
|
|
temp=$(echo "scale=1; $temp/1000" | bc 2>/dev/null)
|
|
print_value "Temperature" "${temp}°C"
|
|
else
|
|
print_value "Temperature" "Not available"
|
|
fi
|
|
fi
|
|
|
|
# CPU Frequencies
|
|
arm_freq=$(vcgencmd measure_clock arm 2>/dev/null | awk -F'=' '{print $2}')
|
|
core_freq=$(vcgencmd measure_clock core 2>/dev/null | awk -F'=' '{print $2}')
|
|
if [ -n "$arm_freq" ]; then
|
|
print_value "ARM Frequency" "$(echo "scale=2; $arm_freq/1000000" | bc) MHz"
|
|
fi
|
|
if [ -n "$core_freq" ]; then
|
|
print_value "Core Frequency" "$(echo "scale=2; $core_freq/1000000" | bc) MHz"
|
|
fi
|
|
|
|
# CPU Usage
|
|
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
|
|
print_value "CPU Usage" "$(printf "%.1f" $cpu_usage)%"
|
|
|
|
# =============================================
|
|
# Memory Information
|
|
# =============================================
|
|
print_title "Memory"
|
|
|
|
# Total and used memory
|
|
total_mem=$(free -m | awk '/Mem:/ {print $2}')
|
|
used_mem=$(free -m | awk '/Mem:/ {print $3}')
|
|
mem_percent=$(echo "scale=1; $used_mem/$total_mem*100" | bc)
|
|
print_value "Total Memory" "$total_mem MB"
|
|
print_value "Used Memory" "$used_mem MB ($mem_percent%)"
|
|
|
|
# Swap information
|
|
total_swap=$(free -m | awk '/Swap:/ {print $2}')
|
|
used_swap=$(free -m | awk '/Swap:/ {print $3}')
|
|
if [ "$total_swap" -gt 0 ]; then
|
|
swap_percent=$(echo "scale=1; $used_swap/$total_swap*100" | bc)
|
|
print_value "Total Swap" "$total_swap MB"
|
|
print_value "Used Swap" "$used_swap MB ($swap_percent%)"
|
|
else
|
|
print_value "Swap" "Not enabled"
|
|
fi
|
|
|
|
# =============================================
|
|
# Storage Information
|
|
# =============================================
|
|
print_title "Storage"
|
|
|
|
# Disk space
|
|
root_usage=$(df -h / | awk 'NR==2 {print $5}')
|
|
root_size=$(df -h / | awk 'NR==2 {print $2}')
|
|
root_avail=$(df -h / | awk 'NR==2 {print $4}')
|
|
print_value "Root Partition" "$root_size total, $root_usage used, $root_avail available"
|
|
|
|
# Boot partition space (if exists)
|
|
if [ -d "/boot" ]; then
|
|
boot_usage=$(df -h /boot | awk 'NR==2 {print $5}')
|
|
boot_size=$(df -h /boot | awk 'NR==2 {print $2}')
|
|
boot_avail=$(df -h /boot | awk 'NR==2 {print $4}')
|
|
print_value "Boot Partition" "$boot_size total, $boot_usage used, $boot_avail available"
|
|
fi
|
|
|
|
# Disk I/O (if available)
|
|
if command -v iostat >/dev/null 2>&1; then
|
|
disk_io=$(iostat -d -x 1 1 | grep -A1 "Device" | tail -n +2)
|
|
if [ -n "$disk_io" ]; then
|
|
print_value "Disk I/O" "\n$disk_io"
|
|
fi
|
|
fi
|
|
|
|
# =============================================
|
|
# Network Information
|
|
# =============================================
|
|
print_title "Network"
|
|
|
|
# Network interfaces
|
|
interfaces=$(ip -o link show | awk -F': ' '{print $2}' | tr '\n' ' ')
|
|
print_value "Interfaces" "$interfaces"
|
|
|
|
# IP addresses for each interface
|
|
for iface in $(ip -o link show | awk -F': ' '{print $2}'); do
|
|
ip_addr=$(ip -4 addr show $iface 2>/dev/null | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | tr '\n' ' ')
|
|
if [ -n "$ip_addr" ]; then
|
|
print_value " $iface IP" "$ip_addr"
|
|
fi
|
|
done
|
|
|
|
# Network speed (if available)
|
|
if command -v ethtool >/dev/null 2>&1; then
|
|
for iface in eth0 enp0s3 enx*; do
|
|
if ip link show $iface >/dev/null 2>&1; then
|
|
eth_speed=$(ethtool $iface 2>/dev/null | grep -i speed | awk '{print $2}')
|
|
if [ -n "$eth_speed" ]; then
|
|
print_value " $iface Speed" "$eth_speed"
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# Network connections
|
|
print_value "Active Connections" "$(get_network_connections)"
|
|
|
|
# =============================================
|
|
# Additional System Information
|
|
# =============================================
|
|
print_title "Additional Information"
|
|
|
|
# Last login - with fallback if 'last' command is not available
|
|
if command -v last >/dev/null 2>&1; then
|
|
last_login=$(last -n 1 $(whoami) 2>/dev/null | head -n 1 | awk '{print $1, $2, $3, $4, $5, $6, $7}')
|
|
if [ -z "$last_login" ]; then
|
|
last_login="No login history found"
|
|
fi
|
|
else
|
|
last_login="Command 'last' not available"
|
|
fi
|
|
print_value "Last Login" "$last_login"
|
|
|
|
# Users currently logged in
|
|
if command -v who >/dev/null 2>&1; then
|
|
current_users=$(who | awk '{print $1}' | sort | uniq | paste -sd ",")
|
|
if [ -z "$current_users" ]; then
|
|
current_users="No users logged in"
|
|
fi
|
|
else
|
|
current_users="Command 'who' not available"
|
|
fi
|
|
print_value "Logged in Users" "$current_users"
|
|
|
|
# System uptime in different formats
|
|
if command -v uptime >/dev/null 2>&1; then
|
|
uptime_pretty=$(uptime -p)
|
|
uptime_since=$(uptime -s)
|
|
print_value "Uptime" "$uptime_pretty (since $uptime_since)"
|
|
else
|
|
print_value "Uptime" "Command 'uptime' not available"
|
|
fi
|
|
|
|
# Running services (top 5 by memory)
|
|
print_title "Running Services"
|
|
if command -v systemctl >/dev/null 2>&1; then
|
|
echo -e "\033[1;32m UNIT LOAD ACTIVE SUB DESCRIPTION\033[0m"
|
|
echo -e " ----------------------------------------------------------------"
|
|
systemctl list-units --type=service --state=running --no-pager | head -n 6 | tail -n +2 | while read -r line; do
|
|
unit=$(echo "$line" | awk '{print $1}')
|
|
load=$(echo "$line" | awk '{print $2}')
|
|
active=$(echo "$line" | awk '{print $3}')
|
|
sub=$(echo "$line" | awk '{print $4}')
|
|
desc=$(echo "$line" | awk '{for(i=5;i<=NF;i++) printf $i" "; print ""}')
|
|
|
|
# Truncate long descriptions
|
|
if [ ${#desc} -gt 40 ]; then
|
|
desc="${desc:0:37}..."
|
|
fi
|
|
|
|
printf " \033[1;37m%-23s\033[0m \033[1;35m%-6s\033[0m \033[1;36m%-6s\033[0m \033[1;34m%-6s\033[0m %s\n" "$unit" "$load" "$active" "$sub" "$desc"
|
|
done
|
|
else
|
|
print_value "Running Services" "systemctl not available"
|
|
fi
|
|
|
|
# # Scheduled tasks (cron jobs)
|
|
# print_title "Scheduled Tasks"
|
|
# if command -v crontab >/dev/null 2>&1; then
|
|
# if crontab -l 2>/dev/null | grep -q .; then
|
|
# echo -e "\033[1;32m User Crontab:\033[0m"
|
|
# crontab -l 2>/dev/null | sed 's/^/ /'
|
|
# else
|
|
# echo -e " \033[1;33mNo user crontab entries\033[0m"
|
|
# fi
|
|
|
|
# if [ -d /etc/cron.d ] || [ -f /etc/crontab ]; then
|
|
# echo -e "\n\033[1;32m System Crontab:\033[0m"
|
|
# if [ -f /etc/crontab ]; then
|
|
# cat /etc/crontab 2>/dev/null | grep -v "^#" | grep -v "^$" | sed 's/^/ /'
|
|
# fi
|
|
|
|
# if [ -d /etc/cron.d ]; then
|
|
# for cronfile in /etc/cron.d/*; do
|
|
# if [ -f "$cronfile" ]; then
|
|
# echo -e "\n\033[1;32m $cronfile:\033[0m"
|
|
# cat "$cronfile" 2>/dev/null | grep -v "^#" | grep -v "^$" | sed 's/^/ /'
|
|
# fi
|
|
# done
|
|
# fi
|
|
# else
|
|
# echo -e " \033[1;33mNo system crontab entries\033[0m"
|
|
# fi
|
|
# else
|
|
# print_value "Scheduled Tasks" "crontab command not available"
|
|
# fi
|
|
|
|
# # Systemd timers (if available)
|
|
# if command -v systemctl >/dev/null 2>&1; then
|
|
# if systemctl list-timers --no-pager 2>/dev/null | grep -q .; then
|
|
# echo -e "\n\033[1;32m Systemd Timers:\033[0m"
|
|
# systemctl list-timers --no-pager | sed 's/^/ /'
|
|
# fi
|
|
# fi
|
|
|
|
# Open files and network connections
|
|
print_title "Open Files and Network Connections"
|
|
if command -v lsof >/dev/null 2>&1; then
|
|
echo -e "\033[1;32m Top 5 processes with most open files:\033[0m"
|
|
lsof -n | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 5 | sed 's/^/ /'
|
|
|
|
echo -e "\n\033[1;32m Network connections by type:\033[0m"
|
|
echo -e " \033[1;36mTCP:\033[0m $(lsof -i TCP | wc -l)"
|
|
echo -e " \033[1;36mUDP:\033[0m $(lsof -i UDP | wc -l)"
|
|
echo -e " \033[1;36mTotal:\033[0m $(lsof -i | wc -l)"
|
|
else
|
|
print_value "Open Files" "lsof command not available"
|
|
fi
|
|
|
|
# =============================================
|
|
# Final Message
|
|
# =============================================
|
|
print_separator
|
|
echo -e "\033[1;33mSystem ready! $(date '+%H:%M')\033[0m" # Bold yellow
|
|
print_separator
|
|
echo
|