Mass Deface
Email Grabber
>sys.stderr, "Could not open %s" % smaps
return files
for line in maps:
slash = line.find('/')
if slash == -1 or line.find('00:') != -1: # if we don't have a '/' or if we fine 00: in the file then it's not _REALLY_ a file
continue
line = line.replace('\n', '')
filename = line[slash:]
filename = filename.split(';')[0]
filename = filename.strip()
if filename not in files:
files.append(filename)
return files
def get_service(pid):
"""Return the systemd service to which the process belongs.
More details:
http://0pointer.de/blog/projects/systemd-for-admins-2.html
https://www.freedesktop.org/wiki/Software/systemd/FrequentlyAskedQuestions/
"""
fname = '/proc/%s/cgroup' % pid
try:
with open(fname, 'r') as f:
groups = f.readlines()
except (IOError, OSError), e:
print >>sys.stderr, "Could not open %s" % fname
return None
for line in groups:
line = line.replace('\n', '')
hid, hsub, cgroup = line.split(':')
if hsub == 'name=systemd':
name = cgroup.split('/')[-1]
if name.endswith('.service'):
return name
return None
def main(args):
(opts, args) = parseargs(args)
my = yum.YumBase()
my.preconf.init_plugins=False
if hasattr(my, 'setCacheDir'):
my.setCacheDir()
my.conf.cache = True
myuid = None
if opts.useronly:
myuid = os.getuid()
boot_time = utils.get_boot_time()
if opts.reboothint:
needing_reboot = set()
for pkg in my.rpmdb.searchNames(REBOOTPKGS):
if float(pkg.installtime) > float(boot_time):
needing_reboot.add(pkg)
if needing_reboot:
print 'Core libraries or services have been updated:'
for pkg in needing_reboot:
print ' %s ->' % pkg.name, pkg.printVer()
print
print 'Reboot is required to ensure that your system benefits',
print 'from these updates.'
print
print 'More information:'
print 'https://access.redhat.com/solutions/27943'
return 1
else:
print 'No core libraries or services have been updated.'
print 'Reboot is probably not necessary.'
return 0
needing_restart = set()
for pid in return_running_pids(uid=myuid):
try:
pid_start = utils.get_process_time(int(pid), boot_time)['start_time']
except (OSError, IOError), e:
continue
found_match = False
for fn in get_open_files(pid):
if found_match:
break
just_fn = fn.replace('(deleted)', '')
just_fn = just_fn.strip()
bogon = False
# if the file is in a pkg which has been updated since we started the pid - then it needs to be restarted
for pkg in my.rpmdb.searchFiles(just_fn):
if float(pkg.installtime) > float(pid_start):
needing_restart.add(pid)
found_match = True
continue
if just_fn in pkg.ghostlist:
bogon = True
break
if bogon:
continue
# if the file is deleted
if fn.find('(deleted)') != -1:
# and it is from /*bin/* then it needs to be restarted
if yum.misc.re_primary_filename(just_fn):
needing_restart.add(pid)
found_match = True
continue
# if the file is from an old ver of an installed pkg - then assume it was just updated but the
# new pkg doesn't have the same file names. Fabulous huh?!
my.conf.cache = False
for oldpkg in my.pkgSack.searchFiles(just_fn): # ghostfiles are always bogons
if just_fn in oldpkg.ghostlist:
continue
if my.rpmdb.installed(oldpkg.name):
needing_restart.add(pid)
found_match = True
break
if opts.services:
names = set([get_service(pid) for pid in needing_restart])
for name in names:
if name is not None:
print name
return 0
for pid in needing_restart:
try:
cmdline = open('/proc/' +pid+ '/cmdline', 'r').read()
except (OSError, IOError), e:
print >>sys.stderr, "Couldn't access process information for %s: %s" % (pid, str(e))
continue
# proc cmdline is null-delimited so clean that up
cmdline = cmdline.replace('\000', ' ')
print '%s : %s' % (pid, cmdline)
return 0
if __name__ == "__main__":
try:
sys.exit(main(sys.argv))
except RepoError, e:
print >>sys.stderr, e
sys.exit(1)