Zbigniew Jędrzejewski-Szmek 17a6f3
import re, sys, os, collections
Zbigniew Jędrzejewski-Szmek 17a6f3
Zbigniew Jędrzejewski-Szmek 17a6f3
buildroot = sys.argv[1]
Zbigniew Jędrzejewski-Szmek 453bbc
no_bootloader = '--no-bootloader' in sys.argv
Zbigniew Jędrzejewski-Szmek b8d376
Zbigniew Jędrzejewski-Szmek b8d376
known_files = '''
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %config(noreplace) /etc/crypttab
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %attr(0444,root,root) /etc/udev/hwdb.bin
Zbigniew Jędrzejewski-Szmek b8d376
/etc/inittab
Zbigniew Jędrzejewski-Szmek b8d376
/usr/lib/systemd/purge-nobody-user
Zbigniew Jędrzejewski-Szmek 1d61a3
# This directory is owned by openssh-server, but we don't want to introduce
Zbigniew Jędrzejewski-Szmek 1d61a3
# a dependency. So let's copy the config and co-own the directory.
Zbigniew Jędrzejewski-Szmek 245a25
%dir %attr(0700,root,root) /etc/ssh/sshd_config.d
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %config(noreplace) /etc/vconsole.conf
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %config(noreplace) /etc/X11/xorg.conf.d/00-keyboard.conf
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %attr(0664,root,root) %verify(not group) /run/utmp
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %attr(0664,root,root) %verify(not group) /var/log/wtmp
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %attr(0660,root,root) %verify(not group) /var/log/btmp
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %attr(0664,root,root) %verify(not md5 size mtime group) /var/log/lastlog
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %config(noreplace) /etc/hostname
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %config(noreplace) /etc/localtime
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %config(noreplace) /etc/locale.conf
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %attr(0444,root,root) %config(noreplace) /etc/machine-id
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %config(noreplace) /etc/machine-info
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %attr(0700,root,root) %dir /var/cache/private
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %attr(0700,root,root) %dir /var/lib/private
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %dir /var/lib/private/systemd
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %dir /var/lib/private/systemd/journal-upload
Zbigniew Jędrzejewski-Szmek b8d376
%ghost /var/lib/private/systemd/journal-upload/state
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %dir /var/lib/systemd/timesync
Zbigniew Jędrzejewski-Szmek b8d376
%ghost /var/lib/systemd/timesync/clock
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %dir /var/lib/systemd/backlight
Zbigniew Jędrzejewski-Szmek b8d376
%ghost /var/lib/systemd/catalog/database
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %dir /var/lib/systemd/coredump
Zbigniew Jędrzejewski-Szmek b8d376
%ghost /var/lib/systemd/journal-upload
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %dir /var/lib/systemd/linger
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %attr(0600,root,root) /var/lib/systemd/random-seed
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %dir /var/lib/systemd/rfkill
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %dir %verify(not mode group) /var/log/journal
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %dir /var/log/journal/remote
Zbigniew Jędrzejewski-Szmek b8d376
%ghost %attr(0700,root,root) %dir /var/log/private
Zbigniew Jędrzejewski-Szmek 3a8edc
'''
Zbigniew Jędrzejewski-Szmek b8d376
Zbigniew Jędrzejewski-Szmek 1d61a3
known_files = {line.split()[-1]:line for line in known_files.splitlines()
Zbigniew Jędrzejewski-Szmek 1d61a3
               if line and not line.startswith('#')}
Zbigniew Jędrzejewski-Szmek 17a6f3
Zbigniew Jędrzejewski-Szmek 17a6f3
def files(root):
Zbigniew Jędrzejewski-Szmek 17a6f3
    os.chdir(root)
Zbigniew Jędrzejewski-Szmek 17a6f3
    todo = collections.deque(['.'])
Zbigniew Jędrzejewski-Szmek 17a6f3
    while todo:
Zbigniew Jędrzejewski-Szmek 17a6f3
        n = todo.pop()
