Create  Edit  Diff  Mac OS X Serverで作る 小さな計算機室  Index  Search  Changes  RSS  Login

プリンター関係

ハングするCUPS

サーバー管理で「プリント」のところを選んだら、「いつまで経ってもクルクル」状態 に陥った。 G5にログインしてみると、/usr/sbin/cupsd -LがCPUを回し続けていたので、 killして、プリントサービスを立ち上げなおす。

/var/log/cups/error_logには

Unable to accept client connection - Too many open files.

なるメッセージが続いていた。

すぐにまた同じような状態になったので、サーバーを再起動。

時間がないので、ホントの原因は究明せず、そのまま放置。

クオータが動かない

WgMでは、ユーザー毎にプリント枚数の上限が設定できることになっている。 ところが、この機能は全く正常に動作しない(サーバーのバージョンは 10.4.3)。 Appleのdiscussion board http://discussions.apple.com/thread.jspa?threadID=132121&tstart=0 をみたら、このことはほとんどFAQみたいだった。

OS X Serverは細かいところがボロボロといった感じだ。

不思議な設定

念のため/etc/cupsの中の設定を眺めていたら、/etc/cups/printers.confの中の プリンターの設定が

QuotaPeriod 1
PageLimit 1

になっている。1秒おきにquotaをチェックして、各秒1枚を上限、というのが プリンターのデフォルト設定らしい。 そこで、印刷枚数を制限するため、とりあえず1ヶ月100枚と設定してみる。

lpadmin -p プリンター名 -o job-quota-period=2592000
lpadmin -p プリンター名 -o job-page-limit=100

これが実際に有効になっているかどうかは後でチェックする。→ やっぱりダメみたいだ。

気持ちの悪いエラー

そういえば、system.logを見ると、サーバーの起動時に

/usr/sbin/atprintd: cupsd's bootstrap server port not found

というエラーが沢山出ていて、気分が悪い。 そもそもAppleTalkでプリントする必要はないので、サーバ管理のプリントの中でAppleTalk のチェックは外しておいた。

そうこうしているうちに、WgMで設定したクオータがちゃんと効いていることに 気づいた。

  1. プロトコルにAppleTalkは使わない
  2. CUPSのjob-page-limitを1より大きな数(例えば100)にしておく

と上手くいくのだろうか??。

プリンタの利用状況

利用者毎のプリント枚数などは、プリントサーバの

/Library/Preferences/com.apple.printservicequotastats.plist

に書き込まれているようなので、CGIなどで利用者が情報を見られる ようにしたい(いずれ)。

その後、日曜プログラミングで、プリントした枚数を確認するスクリプト (CGI)を書いてみた:printed-page.cgi

plistをREXMLを使ってハッシュに変換して、その後で、該当するレコードを 順に検索しているので、はなはだ効率が悪い。 またユーザー認証もしていない、かなりの手抜き。 でも、枚数の確認なんてたまにしかやらないだろうし、他人のプリント枚数が 見えても差し支えはないだろうから、このまま使うことにする。

それにつけても、Mac OSで使われているXML形式で書かれたplistは、こういった用途には とても使いにくい代物だ。 XML式のplistの有り難みを全く感じないのは、僕の理解不足なんだろうか・・・

などと思っていたらhttp://cakoose.com/wiki/plist_xml_is_pointlessなるページを 見つけた。

#!/usr/bin/ruby
#
# 2005 Yoshinori Hayakawa
#
require "rexml/document"
require "time"
require "cgi"

class Plist2
  def convert(fname)
     File.open(fname) do |f|
       doc = REXML::Document.new(f)
       path=""
       scannode(doc.elements["/plist"],path)
     end
     return @phash
  end

  def initialize
     @phash = Hash.new
  end

  def scannode(node,path)
      key=""
      node.elements.each("*") do |e|
        case e.name
        when "key" then
          if e.text.length>0 then
             key = "/"+e.text
          else
             key=""
          end
          next
       when "dict" then
          scannode(e,path+key)
       when "array" then
          index=0
          e.elements.each("*") do |ary|
             scannode(ary,path+key+":"+index.to_s)
             index=index+1
          end
       when "string" then
          @phash[path+key]=e.text.to_s 
       when "integer" then
          @phash[path+key]=e.text.to_i
       when "date" then
          @phash[path+key]=Time.parse(e.text.to_s).localtime 
       end
    end
  end
end

def finduser(phash,target)
  uid=""
  username=""
  printed=0
  start=""
  lastmod=""
  phash.each do |key,value|
    if uid != key.split("/")[1] then
       if username == target then
          return [username, printed, start, lastmod]
       end 
       uid = key.split("/")[1] 
       username=""
       printed=0
       lastmod=""
       start=""
    end 
    if key =~ /byuser\:\d*\/name/ then
       username=value
    elsif key =~ /byuser\:\d*\/quotastats\/default\/printed/ then
       printed=value.to_i
    elsif key =~ /byuser\:\d*\/quotastats\/default\/start/ then
       start=value
    elsif key =~ /byuser\:\d*\/quotastats\/default\/lastmod/ then
       lastmod=value
    end
  end
  return nil
