From fb842558f0330d10fc185e0a76ff347689459633 Mon Sep 17 00:00:00 2001 From: Jali Date: Sat, 27 Sep 2025 21:32:15 +0200 Subject: [PATCH] Move configuration into the unit file --- README.md | 48 +++++++++++++++++++++++++++++++++- services/git-monitor | 54 ++++++++++++++++++++------------------- units/git-monitor.service | 5 ++++ 3 files changed, 80 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index ec61258..58522e1 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ another system. ## git-monitor -The git-monitor is a system service, that monitors a target directory on the +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 @@ -36,3 +36,49 @@ 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: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Environment VariableDescriptionDefault Value
GITMONITOR_URLSA file that contains the list of observed repositories in a directory by name and URL./opt/src/repository.list
GITMONITOR_LOCAL_PATHThe path in which the clone repositories will be stored./opt/src
GITMONITOR_BRANCH_NAMEThe name of the branch to observe.develop
GITMONITOR_POLL_INTERVALLThe number of seconds to wait until the next poll.30
GITMONITOR_LOCK_FILEThe lock file that is used to monitor the service. /run/lock/git-monitor.lock
+ +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. diff --git a/services/git-monitor b/services/git-monitor index 051dee6..3d59819 100755 --- a/services/git-monitor +++ b/services/git-monitor @@ -1,12 +1,12 @@ #!/bin/bash -# Configuration (Customize these!) -REPO_URLS="/opt/src/repository.list" -REPO_LOCAL_PATH="/opt/src" -BRANCH_NAME="develop" -POLL_INTERVAL=60 # Seconds between checks -#LOG_FILE="/var/log/git-monitor.log" # Log file for recording actions -LOCK_FILE="/run/lock/git-monitor.lock" # File to prevent multiple instances +# 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 @@ -19,14 +19,14 @@ log_message() { } check_lock() { - if [ -f "$LOCK_FILE" ]; then + if [ -f "$GITMONITOR_LOCK_FILE" ]; then log_message "WARN" "Another instance is already running. Exiting." exit 1 fi } create_lock() { - touch "$LOCK_FILE" + touch "$GITMONITOR_LOCK_FILE" } run_after() { @@ -36,17 +36,17 @@ run_after() { initialize_repos() { while read -r repo_name repo_url; do - if [ ! -d "$REPO_LOCAL_PATH/$repo_name" ]; then - log_message "INFO" "Repository directory $REPO_LOCAL_PATH/$repo_name does not exist. Cloning..." - mkdir -p "$REPO_LOCAL_PATH/$repo_name" - git clone --depth 1 "$repo_url" "$REPO_LOCAL_PATH/$repo_name" + 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 <$REPO_URLS + done <$GITMONITOR_URLS } check_for_updates() { @@ -55,30 +55,32 @@ check_for_updates() { local current_commit_hash # Get the last known commit hash (from a file) - cd "$REPO_LOCAL_PATH/$repo_name" - if [ -f "$REPO_LOCAL_PATH/$repo_name/.git-monitor-last-commit" ]; then - last_commit_hash=$(cat "$REPO_LOCAL_PATH/$repo_name/.git-monitor-last-commit") + 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 "$REPO_LOCAL_PATH/$repo_name" fetch origin $BRANCH_NAME - current_commit_hash=$(git -C "$REPO_LOCAL_PATH/$repo_name" rev-parse origin $BRANCH_NAME) + 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 "$REPO_LOCAL_PATH/$repo_name" pull origin $BRANCH_NAME + 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 "$REPO_LOCAL_PATH/$repo_name/.git-monitor_after.sh" ]; then - run_after "$REPO_LOCAL_PATH/$repo_name/.git-monitor_after.sh" + 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" > "$REPO_LOCAL_PATH/$repo_name/.git-monitor-last-commit" + echo "$current_commit_hash" > "$GITMONITOR_LOCAL_PATH/$repo_name/.git-monitor-last-commit" else log_message "ERROR" "Pull failed." fi @@ -87,7 +89,7 @@ check_for_updates() { # Main Execution -trap 'rm -f $LOCK_FILE' EXIT +trap 'rm -f $GITMONITOR_LOCK_FILE' EXIT check_lock create_lock @@ -99,7 +101,7 @@ initialize_repos while true; do while read -r repo_name repo_url; do check_for_updates $repo_name - done < $REPO_URLS - sleep "$POLL_INTERVAL" + done < $GITMONITOR_URLS + sleep "$GITMONITOR_POLL_INTERVAL" done diff --git a/units/git-monitor.service b/units/git-monitor.service index 2f15469..9a26484 100644 --- a/units/git-monitor.service +++ b/units/git-monitor.service @@ -7,6 +7,11 @@ 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