From 450310bd9564af081b0d7405145fb37fc2dab879 Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Fri, 16 Nov 2018 16:05:40 -0500 Subject: [PATCH] Back-port accounting changes from CUPS 2.3 (Issue #5439) --- CHANGES.md | 3 +- doc/help/man-cupsd-logs.html | 20 +++------ man/cupsd-logs.man | 27 ++++-------- scheduler/job.c | 82 ++++++++++++++++++++++-------------- test/run-stp-tests.sh | 2 +- 5 files changed, 66 insertions(+), 68 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index bb76c7db7..004e801df 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,4 @@ -CHANGES - 2.2.10 - 2018-11-14 +CHANGES - 2.2.10 - 2018-11-16 ============================= @@ -8,6 +8,7 @@ Changes in CUPS v2.2.10 - The generated PPD files for IPP Everywhere printers did not contain the cupsManualCopies keyword (Issue #5433) - Kerberos credentials might be truncated (Issue #5435) +- Incorporated the page accounting changes from CUPS 2.3 (Issue #5439) Changes in CUPS v2.2.9 diff --git a/doc/help/man-cupsd-logs.html b/doc/help/man-cupsd-logs.html index 30ee2af66..e90dd405b 100644 --- a/doc/help/man-cupsd-logs.html +++ b/doc/help/man-cupsd-logs.html @@ -142,25 +142,17 @@ The level field contains the type of message:

The message field contains a free-form textual message. Messages from job filters are prefixed with "[Job NNN]" where "NNN" is the job ID.

Page Log File Format

-The page_log file lists each page or group of pages that are sent to a printer. +The page_log file lists the total number of pages (sheets) that are printed. By default, each line contains the following information:
 
-    printer user job-id date-time page-number num-copies job-billing
-      job-originating-host-name job-name media sides
-
-    printer user job-id date-time total num-impressions job-billing
+    printer user job-id date-time total num-sheets job-billing
       job-originating-host-name job-name media sides
 
 
-For example the entries for a two page job called "myjob" might look like: +For example the entry for a two page job called "myjob" might look like:
 
-    DeskJet root 1 [20/May/1999:19:21:05 +0000] 1 1 acme-123
-      localhost myjob na_letter_8.5x11in one-sided
-    DeskJet root 1 [20/May/1999:19:21:05 +0000] 2 1 acme-123
-      localhost myjob na_letter_8.5x11in one-sided
-
     DeskJet root 1 [20/May/1999:19:21:06 +0000] total 2 acme-123
       localhost myjob na_letter_8.5x11in one-sided
 
@@ -174,9 +166,7 @@ If you send a job to a printer class, this field will contain the name of the pr
 

The job-id field contains the job number of the page being printed.

The date-time field contains the date and time of when the page started printing. The format of this field is identical to the data-time field in the access_log file. -

The page-number and num-copies fields contain the page number and number of copies being printed of that page. -For printers that cannot produce copies on their own, the num-copies field will always be 1. -

Lines containing the keyword "total" have a num-impressions field instead which provides the total number of impressions (sides) that have been printed on for the job. +

The num-sheets field provides the total number of pages (sheets) that have been printed on for the job.

The job-billing field contains a copy of the job-billing or job-account-id attributes provided with the IPP Create-Job or Print-Job requests or "-" if neither was provided.

The job-originating-host-name field contains the hostname or IP address of the client that printed the job.

The job-name field contains a copy of the job-name attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided. @@ -188,7 +178,7 @@ For printers that cannot produce copies on their own, the num-copies field will cups-files.conf(5), CUPS Online Help (http://localhost:631/help)

Copyright

-Copyright © 2007-2017 by Apple Inc. +Copyright © 2007-2018 by Apple Inc. diff --git a/man/cupsd-logs.man b/man/cupsd-logs.man index d12fab35f..8672afa09 100644 --- a/man/cupsd-logs.man +++ b/man/cupsd-logs.man @@ -1,8 +1,8 @@ .\" .\" cupsd-logs man page for CUPS. .\" -.\" Copyright 2007-2014 by Apple Inc. -.\" Copyright 1997-2006 by Easy Software Products. +.\" Copyright © 2007-2018 by Apple Inc. +.\" Copyright © 1997-2006 by Easy Software Products. .\" .\" These coded instructions, statements, and computer programs are the .\" property of Apple Inc. and are protected by Federal copyright @@ -10,7 +10,7 @@ .\" which should have been included with this file. If this file is .\" file is missing or damaged, see the license at "http://www.cups.org/". .\" -.TH cupsd-logs 5 "CUPS" "11 June 2014" "Apple Inc." +.TH cupsd-logs 5 "CUPS" "8 November 2017" "Apple Inc." .SH NAME cupsd\-logs \- cupsd log files (access_log, error_log, and page_log) .SH DESCRIPTION @@ -176,25 +176,17 @@ The \fIdate-time\fR field contains the date and time of when the page started pr The \fImessage\fR field contains a free-form textual message. Messages from job filters are prefixed with "[Job NNN]" where "NNN" is the job ID. .SS PAGE LOG FILE FORMAT -The \fIpage_log\fR file lists each page or group of pages that are sent to a printer. +The \fIpage_log\fR file lists the total number of pages (sheets) that are printed. By default, each line contains the following information: .nf - \fIprinter user job-id date-time page-number num-copies job-billing - job-originating-host-name job-name media sides\fR - - \fIprinter user job-id date-time \fBtotal \fInum-impressions job-billing + \fIprinter user job-id date-time \fBtotal \fInum-sheets job-billing job-originating-host-name job-name media sides\fR .fi -For example the entries for a two page job called "myjob" might look like: +For example the entry for a two page job called "myjob" might look like: .nf - DeskJet root 1 [20/May/1999:19:21:05 +0000] 1 1 acme-123 - localhost myjob na_letter_8.5x11in one-sided - DeskJet root 1 [20/May/1999:19:21:05 +0000] 2 1 acme-123 - localhost myjob na_letter_8.5x11in one-sided - DeskJet root 1 [20/May/1999:19:21:06 +0000] total 2 acme-123 localhost myjob na_letter_8.5x11in one-sided @@ -213,10 +205,7 @@ The \fIjob-id\fR field contains the job number of the page being printed. The \fIdate-time\fR field contains the date and time of when the page started printing. The format of this field is identical to the data-time field in the \fIaccess_log\fR file. .LP -The \fIpage-number\fR and \fInum-copies\fR fields contain the page number and number of copies being printed of that page. -For printers that cannot produce copies on their own, the num-copies field will always be 1. -.LP -Lines containing the keyword "total" have a \fInum-impressions\fR field instead which provides the total number of impressions (sides) that have been printed on for the job. +The \fInum-sheets\fR field provides the total number of pages (sheets) that have been printed on for the job. .LP The \fIjob-billing\fR field contains a copy of the job-billing or job-account-id attributes provided with the IPP Create-Job or Print-Job requests or "-" if neither was provided. .LP @@ -233,4 +222,4 @@ The \fIsides\fR field contains a copy of the sides attribute provided with the I .BR cups-files.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2017 by Apple Inc. +Copyright \[co] 2007-2018 by Apple Inc. diff --git a/scheduler/job.c b/scheduler/job.c index 554e09215..3cbe56aa8 100644 --- a/scheduler/job.c +++ b/scheduler/job.c @@ -1850,6 +1850,8 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ if (!job->impressions) job->impressions = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions-completed", 0); + if (!job->sheets) + job->sheets = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-media-sheets-completed", 0); if (!job->priority) { @@ -3154,6 +3156,13 @@ finalize_job(cupsd_job_t *job, /* I - Job */ cupsdStatBufDelete(job->status_buffer); job->status_buffer = NULL; + /* + * Log the final impression (page) count... + */ + + snprintf(buffer, sizeof(buffer), "total %d", ippGetInteger(job->impressions, 0)); + cupsdLogPage(job, buffer); + /* * Process the exit status... */ @@ -4993,7 +5002,6 @@ void update_job(cupsd_job_t *job) /* I - Job to check */ { int i; /* Looping var */ - int copies; /* Number of copies printed */ char message[CUPSD_SB_BUFFER_SIZE], /* Message text */ *ptr; /* Pointer update... */ @@ -5031,6 +5039,10 @@ update_job(cupsd_job_t *job) /* I - Job to check */ if (loglevel == CUPSD_LOG_PAGE) { + int impressions = ippGetInteger(job->impressions, 0); + /* Number of impressions printed */ + int delta; /* Number of impressions added */ + /* * Page message; send the message to the page_log file and update the * job sheet count... @@ -5038,51 +5050,57 @@ update_job(cupsd_job_t *job) /* I - Job to check */ cupsdLogJob(job, CUPSD_LOG_DEBUG, "PAGE: %s", message); - if (job->impressions) + if (!_cups_strncasecmp(message, "total ", 6)) { - if (!_cups_strncasecmp(message, "total ", 6)) - { - /* - * Got a total count of pages from a backend or filter... - */ + /* + * Got a total count of pages from a backend or filter... + */ + + int total = atoi(message + 6); /* Total impressions */ - copies = atoi(message + 6); - copies -= ippGetInteger(job->impressions, 0); /* Just track the delta */ + if (total > impressions) + { + delta = total - impressions; + impressions = total; } - else if (!sscanf(message, "%*d%d", &copies)) + else + delta = 0; + } + else + { + /* + * Add the number of copies to the impression count... + */ + + int copies; /* Number of copies */ + + if (!sscanf(message, "%*d%d", &copies) || copies <= 0) copies = 1; - ippSetInteger(job->attrs, &job->impressions, 0, ippGetInteger(job->impressions, 0) + copies); - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); + delta = copies; + impressions += copies; } + if (job->impressions) + ippSetInteger(job->attrs, &job->impressions, 0, impressions); + if (job->sheets) { - if (!_cups_strncasecmp(message, "total ", 6)) - { - /* - * Got a total count of pages from a backend or filter... - */ - - copies = atoi(message + 6); - copies -= ippGetInteger(job->sheets, 0); /* Just track the delta */ - } - else if (!sscanf(message, "%*d%d", &copies)) - copies = 1; + const char *sides = ippGetString(ippFindAttribute(job->attrs, "sides", IPP_TAG_KEYWORD), 0, NULL); - ippSetInteger(job->attrs, &job->sheets, 0, ippGetInteger(job->sheets, 0) + copies); - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); + if (sides && strcmp(sides, "one-sided")) + ippSetInteger(job->attrs, &job->sheets, 0, impressions / 2); + else + ippSetInteger(job->attrs, &job->sheets, 0, impressions); - if (job->printer->page_limit) - cupsdUpdateQuota(job->printer, job->username, copies, 0); + cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job, "Printed %d page(s).", ippGetInteger(job->sheets, 0)); } - cupsdLogPage(job, message); + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); - if (job->sheets) - cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job, "Printed %d page(s).", ippGetInteger(job->sheets, 0)); + if (job->printer->page_limit) + cupsdUpdateQuota(job->printer, job->username, delta, 0); } else if (loglevel == CUPSD_LOG_JOBSTATE) { diff --git a/test/run-stp-tests.sh b/test/run-stp-tests.sh index 8a263fbf1..fc7e2525c 100755 --- a/test/run-stp-tests.sh +++ b/test/run-stp-tests.sh @@ -886,7 +886,7 @@ fi # Paged printed on Test3 count=`$GREP '^Test3 ' $BASE/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'` -expected=4 +expected=2 if test $count != $expected; then echo "FAIL: Printer 'Test3' produced $count page(s), expected $expected." echo "

FAIL: Printer 'Test3' produced $count page(s), expected $expected.

" >>$strfile -- 2.39.2