home *** CD-ROM | disk | FTP | other *** search
- #!/usr/skunk/bin/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
-