mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-06 20:47:00 +02:00
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.
89 lines
2.5 KiB
Python
Executable File
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()
|