Re: [LINUX:392] Print kotasi

Gokhan Moral (gm@Bilkent.EDU.TR)
Wed, 18 Feb 1998 10:29:33 +0000 (WAT)


On Tue, 17 Feb 1998, tayfun asker wrote:

> Bir Linux makinasina bagli printerin kullanicilarina print kotasi vermek
> istiyorum. Bu isin nasil yapildigini nereden bulabilirim.
> Tesekurler.
> T.
>
>
bunu ben de cok aramistim ama bulamayinca mecburen kendim yazdim.
asagida paste edecegim script, input filter olarak kullanildiginda sayfa
sayip eger sayfa yeterli degilse joblari remove edebiliyor.
gonderilen dosya text ya da postscript olmali.
ve de printer spooler'i olarak LPRng kullaniyorum (slackware contrib
directorysinde bulabilirsiniz. ftp.astart.com'da da doclari var ve benim
gordugum en iyi printer spooler'i)

yazdigim quota paketi iki bolumden olusuyor. birincisi quota'yi kontrol
eden ve sayfalari sayan bir input filter (sayfa sayma isini de o yapiyor),
digeri de eger print isi kabul edilirse quotayi arttiran bir c programi.
ikisi de cok acemice yazilmis gibi gorunebilir :) uzerinde calistiklarini
gordukten sonra hic ugrasmadim. sacma buldugunuz yerleri duzeltir bana
maillerseniz sevinirim.

bu arada, quota paketi input filter olarak calismasinin artindan
CTI-ifhp'nin /usr/local/lib/filters altindaki ifhp executable dosyasini
cagiriyor. eger input filter kullanmayacaksaniz (laser printer falan
degilse) bunu cat yapabilirsiniz.

Bu iki kucuk programi ayni zamanda solarislerde de kullaniyorum. onlarda
da sorunsuz calisiyor.

Umarim isinize yarar.

Saygilar

Gokhan Moral
Bilkent University
Network Administrator
(try telnetting "buces.bbs.tr 3000")

#kucuk scriptimiz burada basliyor...
---------------------------------------------
#!/bin/sh
#quota support for Bilkent University by Gokhan Moral
#for LPRng printer spooler

# User configurable part starts
SPOOLDIR=/usr/spool
QUOTAFILE=/etc/lpadm/lquotas
PROGPATH="/usr/local/lib/filters"
FILTER="/usr/local/lib/filters/ifhp -Tstatus=off"
QUOTAINCREASE=/usr/local/lib/filters/quotaincrease
ACCTFILE=/etc/lpadm/acct
#QUOTACHECK 0 yapilirsa sadece sayfalari saylar
QUOTACHECK=1
# User configurable part ends

login=
time=
host=
controlfile=
datafile=
printer=
accountingfile=
filename=
text=0
postscript=0

while [ $# != 0 ];
do case "$1" in
-k* ) controlfile=`echo "$1" | sed s/..//` ;;
-e* ) datafile=`echo "$1" | sed s/..//` ;;
-n* ) login=`echo "$1" | sed s/..//` ;;
-h* ) host=`echo "$1" | sed s/..//` ;;
-P* ) printer=`echo "$1" | sed s/..//` ;;
-T* ) time=`echo "$1" | sed 's/..//'` ;;
-J* ) filename=`echo "$1" | sed 's/..//'` ;;
-* ) ;;
* ) accountingfile=$1;;
esac;
shift;
done

#datafile="d`echo $controlfile | cut -b 2-`"

if [ ! -r $datafile ];
then
echo Cannot read the datafile. host=$host controlfile=$controlfile 1>&2
exec cat > /dev/null
fi

if [ $QUOTACHECK -eq 1 ];
then
QUOTACHECK=0
if [ -r $QUOTAFILE ];
then
QUOTACHECK=1
fi
fi

time=`date | awk '{print $1,$2,$3,$4}'`

type=`file $datafile`

if [ $QUOTACHECK -eq 1 ];
then
userinfo=`grep -w $login $QUOTAFILE`
echo $userinfo | grep $login > /dev/null || {
echo $login does not have quota. 1>&2
exec cat > /dev/null
}
userquota=`echo $userinfo | awk '{print $3}'`
userused=`echo $userinfo | awk '{print $2}'`
quotaleft=`expr $userquota - $userused`
fi

