flatcar-scripts/build_library/gen_tmpfiles.py
Krzesimir Nowak 336a967941 build_library: Convert python2 scripts to python3
This is just a conversion done by 2to3 with a manual updates of
shebangs to mention python3 explicitly. The fixups for bytearray vs
string issues will follow up.
2021-08-18 18:56:48 +02:00

89 lines
2.5 KiB
Python
Executable File

#!/usr/bin/python3
'''Scan an existing directory tree and record installed directories.
During build a number of directories under /var are created in the state
partition. We want to make sure that those are always there so create a record
of them using systemd's tempfiles config format so they are recreated during
boot if they go missing for any reason.
'''
import optparse
import os
import stat
import sys
import pwd
import grp
def main():
keep = set()
parser = optparse.OptionParser(description=__doc__)
parser.add_option('--root', help='Remove root prefix from output')
parser.add_option('--output', help='Write output to the given file')
parser.add_option('--ignore', action='append', default=[],
help='Ignore one or more paths (use multiple times)')
opts, args = parser.parse_args()
if opts.root:
opts.root = os.path.abspath(opts.root)
for path in args:
path = os.path.abspath(path)
if opts.root:
assert path.startswith(opts.root)
for dirpath, dirnames, filenames in os.walk(path):
if any(f.startswith('.keep') for f in filenames):
keep.add(dirpath)
# Add all parent directories too
for path in frozenset(keep):
split = []
for pathbit in path.split('/'):
split.append(pathbit)
joined = '/'.join(split)
if not joined:
continue
if opts.root and not joined.startswith(opts.root):
continue
if opts.root == joined:
continue
keep.add(joined)
config = []
for path in sorted(keep):
if opts.root:
assert path.startswith(opts.root)
stripped = path[len(opts.root):]
assert len(stripped) > 1
else:
stripped = path
if stripped in opts.ignore:
continue
info = os.stat(path)
assert stat.S_ISDIR(info.st_mode)
mode = stat.S_IMODE(info.st_mode)
try:
owner = pwd.getpwuid(info.st_uid).pw_name
except KeyError:
owner = str(info.st_uid)
try:
group = grp.getgrgid(info.st_gid).gr_name
except KeyError:
group = str(info.st_gid)
config.append('d %-22s %04o %-10s %-10s - -'
% (stripped, mode, owner, group))
if opts.output:
fd = open(opts.output, 'w')
fd.write('\n'.join(config)+'\n')
fd.close()
else:
print('\n'.join(config))
if __name__ == '__main__':
main()