Xs-rpmlint-2012-11-19-output
[zyu26@localhost SPECS]$ rpmlint -i ~/rpmbuild/RPMS/noarch/ds-backup-server-0.11.5.g536d1d6-3.fc17.noarch.rpm
ds-backup-server.noarch: E: script-without-shebang /var/www/ds-backup/backup-available.py This text file has executable bits set or is located in a path dedicated for executables, but lacks a shebang and cannot thus be executed. If the file is meant to be an executable script, add the shebang, otherwise remove the executable bits or move the file elsewhere.
ds-backup-server.noarch: W: no-manual-page-for-binary ds-postprocess.py Each executable in standard binary directories should have a man page.
ds-backup-server.noarch: W: no-manual-page-for-binary ds-cleanup.sh Each executable in standard binary directories should have a man page.
ds-backup-server.noarch: W: no-manual-page-for-binary ds-cleanup.py Each executable in standard binary directories should have a man page.
1 packages and 0 specfiles checked; 1 errors, 3 warnings.
The backup-available.py file is in "server" directory: $ ls -ld server drwxr-xr-x. 2 zyu26 zyu26 4096 Feb 10 2012 server ls -l server total 40 -rw-r--r--. 1 zyu26 zyu26 451 Feb 10 2012 apache-ds-backup.conf -rw-r--r--. 1 zyu26 zyu26 2144 Feb 10 2012 backup-available.py -rw-r--r--. 1 zyu26 zyu26 253 Feb 10 2012 cron-ds-backup-server.conf -rwxr-xr-x. 1 zyu26 zyu26 322 Feb 10 2012 ds-backup.setup.sh -rwxr-xr-x. 1 zyu26 zyu26 6595 Feb 10 2012 ds-cleanup.py -rwxr-xr-x. 1 zyu26 zyu26 1312 Feb 10 2012 ds-cleanup.sh -rwxr-xr-x. 1 zyu26 zyu26 3650 Feb 10 2012 ds-postprocess.py -rw-r--r--. 1 zyu26 zyu26 394 Feb 10 2012 incron-ds-backup.comments -rw-r--r--. 1 zyu26 zyu26 84 Feb 10 2012 incron-ds-backup.conf $ cat backup-available.py # this is not a cgi script # will only work as a mod_python handler from mod_python import apache import os import re import pwd import random def handler(req): recentclientsdir = '/var/lib/ds-backup/recentclients' basehomedir = '/library/users' req.content_type= 'text/plain' # max 5% loadavg if (os.getloadavg()[0] > 5): return apache.HTTP_SERVICE_UNAVAILABLE # we need at least a few blocks... libstat = os.statvfs(basehomedir); usedblockspc = 1 - float(libstat[4])/libstat[2] usedfnodespc = 1 - float(libstat[7])/libstat[5] if (usedblockspc > 0.9 or usedfnodespc > 0.9): return apache.HTTP_SERVICE_UNAVAILABLE # Limit concurrent rsync clients # We touch a file with the client identifier # every time we reply with a 200 OK. So # we can check for recent "OKs". # (clients that retry the rsync transfer won't # re-request this url, anyway.) clientcount = os.system('find ' + recentclientsdir + ' -mmin -5 -type f | wc -l'); if (clientcount > 10 ): return apache.HTTP_SERVICE_UNAVAILABLE # Read the XO SN req.add_common_vars() pathinfo = req.subprocess_env['PATH_INFO'] m = re.match('/available/(\w+)$', pathinfo) if (m): # req.log_error(clientid) clientid = m.group(1) else: # We don't like your SN return apache.HTTP_FORBIDDEN # Have we got a user acct for the user? try: homedir = pwd.getpwnam(clientid)[5] except KeyError: return apache.HTTP_FORBIDDEN # check the homedir is in the right place m = re.match(basehomedir, homedir) if (not m): return apache.HTTP_FORBIDDEN #return apache.HTTP_UNAUTHORIZED #return apache.HTTP_FORBIDDEN #return apache.HTTP_VERSION_NOT_SUPPORTED # req.write('') os.system('touch ' + recentclientsdir + '/' + clientid) # TODO: 1 in 10, cleanup recentclients dir if (random.randint(0,10) == 1): os.system('find ' + recentclientsdir + ' -type f -mmin +10 -print0 | xargs -0 -n 100 --no-run-if-empty rm' ) return apache.OK