Zbigniew Jędrzejewski-Szmek 17a6f3
        files = os.scandir(n)
Zbigniew Jędrzejewski-Szmek 17a6f3
        for file in files:
Zbigniew Jędrzejewski-Szmek 17a6f3
            yield file
Zbigniew Jędrzejewski-Szmek 17a6f3
            if file.is_dir() and not file.is_symlink():
Zbigniew Jędrzejewski-Szmek 17a6f3
                todo.append(file)
Zbigniew Jędrzejewski-Szmek 17a6f3
Zbigniew Jędrzejewski-Szmek 070811
outputs = {suffix: open(f'.file-list-{suffix}', 'w')
Zbigniew Jędrzejewski-Szmek 070811
           for suffix in (
Zbigniew Jędrzejewski-Szmek 070811
                   'libs',
Zbigniew Jędrzejewski-Szmek 070811
                   'udev',
Zbigniew Jędrzejewski-Szmek 070811
                   'ukify',
Zbigniew Jędrzejewski-Szmek 070811
                   'boot',
Zbigniew Jędrzejewski-Szmek 070811
                   'pam',
Zbigniew Jędrzejewski-Szmek 070811
                   'rpm-macros',
Zbigniew Jędrzejewski-Szmek 070811
                   'devel',
Zbigniew Jędrzejewski-Szmek 070811
                   'container',
Zbigniew Jędrzejewski-Szmek 070811
                   'networkd',
Zbigniew Jędrzejewski-Szmek 070811
                   'networkd-defaults',
Zbigniew Jędrzejewski-Szmek 070811
                   'oomd-defaults',
Zbigniew Jędrzejewski-Szmek 070811
                   'remote',
Zbigniew Jędrzejewski-Szmek 070811
                   'resolve',
Zbigniew Jędrzejewski-Szmek 070811
                   'tests',
Zbigniew Jędrzejewski-Szmek 070811
                   'standalone-repart',
Zbigniew Jędrzejewski-Szmek 070811
                   'standalone-tmpfiles',
Zbigniew Jędrzejewski-Szmek 070811
                   'standalone-sysusers',
Zbigniew Jędrzejewski-Szmek 070811
                   'standalone-shutdown',
Zbigniew Jędrzejewski-Szmek 070811
                   'main',
Zbigniew Jędrzejewski-Szmek 070811
           )}
Zbigniew Jędrzejewski-Szmek 070811
Zbigniew Jędrzejewski-Szmek 17a6f3
for file in files(buildroot):
Zbigniew Jędrzejewski-Szmek 17a6f3
    n = file.path[1:]
Zbigniew Jędrzejewski-Szmek 17a6f3
    if re.match(r'''/usr/(share|include)$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/share/man(/man.|)$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/share/zsh(/site-functions|)$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/share/dbus-1$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/share/dbus-1/system.d$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/share/dbus-1/(system-|)services$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/share/polkit-1(/actions|/rules.d|)$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/share/pkgconfig$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/share/bash-completion(/completions|)$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr(/lib|/lib64|/bin|/sbin|)$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/lib.*/(security|pkgconfig)$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/lib/rpm(/macros.d|)$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/lib/firewalld(/services|)$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/share/(locale|licenses|doc)|             # no $
Yu Watanabe 9653e1
                    /etc(/pam\.d|/xdg|/X11|/X11/xinit|/X11.*\.d|)$|
Zbigniew Jędrzejewski-Szmek 184871
                    /etc/(dnf|dnf/protected.d)$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                    /usr/(src|lib/debug)|                         # no $
Zbigniew Jędrzejewski-Szmek be4317
                    /run$|
Yu Watanabe 9653e1
                    /var(/cache|/log|/lib|/run|)$
Zbigniew Jędrzejewski-Szmek 17a6f3
    ''', n, re.X):
Zbigniew Jędrzejewski-Szmek 17a6f3
        continue
