0
dummy/1/scripts/script1.sh
Normal file
0
dummy/1/scripts/script1.sh
Normal file
0
dummy/1/scripts/script2.sh
Normal file
0
dummy/1/scripts/script2.sh
Normal file
0
dummy/1/text.txt
Normal file
0
dummy/1/text.txt
Normal file
0
dummy/12/dir1/file1.txt
Normal file
0
dummy/12/dir1/file1.txt
Normal file
1
dummy/12/dir2/file.txt
Normal file
1
dummy/12/dir2/file.txt
Normal file
File diff suppressed because one or more lines are too long
1
dummy/12/dir3/file.txt
Normal file
1
dummy/12/dir3/file.txt
Normal file
@@ -0,0 +1 @@
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
1
dummy/2/file.txt
Normal file
1
dummy/2/file.txt
Normal file
@@ -0,0 +1 @@
|
||||
aa
|
||||
1
dummy/2/file2.txt
Normal file
1
dummy/2/file2.txt
Normal file
@@ -0,0 +1 @@
|
||||
aaa
|
||||
1
dummy/2/files/file.txt
Normal file
1
dummy/2/files/file.txt
Normal file
@@ -0,0 +1 @@
|
||||
aa
|
||||
1
dummy/2/files/file2.txt
Normal file
1
dummy/2/files/file2.txt
Normal file
@@ -0,0 +1 @@
|
||||
aaaa
|
||||
4
dummy/7/targets.txt
Normal file
4
dummy/7/targets.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
8.8.8.8
|
||||
google.com
|
||||
yahoo.com
|
||||
example.com
|
||||
@@ -1,22 +0,0 @@
|
||||
//
|
||||
// Created by lumijiez on 12/8/24.
|
||||
//
|
||||
|
||||
#ifndef BCONSUMER_H
|
||||
#define BCONSUMER_H
|
||||
|
||||
#include "buffer.h"
|
||||
#include <semaphore>
|
||||
|
||||
class BConsumer {
|
||||
public:
|
||||
BConsumer(int id, Buffer& buffer, std::counting_semaphore<5>& sem);
|
||||
void run() const;
|
||||
|
||||
private:
|
||||
int id;
|
||||
Buffer& buffer;
|
||||
std::counting_semaphore<5>& consumerSem;
|
||||
};
|
||||
|
||||
#endif //BCONSUMER_H
|
||||
@@ -1,22 +0,0 @@
|
||||
//
|
||||
// Created by lumijiez on 12/8/24.
|
||||
//
|
||||
|
||||
#ifndef BPRODUCER_H
|
||||
#define BPRODUCER_H
|
||||
|
||||
#include "buffer.h"
|
||||
#include <semaphore>
|
||||
|
||||
class BProducer {
|
||||
public:
|
||||
BProducer(int id, Buffer& buffer, std::counting_semaphore<3>& sem);
|
||||
void run() const;
|
||||
|
||||
private:
|
||||
int id;
|
||||
Buffer& buffer;
|
||||
std::counting_semaphore<3>& producerSem;
|
||||
};
|
||||
|
||||
#endif //BPRODUCER_H
|
||||
@@ -1,28 +0,0 @@
|
||||
//
|
||||
// Created by lumijiez on 11/16/24.
|
||||
//
|
||||
|
||||
#ifndef BUFFER_H
|
||||
#define BUFFER_H
|
||||
|
||||
#include <queue>
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
|
||||
class Buffer {
|
||||
public:
|
||||
explicit Buffer(int size);
|
||||
void produce(int producerId, int item);
|
||||
int consume(int consumerId);
|
||||
bool isEmpty() const;
|
||||
bool isFull() const;
|
||||
|
||||
private:
|
||||
std::queue<int> items;
|
||||
const int maxSize;
|
||||
mutable std::mutex mtx;
|
||||
std::condition_variable notFull;
|
||||
std::condition_variable notEmpty;
|
||||
};
|
||||
|
||||
#endif //BUFFER_H
|
||||
@@ -1,22 +0,0 @@
|
||||
//
|
||||
// Created by lumijiez on 11/16/24.
|
||||
//
|
||||
|
||||
#ifndef CONSUMER_H
|
||||
#define CONSUMER_H
|
||||
|
||||
#include <semaphore>
|
||||
|
||||
class Consumer {
|
||||
public:
|
||||
Consumer(int id, int read_fd, std::counting_semaphore<5>& consumerSem);
|
||||
void run(std::atomic<int>& itemsConsumed, const std::atomic<bool>& stopFlag) const;
|
||||
|
||||
private:
|
||||
int consumerId;
|
||||
int readFd;
|
||||
std::counting_semaphore<5>& consumerSemaphore;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
//
|
||||
// Created by lumijiez on 12/8/24.
|
||||
//
|
||||
|
||||
#ifndef P_PRODUCER_CONSUMER_H
|
||||
#define P_PRODUCER_CONSUMER_H
|
||||
|
||||
#define PNUM_PRODUCERS 3
|
||||
#define PNUM_CONSUMERS 2
|
||||
#define PBUFFER_SIZE 10
|
||||
|
||||
#define PSEM_MUTEX_NAME "/buffer_mutex"
|
||||
#define PSEM_FULL_NAME "/buffer_full"
|
||||
#define PSEM_EMPTY_NAME "/buffer_empty"
|
||||
|
||||
void pproducer(int producer_id, int write_fd);
|
||||
|
||||
void pconsumer(int consumer_id, int read_fd);
|
||||
|
||||
#endif //P_PRODUCER_CONSUMER_H
|
||||
@@ -1,21 +0,0 @@
|
||||
//
|
||||
// Created by lumijiez on 11/16/24.
|
||||
//
|
||||
|
||||
#ifndef PRODUCER_H
|
||||
#define PRODUCER_H
|
||||
|
||||
#include <semaphore>
|
||||
|
||||
class Producer {
|
||||
public:
|
||||
Producer(int id, int write_fd, std::counting_semaphore<3>& producerSem);
|
||||
void run(std::atomic<int>& itemsProduced, const std::atomic<bool>& stopFlag) const;
|
||||
|
||||
private:
|
||||
int producerId;
|
||||
int writeFd;
|
||||
std::counting_semaphore<3>& producerSemaphore;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,30 +0,0 @@
|
||||
//
|
||||
// Created by lumijiez on 12/8/24.
|
||||
//
|
||||
|
||||
#ifndef READER_WRITER_H
|
||||
#define READER_WRITER_H
|
||||
|
||||
#include <semaphore.h>
|
||||
#include <fstream>
|
||||
|
||||
class ReaderWriter {
|
||||
public:
|
||||
ReaderWriter(int numReaders, int numWriters, std::string filename);
|
||||
~ReaderWriter();
|
||||
void run();
|
||||
|
||||
private:
|
||||
int numReaders;
|
||||
int numWriters;
|
||||
std::string filename;
|
||||
|
||||
sem_t resourceAccess{};
|
||||
sem_t readCountAccess{};
|
||||
int readCount;
|
||||
int writeCount;
|
||||
|
||||
static void* reader(void* arg);
|
||||
static void* writer(void* arg);
|
||||
};
|
||||
#endif //READER_WRITER_H
|
||||
@@ -1,18 +0,0 @@
|
||||
//
|
||||
// Created by lumijiez on 11/16/24.
|
||||
//
|
||||
|
||||
#ifndef SIGNAL_HANDLER_H
|
||||
#define SIGNAL_HANDLER_H
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
#include <csignal>
|
||||
#include <cstdlib>
|
||||
#include <stdexcept>
|
||||
#include <limits>
|
||||
#include <cstdint>
|
||||
#include <bits/random.h>
|
||||
#include <random>
|
||||
void setupSignalHandlers();
|
||||
|
||||
#endif //SIGNAL_HANDLER_H
|
||||
338
utility.sh
Normal file
338
utility.sh
Normal file
@@ -0,0 +1,338 @@
|
||||
#!/bin/bash
|
||||
|
||||
file_permissions_and_security() {
|
||||
local file=$1
|
||||
local directory=$2
|
||||
|
||||
local file_permissions=$(stat -c "%a" "$file")
|
||||
if [ "$file_permissions" -gt 644 ]; then
|
||||
echo "The file '$file' has insecure permissions."
|
||||
chmod 644 "$file"
|
||||
echo "Permissions corrected to rw-r--r--."
|
||||
fi
|
||||
|
||||
echo "Scanning directory '$directory' for .sh files..."
|
||||
find "$directory" -type f -name "*.sh" | while read -r script; do
|
||||
if [ ! -x "$script" ]; then
|
||||
echo "The script '$script' is not executable."
|
||||
else
|
||||
echo "The script '$script' is executable."
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
file_integrity_checker() {
|
||||
local file=$1
|
||||
local directory=$2
|
||||
|
||||
if [ ! -f "$file" ]; then
|
||||
echo "Error: File '$file' does not exist."
|
||||
return
|
||||
fi
|
||||
|
||||
if [ ! -d "$directory" ]; then
|
||||
echo "Error: Directory '$directory' does not exist."
|
||||
return
|
||||
fi
|
||||
|
||||
local hash=$(md5sum "$file" | awk '{print $1}')
|
||||
|
||||
local filename=$(basename "$file")
|
||||
|
||||
local file_found=false
|
||||
|
||||
while IFS= read -r other_file; do
|
||||
local other_hash=$(md5sum "$other_file" | awk '{print $1}')
|
||||
|
||||
if [ "$hash" == "$other_hash" ]; then
|
||||
echo "File integrity verified for '$other_file'."
|
||||
file_found=true
|
||||
else
|
||||
echo "File integrity compromised for '$other_file'."
|
||||
fi
|
||||
done < <(find "$directory" -type f -name "$filename")
|
||||
|
||||
if [ "$file_found" == false ]; then
|
||||
echo "File '$filename' not found or not verified in the directory '$directory'."
|
||||
fi
|
||||
}
|
||||
|
||||
disk_space_monitor() {
|
||||
current_date=$(date)
|
||||
echo "$current_date: Checking disk usage..." >> disk_usage.log
|
||||
df -h | awk -v date="$current_date" 'NR>1 && $1 != "tmpfs" {if ($5+0 > 80) print date ": Warning: Partition " $1 " mounted on " $6 " is above 80% usage."; else print date ": OK! Partition " $1 " mounted on " $6 " is fine."}' | tee -a disk_usage.log
|
||||
}
|
||||
|
||||
system_process_tracker() {
|
||||
echo "$(date): Total used memory:" >> process_log.txt
|
||||
free -h | grep Mem | awk '{print "Used: " $3 ", Free: " $4 ", Total: " $2}' >> process_log.txt
|
||||
|
||||
echo "$(date): Listing top memory-consuming processes..." >> process_log.txt
|
||||
ps aux --no-headers --sort=-%mem | head -n 5 | while read -r line; do
|
||||
pid=$(echo $line | awk '{print $2}')
|
||||
mem=$(echo $line | awk '{print $4}')
|
||||
cmd=$(echo $line | awk '{print $11}')
|
||||
|
||||
echo "$(date): PID $pid, Mem: $mem%, Command: $cmd" >> process_log.txt
|
||||
done
|
||||
|
||||
echo "$(date): Top 5 memory-consuming processes logged." >> process_log.txt
|
||||
}
|
||||
|
||||
service_status_checker() {
|
||||
if [ "$#" -eq 0 ]; then
|
||||
services=("nginx" "ssh" "cron")
|
||||
else
|
||||
services=("$@")
|
||||
fi
|
||||
|
||||
echo "$(date): Checking service statuses..." >> service_status.log
|
||||
|
||||
for service in "${services[@]}"; do
|
||||
status=$(systemctl is-active --quiet "$service" && echo "running" || echo "not running")
|
||||
echo "$(date): Service '$service' is $status." >> service_status.log
|
||||
|
||||
if [ "$status" = "not running" ]; then
|
||||
echo "$(date): Service '$service' is not running. Restarting..." | tee -a service_status.log
|
||||
systemctl restart "$service"
|
||||
fi
|
||||
done
|
||||
|
||||
echo "$(date): Service status check complete." >> service_status.log
|
||||
}
|
||||
|
||||
backup_automation() {
|
||||
local dir=$1
|
||||
local backup_dir="./backup"
|
||||
|
||||
if [ ! -d "$dir" ]; then
|
||||
echo "Error: The provided directory '$dir' does not exist."
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$backup_dir" ]; then
|
||||
mkdir -p "$backup_dir"
|
||||
fi
|
||||
|
||||
local timestamp=$(date +"%Y%m%d%H%M%S")
|
||||
local backup_file="$backup_dir/$(basename "$dir")_$timestamp.tar.gz"
|
||||
|
||||
tar -czf "$backup_file" "$dir" && echo "Backup created successfully at $backup_file."
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Backup failed."
|
||||
return 2
|
||||
fi
|
||||
}
|
||||
|
||||
network_connectivity_checker() {
|
||||
local targets_file=$1
|
||||
local default_targets=("8.8.8.8" "google.com" "yahoo.com")
|
||||
|
||||
if [ -z "$targets_file" ]; then
|
||||
targets_file="/tmp/targets.txt"
|
||||
printf "%s\n" "${default_targets[@]}" > "$targets_file"
|
||||
fi
|
||||
|
||||
echo "$(date): Checking network connectivity..." >> connectivity_log.txt
|
||||
|
||||
while IFS= read -r target; do
|
||||
if ping -c 1 "$target" &>/dev/null; then
|
||||
echo "$(date): $target is reachable." | tee -a connectivity_log.txt
|
||||
else
|
||||
echo "$(date): Warning: $target is unreachable." | tee -a connectivity_log.txt
|
||||
fi
|
||||
done < "$targets_file"
|
||||
}
|
||||
|
||||
log_cleaner() {
|
||||
local log_dir=$1
|
||||
local cleanup_log="cleanup.log"
|
||||
|
||||
if [ ! -d "$log_dir" ]; then
|
||||
echo "Error: Directory '$log_dir' does not exist."
|
||||
return 1
|
||||
fi
|
||||
|
||||
touch "$cleanup_log"
|
||||
|
||||
find "$log_dir" -type f -name "*.log" -mtime +7 | while read -r log_file; do
|
||||
echo "Found old log: $log_file"
|
||||
read -p "Delete $log_file? (y/n): " choice
|
||||
if [[ "$choice" =~ ^[Yy]$ ]]; then
|
||||
rm "$log_file"
|
||||
echo "Deleted: $log_file" >> "$cleanup_log"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
cron_job_monitor() {
|
||||
local user=$1
|
||||
local log_file="/var/log/syslog"
|
||||
local failure_log="cron_failures.log"
|
||||
local current_date=$(date +"%b %d")
|
||||
|
||||
echo "$(date): Checking cron jobs for user '$user'..." >> "$failure_log"
|
||||
|
||||
crontab -l -u "$user" | while read -r job; do
|
||||
grep "$current_date" "$log_file" | grep "CRON" | grep -q "$job"
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "$(date): Cron job failed: $job" >> "$failure_log"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
ram_usage_analyzer() {
|
||||
echo "$(date): Monitoring RAM usage..." >> ram_usage.log
|
||||
for i in {1..100}; do
|
||||
read total used free <<< $(free -m | awk '/Mem:/ {print $2, $3, $4}')
|
||||
|
||||
used_percentage=$((used * 100 / total))
|
||||
|
||||
echo "$(date): Total: ${total}MB, Used: ${used}MB, Free: ${free}MB, Used Percentage: ${used_percentage}%" >> ram_usage.log
|
||||
|
||||
progress_bar="["
|
||||
for ((j = 0; j < used_percentage; j+=2)); do
|
||||
progress_bar="${progress_bar}#"
|
||||
done
|
||||
for ((j = used_percentage; j < 100; j+=2)); do
|
||||
progress_bar="${progress_bar} "
|
||||
done
|
||||
progress_bar="${progress_bar}] $used_percentage%"
|
||||
echo -e "$progress_bar"
|
||||
|
||||
if [ "$used_percentage" -gt 50 ]; then
|
||||
echo "$(date): Warning: Memory usage exceeds 50%" | tee -a ram_usage.log
|
||||
fi
|
||||
|
||||
sleep 1
|
||||
done
|
||||
}
|
||||
|
||||
open_ports_scanner() {
|
||||
expected_ports=(22 80 443)
|
||||
|
||||
declare -A processed_ports
|
||||
|
||||
ss -tuln | awk 'NR>1 {print $5}' | while read -r port_info; do
|
||||
port="${port_info##*:}"
|
||||
|
||||
if [[ -n "${processed_ports[$port]}" ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
processed_ports[$port]=1
|
||||
|
||||
if [[ " ${expected_ports[@]} " =~ " ${port} " ]]; then
|
||||
service_name=$(ss -tuln | grep ":$port" | awk '{print $1, $5}')
|
||||
echo "Port $port is open and expected. Service: $service_name" >> open_ports.log
|
||||
else
|
||||
echo "Warning: Port $port is open and unexpected." >> open_ports.log
|
||||
echo "Warning: Port $port is open and unexpected."
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
directory_size_auditor() {
|
||||
local dir=$1
|
||||
|
||||
if [[ -z "$dir" || ! -d "$dir" ]]; then
|
||||
echo "Error: Please provide a valid directory path."
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "$(date): Analyzing directory sizes in '$dir'..." >> dir_size_audit.log
|
||||
|
||||
du -sh "$dir"/* 2>/dev/null | sort -rh | head -n 5 | while read -r size path; do
|
||||
echo "$(basename "$path"): $size" >> dir_size_audit.log
|
||||
done
|
||||
|
||||
echo "Top 5 largest directories logged."
|
||||
}
|
||||
|
||||
exercises=(
|
||||
"File Permissions and Security Script"
|
||||
"File Integrity Checker"
|
||||
"Disk Space Monitor"
|
||||
"System Process Tracker"
|
||||
"Service Status Checker"
|
||||
"Backup Automation Script"
|
||||
"Network Connectivity Checker"
|
||||
"Log Cleaner Script"
|
||||
"Cron Job Status Monitor"
|
||||
"RAM Usage Analyzer"
|
||||
"Open Ports Scanner"
|
||||
"Directory Size Auditor"
|
||||
)
|
||||
|
||||
echo "Choose an exercise to run:"
|
||||
for i in {1..12}; do
|
||||
echo "$i) ${exercises[$i-1]}"
|
||||
done
|
||||
|
||||
echo "Enter the number of the exercise:"
|
||||
read exercise
|
||||
|
||||
case $exercise in
|
||||
1)
|
||||
echo "Enter the file path:"
|
||||
read file
|
||||
echo "Enter the directory path:"
|
||||
read directory
|
||||
file_permissions_and_security "$file" "$directory"
|
||||
;;
|
||||
2)
|
||||
echo "Enter the file path:"
|
||||
read file
|
||||
echo "Enter the directory path:"
|
||||
read directory
|
||||
file_integrity_checker "$file" "$directory"
|
||||
;;
|
||||
3)
|
||||
disk_space_monitor
|
||||
;;
|
||||
4)
|
||||
system_process_tracker
|
||||
;;
|
||||
5)
|
||||
echo "Enter service names separated by spaces:"
|
||||
read -a services
|
||||
service_status_checker "${services[@]}"
|
||||
;;
|
||||
6)
|
||||
echo "Enter the directory path to backup:"
|
||||
read dir
|
||||
backup_automation "$dir"
|
||||
;;
|
||||
7)
|
||||
echo "Enter the path to the targets file:"
|
||||
read targets_file
|
||||
network_connectivity_checker "$targets_file"
|
||||
;;
|
||||
8)
|
||||
echo "Enter the log directory path:"
|
||||
read log_dir
|
||||
log_cleaner "$log_dir"
|
||||
;;
|
||||
9)
|
||||
echo "Enter the user name:"
|
||||
read user
|
||||
cron_job_monitor "$user"
|
||||
;;
|
||||
10)
|
||||
ram_usage_analyzer
|
||||
;;
|
||||
11)
|
||||
open_ports_scanner
|
||||
;;
|
||||
12)
|
||||
echo "Enter the directory path:"
|
||||
read dir
|
||||
directory_size_auditor "$dir"
|
||||
;;
|
||||
*)
|
||||
echo "Invalid choice. Exiting."
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user