end

def show_menu(cgi,msg)
   print cgi.header("type" => "text/html", "charset" => "EUC-JP")
   puts "<html>"
   puts "<head>"
   puts "<title>プリンターの利用状況の確認</title>"
#  puts "<link rel=\"stylesheet\" href=\"printed-page.css\" type=\"text/css\">"
   puts "</head>"
   puts "<body>"

   puts "<FONT COLOR=\"#CC0000\">"
   puts msg
   puts "</FONT><br>"

   print <<-ENDOFFORM1
   <h2>プリンターの利用状況の確認</h2>

   <p><small>
<font color="#777777">■</font>学籍番号を半角英数小文字で入力して〔確認〕を押すと、プリンタの利用状況が表示されます<br>
<font color="#777777">■</font>学生は30日間に100枚を超えてプリントすることはできません。計画的に利用してください<br>
   </small></p>
ENDOFFORM1
   print <<-ENDOFFORM2
   <form method="POST" action="printed-page.cgi">
   学籍番号(ユーザー名):
   <input type="text" name="userid" value="" size="40">
   <br><br>
   <input type="submit" name="check" value="確認">
   </form>
ENDOFFORM2

   puts "</body></html>"
end

def printstatus(cgi,msg,stat)
   print cgi.header("type" => "text/html", "charset" => "EUC-JP")
   puts "<html>"
   puts "<head>"
   puts "<title>プリンターの利用状況の確認</title>"
#  puts "<link rel=\"stylesheet\" href=\"printed-page.css\" type=\"text/css\">"
   puts "</head>"
   puts "<body>"

   puts "<FONT COLOR=\"#CC0000\">"
   puts msg
   puts "</FONT><br>"

   print <<-ENDOFSTATUS
   <h2>プリンターの利用状況の確認</h2>

   <p><small>
<font color="#777777">■</font>学籍番号を半角英数小文字で入力して〔確認〕を押すと、プリンタの利用状況が表示されます<br>
<font color="#777777">■</font>「枚数のカウントを始めた日時」から30日間に100枚以上プリントすることはできません<br>
   </small></p>
   <p>
   学籍番号(ユーザー名):#{stat[0]}
   </p>
   <p>
   プリントした枚数:#{stat[1]} (残り #{100-stat[1]}枚)
   </p>
   <p>
   枚数のカウントを始めた日時:#{stat[2]}
   </p>
   <p>
   最後にプリンタを使った日時:#{stat[3]}
   </p>
   <p><a href="http://xxxxxxxxxxxxxxxx">戻る</a></p>
   </body></html>
ENDOFSTATUS
end

###

$quotastats = "/Library/Preferences/com.apple.printservicequotastats.plist"

cgi = CGI.new

msg=" "

if cgi.has_key?('userid') then
   username = cgi['userid']
   plist2=Plist2.new
   phash=plist2.convert($quotastats).sort 
   stat = finduser(phash,username)
   if username.length==0 or stat.nil? then
      msg="そのユーザーがプリンターを使った記録は見つかりませんでした"
      show_menu(cgi,msg) 
   else
      printstatus(cgi,msg,stat)
   end
else
   show_menu(cgi,msg) 
end

プリントクォータ設定のポイント

これまでの経験から、以下が重要と思われる:

1.WgMでの設定枚数よりも、CUPSでのプリント枚数の上限が優先されるらしいので、プリンター毎に

lpadmin -p プリンター名 -o job-page-limit=とても大きな数

を設定しておくこと。デフォルトでは上限が1枚に設定されている(/etc/cups/printers.conf)。 ユーザーの通算プリント枚数がCUPSでの設定値を超えると、WgMでどのように設定しても (枚数カウントをリセットしても)効かないみたいだ。

2,上記はプリントサーバーの設定をリセットすると書き換えられてしまうみたいなので要注意。

その後、OSが10.4.7になると、この方式は使えなくなってしまった(lpadminで設定しても、 printers.confに反映されていない)。一応quotasは効いているみたいなのだが、「XXX日あたりYYYY枚」 という設定をしておいても、XXX日が経過しても自動的にリセットされていない。困ったものだ。

頂き物

物理の別の講座の方から、プリンター(EPSON LP-8700PS3)のトナーカートリッジを5本も分けていただいた。 何でも、そこの講座で2台所有していたプリンターがどちらも故障したので、それを期にリプレース したとのこと。それで一気にストックを放出することになったのだそうだ。

思えば、端末室のLP-8700PS3は、1回修理に出して、その後はしばらく快調だったが、最近は よくエラーを出すようになった。リセットすると復活するのでそのまま使い続けているけれども、 この様子では、頂いたカートリッジを使い切らないうちに、昇天してしまうかもしれない。

  • Anchor to the attached file is {{attach_anchor(file name [, page name])}}.
  • Indication of the attached file is {{attach_view(file name [, page name])}}.
  • List of the attached pages and files is {{attach_map}}.
Last modified:2006/10/17 10:32:17
Keyword(s):
References:[frontpage] [Mac OS X Serverで作る 小さな計算機室]