Changeset 2229

Show
Ignore:
Timestamp:
05/05/05 00:01:38 (19 years ago)
Author:
jerome
Message:

Improved stability and allowed tracebacks in CGI scripts.
Improved pykotme.cgi to display the cost of print jobs when the user is logged-in.

Location:
pykota/trunk
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • pykota/trunk/cgi-bin/dumpykota.cgi

    r2210 r2229  
    127127        else :     
    128128            if wantreport : 
    129                 if self.form.has_key("datatype") : 
    130                     self.options["data"] = self.form["datatype"].value 
    131                 if self.form.has_key("format") : 
    132                     self.options["format"] = self.form["format"].value 
    133                 if self.form.has_key("filter") :     
    134                     self.arguments = self.form["filter"].value.split() 
    135                      
    136                 # when no authentication is done, or when the remote username     
    137                 # is 'root' (even if not run as root of course), then unrestricted 
    138                 # dump is allowed. 
    139                 remuser = os.environ.get("REMOTE_USER", "root")     
    140                 # special hack to accomodate mod_auth_ldap Apache module 
    141129                try : 
    142                     remuser = remuser.split("=")[1].split(",")[0] 
    143                 except IndexError :     
    144                     pass 
    145                 if remuser != "root" : 
    146                     # non-'root' users when the script is password protected 
    147                     # can not dump any data as they like, we restrict them 
    148                     # to their own datas. 
    149                     if self.options["data"] not in ["printers", "pmembers", "groups", "gpquotas"] : 
    150                         self.arguments.append("username=%s" % remuser) 
    151                      
    152                 if self.options["format"] in ("csv", "ssv") : 
    153                     #ctype = "application/vnd.sun.xml.calc"     # OpenOffice.org 
    154                     ctype = "text/comma-separated-values" 
    155                     fname = "dump.csv" 
    156                 elif self.options["format"] == "tsv" : 
    157                     #ctype = "application/vnd.sun.xml.calc"     # OpenOffice.org 
    158                     ctype = "text/tab-separated-values" 
    159                     fname = "dump.tsv" 
    160                 elif self.options["format"] == "xml" : 
    161                     ctype = "text/xml" 
    162                     fname = "dump.xml" 
    163                 elif self.options["format"] == "cups" : 
    164                     ctype = "text/plain" 
    165                     fname = "page_log" 
    166                 print "Content-type: %s" % ctype     
    167                 print "Content-disposition: attachment; filename=%s" % fname  
    168                 print 
    169                 try : 
     130                    if self.form.has_key("datatype") : 
     131                        self.options["data"] = self.form["datatype"].value 
     132                    if self.form.has_key("format") : 
     133                        self.options["format"] = self.form["format"].value 
     134                    if self.form.has_key("filter") :     
     135                        self.arguments = self.form["filter"].value.split() 
     136                         
     137                    # when no authentication is done, or when the remote username     
     138                    # is 'root' (even if not run as root of course), then unrestricted 
     139                    # dump is allowed. 
     140                    remuser = os.environ.get("REMOTE_USER", "root")     
     141                    # special hack to accomodate mod_auth_ldap Apache module 
     142                    try : 
     143                        remuser = remuser.split("=")[1].split(",")[0] 
     144                    except IndexError :     
     145                        pass 
     146                    if remuser != "root" : 
     147                        # non-'root' users when the script is password protected 
     148                        # can not dump any data as they like, we restrict them 
     149                        # to their own datas. 
     150                        if self.options["data"] not in ["printers", "pmembers", "groups", "gpquotas"] : 
     151                            self.arguments.append("username=%s" % remuser) 
     152                         
     153                    if self.options["format"] in ("csv", "ssv") : 
     154                        #ctype = "application/vnd.sun.xml.calc"     # OpenOffice.org 
     155                        ctype = "text/comma-separated-values" 
     156                        fname = "dump.csv" 
     157                    elif self.options["format"] == "tsv" : 
     158                        #ctype = "application/vnd.sun.xml.calc"     # OpenOffice.org 
     159                        ctype = "text/tab-separated-values" 
     160                        fname = "dump.tsv" 
     161                    elif self.options["format"] == "xml" : 
     162                        ctype = "text/xml" 
     163                        fname = "dump.xml" 
     164                    elif self.options["format"] == "cups" : 
     165                        ctype = "text/plain" 
     166                        fname = "page_log" 
     167                    print "Content-type: %s" % ctype     
     168                    print "Content-disposition: attachment; filename=%s" % fname  
     169                    print 
    170170                    self.main(self.arguments, self.options, restricted=0) 
    171                 except PyKotaToolError, msg :     
    172                     print msg 
     171                except : 
     172                    print 'Content-type: text/html\n\n<html><head><title>CGI Error</title></head><body><p><font color="red">%s</font></p></body></html>' % self.crashed("CGI Error").replace("\n", "<br />") 
    173173            else :         
    174174                self.guiDisplay() 
  • pykota/trunk/cgi-bin/printquota.cgi

    r2220 r2229  
    156156        self.body += "<br />" 
    157157        self.body += self.htmlGroupsCheckbox(isgroup) 
    158         if not self.form.has_key("history") : 
    159             if printers and ugmask : 
    160                 self.reportingtool = openReporter(admin, "html", printers, ugmask.split(), isgroup) 
    161                 self.body += "%s" % self.reportingtool.generateReport() 
    162         else :         
    163             if remuser != "root" : 
    164                 username = remuser 
    165             elif self.form.has_key("username") :     
    166                 username = self.form["username"].value 
    167             else :     
    168                 username = None 
    169             if username is not None :     
    170                 user = self.storage.getUser(username) 
    171             else :     
    172                 user =None 
    173             if self.form.has_key("printername") : 
    174                 printer = self.storage.getPrinter(self.form["printername"].value) 
    175             else :     
    176                 printer = None 
    177             if self.form.has_key("datelimit") :     
    178                 datelimit = self.form["datelimit"].value 
    179             else :     
    180                 datelimit = None 
    181             if self.form.has_key("hostname") :     
    182                 hostname = self.form["hostname"].value 
    183             else :     
    184                 hostname = None 
    185             if self.form.has_key("billingcode") :     
    186                 billingcode = self.form["billingcode"].value 
    187             else :     
    188                 billingcode = None 
    189             self.report = ["<h2>%s</h2>" % _("History")]     
    190             history = self.storage.retrieveHistory(user, printer, datelimit, hostname, billingcode) 
    191             if not history : 
    192                 self.report.append("<h3>%s</h3>" % _("Empty")) 
    193             else : 
    194                 self.report.append('<table class="pykotatable" border="1">') 
    195                 headers = [_("Date"), _("Action"), _("User"), _("Printer"), \ 
    196                            _("Hostname"), _("JobId"), _("JobSize"), \ 
    197                            _("JobPrice"), _("Copies"), _("JobBytes"), \ 
    198                            _("PageCounter"), _("Title"), _("Filename"), \ 
    199                            _("Options"), _("MD5Sum"), _("BillingCode"), \ 
    200                            _("Pages")] 
    201                 self.report.append('<tr class="pykotacolsheader">%s</tr>' % "".join(["<th>%s</th>" % h for h in headers])) 
    202                 oddeven = 0 
    203                 for job in history : 
    204                     oddeven += 1 
    205                     if oddeven % 2 : 
    206                         oddevenclass = "odd" 
    207                     else :     
    208                         oddevenclass = "even" 
    209                     if job.JobAction == "DENY" : 
    210                         oddevenclass = "deny" 
    211                     elif job.JobAction == "WARN" :     
    212                         oddevenclass = "warn" 
    213                     username_url = '<a href="%s?%s">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode({"history" : 1, "username" : job.UserName}), job.UserName) 
    214                     printername_url = '<a href="%s?%s">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode({"history" : 1, "printername" : job.PrinterName}), job.PrinterName) 
    215                     if job.JobHostName : 
    216                         hostname_url = '<a href="%s?%s">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode({"history" : 1, "hostname" : job.JobHostName}), job.JobHostName) 
    217                     else :     
    218                         hostname_url = None 
    219                     if job.JobBillingCode : 
    220                         billingcode_url = '<a href="%s?%s">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode({"history" : 1, "billingcode" : job.JobBillingCode}), job.JobBillingCode) 
    221                     else :     
    222                         billingcode_url = None 
    223                     self.report.append('<tr class="%s">%s</tr>' % \ 
    224                                           (oddevenclass, \ 
    225                                            "".join(["<td>%s</td>" % (h or "&nbsp;") \ 
    226                                               for h in (job.JobDate[:19], \ 
    227                                                         job.JobAction, \ 
    228                                                         username_url, \ 
    229                                                         printername_url, \ 
    230                                                         hostname_url, \ 
    231                                                         job.JobId, \ 
    232                                                         job.JobSize, \ 
    233                                                         job.JobPrice, \ 
    234                                                         job.JobCopies, \ 
    235                                                         job.JobSizeBytes, \ 
    236                                                         job.PrinterPageCounter, \ 
    237                                                         job.JobTitle, \ 
    238                                                         job.JobFileName, \ 
    239                                                         job.JobOptions, \ 
    240                                                         job.JobMD5Sum, \ 
    241                                                         billingcode_url, \ 
    242                                                         job.JobPages)]))) 
    243                 self.report.append('</table>') 
    244                 dico = { "history" : 1, 
    245                          "datelimit" : job.JobDate, 
    246                        } 
    247                 if user and user.Exists : 
    248                     dico.update({ "username" : user.Name }) 
    249                 if printer and printer.Exists : 
    250                     dico.update({ "printername" : printer.Name }) 
    251                 if hostname :     
    252                     dico.update({ "hostname" : hostname }) 
    253                 prevurl = "%s?%s" % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode(dico)) 
    254                 self.report.append('<a href="%s">%s</a>' % (prevurl, _("Previous page"))) 
    255             self.body = "\n".join(self.report)     
     158        try : 
     159            if not self.form.has_key("history") : 
     160                if printers and ugmask : 
     161                    self.reportingtool = openReporter(admin, "html", printers, ugmask.split(), isgroup) 
     162                    self.body += "%s" % self.reportingtool.generateReport() 
     163            else :         
     164                if remuser != "root" : 
     165                    username = remuser 
     166                elif self.form.has_key("username") :     
     167                    username = self.form["username"].value 
     168                else :     
     169                    username = None 
     170                if username is not None :     
     171                    user = self.storage.getUser(username) 
     172                else :     
     173                    user =None 
     174                if self.form.has_key("printername") : 
     175                    printer = self.storage.getPrinter(self.form["printername"].value) 
     176                else :     
     177                    printer = None 
     178                if self.form.has_key("datelimit") :     
     179                    datelimit = self.form["datelimit"].value 
     180                else :     
     181                    datelimit = None 
     182                if self.form.has_key("hostname") :     
     183                    hostname = self.form["hostname"].value 
     184                else :     
     185                    hostname = None 
     186                if self.form.has_key("billingcode") :     
     187                    billingcode = self.form["billingcode"].value 
     188                else :     
     189                    billingcode = None 
     190                self.report = ["<h2>%s</h2>" % _("History")]     
     191                history = self.storage.retrieveHistory(user, printer, datelimit, hostname, billingcode) 
     192                if not history : 
     193                    self.report.append("<h3>%s</h3>" % _("Empty")) 
     194                else : 
     195                    self.report.append('<table class="pykotatable" border="1">') 
     196                    headers = [_("Date"), _("Action"), _("User"), _("Printer"), \ 
     197                               _("Hostname"), _("JobId"), _("JobSize"), \ 
     198                               _("JobPrice"), _("Copies"), _("JobBytes"), \ 
     199                               _("PageCounter"), _("Title"), _("Filename"), \ 
     200                               _("Options"), _("MD5Sum"), _("BillingCode"), \ 
     201                               _("Pages")] 
     202                    self.report.append('<tr class="pykotacolsheader">%s</tr>' % "".join(["<th>%s</th>" % h for h in headers])) 
     203                    oddeven = 0 
     204                    for job in history : 
     205                        oddeven += 1 
     206                        if oddeven % 2 : 
     207                            oddevenclass = "odd" 
     208                        else :     
     209                            oddevenclass = "even" 
     210                        if job.JobAction == "DENY" : 
     211                            oddevenclass = "deny" 
     212                        elif job.JobAction == "WARN" :     
     213                            oddevenclass = "warn" 
     214                        username_url = '<a href="%s?%s">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode({"history" : 1, "username" : job.UserName}), job.UserName) 
     215                        printername_url = '<a href="%s?%s">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode({"history" : 1, "printername" : job.PrinterName}), job.PrinterName) 
     216                        if job.JobHostName : 
     217                            hostname_url = '<a href="%s?%s">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode({"history" : 1, "hostname" : job.JobHostName}), job.JobHostName) 
     218                        else :     
     219                            hostname_url = None 
     220                        if job.JobBillingCode : 
     221                            billingcode_url = '<a href="%s?%s">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode({"history" : 1, "billingcode" : job.JobBillingCode}), job.JobBillingCode) 
     222                        else :     
     223                            billingcode_url = None 
     224                        self.report.append('<tr class="%s">%s</tr>' % \ 
     225                                              (oddevenclass, \ 
     226                                               "".join(["<td>%s</td>" % (h or "&nbsp;") \ 
     227                                                  for h in (job.JobDate[:19], \ 
     228                                                            job.JobAction, \ 
     229                                                            username_url, \ 
     230                                                            printername_url, \ 
     231                                                            hostname_url, \ 
     232                                                            job.JobId, \ 
     233                                                            job.JobSize, \ 
     234                                                            job.JobPrice, \ 
     235                                                            job.JobCopies, \ 
     236                                                            job.JobSizeBytes, \ 
     237                                                            job.PrinterPageCounter, \ 
     238                                                            job.JobTitle, \ 
     239                                                            job.JobFileName, \ 
     240                                                            job.JobOptions, \ 
     241                                                            job.JobMD5Sum, \ 
     242                                                            billingcode_url, \ 
     243                                                            job.JobPages)]))) 
     244                    self.report.append('</table>') 
     245                    dico = { "history" : 1, 
     246                             "datelimit" : job.JobDate, 
     247                           } 
     248                    if user and user.Exists : 
     249                        dico.update({ "username" : user.Name }) 
     250                    if printer and printer.Exists : 
     251                        dico.update({ "printername" : printer.Name }) 
     252                    if hostname :     
     253                        dico.update({ "hostname" : hostname }) 
     254                    prevurl = "%s?%s" % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode(dico)) 
     255                    self.report.append('<a href="%s">%s</a>' % (prevurl, _("Previous page"))) 
     256                self.body = "\n".join(self.report)     
     257        except : 
     258                self.body += '<p><font color="red">%s</font></p>' % self.crashed("CGI Error").replace("\n", "<br />") 
    256259             
    257260if __name__ == "__main__" : 
  • pykota/trunk/cgi-bin/pykotme.cgi

    r2210 r2229  
    130130                jobsize = parser.getJobSize() 
    131131            except PDLAnalyzerError, msg :     
    132                 self.body += '<font color="red">%s</font>' % msg 
     132                self.body += '<p><font color="red">%s</font></p>' % msg 
    133133            else :     
    134                 self.body += _("This file is %i pages long.") % jobsize 
     134                self.body += "<p>%s</p>" % (_("Job size : %i pages") % jobsize) 
     135                 
     136            remuser = os.environ.get("REMOTE_USER", "root")     
     137            # special hack to accomodate mod_auth_ldap Apache module 
     138            try : 
     139                remuser = remuser.split("=")[1].split(",")[0] 
     140            except IndexError :     
     141                pass 
     142            if remuser == "root" :     
     143                self.body += "<p>%s</p>" % _("The exact cost of a print job can only be determined for a particular user. Please retry while logged-in.") 
     144            else :     
     145                try :     
     146                    user = self.storage.getUser(remuser) 
     147                    for printer in printers : 
     148                        upquota = self.storage.getUserPQuota(user, printer) 
     149                        cost = upquota.computeJobPrice(jobsize) 
     150                        self.body += "<p>%s</p>" % (_("Cost on printer %s : %.2f") % (printer.Name, cost)) 
     151                except : 
     152                    self.body += '<p><font color="red">%s</font></p>' % self.crashed("CGI Error").replace("\n", "<br />") 
    135153             
    136154if __name__ == "__main__" : 
  • pykota/trunk/NEWS

    r2228 r2229  
    2626        - Fixed an inconsitency between SQL and LDAP backends' 
    2727          behavior in edpykota. 
     28           
     29        - Improved stability and allowed tracebacks in CGI scripts. 
     30         
     31        - Improved pykotme.cgi 
    2832           
    2933    - 1.22alpha8 : 
  • pykota/trunk/pykota/tool.py

    r2214 r2229  
    5555    __str__ = __repr__ 
    5656     
    57 def crashed(message) :     
     57def crashed(message="Bug in PyKota") :     
    5858    """Minimal crash method.""" 
    5959    import traceback 
     
    218218        sys.exit(0) 
    219219         
    220     def crashed(self, message) :     
     220    def crashed(self, message="Bug in PyKota") :     
    221221        """Outputs a crash message, and optionally sends it to software author.""" 
    222222        msg = crashed(message) 
     223        fullmessage = "========== Traceback :\n\n%s\n\n========== sys.argv :\n\n%s\n\n========== Environment :\n\n%s\n" % \ 
     224                        (msg, \ 
     225                         "\n".join(["    %s" % repr(a) for a in sys.argv]), \ 
     226                         "\n".join(["    %s=%s" % (k, v) for (k, v) in os.environ.items()])) 
    223227        try : 
    224228            crashrecipient = self.config.getCrashRecipient() 
    225229            if crashrecipient : 
    226230                admin = self.config.getAdminMail("global") # Nice trick, isn't it ? 
    227                 fullmessage = "========== Traceback :\n\n%s\n\n========== sys.argv :\n\n%s\n\n========== Environment :\n\n%s\n" % \ 
    228                                 (msg, \ 
    229                                  "\n".join(["    %s" % repr(a) for a in sys.argv]), \ 
    230                                  "\n".join(["    %s=%s" % (k, v) for (k, v) in os.environ.items()])) 
    231231                server = smtplib.SMTP(self.smtpserver) 
    232232                server.sendmail(admin, [admin, crashrecipient], \ 
     
    236236        except : 
    237237            pass 
     238        return fullmessage     
    238239         
    239240    def parseCommandline(self, argv, short, long, allownothing=0) :