Zbigniew Jędrzejewski-Szmek 903ce8
Zbigniew Jędrzejewski-Szmek 903ce8
    if n.endswith('.standalone'):
Zbigniew Jędrzejewski-Szmek 903ce8
        if 'repart' in n:
Zbigniew Jędrzejewski-Szmek 070811
            o = outputs['standalone-repart']
Zbigniew Jędrzejewski-Szmek 903ce8
        elif 'tmpfiles' in n:
Zbigniew Jędrzejewski-Szmek 070811
            o = outputs['standalone-tmpfiles']
Zbigniew Jędrzejewski-Szmek 903ce8
        elif 'sysusers' in n:
Zbigniew Jędrzejewski-Szmek 070811
            o = outputs['standalone-sysusers']
Zbigniew Jędrzejewski-Szmek 903ce8
        elif 'shutdown' in n:
Zbigniew Jędrzejewski-Szmek 070811
            o = outputs['standalone-shutdown']
Zbigniew Jędrzejewski-Szmek 903ce8
        else:
Zbigniew Jędrzejewski-Szmek 903ce8
            assert False, 'Found .standalone not belonging to known packages'
Zbigniew Jędrzejewski-Szmek 903ce8
Zbigniew Jędrzejewski-Szmek 903ce8
    elif '/security/pam_' in n or '/man8/pam_' in n:
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['pam']
Zbigniew Jędrzejewski-Szmek ced923
    elif '/rpm/' in n:
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['rpm-macros']
Zbigniew Jędrzejewski-Szmek 17a6f3
    elif '/usr/lib/systemd/tests' in n:
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['tests']
Zbigniew Jędrzejewski-Szmek 903ce8
    elif 'ukify' in n:
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['ukify']
Zbigniew Jędrzejewski-Szmek 3c4f94
    elif re.search(r'/libsystemd-(shared|core)-.*\.so$', n):
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['main']
Zbigniew Jędrzejewski-Szmek 98684a
    elif re.search(r'/libcryptsetup-token-systemd-.*\.so$', n):
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['udev']
Zbigniew Jędrzejewski-Szmek 0078f9
    elif re.search(r'/lib.*\.pc|/man3/|/usr/include|\.so$', n):
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['devel']
Zbigniew Jędrzejewski-Szmek 17a6f3
    elif re.search(r'''journal-(remote|gateway|upload)|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       systemd-remote\.conf|
Yu Watanabe 9653e1
                       /usr/share/systemd/gatewayd|
Yu Watanabe 9653e1
                       /var/log/journal/remote
Zbigniew Jędrzejewski-Szmek 17a6f3
    ''', n, re.X):
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['remote']
Zbigniew Jędrzejewski-Szmek 0078f9
Zbigniew Jędrzejewski-Szmek 17a6f3
    elif re.search(r'''mymachines|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       machinectl|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       systemd-nspawn|
Zbigniew Jędrzejewski-Szmek 1c9810
                       systemd-vmspawn|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       import-pubring.gpg|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       systemd-(machined|import|pull)|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       /machine.slice|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       /machines.target|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       var-lib-machines.mount|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       org.freedesktop.(import|machine)1
Zbigniew Jędrzejewski-Szmek 17a6f3
    ''', n, re.X):
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['container']
Zbigniew Jędrzejewski-Szmek 0078f9
Zbigniew Jędrzejewski-Szmek f93a13
    # .network.example files go into systemd-networkd, and the matching files
Zbigniew Jędrzejewski-Szmek f93a13
    # without .example go into systemd-networkd-defaults
