.
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
# scripts
|
||||
|
||||
|
||||
|
||||
## Getting started
|
||||
|
||||
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
|
||||
|
||||
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
|
||||
|
||||
## Add your files
|
||||
|
||||
- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
|
||||
- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
|
||||
|
||||
```
|
||||
cd existing_repo
|
||||
git remote add origin http://gitlab.spiralragetech.com/tiago.aica/scripts.git
|
||||
git branch -M main
|
||||
git push -uf origin main
|
||||
```
|
||||
|
||||
## Integrate with your tools
|
||||
|
||||
- [ ] [Set up project integrations](http://gitlab.spiralragetech.com/tiago.aica/scripts/-/settings/integrations)
|
||||
|
||||
## Collaborate with your team
|
||||
|
||||
- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
|
||||
- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
|
||||
- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
|
||||
- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
|
||||
- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
|
||||
|
||||
## Test and Deploy
|
||||
|
||||
Use the built-in continuous integration in GitLab.
|
||||
|
||||
- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
|
||||
- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
|
||||
- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
|
||||
- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
|
||||
- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
|
||||
|
||||
***
|
||||
|
||||
# Editing this README
|
||||
|
||||
When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template.
|
||||
|
||||
## Suggestions for a good README
|
||||
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
|
||||
|
||||
## Name
|
||||
Choose a self-explaining name for your project.
|
||||
|
||||
## Description
|
||||
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
|
||||
|
||||
## Badges
|
||||
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
|
||||
|
||||
## Visuals
|
||||
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
|
||||
|
||||
## Installation
|
||||
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
|
||||
|
||||
## Usage
|
||||
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
|
||||
|
||||
## Support
|
||||
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
|
||||
|
||||
## Roadmap
|
||||
If you have ideas for releases in the future, it is a good idea to list them in the README.
|
||||
|
||||
## Contributing
|
||||
State if you are open to contributions and what your requirements are for accepting them.
|
||||
|
||||
For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
|
||||
|
||||
You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
|
||||
|
||||
## Authors and acknowledgment
|
||||
Show your appreciation to those who have contributed to the project.
|
||||
|
||||
## License
|
||||
For open source projects, say how it is licensed.
|
||||
|
||||
## Project status
|
||||
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
|
||||
Vendored
Vendored
+169
@@ -0,0 +1,169 @@
|
||||
# Raspberry Pi/Debian Automated Setup Scripts
|
||||
|
||||
## Overview
|
||||
This project provides a collection of scripts to automate the configuration of Raspberry Pi or Debian-based systems. The main script (`setup_raspberry.sh`) allows you to easily configure network settings, disable the graphical interface to save RAM, and customize system behavior.
|
||||
|
||||
## Features
|
||||
- Set static MAC address for Ethernet interface (eth0)
|
||||
- Automatically disable Wi-Fi (wlan0) if Ethernet is active and has an IP
|
||||
- Configure static IP address with custom gateway
|
||||
- Disable graphical environment to save system resources
|
||||
- Custom welcome message with system information
|
||||
- Automated setup with a single command
|
||||
|
||||
## Prerequisites
|
||||
- Raspberry Pi or Debian-based Linux system
|
||||
- Internet connection
|
||||
- sudo privileges
|
||||
|
||||
## Installation & Usage
|
||||
|
||||
### Quick Setup via curl
|
||||
You can execute the setup script directly from GitLab using curl:
|
||||
|
||||
#### Basic interactive setup (prompts for each option):
|
||||
```bash
|
||||
curl -s https://gitlab.spiralragetech.com/tiago.aica/scripts-linux/-/raw/main/debian/setup_raspberry.sh | sudo bash
|
||||
```
|
||||
|
||||
#### Configure MAC address only:
|
||||
```bash
|
||||
curl -s https://gitlab.spiralragetech.com/tiago.aica/scripts-linux/-/raw/main/debian/setup_raspberry.sh | sudo bash -s "94:29:48:23:6A:B8"
|
||||
```
|
||||
|
||||
#### Configure MAC address and disable GUI:
|
||||
```bash
|
||||
curl -s https://gitlab.spiralragetech.com/tiago.aica/scripts-linux/-/raw/main/debian/setup_raspberry.sh | sudo bash -s "94:29:48:23:6A:B8" disable_gui
|
||||
```
|
||||
|
||||
#### Configure MAC, disable GUI, and set static IP with gateway:
|
||||
```bash
|
||||
curl -s https://gitlab.spiralragetech.com/tiago.aica/scripts-linux/-/raw/main/debian/setup_raspberry.sh | sudo bash -s "94:29:48:23:6A:B8" disable_gui "192.168.1.100/24" "192.168.1.1"
|
||||
```
|
||||
|
||||
### Manual Installation
|
||||
Alternatively, download and run the script locally:
|
||||
|
||||
1. Download the setup script:
|
||||
```bash
|
||||
wget https://gitlab.spiralragetech.com/tiago.aica/scripts-linux/-/raw/main/debian/setup_raspberry.sh
|
||||
```
|
||||
|
||||
2. Make it executable:
|
||||
```bash
|
||||
chmod +x setup_raspberry.sh
|
||||
```
|
||||
|
||||
3. Run the script:
|
||||
```bash
|
||||
sudo ./setup_raspberry.sh
|
||||
```
|
||||
|
||||
## Script Parameters
|
||||
The setup_raspberry.sh script accepts these parameters in order:
|
||||
1. MAC_ADDRESS (e.g., "94:29:48:23:6A:B8")
|
||||
2. GUI_ACTION (use "disable_gui" to disable graphical environment)
|
||||
3. IP_ADDRESS (e.g., "192.168.1.100/24")
|
||||
4. GATEWAY (e.g., "192.168.1.1")
|
||||
|
||||
## Components
|
||||
|
||||
### 1. set_mac_wifi.sh
|
||||
- Sets static MAC address for eth0
|
||||
- Disables wlan0 if eth0 gets an IP address after 60 seconds
|
||||
- Logs all actions to /var/log/set_mac.log
|
||||
|
||||
### 2. gui_manager.sh
|
||||
- Manages graphical environment (enable/disable)
|
||||
- Helps save RAM by disabling GUI when not needed
|
||||
- Usage:
|
||||
- Disable GUI: `sudo GUI_ACTION=disable /usr/local/bin/gui_manager.sh`
|
||||
- Enable GUI: `sudo GUI_ACTION=enable /usr/local/bin/gui_manager.sh`
|
||||
|
||||
### 3. set_static_ip.sh
|
||||
- Configures static IP for active interface (eth0 or wlan0)
|
||||
- Supports custom gateway configuration
|
||||
- Automatically detects network management system (dhcpcd, netplan, NetworkManager)
|
||||
- Usage:
|
||||
- With parameters: `sudo IP_ADDRESS=192.168.1.100/24 GATEWAY=192.168.1.1 /usr/local/bin/set_static_ip.sh`
|
||||
- Interactive: `sudo /usr/local/bin/set_static_ip.sh`
|
||||
|
||||
### 4. welcome.sh
|
||||
- Displays custom welcome message on login
|
||||
- Shows system information (uptime, IP, memory usage, etc.)
|
||||
- Automatically added to /etc/profile
|
||||
|
||||
## Configuration Examples
|
||||
|
||||
### Example 1: Minimal Configuration (MAC only)
|
||||
```bash
|
||||
curl -s https://gitlab.spiralragetech.com/tiago.aica/scripts-linux/-/raw/main/debian/setup_raspberry.sh | sudo bash -s "00:1A:2B:3C:4D:5E"
|
||||
```
|
||||
|
||||
### Example 2: Network Configuration
|
||||
```bash
|
||||
curl -s https://gitlab.spiralragetech.com/tiago.aica/scripts-linux/-/raw/main/debian/setup_raspberry.sh | sudo bash -s "" "" "192.168.1.100/24" "192.168.1.1"
|
||||
```
|
||||
|
||||
### Example 3: Full Configuration
|
||||
```bash
|
||||
curl -s https://gitlab.spiralragetech.com/tiago.aica/scripts-linux/-/raw/main/debian/setup_raspberry.sh | sudo bash -s "00:1A:2B:3C:4D:5E" disable_gui "192.168.1.100/24" "192.168.1.1"
|
||||
```
|
||||
|
||||
## Post-Installation
|
||||
|
||||
### Checking Configurations
|
||||
- View MAC configuration: `cat /usr/local/bin/set_mac_wifi.sh | grep ETH0_MAC | head -n 1`
|
||||
- View static IP configuration: `ip addr show`
|
||||
- View crontab entries: `crontab -l`
|
||||
|
||||
### Manual Configuration
|
||||
After installation, you can manually run any component:
|
||||
```bash
|
||||
# Change MAC address
|
||||
sudo /usr/local/bin/set_mac_wifi.sh
|
||||
|
||||
# Change static IP
|
||||
sudo IP_ADDRESS=192.168.1.200/24 GATEWAY=192.168.1.1 /usr/local/bin/set_static_ip.sh
|
||||
|
||||
# Toggle GUI
|
||||
sudo GUI_ACTION=enable /usr/local/bin/gui_manager.sh
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
1. **Check log files** for errors:
|
||||
```bash
|
||||
cat /var/log/raspberry_setup.log
|
||||
cat /var/log/set_mac.log
|
||||
cat /var/log/set_static_ip.log
|
||||
cat /var/log/gui_manager.log
|
||||
```
|
||||
|
||||
2. **Verify network configuration**:
|
||||
```bash
|
||||
ip addr show
|
||||
ip route show
|
||||
cat /etc/resolv.conf
|
||||
```
|
||||
|
||||
3. **Check service status**:
|
||||
```bash
|
||||
systemctl status dhcpcd
|
||||
systemctl status networking
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
1. The scripts will create backups of configuration files before making changes.
|
||||
2. A reboot is recommended after configuration to ensure all changes take effect.
|
||||
3. For security, the scripts set proper permissions on configuration files.
|
||||
4. The setup script will prompt before making any changes to your system.
|
||||
|
||||
## Support
|
||||
|
||||
For issues or questions:
|
||||
1. Check the log files in /var/log/
|
||||
2. Verify your network configuration
|
||||
3. Ensure you have sudo privileges
|
||||
4. Check the project repository for updates
|
||||
Vendored
+189
@@ -0,0 +1,189 @@
|
||||
#!/bin/bash
|
||||
|
||||
# =============================================
|
||||
# Graphical Environment Manager Script
|
||||
# Disables/enables graphical environment to save RAM
|
||||
# Must be run with sudo!
|
||||
#
|
||||
# Usage:
|
||||
# ./gui_manager.sh [enable|disable|status]
|
||||
# GUI_ACTION=enable|disable ./gui_manager.sh
|
||||
# =============================================
|
||||
|
||||
# --- Configuration ---
|
||||
LOG_FILE="/var/log/gui_manager.log"
|
||||
|
||||
# --- Functions ---
|
||||
|
||||
# Function to check if system uses systemd
|
||||
is_systemd() {
|
||||
[ -d /run/systemd/system ] && return 0 || return 1
|
||||
}
|
||||
|
||||
# Function to get current display manager
|
||||
get_display_manager() {
|
||||
if [ -f /etc/X11/default-display-manager ]; then
|
||||
cat /etc/X11/default-display-manager
|
||||
elif systemctl list-units --type=service | grep -q "gdm"; then
|
||||
echo "/usr/sbin/gdm3"
|
||||
elif systemctl list-units --type=service | grep -q "lightdm"; then
|
||||
echo "/usr/sbin/lightdm"
|
||||
elif systemctl list-units --type=service | grep -q "sddm"; then
|
||||
echo "/usr/sbin/sddm"
|
||||
elif systemctl list-units --type=service | grep -q "lxdm"; then
|
||||
echo "/usr/sbin/lxdm"
|
||||
else
|
||||
echo "unknown"
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to get current target
|
||||
get_current_target() {
|
||||
if is_systemd; then
|
||||
systemctl get-default
|
||||
else
|
||||
echo "System doesn't use systemd"
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to show GUI status
|
||||
show_gui_status() {
|
||||
if ! is_systemd; then
|
||||
echo "$(date): System doesn't use systemd" | tee -a "$LOG_FILE"
|
||||
return 1
|
||||
fi
|
||||
|
||||
current_target=$(get_current_target)
|
||||
dm=$(get_display_manager)
|
||||
|
||||
echo "$(date): Current system target: $current_target" | tee -a "$LOG_FILE"
|
||||
echo "$(date): Display Manager: $(basename "$dm")" | tee -a "$LOG_FILE"
|
||||
|
||||
if [ "$current_target" = "graphical.target" ]; then
|
||||
echo "$(date): Graphical environment is ENABLED" | tee -a "$LOG_FILE"
|
||||
else
|
||||
echo "$(date): Graphical environment is DISABLED" | tee -a "$LOG_FILE"
|
||||
fi
|
||||
|
||||
# Show memory usage
|
||||
echo "$(date): Memory usage:" | tee -a "$LOG_FILE"
|
||||
free -h | awk '/^Mem:/ {print " Total: " $2 ", Used: " $3 ", Free: " $4}' | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Function to disable graphical environment
|
||||
disable_gui() {
|
||||
if ! is_systemd; then
|
||||
echo "$(date): Error: This system doesn't use systemd" | tee -a "$LOG_FILE"
|
||||
return 1
|
||||
fi
|
||||
|
||||
current_target=$(get_current_target)
|
||||
if [ "$current_target" != "graphical.target" ]; then
|
||||
echo "$(date): Graphical environment is already disabled" | tee -a "$LOG_FILE"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "$(date): Disabling graphical environment..." | tee -a "$LOG_FILE"
|
||||
|
||||
# Get current display manager
|
||||
dm=$(get_display_manager)
|
||||
if [ "$dm" = "unknown" ]; then
|
||||
echo "$(date): Error: Could not determine display manager" | tee -a "$LOG_FILE"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Show memory usage before
|
||||
echo "$(date): Memory usage before disabling GUI:" | tee -a "$LOG_FILE"
|
||||
free -h | awk '/^Mem:/ {print " Total: " $2 ", Used: " $3 ", Free: " $4}' | tee -a "$LOG_FILE"
|
||||
|
||||
# Stop display manager
|
||||
echo "$(date): Stopping display manager $(basename "$dm")..." | tee -a "$LOG_FILE"
|
||||
systemctl stop "$(basename "$dm")"
|
||||
|
||||
# Disable graphical target
|
||||
echo "$(date): Setting default target to multi-user.target..." | tee -a "$LOG_FILE"
|
||||
systemctl set-default multi-user.target
|
||||
|
||||
# Show memory usage after
|
||||
echo "$(date): Memory usage after disabling GUI:" | tee -a "$LOG_FILE"
|
||||
free -h | awk '/^Mem:/ {print " Total: " $2 ", Used: " $3 ", Free: " $4}' | tee -a "$LOG_FILE"
|
||||
|
||||
echo "$(date): Graphical environment disabled successfully" | tee -a "$LOG_FILE"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to enable graphical environment
|
||||
enable_gui() {
|
||||
if ! is_systemd; then
|
||||
echo "$(date): Error: This system doesn't use systemd" | tee -a "$LOG_FILE"
|
||||
return 1
|
||||
fi
|
||||
|
||||
current_target=$(get_current_target)
|
||||
if [ "$current_target" = "graphical.target" ]; then
|
||||
echo "$(date): Graphical environment is already enabled" | tee -a "$LOG_FILE"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "$(date): Enabling graphical environment..." | tee -a "$LOG_FILE"
|
||||
|
||||
# Get current display manager
|
||||
dm=$(get_display_manager)
|
||||
if [ "$dm" = "unknown" ]; then
|
||||
echo "$(date): Error: Could not determine display manager" | tee -a "$LOG_FILE"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Enable graphical target
|
||||
echo "$(date): Setting default target to graphical.target..." | tee -a "$LOG_FILE"
|
||||
systemctl set-default graphical.target
|
||||
|
||||
# Start display manager
|
||||
echo "$(date): Starting display manager $(basename "$dm")..." | tee -a "$LOG_FILE"
|
||||
systemctl start "$(basename "$dm")"
|
||||
|
||||
echo "$(date): Graphical environment enabled successfully" | tee -a "$LOG_FILE"
|
||||
return 0
|
||||
}
|
||||
|
||||
# --- Main Execution ---
|
||||
|
||||
# Create log directory if it doesn't exist
|
||||
mkdir -p /var/log
|
||||
|
||||
# Determine action based on parameters or environment variable
|
||||
ACTION=""
|
||||
|
||||
# Check for command line parameter
|
||||
if [ $# -gt 0 ]; then
|
||||
ACTION="$1"
|
||||
fi
|
||||
|
||||
# Check for environment variable if no parameter provided
|
||||
if [ -z "$ACTION" ] && [ -n "$GUI_ACTION" ]; then
|
||||
ACTION="$GUI_ACTION"
|
||||
fi
|
||||
|
||||
# Default to status if no action specified
|
||||
if [ -z "$ACTION" ]; then
|
||||
ACTION="status"
|
||||
fi
|
||||
|
||||
# Execute the appropriate action
|
||||
case "$ACTION" in
|
||||
disable)
|
||||
disable_gui
|
||||
;;
|
||||
enable)
|
||||
enable_gui
|
||||
;;
|
||||
status)
|
||||
show_gui_status
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 [enable|disable|status]"
|
||||
echo "Or: GUI_ACTION=enable|disable $0"
|
||||
echo "Invalid action: $ACTION"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
Vendored
+112
@@ -0,0 +1,112 @@
|
||||
#!/bin/bash
|
||||
# Script to set fixed MAC address and disable Wi-Fi if eth0 configuration succeeds
|
||||
# Must be run with sudo!
|
||||
|
||||
# --- Configuration ---
|
||||
ETH0_MAC="00:00:00:00:00:00" # Default MAC - will be changed by setup script
|
||||
# WLAN0_MAC="XX:XX:XX:XX:XX:XX" # Uncomment and set if needed
|
||||
|
||||
# Verify root privileges
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
echo "This script must be run as root" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Functions ---
|
||||
# Function to set MAC and verify success
|
||||
set_mac() {
|
||||
local interface="$1"
|
||||
local mac="$2"
|
||||
local success=false
|
||||
|
||||
if ip link show "$interface" &> /dev/null; then
|
||||
# Try to set MAC
|
||||
if ip link set "$interface" down && \
|
||||
ip link set dev "$interface" address "$mac" && \
|
||||
ip link set "$interface" up; then
|
||||
echo "$(date): MAC address for $interface set to $mac" | tee -a /var/log/set_mac.log
|
||||
success=true
|
||||
else
|
||||
echo "$(date): Failed to set MAC address for $interface" | tee -a /var/log/set_mac.log
|
||||
fi
|
||||
else
|
||||
echo "$(date): Interface $interface not found" | tee -a /var/log/set_mac.log
|
||||
fi
|
||||
|
||||
# Return success (0) or failure (1)
|
||||
$success
|
||||
}
|
||||
|
||||
# Function to configure static IP
|
||||
configure_static_ip() {
|
||||
local ip_script="/usr/local/bin/set_static_ip.sh"
|
||||
|
||||
if [ -f "$ip_script" ]; then
|
||||
# Get current IP configuration
|
||||
local interface
|
||||
if interface=$(get_active_interface); then
|
||||
local current_ip=$(ip -4 addr show "$interface" | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
|
||||
if [[ "$current_ip" =~ ^169\.254\. ]]; then
|
||||
# Link-local address, likely no DHCP
|
||||
log "No valid IP address found for $interface, configuring static IP..."
|
||||
IP_ADDRESS_ENV="10.10.0.100/24" bash "$ip_script"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to check if interface has IP address
|
||||
has_ip_address() {
|
||||
local interface="$1"
|
||||
# Check if interface is UP and has an IPv4 address
|
||||
if ip link show "$interface" | grep -q "state UP" && \
|
||||
ip -4 addr show "$interface" | grep -q "inet "; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to disable Wi-Fi
|
||||
disable_wifi() {
|
||||
# Create log directory if it doesn't exist
|
||||
mkdir -p /var/log
|
||||
|
||||
# Wait for 1 minute (60 seconds) before disabling Wi-Fi
|
||||
echo "$(date): Waiting 60 seconds before checking eth0 IP and disabling Wi-Fi..." | tee -a /var/log/set_mac.log
|
||||
sleep 60
|
||||
|
||||
# Check if eth0 has an IP address before disabling Wi-Fi
|
||||
if has_ip_address "eth0"; then
|
||||
if ip link show "wlan0" &> /dev/null; then
|
||||
if ip link set "wlan0" down; then
|
||||
echo "$(date): Wi-Fi (wlan0) disabled successfully (eth0 has IP)" | tee -a /var/log/set_mac.log
|
||||
else
|
||||
echo "$(date): Failed to disable Wi-Fi (wlan0)" | tee -a /var/log/set_mac.log
|
||||
fi
|
||||
else
|
||||
echo "$(date): wlan0 interface not found (Wi-Fi already disabled?)" | tee -a /var/log/set_mac.log
|
||||
fi
|
||||
else
|
||||
echo "$(date): eth0 does not have an IP address. Wi-Fi remains active." | tee -a /var/log/set_mac.log
|
||||
fi
|
||||
}
|
||||
|
||||
# --- Execution ---
|
||||
# Set MAC for eth0 and disable Wi-Fi if successful
|
||||
if set_mac "eth0" "$ETH0_MAC"; then
|
||||
# Check if disable_wifi is already running
|
||||
if ! pgrep -f "disable_wifi" > /dev/null; then
|
||||
#configure_static_ip
|
||||
disable_wifi &
|
||||
else
|
||||
echo "$(date): disable_wifi is already running" | tee -a /var/log/set_mac.log
|
||||
fi
|
||||
else
|
||||
echo "$(date): Could not set MAC for eth0. Wi-Fi remains active" | tee -a /var/log/set_mac.log
|
||||
fi
|
||||
|
||||
# Uncomment if you want to set MAC for wlan0 (optional)
|
||||
# if [[ -n "$WLAN0_MAC" ]]; then
|
||||
# set_mac "wlan0" "$WLAN0_MAC"
|
||||
# fi
|
||||
Vendored
+269
@@ -0,0 +1,269 @@
|
||||
#!/bin/bash
|
||||
|
||||
# =============================================
|
||||
# Static IP Configuration Script
|
||||
# Configures static IP for active interface (eth0 or wlan0)
|
||||
# Must be run with sudo!
|
||||
#
|
||||
# Usage:
|
||||
# IP_ADDRESS=192.168.1.100 GATEWAY=192.168.1.1 ./set_static_ip.sh
|
||||
# =============================================
|
||||
|
||||
# --- Configuration ---
|
||||
DEFAULT_GATEWAY="${GATEWAY_ENV:-10.10.0.1}" # Use GATEWAY_ENV if provided, otherwise default
|
||||
DNS_SERVERS="8.8.8.8 8.8.4.4"
|
||||
LOG_FILE="/var/log/set_static_ip.log"
|
||||
NETPLAN_DIR="/etc/netplan"
|
||||
|
||||
# --- Functions ---
|
||||
|
||||
# Function to log messages
|
||||
log() {
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Function to fix netplan permissions
|
||||
fix_netplan_permissions() {
|
||||
log "Fixing netplan permissions..."
|
||||
|
||||
# Fix permissions for all netplan files
|
||||
find "$NETPLAN_DIR" -type f -name "*.yaml" -exec chmod 600 {} \;
|
||||
find /lib/netplan -type f -name "*.yaml" -exec chmod 600 {} \;
|
||||
find /run/netplan -type f -name "*.yaml" -exec chmod 600 {} \;
|
||||
|
||||
# Fix ownership
|
||||
chown root:root "$NETPLAN_DIR"/*.yaml 2>/dev/null
|
||||
chown root:root /lib/netplan/*.yaml 2>/dev/null
|
||||
chown root:root /run/netplan/*.yaml 2>/dev/null
|
||||
|
||||
log "Netplan permissions fixed"
|
||||
}
|
||||
|
||||
# Function to check if interface is up
|
||||
is_interface_up() {
|
||||
local interface="$1"
|
||||
if ip link show "$interface" | grep -q "state UP"; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to get active interface
|
||||
get_active_interface() {
|
||||
# Check eth0 first
|
||||
if is_interface_up "eth0"; then
|
||||
echo "eth0"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Then check wlan0
|
||||
if is_interface_up "wlan0"; then
|
||||
echo "wlan0"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# No active interface found
|
||||
return 1
|
||||
}
|
||||
|
||||
# Function to check if system uses dhcpcd
|
||||
uses_dhcpcd() {
|
||||
if [ -f /etc/dhcpcd.conf ] && systemctl list-unit-files | grep -q dhcpcd; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to check if system uses netplan
|
||||
uses_netplan() {
|
||||
if [ -d "$NETPLAN_DIR" ] && command -v netplan >/dev/null; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to check if system uses NetworkManager
|
||||
uses_network_manager() {
|
||||
if systemctl list-unit-files | grep -q NetworkManager && command -v nmcli >/dev/null; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to configure static IP using dhcpcd
|
||||
configure_static_ip_dhcpcd() {
|
||||
local interface="$1"
|
||||
local ip_address="$2"
|
||||
local gateway="$3"
|
||||
local dns="$4"
|
||||
|
||||
log "Configuring static IP for $interface using dhcpcd..."
|
||||
|
||||
# Backup original dhcpcd.conf
|
||||
if [ ! -f /etc/dhcpcd.conf.bak ]; then
|
||||
cp /etc/dhcpcd.conf /etc/dhcpcd.conf.bak
|
||||
log "Created backup of /etc/dhcpcd.conf"
|
||||
fi
|
||||
|
||||
# Remove any existing configuration for this interface
|
||||
sed -i "/^interface $interface$/,/^$/d" /etc/dhcpcd.conf
|
||||
|
||||
# Add new configuration
|
||||
{
|
||||
echo ""
|
||||
echo "# Static IP configuration for $interface"
|
||||
echo "interface $interface"
|
||||
echo "static ip_address=$ip_address"
|
||||
echo "static routers=$gateway"
|
||||
echo "static domain_name_servers=$dns"
|
||||
} >> /etc/dhcpcd.conf
|
||||
|
||||
log "Static IP configuration added to /etc/dhcpcd.conf"
|
||||
log "Restarting networking..."
|
||||
|
||||
# Try different methods to restart networking
|
||||
if systemctl restart dhcpcd 2>/dev/null; then
|
||||
log "dhcpcd service restarted successfully"
|
||||
return 0
|
||||
elif systemctl restart networking 2>/dev/null; then
|
||||
log "networking service restarted successfully"
|
||||
return 0
|
||||
elif systemctl restart systemd-networkd 2>/dev/null; then
|
||||
log "systemd-networkd service restarted successfully"
|
||||
return 0
|
||||
else
|
||||
log "Could not restart networking service automatically"
|
||||
log "Please reboot the system for changes to take effect"
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to configure static IP using netplan
|
||||
configure_static_ip_netplan() {
|
||||
local interface="$1"
|
||||
local ip_address="$2"
|
||||
local gateway="$3"
|
||||
local dns="$4"
|
||||
|
||||
log "Configuring static IP for $interface using netplan..."
|
||||
|
||||
# Fix netplan permissions first
|
||||
fix_netplan_permissions
|
||||
|
||||
# Find netplan config file
|
||||
local netplan_file=$(ls "$NETPLAN_DIR"/*.yaml 2>/dev/null | head -n 1)
|
||||
|
||||
if [ -z "$netplan_file" ]; then
|
||||
# Create default netplan file if none exists
|
||||
netplan_file="$NETPLAN_DIR/01-static-ip.yaml"
|
||||
log "Creating new netplan configuration file: $netplan_file"
|
||||
else
|
||||
# Backup original netplan config
|
||||
if [ ! -f "$netplan_file.bak" ]; then
|
||||
cp "$netplan_file" "$netplan_file.bak"
|
||||
log "Created backup of $netplan_file"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Create new netplan configuration
|
||||
cat > "$netplan_file" <<EOF
|
||||
network:
|
||||
version: 2
|
||||
renderer: networkd
|
||||
ethernets:
|
||||
$interface:
|
||||
addresses: [$ip_address]
|
||||
routes:
|
||||
- to: default
|
||||
via: $gateway
|
||||
nameservers:
|
||||
addresses: [$(echo $dns | sed 's/ /, /g')]
|
||||
EOF
|
||||
|
||||
# Set correct permissions
|
||||
chmod 600 "$netplan_file"
|
||||
chown root:root "$netplan_file"
|
||||
|
||||
log "Static IP configuration added to $netplan_file"
|
||||
log "Applying netplan configuration..."
|
||||
|
||||
# Apply netplan configuration
|
||||
if netplan apply; then
|
||||
log "Netplan configuration applied successfully"
|
||||
return 0
|
||||
else
|
||||
log "Failed to apply netplan configuration"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to configure static IP using NetworkManager
|
||||
configure_static_ip_network_manager() {
|
||||
local interface="$1"
|
||||
local ip_address="$2"
|
||||
local gateway="$3"
|
||||
local dns="$4"
|
||||
|
||||
log "Configuring static IP for $interface using NetworkManager..."
|
||||
|
||||
# Set static IP
|
||||
if nmcli con show "$interface" >/dev/null 2>&1; then
|
||||
nmcli con mod "$interface" ipv4.method manual ipv4.addresses "$ip_address" ipv4.gateway "$gateway" ipv4.dns "$dns"
|
||||
else
|
||||
nmcli con add type ethernet ifname "$interface" con-name "$interface" ipv4.method manual ipv4.addresses "$ip_address" ipv4.gateway "$gateway" ipv4.dns "$dns"
|
||||
fi
|
||||
|
||||
# Restart connection
|
||||
nmcli con down "$interface" && nmcli con up "$interface"
|
||||
|
||||
log "NetworkManager configuration applied successfully"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to configure static IP
|
||||
configure_static_ip() {
|
||||
local ip_address="${IP_ADDRESS_ENV:-$1}"
|
||||
local gateway="${GATEWAY_ENV:-$DEFAULT_GATEWAY}"
|
||||
local interface
|
||||
local dns="$DNS_SERVERS"
|
||||
|
||||
# Create log directory if it doesn't exist
|
||||
mkdir -p /var/log
|
||||
|
||||
# Get active interface
|
||||
if ! interface=$(get_active_interface); then
|
||||
log "No active network interface found (eth0 or wlan0)"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log "Active interface: $interface"
|
||||
log "Configuring static IP: $ip_address"
|
||||
log "Gateway: $gateway"
|
||||
log "DNS Servers: $dns"
|
||||
|
||||
# Check which network management system is in use
|
||||
if uses_dhcpcd; then
|
||||
configure_static_ip_dhcpcd "$interface" "$ip_address" "$gateway" "$dns"
|
||||
elif uses_netplan; then
|
||||
configure_static_ip_netplan "$interface" "$ip_address" "$gateway" "$dns"
|
||||
elif uses_network_manager; then
|
||||
configure_static_ip_network_manager "$interface" "$ip_address" "$gateway" "$dns"
|
||||
else
|
||||
log "Could not determine network configuration method"
|
||||
log "Please configure your network manually:"
|
||||
log "Interface: $interface"
|
||||
log "IP Address: $ip_address"
|
||||
log "Gateway: $gateway"
|
||||
log "DNS Servers: $dns"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# --- Main Execution ---
|
||||
|
||||
# Configure static IP
|
||||
configure_static_ip
|
||||
Vendored
+517
@@ -0,0 +1,517 @@
|
||||
#!/bin/bash
|
||||
|
||||
# =============================================
|
||||
# Raspberry Pi Setup Script
|
||||
# Downloads and configures system scripts from Git
|
||||
# =============================================
|
||||
|
||||
# Configuration
|
||||
GITHUB_REPO="https://gitlab.spiralragetech.com/tiago.aica/scripts-linux/-/raw/main/debian"
|
||||
SCRIPT_DIR="/usr/local/bin"
|
||||
LOG_FILE="/var/log/raspberry_setup.log"
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[1;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Function to log messages
|
||||
log() {
|
||||
echo -e "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Function to ask for confirmation
|
||||
ask_confirmation() {
|
||||
local message="$1"
|
||||
local default="$2" # "y" or "n"
|
||||
|
||||
while true; do
|
||||
if [ "$default" = "y" ]; then
|
||||
read -p "$message [Y/n]: " choice < /dev/tty
|
||||
else
|
||||
read -p "$message [y/N]: " choice < /dev/tty
|
||||
fi
|
||||
|
||||
# Default choice if user just presses Enter
|
||||
if [ -z "$choice" ]; then
|
||||
choice="$default"
|
||||
fi
|
||||
|
||||
case "$choice" in
|
||||
y|Y|yes|Yes|YES)
|
||||
return 0
|
||||
;;
|
||||
n|N|no|No|NO)
|
||||
return 1
|
||||
;;
|
||||
*)
|
||||
echo "Please answer yes or no."
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# Function to validate MAC address format
|
||||
validate_mac() {
|
||||
local mac=$1
|
||||
# MAC address validation regex
|
||||
local mac_regex='^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$'
|
||||
if [[ $mac =~ $mac_regex ]]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to validate IP address format
|
||||
validate_ip() {
|
||||
local ip=$1
|
||||
# IP address validation regex
|
||||
local ip_regex='^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(/[0-9]+)?$'
|
||||
if [[ $ip =~ $ip_regex ]]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to validate gateway format
|
||||
validate_gateway() {
|
||||
local gateway=$1
|
||||
# Gateway validation regex
|
||||
local gateway_regex='^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'
|
||||
if [[ $gateway =~ $gateway_regex ]]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to download file from GitLab
|
||||
download_file() {
|
||||
local filename=$1
|
||||
local destination=$2
|
||||
|
||||
log "Downloading $filename..."
|
||||
if curl -s -o "$destination/$filename" "$GITHUB_REPO/$filename"; then
|
||||
log "${GREEN}Successfully downloaded $filename${NC}"
|
||||
chmod +x "$destination/$filename"
|
||||
return 0
|
||||
else
|
||||
log "${RED}Failed to download $filename${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to configure MAC address
|
||||
configure_mac() {
|
||||
local mac_script="$SCRIPT_DIR/set_mac_wifi.sh"
|
||||
local new_mac=$1
|
||||
|
||||
if [ ! -f "$mac_script" ]; then
|
||||
log "${RED}MAC address script not found${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Validate MAC address format
|
||||
if validate_mac "$new_mac"; then
|
||||
# Normalize to use colons
|
||||
new_mac=$(echo "$new_mac" | tr '-' ':')
|
||||
# Update MAC address in script
|
||||
sed -i "s/ETH0_MAC=.*/ETH0_MAC=\"$new_mac\"/" "$mac_script"
|
||||
log "${GREEN}MAC address updated to $new_mac${NC}"
|
||||
return 0
|
||||
else
|
||||
log "${RED}Invalid MAC address format: $new_mac. Please use format XX:XX:XX:XX:XX:XX or XX-XX-XX-XX-XX-XX${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to setup MAC address
|
||||
setup_mac_address() {
|
||||
if ask_confirmation "Do you want to configure the MAC address for eth0?" "n"; then
|
||||
download_file "set_mac_wifi.sh" "$SCRIPT_DIR" || return 1
|
||||
|
||||
local mac_script="$SCRIPT_DIR/set_mac_wifi.sh"
|
||||
|
||||
# If MAC address was provided as parameter, use it
|
||||
if [ -n "$1" ]; then
|
||||
if configure_mac "$1"; then
|
||||
return 0
|
||||
else
|
||||
log "${RED}Failed to configure MAC address${NC}"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Prompt for MAC address
|
||||
while true; do
|
||||
read -p "Enter MAC address for eth0 (format: XX:XX:XX:XX:XX:XX or XX-XX-XX-XX-XX-XX): " new_mac < /dev/tty
|
||||
if validate_mac "$new_mac"; then
|
||||
if configure_mac "$new_mac"; then
|
||||
return 0
|
||||
else
|
||||
log "${RED}Failed to configure MAC address${NC}"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
log "${RED}Invalid MAC address format. Please use format XX:XX:XX:XX:XX:XX or XX-XX-XX-XX-XX-XX${NC}"
|
||||
fi
|
||||
done
|
||||
else
|
||||
log "${YELLOW}Skipping MAC address configuration${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to check if crontab entry exists
|
||||
crontab_entry_exists() {
|
||||
local script_path="$1"
|
||||
crontab -l 2>/dev/null | grep -q "@reboot $script_path"
|
||||
return $?
|
||||
}
|
||||
|
||||
# Function to setup crontab
|
||||
setup_crontab() {
|
||||
if ask_confirmation "Do you want to setup crontab to run MAC script at boot?" "y"; then
|
||||
local mac_script="$SCRIPT_DIR/set_mac_wifi.sh"
|
||||
|
||||
# Download script if not present
|
||||
if [ ! -f "$mac_script" ]; then
|
||||
download_file "set_mac_wifi.sh" "$SCRIPT_DIR" || return 1
|
||||
fi
|
||||
|
||||
if crontab_entry_exists "$mac_script"; then
|
||||
log "${YELLOW}Crontab entry for MAC address script already exists${NC}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log "Setting up crontab for MAC address script..."
|
||||
(crontab -l 2>/dev/null; echo "@reboot $mac_script") | crontab -
|
||||
log "${GREEN}Crontab configured successfully${NC}"
|
||||
return 0
|
||||
else
|
||||
log "${YELLOW}Skipping crontab configuration${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to install dependencies and system updates
|
||||
install_dependencies() {
|
||||
if ask_confirmation "Do you want to update the system and install required dependencies?" "y"; then
|
||||
log "Updating package lists and upgrading installed packages..."
|
||||
|
||||
# Update package lists
|
||||
if ! apt update; then
|
||||
log "${RED}Failed to update package lists${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Upgrade installed packages (excluding kernel)
|
||||
if ask_confirmation "Do you want to perform a packages upgrade?" "n"; then
|
||||
log "Performing package upgrade..."
|
||||
if ! apt upgrade -y --without-new-pkgs; then
|
||||
log "${RED}Failed to upgrade installed packages${NC}"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Upgrade distribution (including kernel)
|
||||
if ask_confirmation "Do you want to perform a distribution upgrade (may include kernel updates)?" "n"; then
|
||||
|
||||
if [ -f /proc/device-tree/model ] && grep -q "Raspberry Pi" /proc/device-tree/model; then
|
||||
log "Raspberry Pi detected - using rpi-update for firmware/kernel updates"
|
||||
|
||||
# Install rpi-update if not already installed
|
||||
if ! command -v rpi-update >/dev/null 2>&1; then
|
||||
log "Installing rpi-update..."
|
||||
if ! apt install -y rpi-update; then
|
||||
log "${RED}Failed to install rpi-update${NC}"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# # Update firmware and kernel
|
||||
# log "Updating Raspberry Pi firmware and kernel..."
|
||||
# if ! rpi-update; then
|
||||
# log "${RED}Failed to update Raspberry Pi firmware/kernel${NC}"
|
||||
# return 1
|
||||
# fi
|
||||
# log "${GREEN}Raspberry Pi firmware and kernel updated successfully${NC}"
|
||||
# log "${YELLOW}Note: A reboot is required for kernel updates to take effect${NC}"
|
||||
|
||||
|
||||
log "Updating Raspberry Pi firmware and kernel..."
|
||||
|
||||
# Install 'yes' command if not available (usually pre-installed)
|
||||
if ! command -v yes >/dev/null 2>&1; then
|
||||
if ! apt install -y coreutils; then
|
||||
log "${RED}Failed to install coreutils package (needed for 'yes' command)${NC}"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Run rpi-update with all prompts automatically answered with 'y'
|
||||
if ! yes | rpi-update; then
|
||||
log "${RED}Failed to update Raspberry Pi firmware/kernel${NC}"
|
||||
|
||||
log "Trying common distribution upgrade..."
|
||||
if ! apt full-upgrade -y; then
|
||||
log "${RED}Failed to perform distribution upgrade${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 1
|
||||
fi
|
||||
|
||||
log "${GREEN}Raspberry Pi firmware and kernel updated successfully${NC}"
|
||||
log "${YELLOW}Note: A reboot is required for kernel updates to take effect${NC}"
|
||||
|
||||
|
||||
else
|
||||
log "Performing distribution upgrade..."
|
||||
if ! apt full-upgrade -y; then
|
||||
log "${RED}Failed to perform distribution upgrade${NC}"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Install required dependencies
|
||||
if ask_confirmation "Do you want to install the required dependencies (figlet, bc, lsof, net-tools)?" "n"; then
|
||||
log "Installing required dependencies (figlet, bc, lsof, net-tools)..."
|
||||
if apt install -y figlet bc lsof net-tools; then
|
||||
log "${GREEN}Dependencies installed successfully${NC}"
|
||||
return 0
|
||||
else
|
||||
log "${RED}Failed to install dependencies${NC}"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Clean up
|
||||
if ask_confirmation "Do you want to clean the package cache?" "n"; then
|
||||
log "Cleaning up package cache..."
|
||||
if apt autoremove -y && apt clean; then
|
||||
log "${GREEN}Package cache cleaned successfully${NC}"
|
||||
else
|
||||
log "${YELLOW}Warning: Failed to clean package cache${NC}"
|
||||
fi
|
||||
fi
|
||||
|
||||
else
|
||||
log "${YELLOW}Skipping system update and dependency installation${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to setup GUI manager
|
||||
setup_gui_manager() {
|
||||
if ask_confirmation "Do you want to configure the graphical environment?" "y"; then
|
||||
download_file "gui_manager.sh" "$SCRIPT_DIR" || return 1
|
||||
|
||||
local gui_script="$SCRIPT_DIR/gui_manager.sh"
|
||||
|
||||
# If GUI action was provided as parameter, use it
|
||||
if [ "$1" = "disable_gui" ]; then
|
||||
log "Disabling graphical environment as requested..."
|
||||
GUI_ACTION=disable bash "$gui_script"
|
||||
# Provide instructions for re-enabling
|
||||
log "${YELLOW}Note:${NC} The graphical environment has been disabled."
|
||||
log "${YELLOW}To re-enable it later, run:${NC}"
|
||||
log "${YELLOW} sudo GUI_ACTION=enable $gui_script${NC}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Ask if user wants to disable GUI
|
||||
if ask_confirmation "Do you want to disable the graphical environment to save RAM?" "n"; then
|
||||
log "Disabling graphical environment..."
|
||||
GUI_ACTION=disable bash "$gui_script"
|
||||
# Provide instructions for re-enabling
|
||||
log "${YELLOW}Note:${NC} The graphical environment has been disabled."
|
||||
log "${YELLOW}To re-enable it later, run:${NC}"
|
||||
log "${YELLOW} sudo GUI_ACTION=enable $gui_script${NC}"
|
||||
else
|
||||
log "${YELLOW}Graphical environment will remain enabled${NC}"
|
||||
fi
|
||||
return 0
|
||||
else
|
||||
log "${YELLOW}Skipping GUI manager configuration${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to check if welcome script is already in profile
|
||||
welcome_script_in_profile() {
|
||||
local welcome_script="$1"
|
||||
grep -q "$welcome_script" /etc/profile
|
||||
return $?
|
||||
}
|
||||
|
||||
# Function to configure welcome script
|
||||
configure_welcome() {
|
||||
if ask_confirmation "Do you want to configure the welcome script?" "y"; then
|
||||
download_file "welcome.sh" "$SCRIPT_DIR" || return 1
|
||||
|
||||
local welcome_script="$SCRIPT_DIR/welcome.sh"
|
||||
|
||||
if welcome_script_in_profile "$welcome_script"; then
|
||||
log "${YELLOW}Welcome script already configured in /etc/profile${NC}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log "Configuring welcome script..."
|
||||
echo "$welcome_script" | sudo tee -a /etc/profile > /dev/null
|
||||
log "${GREEN}Welcome script added to /etc/profile${NC}"
|
||||
return 0
|
||||
else
|
||||
log "${YELLOW}Skipping welcome script configuration${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to setup static IP
|
||||
setup_static_ip() {
|
||||
if ask_confirmation "Do you want to configure a static IP address?" "y"; then
|
||||
download_file "set_static_ip.sh" "$SCRIPT_DIR" || return 1
|
||||
|
||||
local ip_script="$SCRIPT_DIR/set_static_ip.sh"
|
||||
local ip_address="$1" # IP address parameter
|
||||
local gateway_address="$2" # Gateway parameter
|
||||
|
||||
# If both IP and gateway were provided as parameters, use them
|
||||
if [ -n "$ip_address" ] && [ -n "$gateway_address" ]; then
|
||||
log "Configuring static IP as requested: $ip_address with gateway $gateway_address"
|
||||
|
||||
# Validate IP and gateway formats
|
||||
if validate_ip "$ip_address" && validate_gateway "$gateway_address"; then
|
||||
IP_ADDRESS_ENV="$ip_address" GATEWAY_ENV="$gateway_address" bash "$ip_script"
|
||||
return 0
|
||||
else
|
||||
log "${RED}Invalid IP or gateway format. Using default configuration.${NC}"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# If only IP was provided, ask for gateway
|
||||
if [ -n "$ip_address" ]; then
|
||||
# Validate IP format first
|
||||
if ! validate_ip "$ip_address"; then
|
||||
log "${RED}Invalid IP address format: $ip_address.${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Ask for gateway
|
||||
while true; do
|
||||
read -p "Enter gateway IP address (format: 192.168.1.1): " gateway_address < /dev/tty
|
||||
if validate_gateway "$gateway_address"; then
|
||||
log "Configuring static IP: $ip_address with gateway $gateway_address"
|
||||
IP_ADDRESS_ENV="$ip_address" GATEWAY_ENV="$gateway_address" bash "$ip_script"
|
||||
return 0
|
||||
else
|
||||
log "${RED}Invalid gateway format. Please use format like 192.168.1.1${NC}"
|
||||
fi
|
||||
done
|
||||
else
|
||||
# Prompt for both IP and gateway
|
||||
while true; do
|
||||
read -p "Enter static IP address (format: 192.168.1.100 or 192.168.1.100/24): " ip_address < /dev/tty
|
||||
if validate_ip "$ip_address"; then
|
||||
while true; do
|
||||
read -p "Enter gateway IP address (format: 192.168.1.1): " gateway_address < /dev/tty
|
||||
if validate_gateway "$gateway_address"; then
|
||||
log "Configuring static IP: $ip_address with gateway $gateway_address"
|
||||
IP_ADDRESS_ENV="$ip_address" GATEWAY_ENV="$gateway_address" bash "$ip_script"
|
||||
return 0
|
||||
else
|
||||
log "${RED}Invalid gateway format. Please use format like 192.168.1.1${NC}"
|
||||
fi
|
||||
done
|
||||
else
|
||||
log "${RED}Invalid IP address format. Please use format like 192.168.1.100 or 192.168.1.100/24${NC}"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
else
|
||||
log "${YELLOW}Skipping static IP configuration${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to upgrade Debian distribution
|
||||
upgrade_debian_distro() {
|
||||
if ! ask_confirmation "Do you want to check for Debian distribution upgrades? (WARNING: This may break Raspberry Pi OS compatibility)" "n"; then
|
||||
log "${YELLOW}Skipping Debian distribution upgrade${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Download the upgrade script
|
||||
download_file "upgrade_debian.sh" "$SCRIPT_DIR" || {
|
||||
log "${RED}Failed to download upgrade_debian.sh${NC}"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Execute the upgrade script
|
||||
log "Starting Debian distribution upgrade..."
|
||||
bash "$SCRIPT_DIR/upgrade_debian.sh" || {
|
||||
log "${RED}Failed to upgrade Debian distribution${NC}"
|
||||
return 1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to prompt for reboot
|
||||
prompt_for_reboot() {
|
||||
if ask_confirmation "Setup completed. Would you like to reboot now?" "n"; then
|
||||
log "${GREEN}Rebooting system...${NC}"
|
||||
sleep 2
|
||||
reboot
|
||||
else
|
||||
log "${YELLOW}Skipping reboot. Please remember to reboot later to apply all changes.${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
local mac_address=$1
|
||||
local gui_action=$2 # GUI
|
||||
local ip_address=$3 # Static IP
|
||||
local gateway_address=$4 # Gateway IP
|
||||
|
||||
log "Starting Raspberry Pi setup..."
|
||||
|
||||
# Create script directory if it doesn't exist
|
||||
mkdir -p "$SCRIPT_DIR"
|
||||
|
||||
# Install dependencies
|
||||
install_dependencies
|
||||
|
||||
# Check for Debian distribution upgrades
|
||||
# upgrade_debian_distro
|
||||
|
||||
# Setup static IP
|
||||
setup_static_ip "$ip_address" "$gateway_address"
|
||||
|
||||
# Configure MAC address
|
||||
setup_mac_address "$mac_address"
|
||||
|
||||
# Setup GUI manager
|
||||
setup_gui_manager "$gui_action"
|
||||
|
||||
# Setup crontab
|
||||
setup_crontab
|
||||
|
||||
# Configure welcome script
|
||||
configure_welcome
|
||||
|
||||
log "${GREEN}Setup completed successfully!${NC}"
|
||||
|
||||
# Prompt for reboot
|
||||
prompt_for_reboot
|
||||
}
|
||||
|
||||
# Call main function with all arguments
|
||||
main "$@"
|
||||
Vendored
+255
@@ -0,0 +1,255 @@
|
||||
#!/bin/bash
|
||||
# =============================================
|
||||
# Debian Distribution Upgrade Script
|
||||
# Upgrades Debian to the next stable release
|
||||
# =============================================
|
||||
# Configuration
|
||||
LOG_FILE="/var/log/debian_upgrade.log"
|
||||
BACKUP_DIR="/root/debian_upgrade_backup_$(date +%Y%m%d_%H%M%S)"
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[1;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Function to log messages
|
||||
log() {
|
||||
echo -e "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Function to ask for confirmation
|
||||
ask_confirmation() {
|
||||
local message="$1"
|
||||
local default="$2" # "y" or "n"
|
||||
while true; do
|
||||
if [ "$default" = "y" ]; then
|
||||
read -p "$message [Y/n]: " choice < /dev/tty
|
||||
else
|
||||
read -p "$message [y/N]: " choice < /dev/tty
|
||||
fi
|
||||
# Default choice if user just presses Enter
|
||||
if [ -z "$choice" ]; then
|
||||
choice="$default"
|
||||
fi
|
||||
case "$choice" in
|
||||
y|Y|yes|Yes|YES)
|
||||
return 0
|
||||
;;
|
||||
n|N|no|No|NO)
|
||||
return 1
|
||||
;;
|
||||
*)
|
||||
echo "Please answer yes or no."
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# Function to check if running on Raspberry Pi
|
||||
is_raspberry_pi() {
|
||||
if [ -f /proc/device-tree/model ] && grep -q "Raspberry Pi" /proc/device-tree/model; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to validate if curl is installed
|
||||
check_curl() {
|
||||
if ! command -v curl >/dev/null 2>&1; then
|
||||
log "Installing curl..."
|
||||
if ! apt install -y curl; then
|
||||
log "${RED}Failed to install curl${NC}"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to get current Debian version
|
||||
get_current_version() {
|
||||
CURRENT_VERSION=$(cat /etc/debian_version | cut -d'.' -f1)
|
||||
CURRENT_CODENAME=$(grep -oP '(?<=VERSION_CODENAME=).*' /etc/os-release)
|
||||
log "Current Debian version: $CURRENT_CODENAME (Debian $CURRENT_VERSION)"
|
||||
}
|
||||
|
||||
# Function to get next Debian stable version
|
||||
get_next_version() {
|
||||
if ! check_curl; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
NEXT_CODENAME=$(curl -s "http://ftp.debian.org/debian/dists/stable/Release" | grep -oP '(?<=Codename: ).*' | head -n 1)
|
||||
if [ -z "$NEXT_CODENAME" ]; then
|
||||
log "${RED}Failed to fetch next Debian version${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
NEXT_VERSION=$(curl -s "http://ftp.debian.org/debian/dists/${NEXT_CODENAME}/Release" | grep -oP '(?<=Version: ).*' | cut -d'.' -f1)
|
||||
log "Next Debian version available: $NEXT_CODENAME (Debian $NEXT_VERSION)"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to backup important configurations
|
||||
backup_configs() {
|
||||
log "Creating backup of important configurations in $BACKUP_DIR..."
|
||||
mkdir -p "$BACKUP_DIR" || {
|
||||
log "${RED}Failed to create backup directory${NC}"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Backup APT sources
|
||||
cp -a /etc/apt/sources.list "$BACKUP_DIR/" || {
|
||||
log "${RED}Failed to backup /etc/apt/sources.list${NC}"
|
||||
return 1
|
||||
}
|
||||
cp -a /etc/apt/sources.list.d/ "$BACKUP_DIR/" 2>/dev/null || true
|
||||
|
||||
# Backup installed packages
|
||||
dpkg --get-selections > "$BACKUP_DIR/installed_packages.txt" || {
|
||||
log "${RED}Failed to backup installed packages${NC}"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Backup important system configs
|
||||
cp -a /etc/network/interfaces "$BACKUP_DIR/" 2>/dev/null || true
|
||||
cp -a /etc/resolv.conf "$BACKUP_DIR/" 2>/dev/null || true
|
||||
cp -a /etc/ssh/sshd_config "$BACKUP_DIR/" 2>/dev/null || true
|
||||
|
||||
log "${GREEN}Backup completed successfully${NC}"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to update APT repositories
|
||||
update_repositories() {
|
||||
log "Updating APT repositories to $NEXT_CODENAME..."
|
||||
sed -i "s/$CURRENT_CODENAME/$NEXT_CODENAME/g" /etc/apt/sources.list || {
|
||||
log "${RED}Failed to update /etc/apt/sources.list${NC}"
|
||||
return 1
|
||||
}
|
||||
|
||||
if [ -d /etc/apt/sources.list.d/ ]; then
|
||||
find /etc/apt/sources.list.d/ -type f -name "*.list" -exec sed -i "s/$CURRENT_CODENAME/$NEXT_CODENAME/g" {} \; || {
|
||||
log "${RED}Failed to update repositories in /etc/apt/sources.list.d/${NC}"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to perform the upgrade
|
||||
perform_upgrade() {
|
||||
log "Updating package lists..."
|
||||
if ! apt update; then
|
||||
log "${RED}Failed to update package lists${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log "Performing full upgrade..."
|
||||
if ! apt full-upgrade -y; then
|
||||
log "${RED}Failed to perform full upgrade${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log "Performing distribution upgrade to $NEXT_CODENAME..."
|
||||
if ! apt dist-upgrade -y; then
|
||||
log "${RED}Failed to perform distribution upgrade${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to clean up after upgrade
|
||||
cleanup() {
|
||||
log "Cleaning up..."
|
||||
apt autoremove -y || log "${YELLOW}Warning: Failed to autoremove packages${NC}"
|
||||
apt clean || log "${YELLOW}Warning: Failed to clean APT cache${NC}"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to verify upgrade
|
||||
verify_upgrade() {
|
||||
NEW_CODENAME=$(grep -oP '(?<=VERSION_CODENAME=).*' /etc/os-release)
|
||||
if [ "$NEW_CODENAME" != "$NEXT_CODENAME" ]; then
|
||||
log "${RED}Upgrade verification failed. Current codename is still $NEW_CODENAME${NC}"
|
||||
return 1
|
||||
fi
|
||||
log "${GREEN}Successfully upgraded to $NEXT_CODENAME (Debian $NEXT_VERSION)${NC}"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Main function
|
||||
main() {
|
||||
# Check if running as root
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
log "${RED}This script must be run as root. Use 'sudo'.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if this is a Debian system
|
||||
if [ ! -f /etc/debian_version ]; then
|
||||
log "${RED}This script is only for Debian-based systems.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if running on Raspberry Pi
|
||||
if is_raspberry_pi; then
|
||||
log "${RED}WARNING: This is a Raspberry Pi device.${NC}"
|
||||
log "${RED}Upgrading the Debian distribution may break compatibility with Raspberry Pi OS.${NC}"
|
||||
if ! ask_confirmation "Are you sure you want to continue?" "n"; then
|
||||
log "${YELLOW}Aborting Debian distribution upgrade${NC}"
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Get current and next Debian versions
|
||||
get_current_version
|
||||
if ! get_next_version; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if upgrade is needed
|
||||
if [ "$CURRENT_CODENAME" == "$NEXT_CODENAME" ]; then
|
||||
log "No new Debian stable version available. Current version: $CURRENT_CODENAME"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Ask for confirmation
|
||||
if ! ask_confirmation "Do you want to upgrade from $CURRENT_CODENAME to $NEXT_CODENAME?" "n"; then
|
||||
log "${YELLOW}Skipping Debian distribution upgrade${NC}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Backup configurations
|
||||
if ! backup_configs; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Update repositories
|
||||
if ! update_repositories; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Perform upgrade
|
||||
if ! perform_upgrade; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Clean up
|
||||
cleanup
|
||||
|
||||
# Verify upgrade
|
||||
if ! verify_upgrade; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "${YELLOW}Please reboot the system to complete the upgrade${NC}"
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Call main function
|
||||
main
|
||||
Vendored
+435
@@ -0,0 +1,435 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user