diff options
Diffstat (limited to 'perl-install/printer.pm')
-rw-r--r-- | perl-install/printer.pm | 413 |
1 files changed, 410 insertions, 3 deletions
diff --git a/perl-install/printer.pm b/perl-install/printer.pm index 145dac96a..3cde49185 100644 --- a/perl-install/printer.pm +++ b/perl-install/printer.pm @@ -2184,7 +2184,7 @@ RIGHTDRIVE=\" \" # ------------------------------------------------------------------ # -# Configuration of printers in Applications +# Configuration of printers in applications # # ------------------------------------------------------------------ @@ -2192,26 +2192,34 @@ sub configureapplications { my ($printer) = @_; configurestaroffice($printer); configureopenoffice($printer); + configuregimp($printer); } sub addcupsremotetoapplications { my ($printer, $queue) = @_; return (addcupsremotetostaroffice($printer, $queue) && - addcupsremotetoopenoffice($printer, $queue)); + addcupsremotetoopenoffice($printer, $queue) && + addcupsremotetogimp($printer, $queue)); } sub removeprinterfromapplications { my ($printer, $queue) = @_; return (removeprinterfromstaroffice($printer, $queue) && - removeprinterfromopenoffice($printer, $queue)); + removeprinterfromopenoffice($printer, $queue) && + removeprinterfromgimp($printer, $queue)); } sub removelocalprintersfromapplications { my ($printer) = @_; removelocalprintersfromstaroffice($printer); removelocalprintersfromopenoffice($printer); + removelocalprintersfromgimp($printer); } +# ------------------------------------------------------------------ +# Star Offica/OpenOffice.org +# ------------------------------------------------------------------ + sub configurestaroffice { my ($printer) = @_; # Do we have Star Office installed? @@ -2842,4 +2850,403 @@ sub removesection { return join ("", @lines); } +# ------------------------------------------------------------------ +# GIMP +# ------------------------------------------------------------------ + +sub configuregimp { + my ($printer, $queue) = @_; + # Do we have files to treat? + my @configfilenames = findgimpconfigfiles(); + return 1 if $#configfilenames < 0; + # There is no system-wide config file, treat every user's config file + for my $configfilename (@configfilenames) { + # Load GIMP's printer config file + my $configfilecontent = readgimpconfigfile($configfilename); + # Update local printer queues + for my $queue (keys(%{$printer->{configured}})) { + # Check if we have a PPD file + if (! -r "$prefix/etc/foomatic/$queue.ppd") { + if (-r "$prefix/etc/cups/ppd/$queue.ppd") { + # If we have a PPD file in the CUPS config dir, link to it + run_program::rooted($prefix, + "ln", "-sf", + "/etc/cups/ppd/$queue.ppd", + "/etc/foomatic/$queue.ppd"); + } elsif (-r "$prefix/usr/share/postscript/ppd/$queue.ppd") { + # Check PPD directory of GPR, too + run_program::rooted + ($prefix, + "ln", "-sf", + "/usr/share/postscript/ppd/$queue.ppd", + "/etc/foomatic/$queue.ppd"); + } else { + # No PPD file at all? We cannot set up this printer + next; + } + } + # Add the printer entry + if (!isgimpprinterconfigured ($queue, $configfilecontent)) { + # Remove the old printer entry + $configfilecontent = + removegimpprinter($queue, $configfilecontent); + # Add the new printer entry + $configfilecontent = + makegimpprinterentry($printer, $queue, + $configfilecontent); + } + } + # Default printer + if ($configfilecontent !~ /^\s*Current\-Printer\s*:/m) { + $configfilecontent =~ + s/\n/\nCurrent-Printer: $printer->{DEFAULT}\n/s; + } else { + $configfilecontent =~ /^\s*Current\-Printer\s*:\s*(\S+)\s*$/m; + if (!isgimpprinterconfigured ($1, $configfilecontent)) { + $configfilecontent =~ + s/(Current\-Printer\s*:\s*)\S+/$1$printer->{DEFAULT}/; + } + } + # Write back GIMP's printer configuration file + writegimpconfigfile($configfilename, $configfilecontent); + } + return 1; +} + +sub addcupsremotetogimp { + my ($printer, $queue) = @_; + # Do we have files to treat? + my @configfilenames = findgimpconfigfiles(); + return 1 if $#configfilenames < 0; + my @printerlist = getcupsremotequeues(); + my $ppdfile = ""; + if (($printer->{SPOOLER} eq "cups") && + (-x "$prefix/usr/bin/curl")) { + for my $listentry (@printerlist) { + next if !($listentry =~ /^([^\|]+)\|([^\|]+)$/); + my $q = $1; + next if ($q ne $queue); + my $server = $2; + # Remove server name from queue name + $q =~ s/^([^@]*)@.*$/$1/; + eval(run_program::rooted + ($prefix, "/usr/bin/curl", "-o", + "/etc/foomatic/$queue.ppd", + "http://$server:631/printers/$q.ppd")); + # Does the file exist and is it not an error message? + if ((-r "$prefix/etc/foomatic/$queue.ppd") && + (cat_("$prefix/etc/foomatic/$queue.ppd") =~ + /^\*PPD-Adobe/)) { + $ppdfile = "/etc/foomatic/$queue.ppd"; + } else { + unlink ("$prefix/etc/foomatic/$queue.ppd"); + } + } + } else { + return 1; + } + # There is no system-wide config file, treat every user's config file + for my $configfilename (@configfilenames) { + # Load GIMP's printer config file + my $configfilecontent = readsofficeconfigfile($configfilename); + # Add the printer entry + if (!isgimpprinterconfigured ($queue, $configfilecontent)) { + # Remove the old printer entry + $configfilecontent = + removegimpprinter($queue, $configfilecontent); + # Add the new printer entry + $configfilecontent = + makegimpprinterentry($printer, $queue, + $configfilecontent); + } + # Write back GIMP's printer configuration file + writegimpconfigfile($configfilename, $configfilecontent); + } + return 1; +} + +sub removeprinterfromgimp { + my ($printer, $queue) = @_; + # Do we have files to treat? + my @configfilenames = findgimpconfigfiles(); + return 1 if $#configfilenames < 0; + # There is no system-wide config file, treat every user's config file + for my $configfilename (@configfilenames) { + # Load GIMP's printer config file + my $configfilecontent = readgimpconfigfile($configfilename); + # Remove the printer entry + $configfilecontent = + removegimpprinter($queue, $configfilecontent); + # Write back GIMP's printer configuration file + writegimpconfigfile($configfilename, $configfilecontent); + } + return 1; +} + +sub removelocalprintersfromgimp { + my ($printer) = @_; + # Do we have files to treat? + my @configfilenames = findgimpconfigfiles(); + return 1 if $#configfilenames < 0; + # There is no system-wide config file, treat every user's config file + for my $configfilename (@configfilenames) { + # Load GIMP's printer config file + my $configfilecontent = readgimpconfigfile($configfilename); + # Remove the printer entries + for my $queue (keys(%{$printer->{configured}})) { + $configfilecontent = + removegimpprinter($queue, $configfilecontent); + } + # Write back GIMP's printer configuration file + writegimpconfigfile($configfilename, $configfilecontent); + } + return 1; +} + +sub makegimpprinterentry { + my ($printer, $queue, $configfile) = @_; + # Make printer's section + $configfile = addgimpprinter($queue, $configfile); + # Load PPD file + my $ppd = cat_("$prefix/etc/foomatic/$queue.ppd"); + # Is the printer configured with GIMP-Print? + my $gimpprintqueue = 0; + my $gimpprintdriver = "ps2"; + if ($ppd =~ /CUPS\s*\+\s*GIMP\s*\-\s*Print/im) { + # Native CUPS driver + $gimpprintqueue = 1; + $ppd =~ /\s*\*ModelName:\s*\"(\S+)\"\s*$/im; + $gimpprintdriver = $1; + } elsif ($ppd =~ /Foomatic\s*\+\s*gimp\s*\-\s*print/im) { + # GhostScript + Foomatic driver + $gimpprintqueue = 1; + $ppd =~ + /'idx'\s*=>\s*'ev\/gimp-print-((escp2|pcl|bjc|lexmark)\-\S*)'/im; + $gimpprintdriver = $1; + } + if ($gimpprintqueue) { + # Get the paper size from the PPD file + if ($ppd =~ /^\s*\*DefaultPageSize:\s*(\S+)\s*$/m) { + my $papersize = $1; + $configfile = removegimpentry($queue, + "Media-Size", $configfile); + $configfile = addgimpentry($queue, + "Media-Size: $papersize", $configfile); + } + $configfile = removegimpentry($queue, + "PPD-File:", $configfile); + $configfile = addgimpentry($queue, + "PPD-File:", $configfile); + $configfile = removegimpentry($queue, + "Driver:", $configfile); + $configfile = addgimpentry($queue, + "Driver: $gimpprintdriver", $configfile); + $configfile = removegimpentry($queue, + "Destination:", $configfile); + $configfile = addgimpentry($queue, + "Destination: /usr/bin/$lprcommand{$printer->{SPOOLER}} -P $queue -o raw", $configfile); + } else { + $configfile = removegimpentry($queue, + "PPD-File:", $configfile); + $configfile = addgimpentry($queue, + "PPD-File: /etc/foomatic/$queue.ppd", $configfile); + $configfile = removegimpentry($queue, + "Driver:", $configfile); + $configfile = addgimpentry($queue, + "Driver: ps2", $configfile); + $configfile = removegimpentry($queue, + "Destination:", $configfile); + $configfile = addgimpentry($queue, + "Destination: /usr/bin/$lprcommand{$printer->{SPOOLER}} -P $queue", $configfile); + } + return $configfile; +} + +sub findgimpconfigfiles { + my @configfilenames; + if (-d "$prefix/usr/lib/gimp/1.2") { + push (@configfilenames, ".gimp-1.2/printrc"); + } + if (-d "$prefix/usr/lib/gimp/1.3") { + push (@configfilenames, ".gimp-1.3/printrc"); + } + my @filestotreat; + local *PASSWD; + open PASSWD, "< $prefix/etc/passwd" || die "Cannot read /etc/passwd!\n"; + while (<PASSWD>) { + chomp; + if ($_ =~ /^([^:]+):[^:]*:([^:]+):([^:]+):[^:]*:([^:]+):[^:]*$/) { + my ($username, $uid, $gid, $homedir) = ($1, $2, $3, $4); + if ((($uid == 0) || ($uid >= 500)) && ($username ne "nobody")) { + for my $file (@configfilenames) { + my $dir = "$homedir/$file"; + $dir =~ s:/[^/]*$::; + next if ((-f $dir) && (! -d $dir)); + if (! -d $dir) { + run_program::rooted($prefix, + "/bin/mkdir", $dir) + or next; + run_program::rooted($prefix, + "/bin/chown", "$uid.$gid", $dir) + or next; + } + if (! -f "$homedir/$file") { + local *F; + open F, "> $prefix$homedir/$file" or next; + print F "#PRINTRCv1 written by GIMP-PRINT 4.2.2 - 13 Sep 2002\n"; + close F; + run_program::rooted($prefix, + "/bin/chown", "$uid.$gid", + "$homedir/$file") + or next; + } + push (@filestotreat, "$homedir/$file"); + } + } + } + } + @filestotreat; +} + +sub readgimpconfigfile { + my ($file) = @_; + local *F; + open F, "< $prefix$file" || return ""; + my $filecontent = join("", <F>); + close F; + return $filecontent; +} + +sub writegimpconfigfile { + my ($file, $filecontent) = @_; + local *F; + open F, "> $prefix$file" || return 0; + print F $filecontent; + close F; + return 1; +} + +sub addgimpentry { + my ($section, $entry, $filecontent) = @_; + my $sectionfound = 0; + my $entryinserted = 0; + my @lines = split("\n", $filecontent); + local $_; + for (@lines) { + if (!$sectionfound) { + if (/^\s*Printer\s*:\s*($section)\s*$/) { + $sectionfound = 1; + } + } else { + if (!/^\s*$/ && !/^\s*;/) { #-# + $_ = "$entry\n$_"; + $entryinserted = 1; + last; + } + } + } + if ($sectionfound && !$entryinserted) { + push(@lines, $entry); + } + return join ("\n", @lines); +} + +sub addgimpprinter { + my ($section, $filecontent) = @_; + my $entryinserted = 0; + my @lines = split("\n", $filecontent); + local $_; + for (@lines) { + if (/^\s*Printer\s*:\s*($section)\s*$/) { + # section already there, nothing to be done + return $filecontent; + } + } + return $filecontent . "\nPrinter: $section"; +} + +sub removegimpentry { + my ($section, $entry, $filecontent) = @_; + my $sectionfound = 0; + my $done = 0; + my @lines = split("\n", $filecontent); + local $_; + for (@lines) { + $_ = "$_\n"; + next if ($done); + if (!$sectionfound) { + if (/^\s*Printer\s*:\s*($section)\s*$/) { + $sectionfound = 1; + } + } else { + if (/^\s*Printer\s*:\s*.*\s*$/) { # Next section + $done = 1; + } elsif (/^\s*$entry/) { + $_ = ""; + $done = 1; + } + } + } + return join ("", @lines); +} + +sub removegimpprinter { + my ($section, $filecontent) = @_; + my $sectionfound = 0; + my $done = 0; + my @lines = split("\n", $filecontent); + local $_; + for (@lines) { + $_ = "$_\n"; + next if ($done); + if (!$sectionfound) { + if (/^\s*Printer\s*:\s*($section)\s*$/) { + $_ = ""; + $sectionfound = 1; + } + } else { + if (/^\s*Printer\s*:\s*.*\s*$/) { # Next section + $done = 1; + } else { + $_ = ""; + } + } + } + return join ("", @lines); +} + +sub isgimpprinterconfigured { + my ($queue, $filecontent) = @_; + my $sectionfound = 0; + my $done = 0; + my $drivernotps2 = 0; + my $ppdfileset = 0; + my $nonrawprinting = 0; + my @lines = split("\n", $filecontent); + local $_; + for (@lines) { + last if ($done); + if (!$sectionfound) { + if (/^\s*Printer\s*:\s*($queue)\s*$/) { + $sectionfound = 1; + } + } else { + if (/^\s*Printer\s*:\s*.*\s*$/) { # Next section + $done = 1; + } elsif (/^\s*Driver:\s*(\S+)\s*$/) { + $drivernotps2 = ($1 ne "ps2"); + } elsif (/^\s*PPD\-File:\s*(\S+)\s*$/) { + $ppdfileset = 1; + } elsif (/^\s*Destination:\s*(\S+.*)$/) { + $nonrawprinting = ($1 !~ /\-o\s*raw/); + } + } + } + return 0 if ($done && !$sectionfound); + return 1 if ($ppdfileset || $drivernotps2 || $nonrawprinting); + return 0; +} + +# ------------------------------------------------------------------ + 1; |