blob: efad14ce17cf8ea1e76b659ba51922831d5d31a1 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001#!/bin/sh
2echo "Started $0 $*"
3
4ROOT=
5
6# parse command line params
7action=
8while [ $# != 0 ]; do
9 opt="$1"
10
11 case "$opt" in
12 enable)
13 shift
14
15 action="$opt"
16 services="$1"
17 cmd_args="1"
18 shift
19 ;;
20 disable)
21 shift
22
23 action="$opt"
24 services="$1"
25 cmd_args="1"
26 shift
27 ;;
28 mask)
29 shift
30
31 action="$opt"
32 services="$1"
33 cmd_args="1"
34 shift
35 ;;
36 preset)
37 shift
38
39 action="$opt"
40 services="$1"
41 cmd_args="1"
42 shift
43 ;;
44 --root=*)
45 ROOT=${opt##--root=}
46 cmd_args="0"
47 shift
48 ;;
49 *)
50 if [ "$cmd_args" = "1" ]; then
51 services="$services $opt"
52 shift
53 else
54 echo "'$opt' is an unkown option; exiting with error"
55 exit 1
56 fi
57 ;;
58 esac
59done
60if [ "$action" = "preset" -a "$service_file" = "" ]; then
61 services=$(for f in `find $ROOT/etc/systemd/system $ROOT/lib/systemd/system $ROOT/usr/lib/systemd/system -type f 2>1`; do basename $f; done)
62 services="$services $opt"
63 presetall=1
64fi
65
66for service in $services; do
67 if [ "$presetall" = "1" ]; then
68 action="preset"
69 fi
70 if [ "$action" = "mask" ]; then
71 if [ ! -d $ROOT/etc/systemd/system/ ]; then
72 mkdir -p $ROOT/etc/systemd/system/
73 fi
74 cmd="ln -s /dev/null $ROOT/etc/systemd/system/$service"
75 echo "$cmd"
76 $cmd
77 exit 0
78 fi
79
80 service_base_file=`echo $service | sed 's/\(@\).*\(\.[^.]\+\)/\1\2/'`
81 if [ -z `echo $service | sed '/@/p;d'` ]; then
82 echo "Try to find location of $service..."
83 service_template=false
84 else
85 echo "Try to find location of template $service_base_file of instance $service..."
86 service_template=true
87 if [ -z `echo $service | sed 's/^.\+@\(.*\)\.[^.]\+/\1/'` ]; then
88 instance_specified=false
89 else
90 instance_specified=true
91 fi
92 fi
93
94 # find service file
95 for p in $ROOT/etc/systemd/system \
96 $ROOT/lib/systemd/system \
97 $ROOT/usr/lib/systemd/system; do
98 if [ -e $p/$service_base_file ]; then
99 service_file=$p/$service_base_file
100 service_file=${service_file##$ROOT}
101 fi
102 done
103 if [ -z "$service_file" ]; then
104 echo "'$service_base_file' couldn't be found; exiting with error"
105 exit 1
106 fi
107 echo "Found $service in $service_file"
108
109 # If any new unit types are added to systemd they should be added
110 # to this regular expression.
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500111 unit_types_re='\.\(service\|socket\|device\|mount\|automount\|swap\|target\|path\|timer\|snapshot\)\s*$'
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500112 if [ "$action" = "preset" ]; then
113 action=`egrep -sh $service $ROOT/etc/systemd/user-preset/*.preset | cut -f1 -d' '`
114 if [ -z "$action" ]; then
115 globalpreset=`egrep -sh '\*' $ROOT/etc/systemd/user-preset/*.preset | cut -f1 -d' '`
116 if [ -n "$globalpreset" ]; then
117 action="$globalpreset"
118 else
119 action="enable"
120 fi
121 fi
122 fi
123 # create the required symbolic links
124 wanted_by=$(sed '/^WantedBy[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file" \
125 | tr ',' '\n' \
126 | grep "$unit_types_re")
127
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500128 required_by=$(sed '/^RequiredBy[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file" \
129 | tr ',' '\n' \
130 | grep "$unit_types_re")
131
132 for dependency in WantedBy RequiredBy; do
133 if [ "$dependency" = "WantedBy" ]; then
134 suffix="wants"
135 dependency_list="$wanted_by"
136 elif [ "$dependency" = "RequiredBy" ]; then
137 suffix="requires"
138 dependency_list="$required_by"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500139 fi
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500140 for r in $dependency_list; do
141 echo "$dependency=$r found in $service"
142 if [ "$action" = "enable" ]; then
143 enable_service=$service
144 if [ "$service_template" = true -a "$instance_specified" = false ]; then
145 default_instance=$(sed '/^DefaultInstance[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file")
146 if [ -z $default_instance ]; then
147 echo "Template unit without instance or DefaultInstance directive, nothing to enable"
148 continue
149 else
150 echo "Found DefaultInstance $default_instance, enabling it"
151 enable_service=$(echo $service | sed "s/@/@$(echo $default_instance | sed 's/\\/\\\\/g')/")
152 fi
153 fi
154 mkdir -p $ROOT/etc/systemd/system/$r.$suffix
155 ln -s $service_file $ROOT/etc/systemd/system/$r.$suffix/$enable_service
156 echo "Enabled $enable_service for $r."
157 else
158 if [ "$service_template" = true -a "$instance_specified" = false ]; then
159 disable_service="$ROOT/etc/systemd/system/$r.$suffix/`echo $service | sed 's/@/@*/'`"
160 else
161 disable_service="$ROOT/etc/systemd/system/$r.$suffix/$service"
162 fi
163 rm -f $disable_service
164 [ -d $ROOT/etc/systemd/system/$r.$suffix ] && rmdir --ignore-fail-on-non-empty -p $ROOT/etc/systemd/system/$r.$suffix
165 echo "Disabled ${disable_service##$ROOT/etc/systemd/system/$r.$suffix/} for $r."
166 fi
167 done
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500168 done
169
170 # create the required symbolic 'Alias' links
171 alias=$(sed '/^Alias[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file" \
172 | tr ',' '\n' \
173 | grep "$unit_types_re")
174
175 for r in $alias; do
176 if [ "$action" = "enable" ]; then
177 mkdir -p $ROOT/etc/systemd/system
178 ln -s $service_file $ROOT/etc/systemd/system/$r
179 echo "Enabled $service for $alias."
180 else
181 rm -f $ROOT/etc/systemd/system/$r
182 echo "Disabled $service for $alias."
183 fi
184 done
185
186 # call us for the other required scripts
187 also=$(sed '/^Also[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file" \
188 | tr ',' '\n')
189 for a in $also; do
190 echo "Also=$a found in $service"
191 if [ "$action" = "enable" ]; then
192 $0 --root=$ROOT enable $a
193 fi
194 done
195done