Compare commits

...

31 Commits

Author SHA1 Message Date
3ad26474a6 Remove split HatarashiHako and Kumonoboru
All checks were successful
Ansible Deploy / deploy (push) Successful in 53s
2023-11-18 13:20:28 +02:00
9d5303fdc6 Trying Ansible actions
All checks were successful
Ansible Deploy / deploy (push) Successful in 54s
2023-11-17 23:40:24 +02:00
707ebe3a62 Trying Ansible actions
Some checks failed
Ansible Deploy / deploy (push) Failing after 53s
2023-11-17 23:36:37 +02:00
ba29fe637f Trying Ansible actions
Some checks failed
Ansible Deploy / deploy (push) Failing after 54s
2023-11-17 23:33:16 +02:00
73132456f3 Trying Ansible actions
Some checks failed
Ansible Deploy / deploy (push) Failing after 53s
2023-11-17 23:26:26 +02:00
1121ef6db8 Trying Ansible actions
All checks were successful
Ansible Deploy / deploy (push) Successful in 54s
2023-11-17 23:25:05 +02:00
80e47ee92d Trying Ansible actions
Some checks failed
Ansible Deploy / deploy (push) Failing after 54s
2023-11-17 23:23:48 +02:00
1e3b7b9e94 Trying Ansible actions
Some checks failed
Ansible Deploy / deploy (push) Failing after 4s
2023-11-17 23:23:09 +02:00
c6e7e05eef Trying Ansible actions
Some checks failed
Ansible Deploy / deploy (push) Failing after 5s
2023-11-17 23:21:31 +02:00
74ded3ddbe Trying Ansible actions
Some checks failed
Ansible Deploy / deploy (push) Failing after 18s
2023-11-17 23:20:36 +02:00
36bf3c9ba5 Trying Ansible actions
Some checks failed
Ansible Deploy / deploy (push) Failing after 28s
2023-11-17 23:17:08 +02:00
153f1b0dcd Trying Ansible actions
Some checks failed
Ansible Deploy / deploy (push) Failing after 7s
2023-11-17 23:15:32 +02:00
3ccf6c1758 Trying Ansible actions
Some checks failed
Ansible Deploy / deploy (push) Failing after 6s
2023-11-17 23:13:32 +02:00
aed2e11a47 Trying Ansible actions
Some checks failed
Ansible Deploy / deploy (push) Failing after 19s
2023-11-17 23:12:34 +02:00
9c2a255e1c Trying Ansible actions 2023-11-17 23:11:08 +02:00
77016eefaa Trying Ansible actions 2023-11-17 23:10:48 +02:00
4478fc74c8 Update .gitea/workflows/pingflow.yaml
Some checks failed
Ansible Deploy / deploy (push) Failing after 4s
2023-11-17 23:08:08 +02:00
db4006a820 Trying Ansible actions 2023-11-17 23:07:27 +02:00
69aa1b6903 Trying Ansible actions 2023-11-17 23:05:52 +02:00
f03af21605 Trying Ansible actions 2023-11-17 23:05:24 +02:00
fe910e5f79 Trying Gitea actions
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 14s
2023-11-17 22:20:24 +02:00
6b1790171d Hatarashi Hako now provides Prometheus metrics; old updates 2023-11-17 16:50:20 +02:00
2d9f26a558 Updates and enhancements 2023-03-17 13:32:30 +02:00
97fb7da9b3 Check absolutely slaughter download bandwidth; run them once mothly. Relegated logging to systemd 2023-02-24 11:45:32 +02:00
f03573d275 Update Cloud repository location 2022-11-18 15:16:41 +02:00
8719bfbe27 Small service names fix 2022-11-18 15:16:30 +02:00
ed6614c4b1 Clean on the first of each month instead of every friday 2022-11-18 13:23:13 +02:00
f08ba95750 Detect service names nicely 2022-11-18 13:23:01 +02:00
d81683b431 Now relying on global VERBOSE variable 2022-10-28 11:21:26 +03:00
3bd1c3f9bd Extra accuracy fixes 2022-10-28 11:21:14 +03:00
42782597cd Logging format updates - hurray! 2022-10-16 22:11:19 +03:00
7 changed files with 90 additions and 319 deletions

