Spooler Filter
Vasilis Vasaitis
vvas at hal.csd.auth.gr
Fri May 26 22:09:57 EEST 2000
On Wed, May 24, 2000 at 07:49:43PM +0300, DJ Art wrote:
> Τελικά, η ιδέα για το filter του Γιάννη είναι καλή (πρίν, όμως, αλλάξω
> το lpr ;-))
>
> Έφτιαξα το παρακάτω σε gawk. Υπάρχουν ορισμένα προβλήματα:
>
> 1) Πώς θα πάρω τον user που έτρεξε το lpr ???
> 2) Πώς θα πάρω το Job id ??
> 3) optional: Πώς θα πάρω το μέγεθος του αρχείου που εκτυπώνει ??
Δεν ξέρω για το lpr, αλλά το lprng, σύμφωνα με το lpd(8), μπορεί να δώσει
ένα κάρο πληροφορίες στην γραμμή εντολών του φίλτρου. Βέβαια, αν βάλεις το
lprng πιθανώς δεν χρειάζεσαι φίλτρο για τη δουλειά που το θέλεις, αλλά αυτό
είναι μια άλλη ιστορία... Ας δούμε όμως το script που έκανες.
> Λοιπόν:
>
> #!/bin/sh
#!/usr/bin/perl
> gawk '
> BEGIN {
> for (i=1;i<=80;i++) printf "*" ;
> for (i=1;i<=80;i++) printf "*" ;
> for (i=1;i<=80;i++) printf "*" ;
>
> # ναι, ξέρω, θέλει function.
>
> printf "\n";
# Το 80 είναι λίγο προβληματικό, αν σου κάνει κενές γραμμές στον εκτυπωτή
# δοκίμασε 79 ή 72 ή κάτι τέτοιο.
print +("*" x 80 . "\n") x 3, "\n";
> printf "User: ";
> system ("finger $USER | gawk -f script");
>
> # γελάτε, ε ?? :) gawk μέσα από gawk !!!!
> # Λοιπόν ας γράψω το script και να εξηγήσω τί θέλω.
> # script ==> { if (NR<=1) print $4,$5}
> # Θέλω να τυπώσω το 5o πεδίο του passwd, αυτό που γράφει
> # πληροφορίες/ονοματεπώνυμο κλπ. Ε, το παίρνω από το 4o/5o πεδίο του
> # finger $USER
>
> printf "\n";
@userinfo = getpwuid($<);
@gecos = split /,/, $userinfo[6];
print "User: ", $gecos[0], "\n\n";
> printf "Job id: ";
> system ("lpq | gawk -f script2");
>
> # (άντε πάλι ;-)) Ναι, το ξέρω εκ των προτέρων πως δεν θα καταφέρω
> # να πάρω το Job από το lpq, αφού δεν μένει το αναθεματισμένο εκεί
> # για πολλή ώρα :-(
> # script 2 ==>
> #$2 == ENVIRON["USER"] {print $3, " Total Size: ", $5,$6}
>
> printf "\n";
# Γι' αυτά εδώ δεν ξέρω, άμα δεν δω την έξοδο της lpq...
> system ("date");
> printf "\n";
> }
print scalar localtime, "\n\f";
> {print $0}'
print while (<STDIN>);
> -----------------------------
>
> Κάπου στο τέλος ξέχασα και ένα printf "\f". Λοιπόν, θέλω σε κάθε lpr
> request να τυπώνεται σε μία σελίδα το εξής:
>
> *********************************************
> *********************************************
> *********************************************
>
> User: DJ Art
>
> Job Id: 60 Total size: 45 bytes
>
> Wed May 24 19:39:34 EEST 2000
Νομίζω ότι το παραπάνω τα προσεγγίζει αρκετά αυτά.
> ------------------------------
>
> Ποιό είναι τώρα το πρόβλημα:
>
> όταν τρέξω το filter με το "χέρι", όλα δουλεύουν. Όταν το "αναλάβει" ο
> lpr, φυσικά και βγάζει στο User: Idle Login αφού δεν ισχύει το $USER.
> Και φυσικά, στο Job Id δεν βγάζει τίποτα, αφού δεν υπάρχει τίποτα μέσα
> στο lpq.
>
> Όταν εκτελείται το φίλτρο, εκτελείται με option -n username. Ο owner της
> process του sh /var/spool/filter είναι ο username (αυτός που πρέπει
> δηλαδή) και ο owner της process της gawk είναι πάλι ο σωστός. Μπορώ να
> πάρω το user, από εκεί ??
Γενικά η awk δεν σου κάνει ιδιαίτερα στην συγκεκριμένη περίπτωση, γιατί
είναι γλώσσα καθαρά για κείμενο και όχι all-around UNIX εργαλείο. Όταν
φτάνεις να καλείς τόσα system, ξέρεις ότι θα έπρεπε να είχες κάνει τη
δουλειά σου με κάτι άλλο. Στο script που σου έγραψα σε perl βασίζομαι στο
ότι το UID είναι σωστό όπως λες, αλλά και η γραμμή εντολών είναι αρκετά
εύκολη στη χρήση και στις δύο γλώσσες (λέξη κλειδί: ARGV).
Όσο για το job id και το μέγεθος δεν ξέρω, ψάξε στη βοήθεια του lpr μήπως
μπορεί να τα περάσει στην γραμμή εντολών. Διαφορετικά, ξέρεις τι πρέπει να
κάνεις. :-)
(Αλλά πάλι, γιατί απλά δεν βάζεις ένα sh να ησυχάσεις; Τόσο σημαντικό το
θεωρείς το banner;)
--
\ /_. _o|o _ \ /_. _ _.o_|_o _
\/(_|_>|||_> \/(_|_>(_|| |_|_>
__
_. _ / \|_ _.| _ _ _| _. _|_|_ _ ._
\/\/(_|_>| (|/| |(_||o(__>(_|o(_||_||_| |o(_||
\__ _|
--
linux-greek-users mailing list -- http://lists.hellug.gr
More information about the Linux-greek-users
mailing list