Welcome, guest | Sign In | My Account | Store | Cart
#!/bin/env python
import os
import sys
import stat
def set_executable(top):
    def set_exec(name):
        mode = os.stat(name).st_mode
        new_mode = mode
        if new_mode & stat.S_IRUSR:
            new_mode = new_mode | stat.S_IXUSR
        if new_mode & stat.S_IRGRP:
            new_mode = new_mode | stat.S_IXGRP
        if new_mode & stat.S_IROTH:
            new_mode = new_mode | stat.S_IXOTH
        if (mode != new_mode):
            print "Setting exec for '%s' (mode %o => %o)" % (name, mode, new_mode)
            os.chmod(name, new_mode)
    def unset_exec(name):
        mode = os.stat(name).st_mode
        new_mode = mode & ~(stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
        if (mode != new_mode):
            print "Unsetting exec for '%s' (mode %o => %o)" % (name, mode, new_mode)
            os.chmod(name, new_mode)
    for root, dirs, files in os.walk(top):
        for name in files:
            complete_name = os.path.join(root, name)
            f = open(complete_name, 'r')
            header = f.read(4)
            f.close()
            if header[0:2] == '!#' or header[1:4] == 'ELF':
                set_exec(complete_name)
            else:
                unset_exec(complete_name)
        for name in dirs:
            complete_name = os.path.join(root, name)
            set_exec(complete_name)



if len(sys.argv) >= 2:
    for dir in sys.argv[1:]:
        set_executable(sys.argv[1])
else:
    print "Usage\n\t%s <dir1> [dir2|...]\n" % sys.argv[0]
    

Diff to Previous Revision

--- revision 1 2011-08-18 17:41:08
+++ revision 2 2011-08-19 12:05:55
@@ -1,14 +1,26 @@
+#!/bin/env python
 import os
+import sys
 import stat
 def set_executable(top):
     def set_exec(name):
-        print "Setting exec for '%s'" % name
         mode = os.stat(name).st_mode
-        os.chmod(name, mode | stat.S_IEXEC)
+        new_mode = mode
+        if new_mode & stat.S_IRUSR:
+            new_mode = new_mode | stat.S_IXUSR
+        if new_mode & stat.S_IRGRP:
+            new_mode = new_mode | stat.S_IXGRP
+        if new_mode & stat.S_IROTH:
+            new_mode = new_mode | stat.S_IXOTH
+        if (mode != new_mode):
+            print "Setting exec for '%s' (mode %o => %o)" % (name, mode, new_mode)
+            os.chmod(name, new_mode)
     def unset_exec(name):
-        print "Unsetting exec for '%s'" % name
         mode = os.stat(name).st_mode
-        os.chmod(name, mode ^ stat.S_IEXEC)
+        new_mode = mode & ~(stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
+        if (mode != new_mode):
+            print "Unsetting exec for '%s' (mode %o => %o)" % (name, mode, new_mode)
+            os.chmod(name, new_mode)
     for root, dirs, files in os.walk(top):
         for name in files:
             complete_name = os.path.join(root, name)
@@ -22,3 +34,12 @@
         for name in dirs:
             complete_name = os.path.join(root, name)
             set_exec(complete_name)
+
+
+
+if len(sys.argv) >= 2:
+    for dir in sys.argv[1:]:
+        set_executable(sys.argv[1])
+else:
+    print "Usage\n\t%s <dir1> [dir2|...]\n" % sys.argv[0]
+    

History