Zbigniew Jędrzejewski-Szmek f93a13
    elif (re.search(r'''/usr/lib/systemd/network/.*\.network$''', n)
Zbigniew Jędrzejewski-Szmek f93a13
          and os.path.exists(f'./{n}.example')):
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['networkd-defaults']
Zbigniew Jędrzejewski-Szmek f93a13
Zbigniew Jędrzejewski-Szmek f93a13
    elif re.search(r'''/usr/lib/systemd/network/.*\.network|
Dusty Mabe 283a99
                       networkd|
Dusty Mabe 283a99
                       networkctl|
Zbigniew Jędrzejewski-Szmek 04e285
                       org.freedesktop.network1|
901acf
                       sysusers\.d/systemd-network.conf|
77e121
                       tmpfiles\.d/systemd-network.conf|
77e121
                       systemd\.network|
77e121
                       systemd\.netdev
Dusty Mabe 283a99
    ''', n, re.X):
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['networkd']
Zbigniew Jędrzejewski-Szmek 0078f9
Zbigniew Jędrzejewski-Szmek 17a6f3
    elif '.so.' in n:
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['libs']
Zbigniew Jędrzejewski-Szmek b24b99
Zbigniew Jędrzejewski-Szmek 5cae6a
    elif re.search(r'10-oomd-.*defaults.conf|lib/systemd/oomd.conf.d', n, re.X):
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['oomd-defaults']
Zbigniew Jędrzejewski-Szmek 5cae6a
Zbigniew Jędrzejewski-Szmek 17a6f3
    elif re.search(r'''udev(?!\.pc)|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       hwdb|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       bootctl|
Zbigniew Jędrzejewski-Szmek 711d92
                       boot-update|
Zbigniew Jędrzejewski-Szmek aed571
                       bless-boot|
Zbigniew Jędrzejewski-Szmek aed571
                       boot-system-token|
Zbigniew Jędrzejewski-Szmek 408115
                       bsod|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       kernel-install|
Zbigniew Jędrzejewski-Szmek f66faf
                       installkernel|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       vconsole|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       backlight|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       rfkill|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       random-seed|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       modules-load|
Yu Watanabe 9653e1
                       timesync|
Zbigniew Jędrzejewski-Szmek b24b99
                       crypttab|
David Tardon 4a979f
                       cryptenroll|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       cryptsetup|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       kmod|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       quota|
Zbigniew Jędrzejewski-Szmek db1cfc
                       pstore|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       sleep|suspend|hibernate|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       systemd-tmpfiles-setup-dev|
Thomas Haller aff167
                       network/98-default-mac-none.link|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       network/99-default.link|
Zbigniew Jędrzejewski-Szmek db1cfc
                       growfs|makefs|makeswap|mkswap|
Zbigniew Jędrzejewski-Szmek db1cfc
                       fsck|
Zbigniew Jędrzejewski-Szmek db1cfc
                       repart|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       gpt-auto|
Zbigniew Jędrzejewski-Szmek db1cfc
                       volatile-root|
Zbigniew Jędrzejewski-Szmek b24b99
                       veritysetup|
Zbigniew Jędrzejewski-Szmek b24b99
                       integritysetup|
Zbigniew Jędrzejewski-Szmek b24b99
                       integritytab|
Zbigniew Jędrzejewski-Szmek db1cfc
                       remount-fs|
Zbigniew Jędrzejewski-Szmek 0b51ec
                       /initrd|
Zbigniew Jędrzejewski-Szmek e8cc28
                       systemd-pcr|
Zbigniew Jędrzejewski-Szmek b2ad8f
                       systemd-measure|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       /boot$|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       /kernel/|
Zbigniew Jędrzejewski-Szmek 17a6f3
                       /kernel$|
Zbigniew Jędrzejewski-Szmek b24b99
                       /modprobe.d|
Zbigniew Jędrzejewski-Szmek b24b99
                       binfmt|
Zbigniew Jędrzejewski-Szmek b24b99
                       sysctl|
Zbigniew Jędrzejewski-Szmek b24b99
                       coredump|
Zbigniew Jędrzejewski-Szmek b24b99
                       homed|home1|
Zbigniew Jędrzejewski-Szmek 5cae6a
                       oomd|
Zbigniew Jędrzejewski-Szmek b24b99
                       portabled|portable1
Zbigniew Jędrzejewski-Szmek b24b99
    ''', n, re.X):     # coredumpctl, homectl, portablectl are included in the main package because