View File

@@ -0,0 +1,32 @@
name: Ansible Deploy
on:
push:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Set up Python
#uses: actions/setup-python@v4
run: |
apt -y update
apt -y install python3 python3-pip
- name: Install Ansible
run: |
python3 -m pip install --upgrade pip
pip install ansible
- name: Set up SSH
uses: webfactory/ssh-agent@v0.5.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Run Ansible Playbook
run: |
ansible-playbook -i inventory.yml ping.yaml -vv

View File

@@ -1,119 +0,0 @@
#!/bin/bash
##Script to update Docker container images occasionally and alert when update is done.
source /root/.bash_profile
if [[ $1 =~ "-v|--verbose|verbose" ]]; then
source /home/shmick/Scripts/Okiru "$1"
else
source /home/shmick/Scripts/Okiru
fi
source /etc/environment
#Remember where you are to change back to later
LOCAL_DIR=`pwd`
#This is where containers live
CONTAINER_DIR="/var/Red-Vol/Media/Containers/"
declare -a CONTAINER_PATHS
declare -a OUTDATED_CONTAINERS
declare -a FAILED_CONTAINERS
declare -a UPDATED_CONTAINERS
#Remove log from last runs, if present
if [[ -f /tmp/docker-updated ]]; then
rm /tmp/docker-updated
fi
#Start counting how many containers fail; appears in final mail subject.
OUTDATED_COUNT="0"
CONTAINER_PATHS=$(find $CONTAINER_DIR -maxdepth 2 -type f -name docker-compose.yml ! -path '*Archive*' | xargs dirname )
#Find containers in ^ base dir ^ in base container path ^ by finding compose files ^ (not here) ^ and getting their directory name.
for container_path in ${CONTAINER_PATHS[@]}; do
cd $container_path
debug "Working on container directory $container_path"
container_stack=$(basename $container_path)
info "Working on stack" "$container_stack"
container_images="$(cat $container_path/docker-compose.yml | grep -E "image: ([a-z]+)/([a-z]+)(:[a-z0-9].*$)?" | grep -Ev 'postgresql|mariadb' | awk '{print $2}')"
# search for a pattern of something:something with optional :tag ^ avoid database containers print ^ image name
for container_image in $container_images; do
container_name="$(echo $container_image | awk -F/ '{print $2}' | sed "s/\:.*//")"
# remove everything after the : ^
debug "$container_stack has image $container_image"
if [[ -n $(echo $container_image | grep -E "(.*:[a-z0-9].*$)") ]]; then
# check if there is a :tag present ^
image_tag=":$(echo $container_image | awk -F: '{print $NF}')"
# !! Add : ^ before image !! so it is only added to later commands if there is an image at all
debug "$container_image has tag $image_tag"
export container_image=$(echo $container_image | awk -F: '{print $1}')
# If the container does have a tag, keep the base name ^ without it (before the :)
fi
debug "Fetching local image checksum with: docker inspect \"$container_image$image_tag\" | grep -Eo \"$container_image@sha256:([0-9a-zA-Z].*)(\")\" | sed -e 's/\"//g' | awk -F@ '{print \$2}"
local_image=$(docker inspect "$container_image$image_tag" | grep -Eo "$container_image@sha256:([0-9a-zA-Z].*)(\")" | sed -e 's/"//g' -e 's/\s+//g' | awk -F@ '{print $2}')
# remember, this bit ^ is empty without an image ^ this is the main image checksum remove ^ " and whitespace and^ get the checksum after the @
if [[ -z $local_image ]]; then
error "Error fetching local image checksum for container $container_name!"
#The script will complain about failed containers later on
FAILED_CONTAINERS+=("(local) $container_name")
continue 2
else
debug "Local SHA256 for $container_image is $local_image"
fi
debug "Fetching remote image with: skopeo inspect --creds \"dkd6:Vulthuryol569\" docker://docker.io/$container_image$image_tag | grep Digest | head -1 | grep -Eo 'sha256:([0-9a-zA-Z].*)(\")' | sed -e 's/\"//g'"
#Use Skopeo, a Red Hat tool, with my Docker Hub account to register the remote image checksum
remote_image=$(skopeo inspect --creds "dkd6:Vulthuryol569" docker://docker.io/$container_image$image_tag | grep Digest | head -1 | grep -Eo 'sha256:([0-9a-zA-Z].*)(")' | sed -e 's/"//g' -e 's/\s+//g' )
#Sometimes; Docker hub hangs up; try again if you failed
if [[ -z $remote_image ]]; then
remote_image=$(skopeo inspect --creds "dkd6:Vulthuryol569" docker://docker.io/$container_image$image_tag | grep Digest | head -1 | grep -Eo 'sha256:([0-9a-zA-Z].*)(")' | sed -e 's/"//g')
fi
#Now, if you still don't have an image after the second try, something's fuckey.
if [[ -z $remote_image ]]; then
error "Error fetching remote image checksum for container $container_name!"
FAILED_CONTAINERS+=("(remote) $container_name")
continue 2
else
debug "Remote SHA256 for $container_image is $remote_image"
fi
#If we have both checksums, compare them; they should be identical, or the container is outdated.
if [[ -n $local_image ]] && [[ -n $remote_image ]] && [[ "$local_image" =~ "$remote_image" ]]; then
ok "$container_name is up to date!"
else
warn "$container_name is out of date!"
info "Attempting to update $container_name"
if docker-compose pull $container_name; then
info "Pulled latest image for $container_name succesfully. Restarting..."
if docker-compose up -d --remove-orphans; then
ok "$container_stack has been updated sucessfully!"
UPDATED_CONTAINERS+=("($container_stack) $container_name")
else
error "Failed to update $container_name!"
FAILED_CONTAINERS+=("($container_stack|update) $container_name")
#Add to array for mail report
OUTDATED_CONTAINERS+=("($container_stack) $container_name")
export OUTDATED_COUNT=$(($OUTDATED_COUNT+1))
fi
else
error "Failed to pull image for $container_name!"
FAILED_CONTAINERS+=("($container_stack|pull) $container_name")
#Add to array for mail report
OUTDATED_CONTAINERS+=("($container_stack) $container_name")
export OUTDATED_COUNT=$(($OUTDATED_COUNT+1))
fi
fi
#If you found an image tag, reset it before moving on to another container
image_tag=""
done
cd $LOCAL_DIR
done
echo "All done!"
#Iterate over the arrays and output results to a file; if needed, it will be neatly mailed.
if [[ ${#OUTDATED_CONTAINERS[@]} != 0 ]] || [[ ${#FAILED_CONTAINERS[@]} != 0 ]] || [[ ${#UPDATED_CONTAINERS[@]} != 0 ]]; then
if [[ ${#UPDATED_CONTAINERS[@]} != 0 ]]; then
printf "The following containers have updated succefully:\n" > /tmp/docker-updated
printf "%s\n" "${UPDATED_CONTAINERS[@]}" >> /tmp/docker-updated
fi
if [[ ${#OUTDATED_CONTAINERS[@]} != 0 ]]; then
printf "The following containers are out of date:\n" >> /tmp/docker-updated
printf "%s\n" "${OUTDATED_CONTAINERS[@]}" >> /tmp/docker-updated
fi
if [[ ${#FAILED_CONTAINERS[@]} != 0 ]]; then
printf "The following containers failed the update process:\n" >> /tmp/docker-updated
printf "%s\n" "${FAILED_CONTAINERS[@]}" >> /tmp/docker-updated
fi
cat /tmp/docker-updated | mail -s "Docker containers update report - `date +"%B %d %Y"`" -r "Takahe@pukeko.xyz" matanhorovitz@protonmail.com
rm /tmp/docker-updated
fi

View File

@@ -1,180 +0,0 @@
#!/bin/bash
##Simple script to run Restic backups
source /root/.bash_profile
source /home/shmick/Scripts/Okiru
source /etc/environment
export HOME=/root/
arg0=$(basename "$0")
#Show help if arguments are misused
usage()
{
exec 1>2 # Send standard output to standard error
help
exit 1
}
flag_error()
{
echo -e "$arg0: $*." >&2
help
exit 1
}
help()
{
echo "$arg0 - Back up important location to the B2 cloud using Restic."
echo " {-c|--clean} -- Force prune of the remote repositories"
echo " {-r|--repository} repository -- Only backup the specified repository."
echo " {-l|--limit} #[Kbps] -- Limit upload & download speed"
echo " {-h|--help} -- Print this help message and exit"
echo "Available repositories:"
echo "Gerbil-TK Photos (path: /var/Red-Vol/Media/Pictures)"
echo "Pukeko-XYZ-Containers Containers (path: /var/Red-Vol/Media/Containers)"
echo "Pukeko-XYZ-Cloud Data from all devices (path: /var/Red-Vol/Media/Cloud/Syncthing)"
exit 0
}
#Pass arguments to the script
flags()
{
#This is utterly useless
if [[ $# == "0" ]]; then
:
fi
while test $# -gt 0
do
case "$1" in
(-c|--clean)
debug "Cleaning will take place per request."
export CLEAN="1"
shift;;
(-r|--repository)
shift
export REPOSITORY="$1"
debug "Only repository $1 will be processed per request."
shift;;
(-l|--limit)
shift
export BWLIMIT="$1"
debug "Bandwidth will be limited to $BWLIMIT Kbps per request."
shift;;
(-h|--help)
help;;
(*) help;;
esac
done
}
flags "$@"
logging Kumonoboru
#Defaults
if [[ -z $BWLIMIT ]]; then
export BWLIMIT="0"
fi
#Safety function; accepts repository to check
safety(){
REPOSITORY="$1"
info "Checking if repository $REPOSITORY is in use..."
#Check no other Restic process is using this repository; Free unnecessary locks, if present
if [[ -n $(ps aux | grep restic | grep "$REPOSITORY") ]]; then
warn "Repository $REPOSITORY is in use - ignoring"
return 1
# ^ If there's a restic process holding the repository, leave it alone.
else
info "Repository $REPOSITORY is not in use - unlocking"
restic -r b2:$REPOSITORY unlock
# ^ If a lock exists but no process, the repository is safe and should be unlocked.
fi
}
#Backup function; accepts repository and path to backup
backup(){
REPOSITORY="$1"
REPOSITORY_PATH="$2"
if safety "$REPOSITORY"; then
#Run the backup
info "Backing up repository $REPOSITORY"
if restic --cache-dir="$RESTIC_CACHE_DIR" -r b2:"$REPOSITORY" backup "$REPOSITORY_PATH" --limit-upload="$BWLIMIT" --limit-download="$BWLIMIT" | tee -a $LOG; then
ok "Path $REPOSITORY_PATH completed upload to $REPOSITORY."
check "$REPOSITORY"
else
error "Repository $REPOSTIORY failed to upload path $REPOSITORY_PATH!"
fi
fi
}
check(){
REPOSITORY="$1"
PRUNE="$2"
debug "Working on Repostory $1 with prune option $2"
## ^ This variable will have value if repo is already clean, indicating
#+ This is a post backup check.
if [[ -n $PRUNE ]]; then
warn "This repository has been cleaned already; will not clean again."
fi
if safety "$REPOSITORY"; then
info "Checking repository $REPOSITORY"
if restic -r b2:"$REPOSITORY" check --limit-upload="$BWLIMIT" --limit-download="$BWLIMIT" | tee -a $LOG; then
ok "Repository $REPOSITORY passed integrity check!"
info "Current snapshots:"
restic -r b2:"$REPOSITORY" snapshots | tee -a $LOG
else
error "Repository $REPOSITORY failed integrity check!"
fi
fi
}
clean(){
REPOSITORY="$1"
if safety "$REPOSITORY"; then
info "Cleaning repository $REPOSITORY"
if restic -r b2:$REPOSITORY forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune --limit-upload="$BWLIMIT" --limit-download="$BWLIMIT" | tee -a $LOG; then
ok "Repository $REPOSITORY is trim!"
debug "Running post clean check..."
check "$REPOSITORY" "1"
# Marks repository as cleaned already ^ so it won't passed to this function again.
else
error "Repository $REPOSITORY failed to prune!"
fi
fi
}
#If a specific repository was requested, back it up; otherwise, back them all up.
if [[ -n $REPOSITORY ]] && [[ -z $CLEAN ]]; then
case "$REPOSITORY" in
(Gerbil-TK)
backup Gerbil-TK /var/Red-Vol/Media/Pictures/
;;
(Pukeko-XYZ-Containers)
backup Pukeko-XYZ-Containers /var/Red-Vol/Media/Containers
;;
(Pukeko-XYZ-Cloud)
backup Pukeko-XYZ-Cloud /var/Red-Vol/Media/Cloud/Syncthing
;;
(*)
help;;
esac
#If cleaning was not forced, backup the repositories
elif [[ -z $CLEAN ]]; then
backup Gerbil-TK /var/Red-Vol/Media/Pictures/
backup Pukeko-XYZ-Containers /var/Red-Vol/Media/Containers
backup Pukeko-XYZ-Cloud /var/Red-Vol/Media/Cloud/Syncthing
#If a specific repository was requested to be cleaned, clean it
elif [[ -n $REPOSITORY ]] && [[ -n $CLEAN ]]; then
case "$REPOSITORY" in
(Gerbil-TK)
clean Gerbil-TK
;;
(Pukeko-XYZ-Containers)
clean Pukeko-XYZ-Containers
;;
(Pukeko-XYZ-Cloud)
clean Pukeko-XYZ-Cloud
;;
(*)
help;;
esac
#If cleaning was forced and no repository specified, clean all repositories
elif [[ -n $CLEAN ]] || [[ $(date +%a) == "Friday" ]]; then
clean Gerbil-TK
clean Pukeko-XYZ-Containers
clean Pukeko-XYZ-Cloud
fi
#Wrap up this run's log and report nicely
echo "All done; have a nice day!"
end_logging
exit 0

View File

@@ -1,7 +1,6 @@
#!/bin/bash
#Script to backup all important environment files
source /etc/environment
source $SCRIPTS/Okiru
source /home/shmick/Scripts/Okiru
logging "ConfigBackup"
export CONF_DIR="/home/shmick/Config"
if [[ ! -d $CONF_DIR ]]; then
@@ -48,10 +47,10 @@ conf_sync /etc/profile
for conf in $(ls /etc/snapper/configs/* 2> /dev/null); do
conf_sync $conf
done
for conf in $(ls /etc/systemd/system/murchison*); do
for conf in $(ls /etc/systemd/system/Murchison*); do
conf_sync $conf
done
for conf in $(ls /etc/systemd/system/kumonoboru*); do
for conf in $(ls /etc/systemd/system/Kumonoboru*); do
conf_sync $conf
done
#Fix permissions

58
Okiru
View File

@@ -32,7 +32,7 @@ GRAY='\033[1;37m'
STOP="\e[0m"
#If passed from calling script, run in verbose mode (enables debug logging level)
VERBOSE="$1"
VERBOSE="$VERBOSE"
#If a function calls 'logging' for a log, it will create a log file; otherwise, keep the
@@ -83,9 +83,17 @@ logging () {
if [[ -n $VERBOSE ]]; then
#Debugging level logging; can be toggled via a switch
debug () {
printf "${BLUE}[DEBUG]: $1${STOP}\n"
if [[ -f $LOG ]]; then
echo -e "$(date +"%T:%N") [DEBUG]: $1" >> $LOG
if [[ -z $2 ]]; then
printf "${PURPLE}$(date +"%T:%N")${STOP} ${BLUE}[DEBUG]: %s${STOP}\n" "$1"
if [[ -f $LOG ]]; then
echo -e "$(date +"%T:%N") [DEBUG]: $1" >> $LOG
fi
elif [[ -n $2 ]]; then
printf "${PURPLE}$(date +"%T:%N")${STOP} ${BLUE}[DEBUG]: %s${STOP} ${LIGHT_BLUE}%s${STOP}\n" "$1" "$2"
if [[ -f $LOG ]]; then
echo -e "$(date +"%T:%N") [DEBUG]: $1" >> $LOG
fi
fi
}
#Otherwise, ignore debug calls;
@@ -97,32 +105,43 @@ fi
#Information level logging;
info () {
if [[ -z $2 ]]; then
printf "${CYAN}[INFO]:${STOP} %s\n" "$1"
printf "${PURPLE}$(date +"%T:%N")${STOP} ${CYAN}[INFO]:${STOP} %s\n" "$1"
if [[ -f $LOG ]]; then
echo -e "$(date +"%T:%N") [INFO]: $1" >> $LOG
fi
elif [[ -n $2 ]]; then
printf "${CYAN}[INFO]:${STOP} %s ${PURPLE}%s${STOP}\n" "$1" "$2"
printf "${PURPLE}$(date +"%T:%N")${STOP} ${CYAN}[INFO]:${STOP} %s ${LIGHT_CYAN}%s${STOP}\n" "$1" "$2"
if [[ -f $LOG ]]; then
printf "$(date +"%T:%N")${CYAN}[INFO]:${STOP} %s ${PURPLE}%s${STOP}\n" "$1" "$2" >> $LOG
printf "${PURPLE}$(date +"%T:%N")${CYAN}[INFO]:${STOP} %s ${LIGHT_CYAN}%s${STOP}\n" "$1" "$2" >> $LOG
fi
fi
}
#Warning level logging;
warn () {
printf "${YELLOW}[WARNING]:${STOP} $1\n"
if [[ -f $LOG ]]; then
echo -e "$(date +"%T:%N") [WARN]: $1" >> $LOG
if [[ -z $2 ]]; then
printf "${PURPLE}$(date +"%T:%N")${STOP} ${ORANGE}[WARNING]:${STOP} %s\n" "$1"
if [[ -f $LOG ]]; then
echo -e "$(date +"%T:%N") [WARN]: $1" >> $LOG
fi
elif [[ -n $2 ]]; then
printf "${PURPLE}$(date +"%T:%N")${STOP} ${ORANGE}[WARNING]:${STOP} %s ${YELLOW}%s${STOP}\n" "$1" "$2"
if [[ -f $LOG ]]; then
echo -e "$(date +"%T:%N") [WARN]: $1" >> $LOG
fi
fi
}
#Error logging function; Errors are added to an array and a report file.
error () {
printf "${RED}[ERROR]: $1${STOP}\n"
# ^ Print it to the screen
if [[ -z $2 ]]; then
printf "${PURPLE}$(date +"%T:%N")${STOP} ${RED}[ERROR]: %s${STOP}\n" "$1"
# ^ Print it to the screen
elif [[ -n $2 ]]; then
printf "${PURPLE}$(date +"%T:%N")${STOP} ${RED}[ERROR]: %s${STOP}${LIGHT_RED} %s${STOP}\n" "$1"
fi
errors+=("$1")
# ^ And add to errors array
if [[ -f $LOG ]]; then
echo -e "$(date +"%T:%N") [ERROR]: $1" >> $LOG
echo -e "$(date +"%T:%N") [ERROR]: $1" >> $LOG
# ^ Log it with its' time and date
fi
if [[ -f $REPORT ]]; then
@@ -132,9 +151,16 @@ error () {
return 1
}
ok () {
printf "${GREEN}[SUCCESS]: $1${STOP}\n"
if [[ -f $LOG ]]; then
echo -e "$(date +"%T:%N") [SUCCESS]: $1" >> $LOG
if [[ -z $2 ]]; then
printf "${PURPLE}$(date +"%T:%N")${STOP} ${GREEN}[SUCCESS]: %s${STOP}\n" "$1"
if [[ -f $LOG ]]; then
echo -e "$(date +"%T:%N") [SUCCESS]: $1" >> $LOG
fi
elif [[ -n $2 ]]; then
printf "${PURPLE}$(date +"%T:%N")${STOP} ${GREEN}[SUCCESS]:${LIGHT_GREEN} %s${STOP}${GREEN} %s${STOP}\n" "$1" "$2"
if [[ -f $LOG ]]; then
echo -e "$(date +"%T:%N") [SUCCESS]: $1" >> $LOG
fi
fi
}

5
inventory.yml Normal file
View File

@@ -0,0 +1,5 @@
all:
hosts:
takahe:
ansible_host: 192.168.0.66
ansible_user: shmick

8
ping.yaml Normal file
View File

@@ -0,0 +1,8 @@
- hosts: takahe
gather_facts: no
vars:
ansible_ssh_common_args: '-o StrictHostKeyChecking=no'
tasks:
- name: ping
ansible.builtin.ping: