#!/usr/bin/env python # Author:Anand babu # Date: 26 Jun 2008 # Updates freeipmi download counter through cron # License: GNU GPL v3 or later import string import os import gzip import glob import md5 import pickle OUTPUT_FILE="/home/www.gluster.org/glusterfs-download-counter.txt" ROOT_PATH="/home/ftp/pub/gluster/glusterfs" LOG_WEB="/var/log/apache/ftp.zresearch.com-access.log*" LOG_FTP="/var/log/xferlog*" ## PATTERNS: glusterfs-n.n.n.tar.gz, glusterfs-CURRENT.tar.gz, glusterfs-n.n.n.tar.gz, glusterfs-server*.rpm, glusterfs-debuginfo*rpm RELEASE_LIST_CMD='find '+ROOT_PATH+' -regex ".*glusterfs-[0-9Csd].*\.rpm" -or -regex ".*glusterfs-[a-zA-Z0-9].*\.tar\.gz"' COUNTERDB_FILE='/var/cache/glusterfs-download-counter/counter-db.pkl' class CounterDB: cdb={} def loadDB(self): try: fobj=open(COUNTERDB_FILE, 'rb') self.cdb=pickle.load(fobj) fobj.close() except IOError: self.cdb={} def saveDB(self): fobj=open(COUNTERDB_FILE, 'wb') pickle.dump(self.cdb, fobj) fobj.close(); def set(self, hash, hits): self.cdb[hash]=hits def get(self, hash): try: return self.cdb[hash] except KeyError: return -1 class GlusterDownloadCounter: release_files=[] totalDownloads=0 cdb=CounterDB() def __init__(self): fd=os.popen(RELEASE_LIST_CMD) _release_files=fd.read().split('\n')[:-1] fd.close() for release in _release_files: _release=release.split("/")[-1] self.release_files.append(_release) self.cdb.loadDB() def md5sumFile(self, filename): fobj=open(filename) mobj = md5.new() while True: block = fobj.read(8096) if not block: break mobj.update(block) fobj.close() return mobj.hexdigest() def readLog(self, filename): if filename.endswith(".gz"): fobj = gzip.GzipFile(filename, 'rb') else: fobj = open(filename, 'rb') pattern=fobj.read() fobj.close() return pattern.split('\n') def updateDownloads(self): self.totalDownloads=0 for fname in glob.glob(LOG_FTP): perFileCount=0 md5=self.md5sumFile(fname) count=self.cdb.get(md5) if count>=0: self.totalDownloads=self.totalDownloads+count continue lines=self.readLog(fname) for line in lines: if line.find("glusterfs-")<0: continue for release in self.release_files: if line.find(release+" ")>=0: self.totalDownloads=self.totalDownloads+1 perFileCount=perFileCount+1 break self.cdb.set(md5, perFileCount) for fname in glob.glob(LOG_WEB): perFileCount=0 md5=self.md5sumFile(fname) count=self.cdb.get(md5) if count>=0: self.totalDownloads=self.totalDownloads+count continue lines=self.readLog(fname) for line in lines: if line.find("glusterfs-")<0: continue for release in self.release_files: if line.find(release+" ")>=0: if line.find("\" 200 ")>=0: self.totalDownloads=self.totalDownloads+1 perFileCount=perFileCount+1 break self.cdb.set(md5, perFileCount) self.cdb.saveDB() return self.totalDownloads def fileUpdate(self, filename): fobj=open(filename, "w") fobj.write(str(self.updateDownloads())) fobj.close() GlusterDownloadCounter().fileUpdate(OUTPUT_FILE)