1
0
Fork 0
mirror of https://github.com/nix-community/home-manager synced 2024-09-20 21:37:30 +02:00

systemd: move activation script to separate file

This makes the following commit more readable.
This commit is contained in:
Cornelius Mika 2017-12-04 11:17:46 +01:00 committed by Robert Helgesson
parent 28e00b68fd
commit 52bdbc42bb
No known key found for this signature in database
GPG key ID: C3DB11069E65DC86
2 changed files with 114 additions and 111 deletions

View file

@ -0,0 +1,112 @@
systemctlPath:
''
function isStartable() {
local service="$1"
[[ $(${systemctlPath} --user show -p RefuseManualStart "$service") == *=no ]]
}
function isStoppable() {
if [[ -v oldGenPath ]] ; then
local service="$1"
[[ $(${systemctlPath} --user show -p RefuseManualStop "$service") == *=no ]]
fi
}
function systemdPostReload() {
local workDir
workDir="$(mktemp -d)"
if [[ -v oldGenPath ]] ; then
local oldUserServicePath="$oldGenPath/home-files/.config/systemd/user"
fi
local newUserServicePath="$newGenPath/home-files/.config/systemd/user"
local oldServiceFiles="$workDir/old-files"
local newServiceFiles="$workDir/new-files"
local servicesDiffFile="$workDir/diff-files"
if [[ ! (-v oldUserServicePath && -d "$oldUserServicePath") \
&& ! -d "$newUserServicePath" ]]; then
return
fi
if [[ ! (-v oldUserServicePath && -d "$oldUserServicePath") ]]; then
touch "$oldServiceFiles"
else
find "$oldUserServicePath" \
-maxdepth 1 -name '*.service' -exec basename '{}' ';' \
| sort \
> "$oldServiceFiles"
fi
if [[ ! -d "$newUserServicePath" ]]; then
touch "$newServiceFiles"
else
find "$newUserServicePath" \
-maxdepth 1 -name '*.service' -exec basename '{}' ';' \
| sort \
> "$newServiceFiles"
fi
diff \
--new-line-format='+%L' \
--old-line-format='-%L' \
--unchanged-line-format=' %L' \
"$oldServiceFiles" "$newServiceFiles" \
> $servicesDiffFile || true
local -a maybeRestart=( $(grep '^ ' $servicesDiffFile | cut -c2-) )
local -a maybeStop=( $(grep '^-' $servicesDiffFile | cut -c2-) )
local -a maybeStart=( $(grep '^+' $servicesDiffFile | cut -c2-) )
local -a toRestart=( )
local -a toStop=( )
local -a toStart=( )
for f in ''${maybeRestart[@]} ; do
if isStoppable "$f" \
&& isStartable "$f" \
&& ${systemctlPath} --quiet --user is-active "$f" \
&& ! cmp --quiet \
"$oldUserServicePath/$f" \
"$newUserServicePath/$f" ; then
toRestart+=("$f")
fi
done
for f in ''${maybeStop[@]} ; do
if isStoppable "$f" ; then
toStop+=("$f")
fi
done
for f in ''${maybeStart[@]} ; do
if isStartable "$f" ; then
toStart+=("$f")
fi
done
rm -r $workDir
local sugg=""
if [[ -n "''${toRestart[@]}" ]] ; then
sugg="''${sugg}systemctl --user restart ''${toRestart[@]}\n"
fi
if [[ -n "''${toStop[@]}" ]] ; then
sugg="''${sugg}systemctl --user stop ''${toStop[@]}\n"
fi
if [[ -n "''${toStart[@]}" ]] ; then
sugg="''${sugg}systemctl --user start ''${toStart[@]}\n"
fi
if [[ -n "$sugg" ]] ; then
echo "Suggested commands:"
echo -n -e "$sugg"
fi
}
$DRY_RUN_CMD ${systemctlPath} --user daemon-reload
systemdPostReload
''

View file

@ -118,117 +118,8 @@ in
(buildServices "timer" cfg.timers)
);
home.activation.reloadSystemD = dagEntryAfter ["linkGeneration"] ''
function isStartable() {
local service="$1"
[[ $(${cfg.systemctlPath} --user show -p RefuseManualStart "$service") == *=no ]]
}
function isStoppable() {
if [[ -v oldGenPath ]] ; then
local service="$1"
[[ $(${cfg.systemctlPath} --user show -p RefuseManualStop "$service") == *=no ]]
fi
}
function systemdPostReload() {
local workDir
workDir="$(mktemp -d)"
if [[ -v oldGenPath ]] ; then
local oldUserServicePath="$oldGenPath/home-files/.config/systemd/user"
fi
local newUserServicePath="$newGenPath/home-files/.config/systemd/user"
local oldServiceFiles="$workDir/old-files"
local newServiceFiles="$workDir/new-files"
local servicesDiffFile="$workDir/diff-files"
if [[ ! (-v oldUserServicePath && -d "$oldUserServicePath") \
&& ! -d "$newUserServicePath" ]]; then
return
fi
if [[ ! (-v oldUserServicePath && -d "$oldUserServicePath") ]]; then
touch "$oldServiceFiles"
else
find "$oldUserServicePath" \
-maxdepth 1 -name '*.service' -exec basename '{}' ';' \
| sort \
> "$oldServiceFiles"
fi
if [[ ! -d "$newUserServicePath" ]]; then
touch "$newServiceFiles"
else
find "$newUserServicePath" \
-maxdepth 1 -name '*.service' -exec basename '{}' ';' \
| sort \
> "$newServiceFiles"
fi
diff \
--new-line-format='+%L' \
--old-line-format='-%L' \
--unchanged-line-format=' %L' \
"$oldServiceFiles" "$newServiceFiles" \
> $servicesDiffFile || true
local -a maybeRestart=( $(grep '^ ' $servicesDiffFile | cut -c2-) )
local -a maybeStop=( $(grep '^-' $servicesDiffFile | cut -c2-) )
local -a maybeStart=( $(grep '^+' $servicesDiffFile | cut -c2-) )
local -a toRestart=( )
local -a toStop=( )
local -a toStart=( )
for f in ''${maybeRestart[@]} ; do
if isStoppable "$f" \
&& isStartable "$f" \
&& ${cfg.systemctlPath} --quiet --user is-active "$f" \
&& ! cmp --quiet \
"$oldUserServicePath/$f" \
"$newUserServicePath/$f" ; then
toRestart+=("$f")
fi
done
for f in ''${maybeStop[@]} ; do
if isStoppable "$f" ; then
toStop+=("$f")
fi
done
for f in ''${maybeStart[@]} ; do
if isStartable "$f" ; then
toStart+=("$f")
fi
done
rm -r $workDir
local sugg=""
if [[ -n "''${toRestart[@]}" ]] ; then
sugg="''${sugg}systemctl --user restart ''${toRestart[@]}\n"
fi
if [[ -n "''${toStop[@]}" ]] ; then
sugg="''${sugg}systemctl --user stop ''${toStop[@]}\n"
fi
if [[ -n "''${toStart[@]}" ]] ; then
sugg="''${sugg}systemctl --user start ''${toStart[@]}\n"
fi
if [[ -n "$sugg" ]] ; then
echo "Suggested commands:"
echo -n -e "$sugg"
fi
}
$DRY_RUN_CMD ${cfg.systemctlPath} --user daemon-reload
systemdPostReload
'';
home.activation.reloadSystemD = dagEntryAfter ["linkGeneration"]
(import ./systemd-activate.nix cfg.systemctlPath);
})
];
}