2 # -*- Mode: Python; python-indent: 8; indent-tabs-mode: t -*-
4 import sys, os, argparse, errno
6 def find_service(service, runlevel):
9 for l in os.listdir("/etc/rc.d/rc%i.d" % runlevel):
13 if l[0] != 'S' or l[3:] != service:
18 if p >= 0 and p <= 99 and p >= priority:
23 def lookup_database(services):
25 database = open("/var/lib/systemd/sysv-convert/database", "r")
27 if e.errno != errno.ENOENT:
36 service, r, p = line.strip().split("\t", 3)
43 sys.stderr.write("Failed to parse database line %i. Ignoring." % k)
46 if runlevel not in (2, 3, 4, 5):
47 sys.stderr.write("Runlevel out of bounds in database line %i. Ignoring." % k)
50 if priority < 0 or priority > 99:
51 sys.stderr.write("Priority out of bounds in database line %i. Ignoring." % k)
54 if service not in services:
57 if service not in found:
60 if runlevel not in found[service] or found[service][runlevel] < priority:
61 found[service][runlevel] = priority
67 os.makedirs(path, 0755)
69 if e.errno != errno.EEXIST:
73 sys.stderr.write("Need to be root.\n")
76 parser = argparse.ArgumentParser(description='Save and Restore SysV Service Runlevel Information')
78 parser.add_argument('services', metavar='SERVICE', type=str, nargs='+',
81 parser.add_argument('--save', dest='save', action='store_const',
82 const=True, default=False,
83 help='Save SysV runlevel information for one or more services')
85 parser.add_argument('--show', dest='show', action='store_const',
86 const=True, default=False,
87 help='Show saved SysV runlevel information for one or more services')
89 parser.add_argument('--apply', dest='apply', action='store_const',
90 const=True, default=False,
91 help='Apply saved SysV runlevel information for one or more services to systemd counterparts')
93 a = parser.parse_args()
96 for service in a.services:
97 if not os.access("/etc/rc.d/init.d/%s" % service, os.F_OK):
98 sys.stderr.write("SysV service %s does not exist.\n" % service)
101 mkdir_p("/var/lib/systemd/sysv-convert")
102 database = open("/var/lib/systemd/sysv-convert/database", "a")
104 for runlevel in (2, 3, 4, 5):
105 priority = find_service(service, runlevel)
108 database.write("%s\t%s\t%s\n" % (service, runlevel, priority))
111 found = lookup_database(a.services)
114 sys.stderr.write("No information about passed services found.\n")
117 for service, data in found.iteritems():
118 for runlevel, priority in data.iteritems():
119 sys.stdout.write("SysV service %s enabled in runlevel %s at priority %s\n" % (service, runlevel, priority))
122 for service in a.services:
123 if not os.access("/lib/systemd/system/%s.service" % service, os.F_OK):
124 sys.stderr.write("systemd service %s.service does not exist.\n" % service)
127 found = lookup_database(a.services)
130 sys.stderr.write("No information about passed services found.\n")
133 for service, data in found.iteritems():
134 for runlevel in data.iterkeys():
136 sys.stderr.write("ln -sf /lib/systemd/system/%s.service /etc/systemd/system/runlevel%i.target.wants/%s.service\n" % (service, runlevel, service))
138 mkdir_p("/etc/systemd/system/runlevel%i.target.wants" % runlevel)
141 os.symlink("/lib/systemd/system/%s.service" % service,
142 "/etc/systemd/system/runlevel%i.target.wants/%s.service" % (runlevel, service))
144 if e.errno != errno.EEXIST: