Files
operation-bin/sync_personal_config
lemke_h 224c68e90b bin: consistent naming, pixi_pgroup_install, git cleanup
- Commands lose their .sh extension (create_personal_dir,
  gopass_bernina_setup, gopass_bernina_service_setup,
  kerberos_ticket_renew, migrate_to_network_drive, pixi_local_sync,
  pixi_rebuild_local, sync_personal_config); .sh now only marks files
  that are sourced. kerberos_ticket_renew.sh and pixi_local_sync.sh stay
  as links, since they are started at login.
- Sourced files gain .sh (bpy-env, anaconda_env, anaconda_bernina_env,
  mm_bernina); the old names stay as links.
- All references in scripts, the .desktop file and the docs updated;
  cheatsheet.md regenerated via list_bin_commands.
- New pixi_pgroup_install: installs the shared bernina pixi env into a
  pgroup work folder (group-shared, with its own package cache) and
  makes it visible in JupyterHub as bernina-<exp>-<env>.
- Fix '#/bin/bash' first lines (missing '!') in 11 scripts.
- Stop tracking clutter (.nfs placeholders, __pycache__, vim swap file,
  .bak/_bak/~ copies, delme_*, empty 'me'); add .gitignore.
2026-09-25 15:48:11 +02:00

164 lines
5.7 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Migrate selected local-home config (.ipython, .condarc, ...) from host_old
# to host_new using PSI's "Partially Shared Home" feature, per:
# https://linux.psi.ch/documentation/user-guide/personal_drive/
#
# How this actually works on PSI Linux systems:
# - Your personal (U:) drive and project drives are auto-mounted under
# ~/network_drives/ (same network location on every Linux client -
# nothing to copy between hosts for that part).
# - Files like .ipython/.condarc live in the LOCAL home on each machine,
# so they do NOT follow you between hosts automatically.
# - The supported way to carry them over is: seed them once onto the
# personal drive, then declare a `copy:` rule in
# ~/network_drives/home/linux_home_links.yaml so any host (host_new
# included) pulls them into its local home at login.
#
# This script:
# 1. checks/repairs the network_drives mount (setup-network-drives)
# 2. seeds the chosen local files/dirs onto the personal drive
# 3. adds/updates the corresponding `copy:` entries in linux_home_links.yaml
# (only creates the file if missing - never silently rewrites an
# existing one, since that could clobber your comments/other entries)
# 4. applies the change immediately via systemd --user
# 5. (informational only) looks for other NFS-style personal folders,
# e.g. /sf/<instrument>/code/personal/<user>, that might also be worth
# wiring in - unverified whether linux_home_links supports absolute
# paths outside network_drives/home, so this only reports candidates
# instead of touching them.
#
# Run this on host_old to seed + configure. Run steps 1 and 4 again (or just
# log in / ssh / `become <user>`) on host_new to pick the files up.
set -euo pipefail
# --- Managed items: local $HOME path -> name stored under linux_config/ ----
declare -A MANAGED_ITEMS=(
[".ipython"]="ipython"
[".condarc"]="condarc"
)
# ----------------------------------------------------------------------------
NETWORK_DRIVES="${HOME}/network_drives"
HOME_DRIVE="${NETWORK_DRIVES}/home"
CONFIG_DIR="${HOME_DRIVE}/linux_config"
LINKS_FILE_CANDIDATES=(
"${HOME_DRIVE}/linux_home_links.yaml"
"${HOME_DRIVE}/.linux_home_links.yaml"
)
log() { echo "==> $*"; }
ensure_network_drives() {
if [[ ! -d "${HOME_DRIVE}" ]]; then
log "network_drives/home not found - running setup-network-drives"
setup-network-drives || true
fi
if [[ ! -d "${HOME_DRIVE}" ]]; then
echo "ERROR: ${HOME_DRIVE} still missing. Run 'setup-network-drives'" >&2
echo "manually, or open a ServiceNow ticket per the personal_drive docs." >&2
exit 1
fi
}
seed_configs() {
mkdir -p "${CONFIG_DIR}"
for local_name in "${!MANAGED_ITEMS[@]}"; do
local src="${HOME}/${local_name}"
local dest_name="${MANAGED_ITEMS[$local_name]}"
local dest="${CONFIG_DIR}/${dest_name}"
if [[ ! -e "${src}" ]]; then
log "skip ${local_name}: not present in local home"
continue
fi
if [[ -d "${src}" ]]; then
log "seeding directory ${local_name} -> ${dest}/"
mkdir -p "${dest}"
rsync -a --delete "${src}/" "${dest}/"
else
log "seeding file ${local_name} -> ${dest}"
cp -a "${src}" "${dest}"
fi
done
}
find_links_file() {
for f in "${LINKS_FILE_CANDIDATES[@]}"; do
[[ -f "$f" ]] && { echo "$f"; return 0; }
done
return 1
}
configure_links() {
local links_file
if links_file=$(find_links_file); then
log "existing ${links_file} found - not auto-editing it to avoid"
log "clobbering your comments/other entries. Make sure it contains:"
print_snippet
return 0
fi
links_file="${LINKS_FILE_CANDIDATES[0]}"
log "creating ${links_file}"
{
echo "copy:"
for local_name in "${!MANAGED_ITEMS[@]}"; do
local dest_name="${MANAGED_ITEMS[$local_name]}"
printf " '%s':\n from: 'network_drives/home/linux_config/%s'\n" \
"${local_name}" "${dest_name}"
done
} > "${links_file}"
cat "${links_file}"
}
print_snippet() {
echo "---"
echo "copy:"
for local_name in "${!MANAGED_ITEMS[@]}"; do
local dest_name="${MANAGED_ITEMS[$local_name]}"
printf " '%s':\n from: 'network_drives/home/linux_config/%s'\n" \
"${local_name}" "${dest_name}"
done
echo "---"
}
apply_links() {
log "applying create-automatic-links-in-home.service"
systemctl --user restart create-automatic-links-in-home.service || \
log "could not restart the service here - it will run on next login/ssh/become"
}
discover_extra_nfs_locations() {
log "looking for other NFS-style personal folders (informational only)"
local found=0
if [[ -d /sf ]]; then
for f in /sf/*/code/personal/"${USER}"; do
[[ -e "$f" ]] || continue
echo " candidate: $f"
found=1
done
fi
if [[ "$found" -eq 0 ]]; then
echo " none found under /sf/*/code/personal/${USER} on this host"
fi
echo " NOTE: the personal_drive doc's copy/link examples only show"
echo " 'network_drives/home/...' sources - it's unconfirmed whether"
echo " linux_home_links.yaml accepts absolute paths like the above."
echo " Verify with your sysadmin / the admin guide before relying on it."
}
main() {
ensure_network_drives
seed_configs
configure_links
apply_links
discover_extra_nfs_locations
log "done. On host_new: log in / ssh / 'become ${USER}' (or run this"
log "script's ensure_network_drives+apply_links steps) to pick up the files."
}
main "$@"