echo $type | grep PostScript > /dev/null &&
{
page=`grep "%%Page:" $datafile | wc -l | awk '{print $1}'`
if [ $QUOTACHECK -eq 1 ]; then
expr $quotaleft - $page | grep - > /dev/null &&
{
echo $login: not enough laser quota. page=$page quota=$quotaleft1>&2;
exec cat > /dev/null
}
$QUOTAINCREASE $login $page
fi
touch $ACCTFILE.$printer
echo ${login}#${host}#${time}#${page} >> $ACCTFILE.$printer
exec $FILTER $*
} || {
echo $type | grep text > /dev/null && \
{
lines=`wc -l $datafile | awk '{print $1}'`
page=`expr $lines / 66`
page=`expr $page + 1`
if [ $QUOTACHECK -eq 1 ]; then
expr $quotaleft - $page | grep - > /dev/null &&
{
echo $login: not enough laser quota. page=$page quota=$quotaleft
1>&2;
exec cat > /dev/null
}
$QUOTAINCREASE $login $page
fi
touch $ACCTFILE.$printer
echo ${login}#${host}#${time}#${page} >> $ACCTFILE.$printer
exec $FILTER $*
}
}

echo The file cannot be printed. login=$login 1>&2
exec cat > /dev/null
# shell scriptinin sonu.

--------------------------------------------------------------------

/*ikinci kucuk program c programi*/

#define QUOTAFILE "/etc/lpadm/lquotas"
#define ERRORFILE "/etc/lpadm/error.quotas"
/*#define QUOTAFILE "/homestu/stu/eestu/gm/lquotas"
#define ERRORFILE "/homestu/stu/eestu/gm/error.quotas"
*/
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

main(int argc, char *argv[]) {
long position;
char userinfo[80],userquota[80];
char *control1,*control2;
int lengthofchar,userquota_int;
FILE *quotafile;
int found=0;
char errortext[80];

if((quotafile=fopen(QUOTAFILE,"r+"))==NULL) {
printf("Error opening quotafile");
exit(1);
}

if(argc!=3) exit(1);

userquota[0]='\0';
userinfo[0]='\0';

while(1) {
position=ftell(quotafile);
if(fgets(userinfo,80,quotafile)==0) break;
if(strncmp(argv[1],userinfo,strlen(argv[1]))==0
&& (userinfo[strlen(argv[1])]==' ' ||
userinfo[strlen(argv[1])]=='\t') ) {
found++;
for(control1=userinfo;control1[0]!=' '&&control1[0]!='\t';control1++);
for(control2=control1;control2[0]==' '||control2[0]=='\t';control2++);
for(control1=control2;control1[0]!=' '&&control1[0]!='\t';control1++);
lengthofchar=(int)(control1-control2);

strncat(userquota,control2,lengthofchar);
userquota_int=atoi(userquota);
userquota_int+=atoi(argv[2]);
sprintf(userquota,"%d",userquota_int);
strncpy(control2,"0000000000000000000",lengthofchar-strlen(userquota));
control1-=strlen(userquota);
strncpy(control1,userquota,strlen(userquota));
rewind(quotafile);
fseek(quotafile,position,SEEK_SET);
fwrite(userinfo,1,strlen(userinfo),quotafile);
rewind(quotafile);
fseek(quotafile,position,SEEK_SET);
fseek(quotafile,strlen(userinfo),SEEK_CUR);
control1=control2=NULL;
userinfo[0]=userquota[0]='\0';
}
}
if(found!=1) {
sprintf(errortext,"echo XXX %s has %d entry in the quota file. >> %s",argv[1],found,ERRORFILE);
system(errortext);
}

fclose(quotafile);
}
/* kucuk c programimizin sonu */

----------------------------------------------------
quota file'inin yapisi username+bosluk+basinda birsuru sifir olan
kullanilan sayfa sayisi+bosluk+basinda birsuru sifir olan max quota.
ornek:

gm 00000001 000000100
ali 000010 0000050

aklima baska yol gelmemisti, boyle yaptim :)