diff options
Diffstat (limited to 'expect/example/lpunlock')
-rwxr-xr-x | expect/example/lpunlock | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/expect/example/lpunlock b/expect/example/lpunlock new file mode 100755 index 00000000000..dd3bbe26bde --- /dev/null +++ b/expect/example/lpunlock @@ -0,0 +1,95 @@ +#!../expect -f + +# This script unhangs a printer which claims it is "waiting for lock". +# Written by Don Libes. Based on English instructions from Scott Paisley. + +# lpunlock figures out if the printer is on a server, and if so which, +# by looking in the local printcap file. (You can override this by +# supplying a server name as an additional argument.) It then rlogins +# to the server, recreates the device and resets the queue via lpc. + +# assumes user has root privs on remote host via /.rhosts + +# assumes printer is name of device on remote system + +proc usage {} { + send_user "usage: lpunlock <printer> \[<server>\]\n" + send_user "example: lpunlock lw-isg durer\n" + exit +} + +if $argc==0 usage +set printer [lindex $argv 0] + +set client [exec hostname] + +if {$argc == 1} { + # if no arg2, look in local printcap for info + spawn ed /etc/printcap + expect "\n" ;# discard character count + send "/$printer/\r" + for {} 1 {} { + expect -re ".*:rm=(\[^:]*):.*\r\n" { + set server $expect_out(1,string) + break + } "\r\n*\\\r\n" { ;# look at next line of entry + send "\r" + } "\r\n*\n" { ;# no more lines of entry - give up + set server $client + break + } + } +} else { + if {$argc == 2} { + set server [lindex $argv 1] + } else usage +} + +set whoami [exec whoami] +if {[string match $server $client] && [string match $whoami "root"]} { + spawn csh + expect "# " +} else { + # login to the print server as root. + # Set timeout high because login is slow. + set timeout 60 + spawn rlogin $server -l root + expect timeout exit \ + eof exit \ + "Password*" { + send_user "\ncouldn't login to $server as root\n" + exit + } "1#*" + set timeout 10 +} + +# run lpc and 'stop printer' +send lpc\r ; expect "lpc>*" +send stop $printer\r ; expect "unknown*" exit \ + "disabled*lpc>*" + +# exit lpc and cd /dev +send quit\r ; expect "#*" +send cd /dev\r ; expect "#*" + +# figure out major/minor device numbers +send ls -l /dev/$printer\r ; expect timeout { + send_user "\nbad device - couldn't get major/minor numbers\n"; exit + } "crw*#*" +scan $expect_out(buffer) "ls -l %*s %*s 1 root %d, %d" major minor + +# delete the lock and the printer device itself +send rm /var/spool/$printer/lock /dev/$printer\r ; expect #* + +# recreate the printer device +send mknod $printer c $major $minor\r ; expect #* + +# run lpc and 'start printer' +send lpc\r ; expect lpc>* +send start $printer\r ; expect started*lpc>* +send quit\r ; expect #* + +# logout +send exit\r ; expect eof + +send_user Printer unlocked and restarted.\n |