Você está na página 1de 54

$'5,$12 6$7+/(5 +25676 6,67(0$ '( *(5(1&,$'25 '( &27$6 '( ,035(662 9,$ :(%

Monografia apresentada ao Departamento de Cincia da Computao da Universidade Federal de Lavras, como parte das exigncias do curso de Ps-Graduao /DWR 6HQVX em Administrao de redes Linux, para obteno do ttulo de especialista em Administrao de Redes Linux

Orientador: Prof. Fernando Cortez Sica

LAVRAS MINAS GERAIS BRASIL 2004

$'5,$12 6$7+/(5 +25676 6,67(0$ '( *(5(1&,$'25 '( &27$6 '( ,035(662 9,$ :(%

Monografia apresentada ao Departamento de Cincia da Computao da Universidade Federal de Lavras, como parte das exigncias do curso de Ps-Graduao /DWR 6HQVX em Administrao de redes Linux, para obteno do ttulo de especialista em Administrao de Redes Linux

Aprovada em 24 de Abril de 2004 Prof. Joaquim Quinteiro Ucha Prof. Ricardo Martins de Abreu Silva Prof.: Fernando Cortez Sica (Orientador)

LAVRAS MINAS GERAIS BRASIL 2004

6805,2
LISTA DE FIGURAS...................................................................................... v LISTA DE TABELAS..................................................................................... vii RESUMO......................................................................................................... 9 1 INTRODUO............................................................................................ 11 2 Trabalhos correlatos ..................................................................................... 13 3 O Projeto ARLCOTA .................................................................................. 17 3.1 Os scripts ............................................................................................ 21 3.2 Sistema de gerenciamento WEB ARLCOTA .................................. 23 4 CONCLUSO............................................................................................... 31 5 REFERNCIAS BIBLIOGRFICAS........................................................... 33 ANEXOS .......................................................................................................... 34 ANEXO A ........................................................................................................ 35 ANEXO B ........................................................................................................ 36 ANEXO C ....................................................................................................... 41 ANEXO D ....................................................................................................... 50

iii

/,67$ '( ),*85$6


Figura 1 - Funcionamento IBQUOTA ...........................................................17 Figura 2 - Funcionamento ARLCOTA ..........................................................18 Figura 3 - Identificar os arquivos dos respectivos jobs da impressora VIRTUAL ..................................................................................................21 Figura 4 - Identificar o dono do Job...............................................................21 Figura 5 - Identificar quantas paginas o Job possui .......................................21 Figura 6 - Manda job para fila da impressora real .........................................22 Figura 7 - Remove job da fila da impressora virtual:.....................................22 Figura 8 - Tela principal.................................................................................23 Figura 9 - Tela de cadastro de novos usurios. ..............................................24 Figura 10 Pgina de Cadastro de Cotas .....................................................26 Figura 11 Pgina inicial de relatrios de impresso ..................................27 Figura 12 Relatrio de impresses por usurio .........................................28 Figura 13 Impresso por grupo de usurios...............................................29

/,67$ '( 7$%(/$6


Tabela 1 Comparativo entre sistemas de cotas de impresso.......................14

vii

5(6802
O presente trabalho tem por objetivo desenvolver o ARLCOTA, que um sistema de gerenciamento de cotas de impresso por usurio para um servidor de impresso linux utilizando o sistema de impresso CUPS (&RPPRQ 8QL[ 3ULQWLQJ 6\VWHP e o script bash IBQUOTA. O software foi desenvolvido em script PHP, utilizando banco de dados Mysql. Alm do script em PHP, o sistema possuir o gerenciador grfico WEB tambm desenvolvido em PHP, este gerenciador far o cadastro de impressoras, grupos de usurios, usurios, cotas e gerao de relatrios como impresso por grupo, por usurios, ltimas impresses e, ainda, estatsticas de impresso, possibilitando o administrador ter uma gerncia adequada de um servidor de impresso.

 ,1752'8d2
A cada dia que passa os custos relacionados com impresso aumentam. Isso faz com que em ambientes onde se tem grande volume de impresso, como universidades, empresas, rgo pblico, etc, seja necessrio controlar e reduzir gastos com impresso. Assim extremamente interessante utilizar um sistema de cotas de impresso limitando e fiscalizando as impresses de todos os usurios. A manipulao de cotas para servidores Linux possui poucas iniciativas comparadas com sistemas para servidores Windows, onde se encontram vrios sistemas pagos. No Linux tem se a iniciativa do CUPS (&RPPRQ 8QL[ 3ULQWLQJ 6\VWHP para controle de cotas, porem seu controle limitado, por exemplo: pode se atribuir para todos os usurios o limite de impresso de 5 paginas por dia para uma determinada impressora mas no se pode criar uma exceo para um determinado usurio ou grupo de usurios. Esta monografia visa descrever o ARLCOTA. O ARLCOTA consiste de um sistema cuja funcionalidade gerenciar cotas de impresso via interface WEB de um servidor Linux utilizando o sistema de impresso CUPS. Para tanto, esta monografia apresenta no capitulo 3 trabalhos correlatos ao projeto aqui descrito. O capitulo 4 uma viso geral de como funciona a impresso em sistemas Linux, o sistema de impresso CUPS e o aplicativo SAMBA. O capitulo 5 aborda o projeto ARLCOTA descrevendo suas funes, scripts, o projeto do banco de dados e algumas interfaces do sistema. E finalmente, o capitulo 6 apresenta a concluso deste trabalho.

11

 75$%$/+26 &255(/$726
Com o intuito de desenvolver um sistema de gerenciamento de cotas de impresso pesquisou-se sistemas semelhantes e com o mesmo objetivo, dentro os quais pode-se citar o IBQUOTA. O IBQUOTA verso 1.2.1 um software livre desenvolvido por Valcir Cabral (http://www.ib.unicamp.br/ibquota/). Este software funciona entre o SAMBA, que responsvel pela autenticao dos usurios e compartilhamento da impressora na rede, e o Gerenciador de Impresso (CUPS). Para o IBQUOTA funcionar so criadas, no servidor de impresso, duas filas de impresso: uma VIRTUAL, que receber todos os trabalhos enviados pelos usurios, e a fila de impresso REAL. O IBQUOTA ficar verificando se h trabalhos na fila VIRTUAL. Caso haja trabalhos na fila de impresso VIRTUAL ser consultado no banco de dados Mysql se o usurio possui cota para impresso. Se possuir cota suficiente para impresso o IBQUOTA encaminha o trabalho para a fila de impresso REAL para ser impressa. Caso o usurio no possua cota o sistema descarta o trabalho mas grava no banco de dados a tentativa de impresso do usurio. O IBQUOTA, em sua verso 1.2, apresenta algumas limitaes como por exemplo: apenas 4 relatrios, listagem das ltimas 10 impresses, listagem de usurios e grupos e listagem de impresses; um cadastro simples para grupos e para usurios; poltica de cota simples, onde o usurio teria a cota de impresso do grupo ou cota infinita de impresso. Devido s limitadas apresentadas, foi pensado, atravs deste projeto, adicionar novos recursos como os apresentados a seguir:

13

Cota global a cota ser contabilizada a partir do cadastrado do usurio sem limite de tempo apenas pelo somatrio de impresses; Cota mensal a cota poder ser mensal e no acumulativa; Cota por perodo a cota ser contabilizada a partir de um determinado perodo e finalizada quando o usurio ou grupo atingir o seu limite;

Gerenciamento de impressoras sendo controlado gastos com manuteno, operao e cartuchos; com objetivo de levantar custos reais de impresso;

Relatrios e estatsticas de impresso. Cota soft e hard os tipos de cota mensal e global tero valores soft e hard, para utilizar valores limites para cobrana ou aviso. Assim um usurio receber um e-mail comunicando que sua cota excedeu o limite soft, e se for o caso da poltica da empresa ou instituio cobrar por impresses acima do limite soft. O sistema s barrar as impresses quando o usurio ou grupo atingir o limite hard.

Alem do IBQUOTA existem outros softwares com esta finalidade, como: Printbill (http://ieee.uow.edu.au/~daniel/software/printbill/); PrintQuota (http://printquota.sourceforge.net/) PyKota (http://www.librelogiciel.com/software/PyKota/action_Presentation) A seguir tem se a tabela 1 com quadro comparativo entre os sistemas pesquisados: 7DEHOD   &RPSDUDWLYR HQWUH VLVWHPDV GH FRWDV GH LPSUHVVmR
PrintBill GNU Printquota GPL, GNU GPL IBQUOTA GNU GPL

Funcionalidade PyKota Licena GNU GPL

14

Suporte Comercial Maturidade Linguagem de Programao Uso de recursos

Sim Novo Python Leve

Modules Perl so duas licenas (Artistic+GPL) Sim Sim Maduro Perl+C Novo C

No Novo Bash + PHP Leve

Pesado, se a Leve contabilizao de tinta for usada Interface WEB Relatrio de Sim No cotas somente Dependncias Python Perl LPRng (requerido); (requerido); (requerido); mxDateTime File::Temp Perl libpopt Python module module; (requerido); (requerido); Ghostscript Ghostscript PostgreSQL (requerido); (requerido); (requerido); LPRng PostgreSQL or PyGreSQL (requerido); MySQL Python module Apache (recomendado). (requerido); (recomendado); Common Magicfilter UNIX Printing (recomendado); System or Samba LPRng (recomendado); (requerido); Libpng Ghostscript (requerido); (recomendado) Ghostscript ; Net-SNMP fonts (recomendado) (requerido); ; netatalk GnuPlot (recomendado) (recommended). ; Apache (recomendado). Sistemas de CUPS, LPRng CUPS LPRng impresso (iniciando); suportados LPRng

Sim CUPS (requerido); SAMBA (recomendado); APACHE (requerido); PHP (requerido); Mysql (requerido)

CUPS

Trabalha com Sim clientes Windows

Sim

Sim

Sim

15

Lista de discusso Documentao Cotas de usurio por impressora Cotas de grupo por impressora Contabilidade de pginas Contabilidade de tinta Trabalha com impressoras da rede Trabalha com impressoras locais Banco de dados Pacotes DEBIAN Pacotes RPM Tarballs Acesso CVS

Sim. Sim Sim Sim Sim No Sim

Sim. Sim Sim No Sim Sim Sim

Sim. Sim Sim No Sim No Sim Sim

Sim Sim No No Sim No Sim Sim MySQL No No Sim No

No foi testado Sim PostgreSQL, LDAP (iniciando) No Sim Sim Sim

Arquivos texto, PostgreSQL, SQL, LDAP MySQL, Arquivos texto Sim No No Sim No No Sim Sim

16

 2 352-(72 $5/&27$
O sistema tem como objetivo controlar a impresso de usurios ou grupos de usurios atravs de cotas. As cotas sero atribudas para o usurio e para o grupo. Caso o usurio esteja inserido em algum grupo, o sistema ter opo para ser atribudo ao usurio a cota do grupo ou a cota do usurio. Caso seja atribuda para o usurio a cota do grupo, a somatria da quantidade de folhas impressas pelo grupo ser a quantidade limite de impresso. O sistema tambm possuir um valor de quota de tolerncia ou quantidade soft, onde depois de atingido este valor o usurio receber um e-mail informando que seu limite est prximo do fim. Para monitorar as impresses o sistema utiliza o script bash IBQUOTA (http://www.ib.unicamp.br/ibquota/), onde criada para uma mesma impressora uma fila de impresso VIRTUAL e uma fila de impresso REAL. O script bash ficar rodando verificando a fila VIRTUAL e ento passando como parmetros o nome do usurio, a quantidade de pginas a imprimir, o nome da impressora, o nmero de job e o nome do arquivo do job para o script do ARLCOTA escrito em php.

)LJXUD  

)XQFLRQDPHQWR ,%4827$

17

IBQUOTA Script bash ARLCOTA Script PHP Gerenciador WEB PHP + Mysql )LJXUD   )XQFLRQDPHQWR $5/&27$

Assim o script php far a verificao da cota. Caso o usurio tenha cota ou permisso para impresso, o script ir remover o job de impresso da fila VIRTUAL e colocar na fila de impresso REAL, caso o usurio no possua cota para impresso ele receber um e-mail informando que no possui cota de impresso e seu job de impresso ser apenas removido. Independente de ser impresso ou no todos os jobs de impresso sero armazenados no banco de dados Mysql, contendo os dados do usurio, impressora e quantidade de pginas enviadas para impresso. Algumas operaes do sistema sero armazenadas em no banco de dados Mysql para servir como log, facilitando para o administrador apurar falhas no sistema. O controle de cotas atender as seguintes condies e exigncias: O administrador poder optar em configurar uma cota de impresso de usurio ou de grupo para um determinado usurio. A cota de usurio destinada somente ao usurio, j a cota de grupo pode ser configurada e no cadastro do usurio adicion-lo ao grupo e ento optar pelo controle de cota de grupo, assim o controle se far pelas cotas do grupo, ou seja, ser somada toda impresso de todos os usurios do grupo. Controle de cotas mensais - ser somada toda impresso do usurio ou do grupo, dependendo da configurao realizada para o usurio, 18

no ms corrente no sendo acumulativas nos meses seguintes e assim que a quantidade limite (hard) for atingida as impresses sero bloqueadas. Neste caso haver ainda uma quantidade especificada abaixo da quantidade limite chamada de quantidade soft que servir para informar ao usurio, atravs de e-mail, que seu limite est prximo do fim; Controle de cotas globais ser o controle feito deste o incio do cadastro do usurio ou do grupo, ou seja, ser somada toda impresso do usurio ou do grupo e assim que a quantidade limite for atingida as impresses sero bloqueadas. Neste caso tambm haver ainda uma quantidade especificada abaixo da quantidade limite chamada de quantidade soft que servir para informar ao usurio, atravs de e-mail, que seu limite est prximo do fim . Controle de contas por perodo o controle ser iniciado a partir da data de incio, ou seja, ser somada toda a impresso do usurio ou do grupo a partir de uma determinada data e assim que a quantidade limite for atingida as impresses sero bloqueadas. Controle de manuteno dever ser controlado os gastos com a manuteno da impressora, como assistncia tcnica, aquisio e troca de toners, etc, para gerar relatrios de custos reais de impresso. Utilizando o gerenciador grfico WEB emitir relatrios de impresso por grupos, usurios e estatsticas de impresso mensais.

19

 2V VFULSWV
Como j comentado, o script bash IBQUOTA verifica a fila de impresso. Sendo assim, sero destacadas algumas linhas de cdigo do script, como: Na figura 3 o comando lpstat P nome da impressora virtual identifica os jobs da impressora e armazenar em um vetor (vet_jobs). vet_jobs=`$LPSTAT -P $VIRTUAL | grep "$VIRTUAL" | cut -d"-" -f2 | cut -d" " -f1 | tail -1` )LJXUD   ,GHQWLILFDU RV DUTXLYRV GRV UHVSHFWLYRV MREV GD LPSUHVVRUD 9,578$/

Na figura 4 o mesmo comando lpstat -P tambm usado para identificar o nome do usurio que enviou o job. dono=`$LPSTAT -P $VIRTUAL | grep "$VIRTUAL-$job" | awk ' {print $2}' ` )LJXUD   ,GHQWLILFDU R GRQR GR -RE

Para identificar o nmero de pginas a serem impressas pelo Job, figura 5, foi capturada a linha dentro do arquivo do Job que informa a quantidade de pginas e, depois, copiado o valor dentro da varivel paginas_job. Este arquivo fica localizado dentro da fila de impresso, no CUPS geralmente em /var/spool/cups/. paginas_job=`cat $SPOOL_FILA$nome_arq_job | grep ' %%Pages:' | tail -1 | cut -d' -f2` ' )LJXUD   ,GHQWLILFDU TXDQWDV SDJLQDV R -RE SRVVXL

21

O script arlcota.php fica responsvel pelo controle e contabilizao das impresses, remoo do job da fila de impresso da impressora virtual (Figura 7) e encaminhamento do job da impressora virtual para a impressora real no caso do usurio ter condies de impresso (Figura 6). Todo o controle e contabilizao das impresses pode ser conferido no anexo C onde tem-se o script arlcota.php na integra. system("cat " . $spool_fila . $nomearq_job . " | lpr -P $impressora" . "real -C $usuario"); )LJXUD   0DQGD MRE SDUD ILOD GD LPSUHVVRUD UHDO

system("$lprm -P $impressora $job"); )LJXUD   5HPRYH MRE GD ILOD GD LPSUHVVRUD YLUWXDO

22

 6LVWHPD GH JHUHQFLDPHQWR :(%  $5/&27$


Com o sistema de gerenciamento WEB, o administrador poder cadastrar impressoras, usurios, cotas, grupos, manutenes de impressoras, associar os usurios e grupos a cotas j cadastradas, visualizar relatrios de impresso. Para a segurana de acesso s pginas administrativas, o administrador deve utilizar-se da segurana provida pelo servidor WEB Apache, configurando o arquivo .htaccess para o diretrio onde ser encontrar o sistema de gerenciamento WEB ARLCOTA. A seguir sero apresentadas algumas funcionalidades do sistema de gerenciamento ARLCOTA com algumas telas. Na pgina principal (Fig. 8) sero exibidos todos os links de cadastros, informaes sobre o software, relatrios e sero mostradas as ltimas 40 impresses, este nmero de impresses a serem exibidas pode ser configurada no arquivo conf.php.

)LJXUD  

7HOD SULQFLSDO

23

Na pgina de cadastro de novos usurios (Fig. 9), tem-se os campos: usurio : nome do usurio, lembrando que dever ser o mesmo do sistema que far a autenticao (SAMBA por exemplo); grupo : grupo que o usurio pertence; e-mail: e-mail do usurio; setor: setor que o usurio pertence; status: status do usurio podendo ser ATIVO ou BLOQUEADO, se o usurio estiver bloqueado ele no conseguir imprimir; cota infinita: com as opes NO e SIM, caso o usurio tenha cota infinita como SIM no ser aplicada nenhuma cota. Tipo de conta: com as opes APLICAR COTA DO GRUPO e APLICAR COTA DO USURIO.

)LJXUD  

7HOD GH FDGDVWUR GH QRYRV XVXiULRV

Na pgina de cadastro de novas cotas (Fig. 10), tem-se os seguintes campos: Cota: nome da cota;

24

Qtde pginas ms (soft): quantidade de paginas ms soft, caso a cota do grupo ou do usurio for controlada por ms e ultrapassar esse valor o usurio receber um e-mail informando que sua cota esta prxima do fim;

Qtde pginas ms lim (hard): quantidade de paginas ms limite (Hard), caso a cota do grupo ou do usurio for controlada por ms esse valor ser o limite mximo de sua cota;

Qtde pginas global (soft): quantidade de paginas global soft, caso a cota do grupo ou do usurio for controlada pelo tipo global e ultrapassar esse valor o usurio receber um e-mail informando que sua cota esta prxima do fim;

Qtde pginas global lim (Hard): quantidade de paginas global limite (Hard), caso a cota do grupo ou do usurio for controlada pelo tipo global esse valor ser o limite mximo de sua cota;

Perodo (dias): perodo em dias, para ser usado no tipo de cota por perodo; Data incio: data de incio para cota por perodo. Tipo de conta: os tipos de cotas so GLOBAL, MENSAL, POR PERODO, INFINITA. Descrio/Obs: descries ou observaes sobre a cota.

25

)LJXUD  

3iJLQD GH &DGDVWUR GH &RWDV

26

No link Relatrios o administrador ter relatrios e estatsticas de impresses. Na pgina inicial do link Relatrios de impresso, como mostra a figura 11, tem-se o total impresso por todas as impressoras, a lista de impressoras, o nmero de impresses efetuadas por cada impressora e o valor percentual em forma de grfico da quantidade impressa. Esses valores sero contabilizados por perodo, sendo que o padro o ms corrente, mas caso o administrador queria verificar outro perodo basta utilizar o Filtro por perodo informando a data de incio e a data de fim.

)LJXUD  

3iJLQD LQLFLDO GH UHODWyULRV GH LPSUHVVmR

Ainda na pgina principal do Relatrio de impresso tem-se os links para consultar a impresso por usurio e por grupo de uma determinada impressora, valendo-se do perodo selecionado. O link Por usurio o administrador ter, como mostra a figura 12, as seguintes informaes sobre a impresso dos usurios para uma determinada impressora: nome do usurio, setor, status do usurio (quando ativo igual a 1 o usurio est ativo, igual a 0 o usurio esta bloqueado para impresso), grupo, 27

Tipo de cota, Nmero de impresses e ainda grfico com percentual de impresses.

)LJXUD  

5HODWyULR GH LPSUHVV}HV SRU XVXiULR

O link Por grupo o administrador ter, como mostra a figura 13, as seguintes informaes sobre a impresso dos grupos de usurios para uma determinada impressora: nome do grupo, total impresso pelo grupo e grfico com o percentual de impresses do grupo.

28

)LJXUD  

,PSUHVVmR SRU JUXSR GH XVXiULRV

29

 &21&/862
Este trabalho atingiu seu objetivo de desenvolver um software de controle de cotas de impresso por usurio com gerenciamento WEB, que facilita a gerncia de um servidor de impresso Linux. O projeto ser til visto que custos de impresso a cada dia aumentam muito, e que usurios conscientes que possuem cotas podero imprimir menos sem desperdcio. Outro fator a facilidade de implantao do software e se for o caso seu possvel ajuste ou alterao. O sistema foi testado na rede da Cmara Municipal de Ipatinga MG, onde se mostrou funcional. As sugestes aqui apresentadas podero fazer parte do IBQUOTA via *3/ (*HQHUDO 3XEOLF /LFHQVH), e ainda o prprio ARLCOTA estar livre para qualquer utilizao e alteraes.

31

 5()(51&,$6 %,%/,2*5),&$6
[1] SICA, FERNANDO CORTEZ; UCHOA, JOAQUIM QUINTERO. $GPLQLVWUDomR GH 6LVWHPDV /LQX[. Lavras: UFLA/FAEP, 2003. [2] CHAGAS, VALCIR. IBQUOTA. http://www.ib.unicamp.br/ibquota/. Disponvel na Internet em

[3] EASY SOFTWARE PRODUCTS. &836 6RIWZDUH $GPLQLVWUDWRUV 0DQXDO. URL: http://www.cups.org/. [4] TAYLOR, GRANT. /LQX[3ULQWLQJRUJ. URL: http://www.linuxprinting.org [5] CAMPOS, ANDR LUIZ GONALVES. &836  XPD VROXomR GH EDL[R FXVWR SDUD LPSUHVVmR HP VHUYLGRUHV /,18;. RNP Rede Nacional de Ensino e Pesquisa 26 de agosto de 2003 | volume 7, nmero 4. [6] PFEIFLE, KURT; GOFFIOUL, MICHAEL; TRADUO: NARDIN, MAGNO KRETZSCHMAR. 2 0DQXDO GR .'(3ULQW. Reviso 1.00.04 (200108-09). Copyright 2001 Kurt Pfeifle. URL: http://docs.kde.org/pt_BR/HEAD/kdebase/kdeprint/index.html [7] ECKSTEIN , ROBERT; COLLIER-BROWN, DAVID; KELLY, PETER. 8VLQJ 6DPED OREILLY : 1st Edition November 1999. URL: http://www.oreilly.com/catalog/samba/chapter/book/index.html

33

$1(;26

34

$1(;2 $
Com base no objetivo do sistema e das especificaes discutidas no item 5, construu-se a modelagem Fsica do Bando de Dados elaborada com DBDesigner4. A descrio das tabelas seus campos encontra-se no anexo b.

35

$1(;2 %
Dicionrio de dados:
JUXSR

Grupos de usurios

PK

NN

Cdigo grupo Nome grupo

do do

AI

grupo descricao

VARCHAR(20) VARCHAR(100)

Descries e observaes

JUXSRBTXRWD
   (

Determina a cota que ser aplicado a um grupo e uma impressora especifica.

PK PK

NN NN

Cdigo do grupo Cdigo da impressora Cdigo da cota que ser aplicada ao grupo e impressora selecionada

quota_codquota

I NTEGER

NN

LPSUHVVRUD
PK NN Cdigo impressora da AI

impressora

VARCHAR(100)

NN

Nome da impressora, identico ao nome da impressora virtual configurada no CUPS Descries observaes impressora Estado impressora Device impressora e da da da

descricao state device

VARCHAR(100) VARCHAR(50) VARCHAR(100)

36

7 5    $6 4 (

7 5  $6 4

$6 4 7 5 

  (

  ( 32$ 

32$ 

32$ 

"  0 "&  &  # " !  1)( ' % $ 

"  0 "&  & 1)( ' %

"  0 "&  & 1)( ' % E A C A !  D1B85

E A C A !  & H  # ' 9 7 & H & # D1B85 )I6HG& 8FG6H6G '

 # !   $" 

ED1B85 )66G 987 A C A ! & H H & # '

 " !  $#      E A C A  D1B!85 $ @8$$# @ # & 9 7 F &    ( $ 987 # & @

impressora setor marca modelo papel VARCHAR(50) VARCHAR(30) VARCHAR(50) VARCHAR(50) Setor onde a impressora esta localizada fisicamente Marca Modelo Tipo de utilizado papel

modoimpressao VARCHAR(30)

Modo de impresso: Normal; Alta Qualidade;Rascunho

MRE

Jog's de impresso enviados pelos usurios.

PK PK PK

NN NN NN

Cdigo do job Cdigo do usurio que envio o Job Cdigo da impressora Data do Job Nmero Job do

datajob job paginas

DATETI ME VARCHAR(50) I NTEGER

Quantidade de pginas do Job Nome arquivo Job do do

arquivo

VARCHAR(100)

statusjob

VARCHAR(20)

Status do Job. OK= I ndica que o Job foi impresso, Sem cota= indica bloqueio de impresso por cota, Usuario I nativo= I ndica bloqueio de impresso por usurio estar inativo

ORJFRWD

Tabela de logs do sistema.

37

  (

7 5    $6 4 (

32$ 

"  0 "&  & 1)( ' % 32$ 

"  0 "&  & 1)( ' %

E A C A !  D1B85 $   # " !  E A C A !  D1B85

E A C A !  & H  # ' 9 7 & H & # D1B85 )I6HG& 8FG6H6G '

 " !  $#     

' &$S$8$ ' &$S$  H 9 7 F  H

R P Q987    (

PK

NN

Cdigo do AI log Data log do

datalog logmensagem

DATETI ME VARCHAR(255)

PDQXWHQFDR
   (

Controle da manutenes da impressora. Utilizada para apurar os custos reais de impresso.

PK

Cdigo de AI manuteno Cdigo da impressora Data da manuteno Histrico (descrio) da manuteno Verifica se a manuteno foi uma troca de toner (S ou N) Custo em Reais da manuteno

impressora_codimpressora I NTEGER datamanutencao DATE

historico

VARCHAR(100)

trocatoner

CHAR(1)

valor

FLOAT

TXRWD

A tabela cota contm os dados para as polticas de controle de cotas.

PK

NN

Cdigo cota Nome cota

da AI

quota

VARCHAR(20)

da

qtdepaginasmes

I NTEGER

Qtde soft de pginas no ms Qtde hard de pginas no ms Qtde soft de pginas globais. Qtde

qtdepaginasmeslim

I NTEGER

qtdepaginasglobal

I NTEGER

38

7 5  $6 4

$6 4 7 5 

(  

  (

32$ 

"  0 "&  & 1)( ' %

1)( ' % "  0 "&  &

 # " !  $ 

E A C A  D1B!85

 " !   $# 

ED1B85 A C A !

E A C A  D1B!85

$87$ (987   

   (

 $$987 T

@  987

Mensagem do log

independente de datas de impresso qtdepaginasgloballim I NTEGER Qtde hard de pginas globais Perodo em dias que se far o controle de cota a partir da data de incio. Data de incio para controle de cotas por perodo Qtde pginas perodo NN de por

periodo

I NTEGER

dinicio

DATE

qtdepaginasperiodo

I NTEGER

tipoquota

CHAR(1)

M = mensal G = global P = periodo I = infinita Descries e observaes sobre a cota

descricao

VARCHAR(100)

XVXDULR

Usurios do sistema. Devem ser os mesmos do servidor de autenticao.

PK

NN

Cdigo do AI usurio Cdigo do grupo em Nome do usurio, E-mail do usurio

grupo_codgrupo I NTEGER usuario email VARCHAR(50) VARCHAR(100)

39

7 5    $6 4 (

32$ 

1)( ' % "  0 "&  &

 # !   $"  ED1B85 A C A !

   ( ' &$S$987  H

email

VARCHAR(100)

E-mail do usurio Setor onde usurio est lotado Status do usurio Ativo = 1 Bloqueado = 0 Usurio com cota infinita Sim = S , No = N Tipo de cota que ser aplicada ao usurio. G = grupo U = usuario

setor

VARCHAR(50)

ativo

CHAR(1)

semquota

CHAR(1)

tipocota

CHAR(1)

XVXDULRBTXRWD
   (
quota_codquota

Cota de usurio para uma determinada impressora.

PK PK

NN NN

Cdigo do usurio Cdigo da impressora Cota aplicada para usurio e impressora

I NTEGER

NN

40

$6 4 ( 7 5   

32$ 

"  0 "&  &  # " !  1)( ' % $  E A C A !  D1B85

E A C A !  & H  # ' 9 7 & H & # D1B85 )I6HG& 8FG6H6G '

' &$S$8$ ' &$S$  H 9 7 F  H

$1(;2 &
#!/usr/bin/php -q <? //****************************************************** //ARLCOTA - Gerenciador de impresso por usurio //Trabalho final para o curso de Pos-Graduao em Administrao de Redes Linux //UFLA - MG //Autor: Adriano Sathler Horsts // adriano@ciopnet.com.br //Orientador: Fernando Cortez Sica //08/04/2004 // //Script utilizado em conjunto com o script bash IBQUOTA v. 1.2.1 //de Valcir Cabral e colaboradores //http://www.ib.unicamp.br/ibquota/ //****************************************************** $spool_fila = ' /var/spool/cups/' ; $lprm = ' /usr/bin/lprm' ; #Banco de dados mysql $hostname = ' localhost' ; $banco = ' arlcota' ; $usuario = ' ; root' $senha = ' ; root' $con = mysql_connect($hostname, $usuario, $senha) or die ("Conexo falhou"); $db = mysql_select_db($banco,$con) or die ("Erro ao conectar no bd");

$usuario = $argv[1]; $impressora = $argv[2]; $numpaginas = $argv[3]; $nomearq_job = $argv[4]; $job = $argv[5]; $query = "SELECT codusuario, email, tipocota, grupo_codgrupo, ativo, semquota from usuario where usuario = ' $usuario' "; $result = mysql_query($query, $con) or die(' Erro: select grupo' ); if (mysql_num_rows($result)> 0) { while(list($codusuario, $email, $tipocota, $codgrupo, $ativo, $semquota) = mysql_fetch_row($result)) {

41

$codusr = $codusuario; $codgrp = $codgrupo; if ($ativo == 1) { if ($semquota == ' ) { //Verifica se o a cota infinita (semquota = S) N' //*********************************************** //Cotas por grupo de usuario. Soma de todas impressoes do grupo //Verifica o tipo de cota G=grupo, U=usuario //************************************************** if ($tipocota == ' ) { G' $query = "select qt.codquota, qt.quota, qt.qtdepaginasmes, qt.qtdepaginasmeslim, qt.qtdepaginasglobal, qt.qtdepaginasgloballim, qt.periodo, date_format(qt.dinicio, ' %d/%m/%Y' ), qt.qtdepaginasperiodo, qt.tipoquota, imp.codimpressora from quota qt inner join grupo_quota gq on (gq.quota_codquota = qt.codquota) inner join impressora imp on (imp.codimpressora = gq.impressora_codimpressora) where (gq.grupo_codgrupo = ' $codgrp'and ) (imp.impressora = ' $impressora' )"; //echo($query); $result = mysql_query($query, $con) or die(' Erro: select cota 1' ); if (mysql_num_rows($result)> 0) { //se existe cota para grupo while(list($codquota, $quota, $qtdepaginasmes, $qtdepaginasmeslim, $qtdepaginasglobal, $qtdepaginasgloballim, $periodo, $dinicio, $qtdepaginasperiodo, $tipocota, $codimpressora) = mysql_fetch_row($result)) { $codimp = $codimpressora; if ($tipocota == ' ) { P' #Cotas por periodo $sql = "select sum(job.paginas) as totalimpresso from job, usuario where (job.usuario_codusuario = usuario.codusuario) and (date_format(job.datajob, ' %d/%m/%Y'>= ' ) $dinicio' and ) (job.statusjob = ' ) and OK' (job.impressora_codimpressora = ' $codimp' )

42

$codgrp)"; die(Erro: soma pag impressas pelo grupo); mysql_result($resultsql,0); $qtdepaginasperiodo) {

and (usuario.grupo_codgrupo = //echo($sql); $resultsql = mysql_query($sql, $con) or $impressaogrupo = if (($impressaogrupo + $numpaginas) >

$liberaimpressao = 0; echo( cota por periodo estourada ); mail($email,Cota impressao estourada,A cota de impressao de seu grupo excedeu o limite deste mes!) or die("erro: nao foi possivel enviar email"); } else { $liberaimpressao = 1; echo( Cota por periodo ok para impressao ); } } if ($tipocota == M) { #Cotas mensais $mes = date("m"); $sql = "select sum(job.paginas) as totalimpresso from job, usuario where (job.usuario_codusuario = usuario.codusuario) and (month(job.datajob) = $mes) and (job.statusjob = OK) and (job.impressora_codimpressora = $codimp) and (usuario.grupo_codgrupo = $codgrp)"; //echo($sql); $resultsql = mysql_query($sql, $con) or die(Erro: soma pag impressas pelo grupo); $impressaogrupo = mysql_result($resultsql,0); $qtdepaginasmeslim) { if (($impressaogrupo + $numpaginas) > $liberaimpressao = 0; echo( cota mensal estourada );

43

mail($email,Cota impressao estourada,A cota de impressao de seu grupo excedeu o limite deste mes!) or die("erro: nao foi possivel enviar email"); } else { $liberaimpressao = 1; echo( Cota ok para impressao ); if (($impressaogrupo + $numpaginas) > $qtdepaginasmes) { mail($email,Cota impressao,Cota proxima do limite) or die("erro: nao foi possivel enviar email"); } } } if ($tipocota == I) { #Cotas infinitas (no a restrio de impresses) $liberaimpressao = 1; } if ($tipocota == ' ) { G' #Cotas globais $sql = "select sum(job.paginas) as totalimpresso from job, usuario where (job.usuario_codusuario = usuario.codusuario) and (job.statusjob = ' ) and OK' (job.impressora_codimpressora = ' $codimp' ) and (usuario.grupo_codgrupo = ' $codgrp' )"; //echo($sql); $resultsql = mysql_query($sql, $con) or die(' Erro: soma pag impressas pelo grupo' ); $impressaogrupo = mysql_result($resultsql,0); if (($impressaogrupo + $numpaginas) > $qtdepaginasgloballim) { $liberaimpressao = 0; echo(' cota global estourada ' ); mail($email,' Cota impressao estourada'A cota de impressao global de seu grupo excedeu o limite deste mes!'or ,' ) die("erro: nao foi possivel enviar email"); } else { $liberaimpressao = 1; echo(' Cota global ok para impressao ' );

44

$numpaginas) > $qtdepaginasglobal) {

if (($impressaogrupo +

mail($email,Cota impressao,Cota proxima do limite) or die("erro: nao foi possivel enviar email"); } } } //Fim if tipocota=G } } else { $query = "insert into logcota values (' , now(), ' existe cota para 0' No impressora: $impressora e grupo: $codgrp' )"; mysql_query($query, $con) or die(' Erro: insert logcota' ); } //****************************************************** ////Quota por usuario //***************************************************** } else { //cota por usuario $query = "select qt.codquota, qt.quota, qt.qtdepaginasmes, qt.qtdepaginasmeslim, qt.qtdepaginasglobal, qt.qtdepaginasgloballim, qt.periodo, date_format(qt.dinicio, ' %d/%m/%Y' ), qt.qtdepaginasperiodo, qt.tipoquota, imp.codimpressora from quota qt inner join usuario_quota gq on (gq.quota_codquota = qt.codquota) inner join impressora imp on (imp.codimpressora = gq.impressora_codimpressora) where (gq.usuario_codusuario = ' $codusr'and ) (imp.impressora = ' $impressora' )"; //echo($query); $result = mysql_query($query, $con) or die(' Erro: select cota 2' ); if (mysql_num_rows($result)> 0) { //se existe cota para usuario while(list($codquota, $quota, $qtdepaginasmes, $qtdepaginasmeslim, $qtdepaginasglobal, $qtdepaginasgloballim, $periodo, $dinicio, $qtdepaginasperiodo, $tipocota, $codimpressora) = mysql_fetch_row($result)) { $codimp = $codimpressora; if ($tipocota == ' ) { P' #Cotas por periodo

45

totalimpresso $codusr) %d/%m/%Y) >= $dinicio) and (job.impressora_codimpressora = $codimp)"; die(Erro: soma pag impressas pelo grupo); mysql_result($resultsql,0); $qtdepaginasperiodo) { estourada );

$sql = "select sum(job.paginas) as from job where (job.usuario_codusuario = and (date_format(job.datajob, (job.statusjob = OK) and //echo($sql); $resultsql = mysql_query($sql, $con) or $impressaogrupo = if (($impressaogrupo + $numpaginas) > $liberaimpressao = 0; echo( cota por periodo para usuario

mail($email,Cota impressao estourada,Sua cota de impressao excedeu o limite deste periodo!) or die("erro: nao foi possivel enviar email"); } else { $liberaimpressao = 1; echo( Cota por periodo para usuario ok para impressao ); } } if ($tipocota == M) { #Cotas mensais $mes = date("m"); $sql = "select sum(job.paginas) as totalimpresso from job where (job.usuario_codusuario = $codusr) and (month(job.datajob) = $mes) and (job.statusjob = OK) and (job.impressora_codimpressora = $codimp)"; //echo($sql); $resultsql = mysql_query($sql, $con) or die(Erro: soma pag impressas pelo grupo); $impressaogrupo = mysql_result($resultsql,0);

46

$qtdepaginasmeslim) { estourada );

if (($impressaogrupo + $numpaginas) > $liberaimpressao = 0; echo( cota mensal do usuario

mail($email,Cota impressao estourada,Sua cota de impressao excedeu o limite deste mes!) or die("erro: nao foi possivel enviar email"); } else { $liberaimpressao = 1; echo( Cota mesal do usuario ok para impressao ); if (($impressaogrupo + $numpaginas) > $qtdepaginasmes) { mail($email,Cota impressao,Cota proxima do limite) or die("erro: nao foi possivel enviar email"); } } } if ($tipocota == I) { #Cotas infinitas (no a restrio de impresses) $liberaimpressao = 1; } if ($tipocota == ' ) { G' #Cotas globais $sql = "select sum(job.paginas) as totalimpresso from job where (job.usuario_codusuario = ' $codusr' ) and (job.statusjob = ' ) and OK' (job.impressora_codimpressora = ' $codimp' )"; //echo($sql); $resultsql = mysql_query($sql, $con) or die(' Erro: soma pag impressas pelo grupo' ); $impressaogrupo = mysql_result($resultsql,0); if (($impressaogrupo + $numpaginas) > $qtdepaginasgloballim) { $liberaimpressao = 0; echo(' cota global de usuario estourada ' );

47

mail($email,Cota impressao estourada,Sua cota de impressao global excedeu o limite!) or die("erro: nao foi possivel enviar email"); } else { $liberaimpressao = 1; echo( Cota global ok para impressao ); if (($impressaogrupo + $numpaginas) > $qtdepaginasglobal) { mail($email,Cota impressao,Cota proxima do limite) or die("erro: nao foi possivel enviar email"); } } } //Fim if tipocota=G } } else { $query = "insert into logcota values (' , now(), ' existe cota para 0' No impressora: $impressora e grupo: $codgrp' )"; mysql_query($query, $con) or die(' Erro: insert logcota' ); } } //Fim cota por usuario } else { //Usuario com com infinita (semquota = S) echo(' Usuario com cota infinita ' ); $liberaimpressao = 1; } } else { //Usurio no esta ativo $liberaimpressao = 0; echo(' usuario nao ativo' ); $query = "insert into job values (' , $codusr, $codimp, now(), 0' $job, $numpaginas, $nomearq_job,' Usuario Inativo' )"; mysql_query($query, $con) or die(' Erro: insert logcota 3 ' ); }

// echo($liberaimpressao); if ($liberaimpressao == 1) { #Manda job para fila da impressora real //echo("cat " . $spool_fila . $nomearq_job . " | lpr -P $impressora" . "real -C $usuario"); system("cat " . $spool_fila . $nomearq_job . " | lpr -P $impressora" . "real -C $usuario"); $query = "insert into job values (' , ' 0' $codusr'' , $codimp'now(), ' , ' , $job' $numpaginas' , ' $nomearq_job'' )"; , OK' mysql_query($query, $con) or die(' Erro: insert logcota 1 ' );

48

$query = "insert into job values (0, $codusr, $codimp, now(), $job, $numpaginas, $nomearq_job, Sem cota)"; mysql_query($query, $con) or die(Erro: insert logcota 2); } } else { //Se usurio no existe $query = "insert into logcota values (' , now(), ' 0' Usurio: $usuario no cadastrado' )"; mysql_query($query, $con) or die(' Erro: insert logcota' ); } #Remove job da fila da impressora virtual system("$lprm -P $impressora $job"); ?>

} else {

49

$1(;2 '
Script IBQUOTA verso 1.2.1 alterado e adaptado para utilizar o ARLCOTA:
#!/bin/sh # # Script de Quota de Impressao por Usuario - IBQUOTA # Valcir Cabral Vargas - Instituto de Biologia - Unicamp # Data: 16/09/2003 # # FUNCIONAMENTO: # # Pega o job da fila de impressao VIRTUAL, verifica se o dono # possui quota de impressao no banco de dados, e se possuir move # o job para a fila REAL, caso nao tenha quota o job eh # descartado. # Independente se o dono do job tenha ou nao quota, a informacao # eh gravada no banco de dados para ser consultada via WEB, pelo # GG (Gerenciador Grafico). # # VERSAO: 1.2.1 # # Log.: IBQUOTA alterado para suporte de multipas filas de impresso, # com o uso de uma instncia do script. ( Edgar da Rocha - 3/2/2004 11:08:11) # # Obs.: Testei com as filas de impresso em pausa, pois estou de frias e acesso # as mquinas d o trabalho via ssh. # #ALTERADO E ADAPTADO PARA UTILIZAR O ARLCOTA #Adriano Sathler Horsts

#### Inicio das variaveis de parametrizacao #### #Path do comando que informa se ha jobs, lpstat LPSTAT=/usr/bin/lpstat #Path do comando que remove job da fila de impressao, lprm LPRM=/usr/bin/lprm #Nome da Fila da impressora Virtual #VIRTUAL=hp4100n

50

# Nome das filas de impresso (separado por um espao) PRINTERS="HP3550 HP2" # Sulfixo para nome da impressora real # exemplo.: Virtual= hp4100n TAG_REAL=-real nome_impressora_real= hp4100n-real TAG_REAL=real # rotina de testes no desenvolvimento #echo "$PRINTERS$TAG_REAL" #for REAL in $PRINTERS ;do # echo "$AA"; #done #exit 1 #Path do diretorio de spool da fila de impressao SPOOL_FILA=/var/spool/cups/ #Valor em segundos que o IBQUOTA ira dormir caso nao tenha # jobs na fila VIRTUAL, deve-se utilizar um numero maior que zero. TEMPO_DE_ESPERA=10 #### Fim das variaveis de parametrizacao #### #### Testes de tolerancia a falhas #### # #Testar se o path do LPSTAT eh existente. if ! [ -f $LPSTAT ]; then echo "Path do LPSTAT nao valido: $LPSTAT" exit 1 fi # #Testar se o path do LPRM eh existente. if ! [ -f $LPRM ]; then echo "Path do LPRM nao valido: $LPRM" exit 1 fi # verifica se as filas cadastradas so vlidos for VIRTUAL in $PRINTERS; do REAL=$VIRTUAL$TAG_REAL #echo "$REAL --- $VIRTUAL" #

51

#Testar se o nome dado eh impressora VIRTUAL eh valido. if [ $LPSTAT -v | grep "for $VIRTUAL:" | wc -l -ne 1 ]; then echo "Impressora VIRTUAL nao eh valida: $VIRTUAL" exit 1 fi # #Testar se o nome dado eh impressora REAL eh valido. if [ $LPSTAT -v | grep "for $REAL:" | wc -l -ne 1 ]; then echo "Impressora REAL nao eh valida: $REAL" exit 1 fi done # #Testar se o path do SPOOL_FILA eh existente. if ! [ -d $SPOOL_FILA ]; then echo "Path do SPOOL_FILA nao valido: $SPOOL_FILA" exit 1 fi # #Verificar se o TEMPO_DE_ESPERA eh maior que 0 (zero). if [ $TEMPO_DE_ESPERA -le 0 ]; then echo "O TEMPO_DE_ESPERA deve ser maior que 0 (zero)" exit 1 fi # #### Fim dos Testes #### log_arq=log_ibquota echo "date - IBQUOTA iniciado com sucesso" >> $log_arq while true ; do # seta variveis VIRTUAL e REAL # faltou identao nasi linhas de baixo, mas tudo bem :) for VIRTUAL in $PRINTERS; do REAL=$VIRTUAL$TAG_REAL echo $VIRTUAL # #Identificar os arquivos dos respectivos jobs da impressora VIRTUAL vet_jobs=` $LPSTAT -P $VIRTUAL | grep "$VIRTUAL" | cut -d"-" -f2 | cut -d" " -f1 | tail -1`

52

if [ -n $vet_jobs ]; then for job in $vet_jobs; do if [ $job -lt 10 ]; then nome_arq_job="d0000$job-001" fi if [ $job -gt 9 -a $job -lt 100 ]; then nome_arq_job="d000$job-001" fi if [ $job -gt 99 -a $job -lt 1000 ]; then nome_arq_job="d00$job-001" fi if [ $job -gt 999 -a $job -lt 10000 ]; then nome_arq_job="d0$job-001" fi #Testar se o JOB nao eh PS # arq_eh_ps=tail -1 $SPOOL_FILA$nome_arq_job echo "$arq_eh_ps" # if test "$arq_eh_ps" != "@PJL ECHO EOJ" ; then #Grava no log: # echo "Arquivo $nome_arq_job nao eh PS. Job Cancelado." >> $log_arq #Deletar job da Impressora Virtual # $LPRM -P $VIRTUAL $job #Inseri "Arq nao PS" na tabela logi # executa=$MYSQL -B -N -u $USUARIO_BANCO -p$SENHA_BANCO -e "Insert into logi (cod,login,data,hora,job,paginas,arquivo,status) VALUES (0,$dono,SYSDATE(),NOW(),$job,0,$nome_arq_job,Arq nao PS);" $BANCO # Volta ao Loop # continue # fi # #Identificar o dono do Job dono=$LPSTAT -P $VIRTUAL | grep "$VIRTUAL-$job" | awk {print $2} #Testar se o dono do Job eh diferente de NULL if test "X$dono" = "X" ; then #Grava no log: echo "Nao foi possivel identificar o dono do arquivo $nome_arq_job. Job Cancelado." >> $log_arq #Deletar job da Impressora Virtual $LPRM -P $VIRTUAL $job # Volta ao Loop continue fi

53

#Testar se o arquivo temporario de impressao nao existe if ! [ -f $SPOOL_FILA$nome_arq_job ]; then #Grava no log: echo "Arquivo $nome_arq_job nao existe, do job= $job. Job Cancelado." >> $log_arq #Deletar job da Impressora Virtual $LPRM -P $VIRTUAL $job # Volta ao Loop continue fi #Identificar quantas paginas o Job possui paginas_job=cat $SPOOL_FILA$nome_arq_job | grep %%Pages: | tail -1 | cut -d

#Testar se a quantidade de pagina eh negativa, cancelar impressao if [ $paginas_job -lt 1 ]; then #Grava no log: echo "Arquivo $nome_arq_job com a quantidade de pagina menor que 1. Job=$job Cancelado." >> $log_arq #Deletar job da Impressora Virtual $LPRM -P $VIRTUAL $job # Volta ao Loop continue fi #aqui comea o controle de cotas #$usuario = $argv[1]; $impressora = $argv[2];$numpaginas = $argv[3];$job = $argv[4]; ARLCOTA=/usr/local/ibquota/arlcota.php $ARLCOTA $dono $VIRTUAL $paginas_job $nome_arq_job $job #FIM CONTROLE DE COTAS done fi ## fim da rotina de verificao dos spools cadastrados (comando for) done if [ -z $vet_jobs ]; then # Colocar o Script para dormir enquanto nao chega um job sleep "$TEMPO_DE_ESPERA" fi #Caso queira ver o IBQUOTA funcionando, descomente esta linha # echo "Rodou.." # date done

-f2

54