Zbigniew Jędrzejewski-Szmek b24b99
                       # they can be used to interact with remote daemons. Also, the user could be
Zbigniew Jędrzejewski-Szmek b24b99
                       # confused if those user-facing binaries are not available.
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['udev']
Zbigniew Jędrzejewski-Szmek b24b99
Zbigniew Jędrzejewski-Szmek 7a8193
    elif re.search(r'''/boot/efi|
Zbigniew Jędrzejewski-Szmek 1a6178
                       /usr/lib/systemd/boot|
Zbigniew Jędrzejewski-Szmek 7a8193
                       sd-boot|systemd-boot\.|loader.conf
Zbigniew Jędrzejewski-Szmek 7a8193
    ''', n, re.X):
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['boot']
Zbigniew Jędrzejewski-Szmek 54a3b6
Zbigniew Jędrzejewski-Szmek b24b99
    elif re.search(r'''resolved|resolve1|
be0f56
                       systemd-resolve|
be0f56
                       resolvconf|
Zbigniew Jędrzejewski-Szmek b24b99
                       systemd\.(positive|negative)
Zbigniew Jędrzejewski-Szmek b24b99
    ''', n, re.X):     # resolvectl and nss-resolve are in the main package.
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['resolve']
Zbigniew Jędrzejewski-Szmek b24b99
Zbigniew Jędrzejewski-Szmek 17a6f3
    else:
Zbigniew Jędrzejewski-Szmek 070811
        o = outputs['main']
Zbigniew Jędrzejewski-Szmek 17a6f3
Zbigniew Jędrzejewski-Szmek 17a6f3
    if n in known_files:
Zbigniew Jędrzejewski-Szmek 4c7acd
        prefix = known_files[n].split()[:-1]
Zbigniew Jędrzejewski-Szmek 17a6f3
    elif file.is_dir() and not file.is_symlink():
Zbigniew Jędrzejewski-Szmek 4c7acd
        prefix = ['%dir']
Zbigniew Jędrzejewski-Szmek c6e8c3
    elif 'README' in n:
Zbigniew Jędrzejewski-Szmek 4c7acd
        prefix = ['%doc']
Zbigniew Jędrzejewski-Szmek 17a6f3
    elif n.startswith('/etc'):
Zbigniew Jędrzejewski-Szmek 4c7acd
        prefix = ['%config(noreplace)']
Zbigniew Jędrzejewski-Szmek 4c7acd
        if file.stat().st_size == 0:
Zbigniew Jędrzejewski-Szmek 4c7acd
            prefix += ['%ghost']
Zbigniew Jędrzejewski-Szmek 17a6f3
    else:
Zbigniew Jędrzejewski-Szmek 4c7acd
        prefix = []
Zbigniew Jędrzejewski-Szmek 4c7acd
    prefix = ' '.join(prefix + ['']) if prefix else ''
Zbigniew Jędrzejewski-Szmek 17a6f3
Zbigniew Jędrzejewski-Szmek 17a6f3
    suffix = '*' if '/man/' in n else ''
Zbigniew Jędrzejewski-Szmek 17a6f3
Zbigniew Jędrzejewski-Szmek 17a6f3
    print(f'{prefix}{n}{suffix}', file=o)
Zbigniew Jędrzejewski-Szmek 0e8fc1
Zbigniew Jędrzejewski-Szmek 0e8fc1
if [print(f'ERROR: no file names were written to {o.name}')
Zbigniew Jędrzejewski-Szmek 453bbc
    for name, o in outputs.items()
Zbigniew Jędrzejewski-Szmek 453bbc
    if (o.tell() == 0 and
Zbigniew Jędrzejewski-Szmek a3dfa1
        not (no_bootloader and name in ('ukify', 'boot')))
Zbigniew Jędrzejewski-Szmek 453bbc
    ]:
Zbigniew Jędrzejewski-Szmek 0e8fc1
    sys.exit(1)