feat: Create a systemd unit to create opt links on boot (#380)
This creates a systemd unit file that will execute on boot and create symlinks in `/var/opt/` for every directory that exists in `/usr/lib/opt/`. This removes the need for users to manually create these links to get programs working like the Brave browser.
This commit is contained in:
commit
96b78eb3dc
3 changed files with 56 additions and 2 deletions
11
modules/rpm-ostree/bluebuild-optfix.service
Normal file
11
modules/rpm-ostree/bluebuild-optfix.service
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
[Unit]
|
||||
Description=Create symbolic links for directories in /usr/lib/opt/ to /var/opt/
|
||||
After=multi-user.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/libexec/bluebuild/optfix.sh
|
||||
RemainAfterExit=no
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
27
modules/rpm-ostree/optfix.sh
Normal file
27
modules/rpm-ostree/optfix.sh
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SOURCE_DIR="/usr/lib/opt/"
|
||||
TARGET_DIR="/var/opt/"
|
||||
|
||||
# Ensure the target directory exists
|
||||
mkdir -p "$TARGET_DIR"
|
||||
|
||||
# Loop through directories in the source directory
|
||||
for dir in "$SOURCE_DIR"*/; do
|
||||
if [ -d "$dir" ]; then
|
||||
# Get the base name of the directory
|
||||
dir_name=$(basename "$dir")
|
||||
|
||||
# Check if the symlink already exists in the target directory
|
||||
if [ -L "$TARGET_DIR/$dir_name" ]; then
|
||||
echo "Symlink already exists for $dir_name, skipping."
|
||||
continue
|
||||
fi
|
||||
|
||||
# Create the symlink
|
||||
ln -s "$dir" "$TARGET_DIR/$dir_name"
|
||||
echo "Created symlink for $dir_name"
|
||||
fi
|
||||
done
|
||||
|
|
@ -42,16 +42,32 @@ fi
|
|||
# Create symlinks to fix packages that create directories in /opt
|
||||
get_json_array OPTFIX 'try .["optfix"][]' "$1"
|
||||
if [[ ${#OPTFIX[@]} -gt 0 ]]; then
|
||||
LIB_EXEC_DIR="/usr/libexec/bluebuild"
|
||||
SYSTEMD_DIR="/etc/systemd/system"
|
||||
MODULE_DIR="/tmp/modules/rpm-ostree"
|
||||
|
||||
if ! [ -x "${LIB_EXEC_DIR}/optfix.sh" ]; then
|
||||
mkdir -p "${LIB_EXEC_DIR}"
|
||||
cp "${MODULE_DIR}/optfix.sh" "${LIB_EXEC_DIR}/"
|
||||
chmod +x "${LIB_EXEC_DIR}/optfix.sh"
|
||||
fi
|
||||
|
||||
if ! [ -f "${SYSTEMD_DIR}/bluebuild-optfix.service" ]; then
|
||||
cp "${MODULE_DIR}/bluebuild-optfix.service" "${SYSTEMD_DIR}/"
|
||||
systemctl enable bluebuild-optfix.service
|
||||
fi
|
||||
|
||||
echo "Creating symlinks to fix packages that install to /opt"
|
||||
# Create symlink for /opt to /var/opt since it is not created in the image yet
|
||||
mkdir -p "/var/opt"
|
||||
ln -s "/var/opt" "/opt"
|
||||
ln -fs "/var/opt" "/opt"
|
||||
|
||||
# Create symlinks for each directory specified in recipe.yml
|
||||
for OPTPKG in "${OPTFIX[@]}"; do
|
||||
OPTPKG="${OPTPKG%\"}"
|
||||
OPTPKG="${OPTPKG#\"}"
|
||||
mkdir -p "/usr/lib/opt/${OPTPKG}"
|
||||
ln -s "../../usr/lib/opt/${OPTPKG}" "/var/opt/${OPTPKG}"
|
||||
ln -fs "/usr/lib/opt/${OPTPKG}" "/var/opt/${OPTPKG}"
|
||||
echo "Created symlinks for ${OPTPKG}"
|
||||
done
|
||||
fi
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue