[PATCH] BZ#1262691 - Added --verbose option to needs-restarting

Sean O'Keeffe seanokeeffe797 at gmail.com
Fri Nov 27 21:53:10 UTC 2015


---
 needs-restarting.py | 84 +++++++++++++++++++++++++++++++++++++++++------------
 yum-utils.spec      |  6 +++-
 2 files changed, 71 insertions(+), 19 deletions(-)

diff --git a/needs-restarting.py b/needs-restarting.py
index b0e540b..a516b6a 100755
--- a/needs-restarting.py
+++ b/needs-restarting.py
@@ -57,6 +57,8 @@ def parseargs(args):
     
     parser.add_option("-u", "--useronly", default=False, action="store_true",
       help='show processes for my userid only')
+    parser.add_option("-v", "--verbose", default=False, action="store_true",
+      help='show verbose output including library & source package')
     
     (opts, args) = parser.parse_args(args)
     return (opts, args)
@@ -98,6 +100,23 @@ def get_open_files(pid):
             files.append(filename)
     return files
 
+def getlength(position,lst):
+    hold_lens = []
+    found = len(lst)
+    for i in range(found):
+        lens = len(zip(lst[i][position]))
+        hold_lens.append(lens)
+    return max(hold_lens)
+
+def getcmdline(pid):
+    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))
+    # proc cmdline is null-delimited so clean that up
+    cmdline = cmdline.replace('\000', ' ')
+    return cmdline
+
 def main(args):
     (opts, args)  = parseargs(args)
 
@@ -112,7 +131,7 @@ def main(args):
         my.setCacheDir()
     my.conf.cache = True
     
-    needing_restart = set()
+    needing_restart = []
 
     boot_time = utils.get_boot_time()
     for pid in return_running_pids(uid=myuid):
@@ -130,7 +149,7 @@ def main(args):
             # 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)
+                    needing_restart.append([pid, just_fn, pkg.name])
                     found_match = True
                     continue
                 if just_fn in pkg.ghostlist:
@@ -144,7 +163,7 @@ def main(args):
             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)
+                    needing_restart.append([pid, just_fn, pkg.name])
                     found_match = True
                     continue
 
@@ -155,24 +174,53 @@ def main(args):
                     if just_fn in oldpkg.ghostlist:
                         continue
                     if my.rpmdb.installed(oldpkg.name):
-                        needing_restart.add(pid)
+                        needing_restart.append([pid, just_fn, pkg.name])
                         found_match = True
                         break
 
-           
-            
-    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 needing_restart:
+        # get width of output
+        hold_lens = []
+        for pid,lib,pkg in needing_restart:
+            cmdline = getcmdline(pid)
+            lens = len(cmdline)
+            hold_lens.append(lens)
+            cmdwidth = max(hold_lens)
+
+        pidwidth = getlength(0,needing_restart)
+        libwidth = 0
+        pkgwidth = 0
+        spacer = 2
+        if opts.verbose:
+            libwidth = getlength(1,needing_restart)
+            pkgwidth = getlength(2,needing_restart)
+            spacer = 6
+
+        width = pidwidth + libwidth + pkgwidth + cmdwidth
+
+        print '-' * (width + spacer)
+        if opts.verbose:
+            print '{pid:{widthpid}}  {cmd:{widthcmd}}  {lib:{widthlib}}  {pkg:{widthpkg}}'.format(pid='PID', widthpid=pidwidth,
+              cmd='CMD', widthcmd=cmdwidth, lib='Library', widthlib=libwidth, pkg='Package', widthpkg=pkgwidth)
+        else:
+            print '{pid:{widthpid}}  {cmd:{widthcmd}}'.format(pid='PID', widthpid=pidwidth, cmd='CMD', widthcmd=cmdwidth)
+        print '-' * (width + spacer)
+
+        for pid,lib,pkg in needing_restart:
+            cmdline = getcmdline(pid)
+            if opts.verbose:
+                print '{pid:{widthpid}}  {cmd:{widthcmd}}  {lib:{widthlib}}  {pkg:{widthpkg}}'.format(pid=pid, widthpid=pidwidth,
+                  cmd=cmdline, widthcmd=cmdwidth, lib=lib, widthlib=libwidth, pkg=pkg, widthpkg=pkgwidth)
+            else:
+                print '{pid:{widthpid}}  {cmd:{widthcmd}}'.format(pid=pid, widthpid=pidwidth, cmd=cmdline, widthcmd=cmdwidth)
+
+        return 0
+    else:
+        if opts.verbose:
+            print 'No programs that started running before they or some component they use were updated.'
+       
 if __name__ == "__main__":
     try:
         sys.exit(main(sys.argv))
diff --git a/yum-utils.spec b/yum-utils.spec
index 193110b..f0c8da5 100644
--- a/yum-utils.spec
+++ b/yum-utils.spec
@@ -9,7 +9,7 @@
 
 Summary: Utilities based around the yum package manager
 Name: yum-utils
-Version: 1.1.31
+Version: 1.1.32
 Release: 1%{?dist}
 License: GPLv2+
 Group: Development/Tools
@@ -702,6 +702,10 @@ fi
 %{_mandir}/man1/yum-ovl.1.*
 
 %changelog
+* Fri Nov 27 2015 Sean O'Keeffe <seanokeeffe797 at gmail.com> 
+- mark as 1.1.32
+- Added --verbose option to needs-restarting
+
 * Thu Aug 10 2011 Tim Lauridsen <timlau at fedoraproject.org> 
 - mark as 1.1.31
 
-- 
2.5.0



More information about the Yum-devel mailing list