Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- import os
- from glob import glob
- import tarfile
- from elftools.elf.elffile import ELFFile
- valid_dirs = ['usr/bin/', 'usr/sbin/']
- def _file_has_magic(fileobj, magic_bytes):
- length = len(magic_bytes)
- magic = fileobj.read(length)
- fileobj.seek(0)
- return magic == magic_bytes
- def is_elf(fileobj):
- "Take file object, peek at the magic bytes to check if ELF file."
- return _file_has_magic(fileobj, b"\x7fELF")
- def is_pie(fp):
- elf = ELFFile(fp)
- return elf.header['e_type'] == 'ET_DYN'
- def check_tar(xzfile):
- with tarfile.open(xzfile) as tar:
- for entry in tar:
- if not entry.isfile():
- continue
- in_dir = any(entry.name.startswith(d) for d in valid_dirs)
- if not in_dir:
- continue
- fp = tar.extractfile(entry)
- if not is_elf(fp):
- continue
- elf = ELFFile(fp)
- if elf.header['e_type'] == 'ET_DYN':
- print('{}: PIE'.format(entry.name))
- return True
- else:
- print('{}: Cake is a lie!'.format(entry.name))
- return False
- no_pie = []
- files = glob('/srv/ftp/pool/packages/*.pkg.tar.xz')
- for pkg in files:
- if not check_tar(pkg):
- no_pie.append(os.path.basename(pkg))
- pie = len(files) - len(no_pie)
- print('PIE stats {}/{}'.format(pie, len(files)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement