3 import sys, re, os, initdutils
7 # If the absolute path isn't specified, assume it's relative to
8 # cwd; if that doesn't exist, try /etc/init.d
9 ap = os.path.abspath(initfile)
10 if os.path.exists(ap):
13 initfile = os.path.join('/etc/init.d', initfile)
15 print >> sys.stderr, 'Usage: %s /etc/init.d/<init-script>' % sys.argv[0]
19 startpri = stoppri = 20
20 defstart = [2, 3, 4, 5]
23 # Estimated priorities of these facilities in Debian
25 "$local_fs" : {'lsb' : (0, 100)},
26 "$network" : {'lsb' : (10, 50)},
27 "$remote_fs" : {'lsb': (19, 20)},
28 "$named" : {'lsb': (19, 19)},
29 "$syslog" : {'lsb' : (10, 89)},
30 # No longer present in gLSB 1.2; however, required for gLSB 1.1
31 # compat. Note that these are looser than $portmap and $time;
32 # anything specifying $netdaemons will be run later, which may not
34 "$netdaemons" : {'lsb': (80, 19)},
36 "$portmap" : {'lsb' : (19, 34)},
37 "$time" : {'lsb' : (24, 21)},
40 facilities = initdutils.load_facilities()
41 facilities.update(os_facilities)
43 depends = initdutils.load_depends()
44 depends[initfile] = []
46 headers = initdutils.scan_initfile(initfile)
48 reqstart = headers.get('Required-Start', [])
49 shouldstart = headers.get('Should-Start', [])
50 if reqstart or shouldstart:
52 for facility in reqstart:
53 if facility not in facilities:
54 print >> sys.stderr, 'Missing required start facility', facility
57 for script, pri in facilities[facility].iteritems():
58 if script != initfile:
60 startpri = max(startpri, start+1)
61 if facility not in depends[initfile]:
62 depends[initfile].append(facility)
64 for facility in shouldstart:
65 if facility not in facilities:
66 print >> sys.stderr, 'Missing should-start facility', facility, '(ignored)'
68 for script, pri in facilities[facility].iteritems():
69 if script != initfile:
71 startpri = max(startpri, start+1)
72 startpri = min(max(startpri, 1), 99)
74 reqstop = headers.get('Required-Stop', [])
75 shouldstop = headers.get('Should-Stop', [])
76 if reqstop or shouldstop:
78 for facility in reqstop:
79 if facility not in facilities:
80 print >> sys.stderr, 'Missing required stop facility', facility
83 for script, pri in facilities[facility].iteritems():
84 if script != initfile:
86 stoppri = min(stoppri, stop-1)
87 if facility not in depends[initfile]:
88 depends[initfile].append(facility)
90 for facility in shouldstop:
91 if facility not in facilities:
92 print >> sys.stderr, 'Missing should-stop facility', facility, '(ignored)'
94 for script, pri in facilities[facility].iteritems():
95 if script != initfile:
97 stoppri = min(stoppri, stop-1)
99 stoppri = min(max(stoppri, 1), 99)
101 if depends[initfile]:
102 initdutils.save_depends(depends)
104 provides = headers.get('Provides', [])
106 for facility in provides:
107 if facility[0] == '$':
108 print >> sys.stderr, 'Ignoring system-provided facility', facility
110 if not facilities.has_key(facility):
111 facilities[facility] = {}
113 facilities[facility][initfile] = (startpri, stoppri)
114 initdutils.save_facilities(facilities)
116 defstart = headers.get('Default-Start', defstart)
117 defstop = headers.get('Default-Stop', defstop)
119 # A set type would be nice... [range(2,6) = 2..5]
120 for level in range(2,6):
121 if level in defstart:
123 if i not in defstart:
133 start_runlevels = " ".join(map(str, defstart))
134 stop_runlevels = " ".join(map(str, defstop))
136 initfile = initfile.replace('/etc/init.d/', '')
138 os.system("/usr/sbin/update-rc.d %(initfile)s start %(startpri)d %(start_runlevels)s . stop %(stoppri)d %(stop_runlevels)s ." % locals())