# cups-driver.pl # Functions for CUPS printer drivers $webmin_windows_driver = 0; $cups_ppd_dir = "/etc/cups/ppd"; $lpoptions = &has_command("lpoptions.cups") ? "lpoptions.cups" : "lpoptions"; # is_windows_driver(path, &printer) # Returns the server, share, username, password, workgroup, program # if path is a webmin windows driver sub is_windows_driver { if ($_[1]->{'dev'} =~ /^smb:\/\/(\S*):(\S*)\@(\S*)\/(\S*)\/(\S*)$/) { return { 'user' => $1, 'pass' => $2, 'workgroup' => $3, 'server' => $4, 'share' => $5, 'program' => $_[0] }; } elsif ($_[1]->{'dev'} =~ /^smb:\/\/(\S*):(\S*)\@(\S*)\/(\S*)$/) { return { 'user' => $1, 'pass' => $2, 'server' => $3, 'share' => $4, 'program' => $_[0] }; } elsif ($_[1]->{'dev'} =~ /^smb:\/\/(\S*)\/(\S*)\/(\S*)$/) { return { 'workgroup' => $1, 'server' => $2, 'share' => $3, 'program' => $_[0] }; } elsif ($_[1]->{'dev'} =~ /^smb:\/\/(\S*)\/(\S*)$/) { return { 'server' => $1, 'share' => $2, 'program' => $_[0] }; } else { return undef; } } # is_driver(path, &printer) # Returns the driver name if some path is a CUPS driver, or undef sub is_driver { if (!$_[0] || !-r $_[0]) { return { 'mode' => 0, 'desc' => $text{'cups_none'} }; } local $ppd = &parse_cups_ppd($_[0]); if ($ppd->{'NickName'}) { # Looks like a CUPS PPD file! return { 'mode' => 1, 'manuf' => $ppd->{'Manufacturer'}, 'model' => $ppd->{'ModelName'}, 'nick' => $ppd->{'NickName'}, 'desc' => "$ppd->{'Manufacturer'} $ppd->{'ModelName'}" }; } else { # Some other kind of interface file return { 'mode' => 2, 'file' => $_[0], 'desc' => $_[0] }; } } # create_windows_driver(&printer, &driver) sub create_windows_driver { if ($_[1]->{'workgroup'} && $_[1]->{'user'}) { $_[0]->{'dev'} = "smb://$_[1]->{'user'}:$_[1]->{'pass'}\@$_[1]->{'workgroup'}/$_[1]->{'server'}/$_[1]->{'share'}"; } elsif ($_[1]->{'workgroup'}) { $_[0]->{'dev'} = "smb://$_[1]->{'workgroup'}/$_[1]->{'server'}/$_[1]->{'share'}"; } elsif ($_[1]->{'user'}) { $_[0]->{'dev'} = "smb://$_[1]->{'user'}:$_[1]->{'pass'}\@$_[1]->{'server'}/$_[1]->{'share'}"; } else { $_[0]->{'dev'} = "smb://$_[1]->{'server'}/$_[1]->{'share'}"; } return $_[1]->{'program'}; } # create_driver(&printer, &driver) sub create_driver { local $drv = "$cups_ppd_dir/$_[0]->{'name'}.ppd"; undef($cups_driver_options); if ($_[1]->{'mode'} == 0) { &system_logged("rm -f \"$drv\""); return undef; } elsif ($_[1]->{'mode'} == 2) { &system_logged("rm -f \"$drv\""); return $_[1]->{'file'}; } else { # Copy the driver into place if ($_[1]->{'ppd'} =~ /\.gz$/) { &system_logged("gunzip -c '$_[1]->{'ppd'}' >$drv"); } else { &system_logged("cp $_[1]->{'ppd'} $drv"); } chmod(0777, $drv); $cups_driver_options = $_[1]->{'opts'}; # for modify_printer return $drv; } } # delete_driver(name) sub delete_driver { &system_logged("rm -f \"$cups_ppd_dir/$_[0].ppd\""); } # driver_input(&printer, &driver) sub driver_input { printf "
| $disp: | \n"; print "\n"; print " |