Merge pull request 'Release v.1.0.25270.1' (#1) from develop into main
Reviewed-on: #1
This commit is contained in:
84
README.md
84
README.md
@@ -0,0 +1,84 @@
|
|||||||
|
# PiDP 10 Services
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This repository combines a set of useful scripts and services, to run on the
|
||||||
|
PiDP-10 in order to make it easier to work with it and develop for it. These
|
||||||
|
services can be installed on the PiDP-10 and automate tasks such as copying
|
||||||
|
files onto the ITS operating system. These tools help automate processes, that
|
||||||
|
would require interaction with the Linux part of the PiDP-10 when developing on
|
||||||
|
another system.
|
||||||
|
|
||||||
|
## git-monitor
|
||||||
|
|
||||||
|
The git-monitor is a system service that monitors a target directory on the
|
||||||
|
PiDP-10. It contains a file with a list of git repositories to monitor, one at a
|
||||||
|
time. The service will check if any of the repositories changed, and pull them.
|
||||||
|
After a successful pull a script will be called, if it exists, that allows the
|
||||||
|
newly updated repository to interact with a running PDP-10 simulation.
|
||||||
|
|
||||||
|
The monitor consists of a script, that needs to be installed to `/usr/local/bin`
|
||||||
|
and a systemd unit-file to run it as a service.
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
To install the git-monitor, clone this repository to the target computer, and
|
||||||
|
run the install script:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://gitea.orca-central.de/jali/PiDP10Services.git
|
||||||
|
sudo ./install.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
This will install the service on your system and start it. If you want the
|
||||||
|
service to be enabled on system boot, enable the service:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl enable git-monitor.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
The service is usable immediately after installation. The service is configured
|
||||||
|
through a series of environment variables, that can be set to change the default
|
||||||
|
behaviour. There are five different environment variables to configure the
|
||||||
|
service with:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Environment Variable</th>
|
||||||
|
<th>Description</th>
|
||||||
|
<th>Default Value</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>GITMONITOR_URLS</td>
|
||||||
|
<td>A file that contains the list of observed repositories in a directory by name and URL.</td>
|
||||||
|
<td>/opt/src/repository.list</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>GITMONITOR_LOCAL_PATH</td>
|
||||||
|
<td>The path in which the clone repositories will be stored.</td>
|
||||||
|
<td>/opt/src</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>GITMONITOR_BRANCH_NAME</td>
|
||||||
|
<td>The name of the branch to observe.</td>
|
||||||
|
<td>develop</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>GITMONITOR_POLL_INTERVALL</td>
|
||||||
|
<td>The number of seconds to wait until the next poll.</td>
|
||||||
|
<td>30</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>GITMONITOR_LOCK_FILE</td>
|
||||||
|
<td>The lock file that is used to monitor the service. </td>
|
||||||
|
<td>/run/lock/git-monitor.lock</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
You can override these settings by creating an override file for the service
|
||||||
|
unit. Create a new file
|
||||||
|
`/etc/serviced/service/git-monitor.service.d/override.conf` by typing
|
||||||
|
`sudo systemctl edit git-monitor.service`. You can then uncomment the
|
||||||
|
`Environment` statements, and change the value of the variables accordingly.
|
||||||
|
|||||||
15
install.sh
Executable file
15
install.sh
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Install the service on the target machine
|
||||||
|
|
||||||
|
SERVICEDIR="/usr/local/bin"
|
||||||
|
SYSTEMDDIR="/etc/systemd/system"
|
||||||
|
|
||||||
|
echo "- Installing the service files"
|
||||||
|
cp ./services/git-monitor $SERVICEDIR
|
||||||
|
cp ./units/git-monitor.service $SYSTEMDDIR
|
||||||
|
|
||||||
|
echo "- Preparing the service files"
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl start git-monitor.service
|
||||||
|
|
||||||
|
echo "- Installation complete."
|
||||||
107
services/git-monitor
Executable file
107
services/git-monitor
Executable file
@@ -0,0 +1,107 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
[[ "x${GITMONITOR_URLS}" == "x" ]] && GITMONITOR_URLS="/opt/src/repository.list"
|
||||||
|
[[ "x${GITMONITOR_LOCAL_PATH}" == "x" ]] && GITMONITOR_LOCAL_PATH="/opt/src"
|
||||||
|
[[ "x${GITMONITOR_BRANCH_NAME}" == "x" ]] && GITMONITOR_BRANCH_NAME="develop"
|
||||||
|
[[ "x${GITMONITOR_POLL_INTERVAL}" == "x" ]] && GITMONITOR_POLL_INTERVAL=60 # Seconds between checks
|
||||||
|
[[ "x${GITMONITOR_LOCK_FILE}" == "x" ]] && GITMONITOR_LOCK_FILE="/run/lock/git-monitor.lock" # File to prevent multiple instances
|
||||||
|
|
||||||
|
IFS="|"
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
log_message() {
|
||||||
|
local level=$1
|
||||||
|
local message=$2
|
||||||
|
timestamp=$(date +'%Y-%m-%d %H:%M:%S')
|
||||||
|
#echo "$timestamp [$level] $message" >> "$LOG_FILE"
|
||||||
|
echo "$timestamp [$level] $message" # Also print to console (optional)
|
||||||
|
}
|
||||||
|
|
||||||
|
check_lock() {
|
||||||
|
if [ -f "$GITMONITOR_LOCK_FILE" ]; then
|
||||||
|
log_message "WARN" "Another instance is already running. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
create_lock() {
|
||||||
|
touch "$GITMONITOR_LOCK_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
run_after() {
|
||||||
|
local after_pull_script=$1
|
||||||
|
source $after_pull_script
|
||||||
|
}
|
||||||
|
|
||||||
|
initialize_repos() {
|
||||||
|
while read -r repo_name repo_url; do
|
||||||
|
if [ ! -d "$GITMONITOR_LOCAL_PATH/$repo_name" ]; then
|
||||||
|
log_message "INFO" "Repository directory $GITMONITO_LOCAL_PATH/$repo_name does not exist. Cloning..."
|
||||||
|
mkdir -p "$GITMONITOR_LOCAL_PATH/$repo_name"
|
||||||
|
git clone --depth 1 "$repo_url" "$GITMONITOR_LOCAL_PATH/$repo_name"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
log_message "ERROR" "Failed to clone repository. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
log_message "INFO" "Repository cloned successfully."
|
||||||
|
fi
|
||||||
|
done <$GITMONITOR_URLS
|
||||||
|
}
|
||||||
|
|
||||||
|
check_for_updates() {
|
||||||
|
local repo_name=$1
|
||||||
|
local last_commit_hash
|
||||||
|
local current_commit_hash
|
||||||
|
|
||||||
|
# Get the last known commit hash (from a file)
|
||||||
|
cd "$GITMONITOR
|
||||||
|
_LOCAL_PATH/$repo_name"
|
||||||
|
if [ -f "$GITMONITOR_LOCAL_PATH/$repo_name/.git-monitor-last-commit" ]; then
|
||||||
|
last_commit_hash=$(cat "$GITMONITOR_LOCAL_PATH/$repo_name/.git-monitor-last-commit")
|
||||||
|
else
|
||||||
|
last_commit_hash="" # Initialize if file doesn't exist
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fetch the latest commit hash from the remote repository
|
||||||
|
git -C "$GITMONITOR_LOCAL_PATH/$repo_name" fetch origin $GITMONITOR_BRANCH_NAME
|
||||||
|
current_commit_hash=$(git -C "$GITMONITOR_LOCAL_PATH/$repo_name" rev-parse origin $GITMONITOR_BRANCH_NAME)
|
||||||
|
|
||||||
|
if [ -z "$last_commit_hash" ] || [ "$current_commit_hash" != "$last_commit_hash" ]; then
|
||||||
|
log_message "INFO" "New commits detected. Pulling..."
|
||||||
|
git -C "$GITMONITOR
|
||||||
|
_LOCAL_PATH/$repo_name" pull origin $GITMONITOR_BRANCH_NAME
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
log_message "INFO" "Pull successful."
|
||||||
|
|
||||||
|
# run local scripts
|
||||||
|
if [ -f "$GITMONITOR_LOCAL_PATH/$repo_name/.git-monitor_after.sh" ]; then
|
||||||
|
run_after "$GITMONITOR_LOCAL_PATH/$repo_name/.git-monitor_after.sh"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update the last commit hash file
|
||||||
|
echo "$current_commit_hash" > "$GITMONITOR_LOCAL_PATH/$repo_name/.git-monitor-last-commit"
|
||||||
|
else
|
||||||
|
log_message "ERROR" "Pull failed."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main Execution
|
||||||
|
|
||||||
|
trap 'rm -f $GITMONITOR_LOCK_FILE' EXIT
|
||||||
|
|
||||||
|
check_lock
|
||||||
|
create_lock
|
||||||
|
|
||||||
|
log_message "INFO" "Git monitor started."
|
||||||
|
|
||||||
|
initialize_repos
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
while read -r repo_name repo_url; do
|
||||||
|
check_for_updates $repo_name
|
||||||
|
done < $GITMONITOR_URLS
|
||||||
|
sleep "$GITMONITOR_POLL_INTERVAL"
|
||||||
|
done
|
||||||
|
|
||||||
17
units/git-monitor.service
Normal file
17
units/git-monitor.service
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Get Repository Monitor
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/usr/local/bin/git-monitor
|
||||||
|
Restart=on-failure
|
||||||
|
User=monitor
|
||||||
|
WorkingDirectory=/opt/src
|
||||||
|
Environment="GITMONITOR_URLS=/opt/src/repository.list"
|
||||||
|
Environment="GITMONITOR_LOCAL_PATH=/opt/src"
|
||||||
|
Environment="GITMONITOR_BRANCH_NAME=develop"
|
||||||
|
Environment="GITMONITOR_POLL_INTERVALL=30"
|
||||||
|
Environment="GITMONITOR_LOCK_FILE=/run/lock/git-monitor.lock"
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
Reference in New Issue
Block a user