Changeset 1271 for pykota/trunk/pykota
- Timestamp:
- 01/12/04 00:22:42 (20 years ago)
- Location:
- pykota/trunk/pykota
- Files:
-
- 4 modified
Legend:
- Unmodified
- Added
- Removed
-
pykota/trunk/pykota/accounter.py
r1257 r1271 22 22 # 23 23 # $Log$ 24 # Revision 1.11 2004/01/11 23:22:42 jalet 25 # Major code refactoring, it's way cleaner, and now allows automated addition 26 # of printers on first print. 27 # 24 28 # Revision 1.10 2004/01/08 14:10:32 jalet 25 29 # Copyright year changed. … … 69 73 self.filter = kotafilter 70 74 self.arguments = arguments 75 self.isDelayed = 0 # Accounting is immediate by default 71 76 72 77 def getLastPageCounter(self) : … … 76 81 except : 77 82 return 0 78 79 def filterInput(self, inputfile) :80 """Transparent filter."""81 mustclose = 082 if inputfile is not None :83 if hasattr(inputfile, "read") :84 infile = inputfile85 else :86 infile = open(inputfile, "rb")87 mustclose = 188 else :89 infile = sys.stdin90 data = infile.read(256*1024)91 while data :92 sys.stdout.write(data)93 data = infile.read(256*1024)94 if mustclose :95 infile.close()96 83 97 def beginJob(self, printer, user) :84 def beginJob(self, userpquota) : 98 85 """Saves the computed job size.""" 99 86 # computes job's size … … 101 88 102 89 # get last job information for this printer 103 if not printer.LastJob.Exists :90 if not userpquota.Printer.LastJob.Exists : 104 91 # The printer hasn't been used yet, from PyKota's point of view 105 92 self.LastPageCounter = 0 … … 108 95 # Last lifetime page counter before actual job is 109 96 # last page counter + last job size 110 self.LastPageCounter = int( printer.LastJob.PrinterPageCounter or 0) + int(printer.LastJob.JobSize or 0)97 self.LastPageCounter = int(userpquota.Printer.LastJob.PrinterPageCounter or 0) + int(userpquota.Printer.LastJob.JobSize or 0) 111 98 112 def endJob(self, printer, user) :99 def endJob(self, userpquota) : 113 100 """Do nothing.""" 114 101 pass … … 121 108 return 0 122 109 123 def doAccounting(self, printer, user) :124 """Dele tgates the computation of the job size to an external command.110 def doAccounting(self, userpquota) : 111 """Delegates the computation of the job size to an external command. 125 112 126 113 The command must print the job size on its standard output and exit successfully. 127 114 """ 128 self.beginJob( printer, user)115 self.beginJob(userpquota) 129 116 130 117 # get the job size, which is real job size * number of copies. 118 # TODO : Double check with CUPS documentation : this is not always correct 131 119 jobsize = self.getJobSize() * self.filter.copies 132 120 133 121 # Is the current user allowed to print at all ? 134 userpquota = self.filter.storage.getUserPQuota(user, printer)135 122 action = self.filter.warnUserPQuota(userpquota) 136 123 … … 142 129 143 130 # adds the current job to history 144 jobprice = (float( printer.PricePerPage or 0.0) * jobsize) + float(printer.PricePerJob or 0.0)145 printer.addJobToHistory(self.filter.jobid, user, self.getLastPageCounter(), action, jobsize, jobprice, self.filter.preserveinputfile, self.filter.title, self.filter.copies, self.filter.options)146 self.endJob( printer, user)131 jobprice = (float(userpquota.Printer.PricePerPage or 0.0) * jobsize) + float(userpquota.Printer.PricePerJob or 0.0) 132 userpquota.Printer.addJobToHistory(self.filter.jobid, userpquota.User, self.getLastPageCounter(), action, jobsize, jobprice, self.filter.preserveinputfile, self.filter.title, self.filter.copies, self.filter.options) 133 self.endJob(userpquota) 147 134 return action 148 135 -
pykota/trunk/pykota/accounters/querying.py
r1257 r1271 22 22 # 23 23 # $Log$ 24 # Revision 1.12 2004/01/11 23:22:42 jalet 25 # Major code refactoring, it's way cleaner, and now allows automated addition 26 # of printers on first print. 27 # 24 28 # Revision 1.11 2004/01/08 14:10:32 jalet 25 29 # Copyright year changed. … … 69 73 AccounterBase.__init__(self, kotabackend, arguments) 70 74 self.requester = openRequester(kotabackend.config, kotabackend.printername) 75 self.isDelayed = 1 # With the pykota filter, accounting is delayed by one job 71 76 72 77 def getPrinterInternalPageCounter(self) : … … 89 94 return counter 90 95 91 def beginJob(self, printer, user) :96 def beginJob(self, userpquota) : 92 97 """Saves printer internal page counter at start of job.""" 93 98 # save page counter before job 94 99 self.LastPageCounter = self.counterbefore = self.getPrinterInternalPageCounter() 95 100 96 def endJob(self, printer, user) :101 def endJob(self, userpquota) : 97 102 """Saves printer internal page counter at end of job.""" 98 103 # save page counter after job … … 122 127 return jobsize 123 128 124 def doAccounting(self, printer, user) :129 def doAccounting(self, userpquota) : 125 130 """Does print accounting and returns if the job status is ALLOW or DENY.""" 126 131 # Get the page counter directly from the printer itself 127 # Tries MAXTRIES times, sleeping two seconds each time, in case the printer is sleeping. 128 # This was seen with my Apple LaserWriter 16/600 PS which doesn't answer before having warmed up. 129 counterbeforejob = self.getPrinterInternalPageCounter() 132 counterbeforejob = self.getPrinterInternalPageCounter() or 0 130 133 131 # get last job information for this printer132 if not printer.LastJob.Exists :133 # The printer hasn't been used yet, from PyKota's point of view134 lastuser = user135 lastpagecounter = counterbeforejob136 else :137 # get last values from Quota Storage138 lastuser = printer.LastJob.User139 lastpagecounter = printer.LastJob.PrinterPageCounter140 141 # if printer is off then we assume the correct counter value is the last one142 if counterbeforejob is None :143 counterbeforejob = lastpagecounter144 145 # if the internal lifetime page counter for this printer is 0146 # then this may be a printer with a volatile counter (never147 # saved to NVRAM) which has just been switched off and then on148 # so we use the last page counter from the Quota Storage instead149 # explanation at : http://web.mit.edu/source/third/lprng/doc/LPRng-HOWTO-15.html150 if counterbeforejob == 0 :151 counterbeforejob = lastpagecounter152 153 # Computes the last job size as the difference between internal page154 # counter in the printer and last page counter taken from the Quota155 # Storage database for this particular printer156 try :157 jobsize = (counterbeforejob - lastpagecounter)158 except TypeError :159 # never used, and internal page counter not accessible160 jobsize = 0161 162 if jobsize < 0 :163 # Probably an HP printer which was switched off and back on,164 # its primary counter is only saved in a 10 increment, so165 # it may be lower than the last page counter saved in the166 # Quota Storage.167 # We unconditionnally set the last job's size to168 # abs(int((10 - abs(lastcounter(snmp) - lastcounter(storage)) / 2))169 # For more accurate accounting, don't switch off your HP printers !170 # explanation at : http://web.mit.edu/source/third/lprng/doc/LPRng-HOWTO-15.html171 self.filter.logger.log_message(_("Error in page count value %i for user %s on printer %s") % (jobsize, lastuser.Name, self.filter.printername), "error")172 jobsize = abs(int((10 - abs(jobsize)) / 2)) # Workaround for HP printers' feature !173 174 # update the quota for the previous user on this printer175 lastuserquota = self.filter.storage.getUserPQuota(lastuser, printer)176 if lastuserquota.Exists :177 lastuserquota.increasePagesUsage(jobsize)178 179 # update the last job size in the history180 if printer.LastJob.Exists :181 printer.LastJob.setSize(jobsize)182 183 # warns the last user if he is over quota184 if lastuserquota.Exists :185 self.filter.warnUserPQuota(lastuserquota)186 187 134 # Is the current user allowed to print at all ? 188 action = self.filter.warnUserPQuota( self.filter.storage.getUserPQuota(user, printer))135 action = self.filter.warnUserPQuota(userpquota) 189 136 190 137 # adds the current job to history 191 printer.addJobToHistory(self.filter.jobid, user, counterbeforejob, action, filename=self.filter.preserveinputfile, title=self.filter.title, copies=self.filter.copies, options=self.filter.options)138 userpquota.Printer.addJobToHistory(self.filter.jobid, userpquota.User, counterbeforejob, action, filename=self.filter.preserveinputfile, title=self.filter.title, copies=self.filter.copies, options=self.filter.options) 192 139 return action 193 140 -
pykota/trunk/pykota/tool.py
r1257 r1271 22 22 # 23 23 # $Log$ 24 # Revision 1.71 2004/01/11 23:22:42 jalet 25 # Major code refactoring, it's way cleaner, and now allows automated addition 26 # of printers on first print. 27 # 24 28 # Revision 1.70 2004/01/08 14:10:32 jalet 25 29 # Copyright year changed. … … 775 779 self.logger.log_message(_("User %s doesn't have quota on printer %s in the PyKota system, applying external policy (%s) for printer %s") % (self.username, self.printername, commandline, self.printername), "info") 776 780 if os.system(commandline) : 777 # if an error occured, we die without error,778 # so that the job doesn't stop the print queue.779 781 self.logger.log_message(_("External policy %s for printer %s produced an error. Job rejected. Please check PyKota's configuration files.") % (commandline, self.printername), "error") 780 782 policy = "EXTERNALERROR" 781 783 break 782 784 else : 785 if not printer.Exists : 786 self.logger.log_message(_("Printer %s not registered in the PyKota system, applying default policy (%s)") % (self.printername, policy), "info") 787 if not user.Exists : 788 self.logger.log_message(_("User %s not registered in the PyKota system, applying default policy (%s) for printer %s") % (self.username, policy, self.printername), "info") 789 if not userpquota.Exists : 790 self.logger.log_message(_("User %s doesn't have quota on printer %s in the PyKota system, applying default policy (%s)") % (self.username, self.printername, policy), "info") 783 791 break 792 if policy == "EXTERNAL" : 793 if not printer.Exists : 794 self.logger.log_message(_("Printer %s still not registered in the PyKota system, job will be rejected") % self.printername, "info") 795 if not user.Exists : 796 self.logger.log_message(_("User %s still not registered in the PyKota system, job will be rejected on printer %s") % (self.username, self.printername), "info") 797 if not userpquota.Exists : 798 self.logger.log_message(_("User %s still doesn't have quota on printer %s in the PyKota system, job will be rejected") % (self.username, self.printername), "info") 784 799 return (policy, printer, user, userpquota) 785 800 786 def main (self) :801 def mainWork(self) : 787 802 """Main work is done here.""" 788 803 (policy, printer, user, userpquota) = self.getPrinterUserAndUserPQuota() 804 # TODO : check for last user's quota in case pykota filter is used with querying 789 805 if policy == "EXTERNALERROR" : 790 806 # Policy was 'EXTERNAL' and the external command returned an error code 791 pass # TODO : reject job807 return self.removeJob() 792 808 elif policy == "EXTERNAL" : 793 809 # Policy was 'EXTERNAL' and the external command wasn't able 794 810 # to add either the printer, user or user print quota 795 pass # TODO : reject job 796 elif policy == "ALLOW": 797 # Either printer, user or user print quota doesn't exist, 798 # but the job should be allowed anyway. 799 pass # TODO : accept job 800 elif policy == "OK" : 801 # Both printer, user and user print quota exist, job should 802 # be allowed if current user is allowed to print on this 803 # printer 804 pass # TODO : decide what to do based on user quota. 805 else : # DENY 811 return self.removeJob() 812 elif policy == "DENY" : 806 813 # Either printer, user or user print quota doesn't exist, 807 814 # and the job should be rejected. 808 pass # TODO : reject job 815 return self.removeJob() 816 else : 817 if policy not in ("OK", "ALLOW") : 818 self.logger.log_message(_("Invalid policy %s for printer %s") % (policy, self.printername)) 819 return self.removeJob() 820 else : 821 return self.doWork(policy, printer, user, userpquota) -
pykota/trunk/pykota/version.py
r1269 r1271 22 22 # 23 23 24 __version__ = "1.16alpha2 3_unofficial"24 __version__ = "1.16alpha24_unofficial" 25 25 26 26 __doc__ = """PyKota : a complete Printing Quota Solution for CUPS and LPRng."""