Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
logs/
backups/
*.log
66 changes: 66 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

# 🚀 DevOps Bash Toolkit Assessment

![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/your-username/devops-bash-toolkit/grade.yml)
Expand Down Expand Up @@ -228,3 +229,68 @@ logs/app.log
* Handle script failures gracefully

**Submission link:** [CLICK HERE](https://forms.gle/jrhpKjXsQXZxLopN6)
# DevOps Bash Toolkit Assessment

## Overview
This project contains Bash scripts that demonstrate DevOps fundamentals including:
- Bash scripting
- System monitoring
- Logging
- File management
- Backup automation
- Git workflow

## Scripts

### 1. user_info.sh
Prompts the user for name, age, and country.
Validates age input and classifies user as Minor, Adult, or Senior.
Logs output to `logs/user_info.log`.

### 2. system_check.sh
Displays:
- Disk usage
- Memory usage
- CPU load
- Disk usage warnings above 80%
- Total running processes
- Top 5 memory-consuming processes

Logs output to `logs/system_report_<date>.log`.

### 3. file_manager.sh
Supports:
- create
- delete
- list
- rename

Logs actions to `logs/file_manager.log`.

### 4. backup.sh
Creates compressed backups of a given directory in `backups/`.
Keeps only the latest 5 backups.
Logs actions to `logs/backup.log`.

### 5. process_monitor.sh
Optional bonus script.
Checks if a monitored process is running and simulates restart if not.
Logs actions to `logs/process_monitor.log`.

### 6. run_all.sh
Optional bonus script with interactive menu.
Uses `set -euo pipefail` and logs actions to `logs/app.log`.

## How to Run

```bash
./scripts/user_info.sh
./scripts/system_check.sh
./scripts/file_manager.sh create test.txt
./scripts/file_manager.sh list
./scripts/file_manager.sh rename test.txt new.txt
./scripts/file_manager.sh delete new.txt
./scripts/backup.sh scripts
./scripts/process_monitor.sh nginx
./run_all.sh

64 changes: 64 additions & 0 deletions run_all.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#!/usr/bin/env bash
set -euo pipefail

mkdir -p logs
LOG_FILE="logs/app.log"

log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

run_system_check() {
log "Running system check..."
if ./scripts/system_check.sh; then
log "System check completed successfully."
else
log "System check failed."
fi
}

run_backup() {
read -rp "Enter directory to back up: " dir
log "Running backup for directory: $dir"
if ./scripts/backup.sh "$dir"; then
log "Backup completed successfully."
else
log "Backup failed."
fi
}

run_all_scripts() {
log "Running all available scripts..."
./scripts/system_check.sh || log "system_check.sh failed"
./scripts/user_info.sh || log "user_info.sh failed"

read -rp "Enter directory to back up for run all: " dir
./scripts/backup.sh "$dir" || log "backup.sh failed"
}

show_menu() {
echo
echo "===== DevOps Bash Toolkit ====="
echo "1. Run all"
echo "2. System check"
echo "3. Backup"
echo "4. Exit"
}

while true; do
show_menu
read -rp "Choose an option: " choice

case "$choice" in
1) run_all_scripts ;;
2) run_system_check ;;
3) run_backup ;;
4)
log "Exiting application."
exit 0
;;
*)
echo "Invalid option. Try again."
;;
esac
done
38 changes: 38 additions & 0 deletions scripts/backup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/usr/bin/env bash

mkdir -p logs backups
LOG_FILE="logs/backup.log"

if [[ $# -ne 1 ]]; then
echo "Usage: $0 <directory>"
exit 1
fi

source_dir="$1"
timestamp="$(date '+%Y-%m-%d_%H-%M-%S')"

if [[ ! -d "$source_dir" ]]; then
message="[$(date '+%Y-%m-%d %H:%M:%S')] Error: Directory '$source_dir' does not exist."
echo "$message"
echo "$message" >> "$LOG_FILE"
exit 1
fi

base_name="$(basename "$source_dir")"
backup_file="backups/backup_${base_name}_${timestamp}.tar.gz"

if tar -czf "$backup_file" "$source_dir"; then
message="[$(date '+%Y-%m-%d %H:%M:%S')] Backup created: $backup_file"
echo "$message"
echo "$message" >> "$LOG_FILE"
else
message="[$(date '+%Y-%m-%d %H:%M:%S')] Backup failed for: $source_dir"
echo "$message"
echo "$message" >> "$LOG_FILE"
exit 1
fi

ls -1t backups/backup_*.tar.gz 2>/dev/null | tail -n +6 | while read -r old_backup; do
rm -f "$old_backup"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Deleted old backup: $old_backup" >> "$LOG_FILE"
done
100 changes: 100 additions & 0 deletions scripts/file_manager.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#!/usr/bin/env bash
mkdir -p logs
LOG_FILE="logs/file_manager.log"

usage() {
echo "Usage:"
echo " $0 create <filename>"
echo " $0 delete <filename>"
echo " $0 list"
echo " $0 rename <oldname> <newname>"
}

log_action() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

if [[ $# -lt 1 ]]; then
usage
exit 1
fi

command="$1"

case "$command" in
create)
if [[ $# -ne 2 ]]; then
usage
exit 1
fi

file="$2"

if [[ -e "$file" ]]; then
echo "Error: '$file' already exists. Will not overwrite."
log_action "CREATE FAILED: '$file' already exists."
exit 1
fi

touch "$file"
echo "File '$file' created successfully."
log_action "CREATED: '$file'"
;;

delete)
if [[ $# -ne 2 ]]; then
usage
exit 1
fi

file="$2"

if [[ ! -e "$file" ]]; then
echo "Error: '$file' does not exist."
log_action "DELETE FAILED: '$file' does not exist."
exit 1
fi

rm -f "$file"
echo "File '$file' deleted successfully."
log_action "DELETED: '$file'"
;;

list)
ls -lah
log_action "LIST executed."
;;

rename)
if [[ $# -ne 3 ]]; then
usage
exit 1
fi

oldname="$2"
newname="$3"

if [[ ! -e "$oldname" ]]; then
echo "Error: '$oldname' does not exist."
log_action "RENAME FAILED: '$oldname' does not exist."
exit 1
fi

if [[ -e "$newname" ]]; then
echo "Error: '$newname' already exists. Will not overwrite."
log_action "RENAME FAILED: '$newname' already exists."
exit 1
fi

mv "$oldname" "$newname"
echo "Renamed '$oldname' to '$newname'."
log_action "RENAMED: '$oldname' -> '$newname'"
;;

*)
usage
exit 1
;;
esac


43 changes: 43 additions & 0 deletions scripts/process_monitor.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/usr/bin/env bash

mkdir -p logs
LOG_FILE="logs/process_monitor.log"
services=("nginx" "ssh" "docker")

if [[ $# -ne 1 ]]; then
echo "Usage: $0 <process_name>"
echo "Allowed examples: ${services[*]}"
exit 1
fi

process_name="$1"
timestamp="$(date '+%Y-%m-%d %H:%M:%S')"

is_allowed=false
for service in "${services[@]}"; do
if [[ "$service" == "$process_name" ]]; then
is_allowed=true
break
fi
done

if [[ "$is_allowed" == false ]]; then
message="[$timestamp] '$process_name' is not in the monitored services list: ${services[*]}"
echo "$message"
echo "$message" >> "$LOG_FILE"
exit 1
fi

if pgrep -x "$process_name" >/dev/null 2>&1; then
message="[$timestamp] $process_name: Running"
echo "$message"
echo "$message" >> "$LOG_FILE"
else
message="[$timestamp] $process_name: Stopped. Simulating restart..."
echo "$message"
echo "$message" >> "$LOG_FILE"

restart_message="[$timestamp] $process_name: Restarted"
echo "$restart_message"
echo "$restart_message" >> "$LOG_FILE"
fi
43 changes: 43 additions & 0 deletions scripts/system_check.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/usr/bin/env bash
mkdir -p logs
DATE_STAMP="$(date '+%Y-%m-%d_%H-%M-%S')"
LOG_FILE="logs/system_report_${DATE_STAMP}.log"

{
echo "===== SYSTEM CHECK REPORT ====="
echo "Generated at: $(date)"
echo

echo "----- Disk Usage -----"
df -h
echo

echo "----- Memory Usage -----"
free -m
echo

echo "----- CPU Load -----"
uptime
echo

echo "----- Disk Usage Warnings (>80%) -----"
df -hP | awk 'NR>1 {
gsub("%","",$5)
if ($5 > 80) {
print "WARNING: Filesystem " $1 " is at " $5 "% usage."
}
}'
echo

echo "----- Total Running Processes -----"
ps -e --no-headers | wc -l
echo

echo "----- Top 5 Memory-Consuming Processes -----"
ps -eo pid,comm,%mem,%cpu --sort=-%mem | head -n 6
echo
} | tee "$LOG_FILE"




Loading