summaryrefslogtreecommitdiffstats
path: root/perl-install/printer/main.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/printer/main.pm')
-rw-r--r--perl-install/printer/main.pm293
1 files changed, 125 insertions, 168 deletions
diff --git a/perl-install/printer/main.pm b/perl-install/printer/main.pm
index 2ee75ba04..d3699491c 100644
--- a/perl-install/printer/main.pm
+++ b/perl-install/printer/main.pm
@@ -13,6 +13,7 @@ use printer::gimp;
use printer::cups;
use printer::office;
use printer::detect;
+use handle_configs;
use services;
use vars qw(@ISA @EXPORT);
@@ -674,95 +675,6 @@ sub write_cupsd_conf {
printer::services::restart("cups");
}
-sub read_directives {
-
- # Read one or more occurences of a directive from the cupsd.conf file
- # or from a ripped-out location block
-
- my ($lines_ptr, $directive) = @_;
-
- my @result = ();
- ($_ =~ /^\s*$directive\s+(\S.*)$/ and push(@result, $1))
- foreach @{$lines_ptr};
- (chomp) foreach @result;
- return @result;
-}
-
-sub read_unique_directive {
-
- # Read a directive from the from the cupsd.conf file or from a
- # ripped-out location block, if the directive appears more than once,
- # use the last occurence and remove all the others, if it does not
- # occur, return the default value
-
- my ($lines_ptr, $directive, $default) = @_;
-
- if ((my @d = read_directives($lines_ptr, $directive)) > 0) {
- my $value = @d[$#d];
- set_directive($lines_ptr, "$directive $value");
- return $value;
- } else {
- return $default;
- }
-}
-
-sub insert_directive {
-
- # Insert a directive into the cupsd.conf file or into a ripped-out
- # location block (but only if it is not already there)
-
- my ($lines_ptr, $directive) = @_;
-
- ($_ =~ /^\s*$directive$/ and return 0) foreach @{$lines_ptr};
- splice(@{$lines_ptr}, -1, 0, "$directive\n");
- return 1;
-}
-
-sub remove_directive {
-
- # Remove a directive from the cupsd.conf file or from a ripped-out
- # location block
-
- my ($lines_ptr, $directive) = @_;
-
- my $success = 0;
- ($_ =~ /^\s*$directive/ and $_ = "" and $success = 1)
- foreach @{$lines_ptr};
- return $success;
-}
-
-sub replace_directive {
-
- # Replace a directive in the cupsd.conf file or from a ripped-out
- # location block, if the directive appears more than once, remove
- # the additional occurences
-
- my ($lines_ptr, $olddirective, $newdirective) = @_;
-
- $newdirective = "$newdirective\n";
- my $success = 0;
- ($_ =~ /^\s*$olddirective/ and $_ = $newdirective and
- $success = 1 and $newdirective = "") foreach @{$lines_ptr};
- return $success;
-}
-
-sub set_directive {
-
- # Set a directive in the cupsd.conf, replace the old definition or
- # a commented definition
-
- my ($cupsd_conf_ptr, $directive) = @_;
-
- my $olddirective = $directive;
- $olddirective =~ s/^\s*(\S+)\s+.*$/$1/s;
-
- return (replace_directive($cupsd_conf_ptr, $olddirective,
- $directive) or
- replace_directive($cupsd_conf_ptr, "\#$olddirective",
- $directive) or
- insert_directive($cupsd_conf_ptr, $directive));
-}
-
sub read_location {
# Return the lines inside the [path] location block
@@ -866,7 +778,7 @@ sub add_to_location {
my ($cupsd_conf_ptr, $path, $directive) = @_;
my ($location_start, @location) = rip_location($cupsd_conf_ptr, $path);
- my $success = insert_directive(\@location, $directive);
+ my $success = handle_configs::insert_directive(\@location, $directive);
insert_location($cupsd_conf_ptr, $location_start, @location);
return $success;
}
@@ -878,7 +790,7 @@ sub remove_from_location {
my ($cupsd_conf_ptr, $path, $directive) = @_;
my ($location_start, @location) = rip_location($cupsd_conf_ptr, $path);
- my $success = remove_directive(\@location, $directive);
+ my $success = handle_configs::remove_directive(\@location, $directive);
insert_location($cupsd_conf_ptr, $location_start, @location);
return $success;
}
@@ -890,8 +802,9 @@ sub replace_in_location {
my ($cupsd_conf_ptr, $path, $olddirective, $newdirective) = @_;
my ($location_start, @location) = rip_location($cupsd_conf_ptr, $path);
- my $success = replace_directive(\@location, $olddirective,
- $newdirective);
+ my $success = handle_configs::replace_directive(\@location,
+ $olddirective,
+ $newdirective);
insert_location($cupsd_conf_ptr, $location_start, @location);
return $success;
}
@@ -901,7 +814,8 @@ sub add_allowed_host {
# Add a host or network which should get access to the local printer(s)
my ($cupsd_conf_ptr, $host) = @_;
- return (insert_directive($cupsd_conf_ptr, "BrowseAddress $host") and
+ return (handle_configs::insert_directive($cupsd_conf_ptr,
+ "BrowseAddress $host") and
add_to_location($cupsd_conf_ptr, "/", "Allow From $host"));
}
@@ -911,8 +825,9 @@ sub remove_allowed_host {
# printer(s)
my ($cupsd_conf_ptr, $host) = @_;
- return (remove_directive($cupsd_conf_ptr, "BrowseAddress $host") and
- remove_from_location($cupsd_conf_ptr, "/", "Allow From $host"));
+ return (handle_configs::remove_directive($cupsd_conf_ptr, "BrowseAddress $host") and
+ remove_from_location($cupsd_conf_ptr, "/",
+ "Allow From $host"));
}
sub replace_allowed_host {
@@ -921,8 +836,9 @@ sub replace_allowed_host {
# printer(s)
my ($cupsd_conf_ptr, $oldhost, $newhost) = @_;
- return (replace_directive($cupsd_conf_ptr, "BrowseAddress $oldhost",
- "BrowseAddress $newhost") and
+ return (handle_configs::replace_directive($cupsd_conf_ptr,
+ "BrowseAddress $oldhost",
+ "BrowseAddress $newhost") and
replace_in_location($cupsd_conf_ptr, "/", "Allow From $newhost",
"Allow From $newhost"));
}
@@ -1049,17 +965,27 @@ sub clientnetworks {
# Check for a "Deny From All" line
my $havedenyfromall =
(join('', @{$printer->{cupsconfig}{root}{DenyFrom}}) =~
- /All/im);
+ /All/im ? 1 : 0);
+
+ # Check for "Deny From XXX" with XXX != All
+ my $havedenyfromnotall =
+ ($#{$printer->{cupsconfig}{root}{DenyFrom}} - $havedenyfromall < 0 ?
+ 0 : 1);
+
+ # Check for a "BrowseDeny All" line
+ my $havebrowsedenyall =
+ (join('', @{$printer->{cupsconfig}{keys}{BrowseDeny}}) =~
+ /All/im ? 1 : 0);
- # Check for "Order Deny,Allow"
- my $orderdenyallow =
- ($printer->{cupsconfig}{root}{Order} =~
- /deny\s*,\s*allow/i);
+ # Check for "BrowseDeny XXX" with XXX != All
+ my $havebrowsedenynotall =
+ ($#{$printer->{cupsconfig}{keys}{BrowseDeny}} -
+ $havebrowsedenyall < 0 ? 0 : 1);
my @sharehosts;
my $haveallowfromlocalhost = 0;
my $haveallowedhostwithoutbrowseaddress = 0;
-
+ my $haveallowedhostwithoutbrowseallow = 0;
# Go through all "Allow From" lines
for my $line (@{$printer->{cupsconfig}{root}{AllowFrom}}) {
if ($line =~ /^\s*(localhost|0*127\.0+\.0+\.0*1)\s*$/i) {
@@ -1074,6 +1000,10 @@ sub clientnetworks {
@{$printer->{cupsconfig}{keys}{BrowseAddress}})) {
$haveallowedhostwithoutbrowseaddress = 1;
}
+ if (!member($line,
+ @{$printer->{cupsconfig}{keys}{BrowseAllow}})) {
+ $haveallowedhostwithoutbrowseallow = 1;
+ }
}
}
my $havebrowseaddresswithoutallowedhost = 0;
@@ -1089,11 +1019,28 @@ sub clientnetworks {
$havebrowseaddresswithoutallowedhost = 1;
}
}
+ my $havebrowseallowwithoutallowedhost = 0;
+ # Go through all "BrowseAllow" lines
+ for my $line (@{$printer->{cupsconfig}{keys}{BrowseAllow}}) {
+ if ($line =~ /^\s*(localhost|0*127\.0+\.0+\.0*1)\s*$/i) {
+ # Skip lines pointing to localhost
+ } elsif ($line =~ /^\s*(none)\s*$/i) {
+ # Skip "BrowseAllow None" lines
+ } elsif (!member($line, @sharehosts)) {
+ # Line pointing to remote server
+ push(@sharehosts, $line);
+ $havebrowseallowwithoutallowedhost = 1;
+ }
+ }
- my $configunsupported = (!$havedenyfromall || !$orderdenyallow ||
+ print "##### (!$havedenyfromall || $havedenyfromnotall || !$havebrowsedenyall || $havebrowsedenynotall || !$haveallowfromlocalhost || $haveallowedhostwithoutbrowseaddress || $havebrowseaddresswithoutallowedhost || $haveallowedhostwithoutbrowseallow || $havebrowseallowwithoutallowedhost)\n";
+ my $configunsupported = (!$havedenyfromall || $havedenyfromnotall ||
+ !$havebrowsedenyall || $havebrowsedenynotall ||
!$haveallowfromlocalhost ||
$haveallowedhostwithoutbrowseaddress ||
- $havebrowseaddresswithoutallowedhost);
+ $havebrowseaddresswithoutallowedhost ||
+ $haveallowedhostwithoutbrowseallow ||
+ $havebrowseallowwithoutallowedhost);
return ($configunsupported, @sharehosts);
}
@@ -1151,33 +1098,33 @@ sub read_cups_config {
# Keyword "Browsing"
$printer->{cupsconfig}{keys}{Browsing} =
- read_unique_directive($printer->{cupsconfig}{cupsd_conf},
- 'Browsing', 'On');
+ handle_configs::read_unique_directive($printer->{cupsconfig}{cupsd_conf},
+ 'Browsing', 'On');
# Keyword "BrowseInterval"
$printer->{cupsconfig}{keys}{BrowseInterval} =
- read_unique_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseInterval', '30');
+ handle_configs::read_unique_directive($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseInterval', '30');
# Keyword "BrowseAddress"
@{$printer->{cupsconfig}{keys}{BrowseAddress}} =
- read_directives($printer->{cupsconfig}{cupsd_conf},
- 'BrowseAddress');
+ handle_configs::read_directives($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseAddress');
# Keyword "BrowseAllow"
@{$printer->{cupsconfig}{keys}{BrowseAllow}} =
- read_directives($printer->{cupsconfig}{cupsd_conf},
- 'BrowseAllow');
+ handle_configs::read_directives($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseAllow');
# Keyword "BrowseDeny"
@{$printer->{cupsconfig}{keys}{BrowseDeny}} =
- read_directives($printer->{cupsconfig}{cupsd_conf},
- 'BrowseDeny');
+ handle_configs::read_directives($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseDeny');
# Keyword "BrowseOrder"
$printer->{cupsconfig}{keys}{BrowseOrder} =
- read_unique_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseOrder', 'deny,allow');
+ handle_configs::read_unique_directive($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseOrder', 'deny,allow');
# Root location
@{$printer->{cupsconfig}{rootlocation}} =
@@ -1185,18 +1132,18 @@ sub read_cups_config {
# Keyword "Allow from"
@{$printer->{cupsconfig}{root}{AllowFrom}} =
- read_directives($printer->{cupsconfig}{rootlocation},
- 'Allow From');
+ handle_configs::read_directives($printer->{cupsconfig}{rootlocation},
+ 'Allow From');
# Keyword "Deny from"
@{$printer->{cupsconfig}{root}{DenyFrom}} =
- read_directives($printer->{cupsconfig}{rootlocation},
- 'Deny From');
+ handle_configs::read_directives($printer->{cupsconfig}{rootlocation},
+ 'Deny From');
# Keyword "Order"
$printer->{cupsconfig}{root}{Order} =
- read_unique_directive($printer->{cupsconfig}{rootlocation},
- 'Order', 'Deny,Allow');
+ handle_configs::read_unique_directive($printer->{cupsconfig}{rootlocation},
+ 'Order', 'Deny,Allow');
# Widget settings
@@ -1224,51 +1171,43 @@ sub write_cups_config {
# Local printers available to other machines?
if ($printer->{cupsconfig}{localprintersshared}) {
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'Browsing On');
+ handle_configs::set_directive($printer->{cupsconfig}{cupsd_conf},
+ 'Browsing On');
if ($printer->{cupsconfig}{keys}{BrowseInterval} == 0) {
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseInterval 30');
+ handle_configs::set_directive($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseInterval 30');
}
} else {
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseInterval 0');
+ handle_configs::set_directive($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseInterval 0');
}
# This machine is accepting printers shared by remote machines?
if ($printer->{cupsconfig}{remotebroadcastsaccepted}) {
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'Browsing On');
- if (($printer->{cupsconfig}{localprintersshared}) &&
- ($#{$printer->{cupsconfig}{clientnetworks}} > 0) &&
- (!$printer->{cupsconfig}{customsharingsetup})) {
+ handle_configs::set_directive($printer->{cupsconfig}{cupsd_conf},
+ 'Browsing On');
+ if (!$printer->{cupsconfig}{customsharingsetup}) {
# If we broadcast our printers, let's accept the broadcasts
# from the machines to which we broadcast
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseDeny All');
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseOrder Deny,Allow');
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseAllow ' .
- join ("\nBrowseAllow ",
- @{$printer->{cupsconfig}{clientnetworks}}));
- } elsif (!remotebroadcastsaccepted($printer)) {
- # Use default settings if the "BrowseDeny"/"BrowseAllow"
- # configuration does not accept broadcasts
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseDeny All');
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseOrder Deny,Allow');
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseOrder @LOCAL');
+ handle_configs::set_directive($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseDeny All');
+ handle_configs::set_directive($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseOrder Deny,Allow');
}
} else {
- # Deny all broadcasts, but leave all "BrowseAllow" lines
- # untouched
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseDeny All');
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseOrder Allow,Deny');
+ if ($printer->{cupsconfig}{localprintersshared}) {
+ # Deny all broadcasts, but leave all "BrowseAllow" lines
+ # untouched
+ handle_configs::set_directive($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseDeny All');
+ handle_configs::set_directive($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseOrder Allow,Deny');
+ } else {
+ # We also do not share printers, so we turn browsing off to
+ # do not need to deal with any addresses
+ handle_configs::set_directive($printer->{cupsconfig}{cupsd_conf},
+ 'Browsing Off');
+ }
}
# To which machines are the local printers available?
@@ -1276,24 +1215,42 @@ sub write_cups_config {
# root location block
@{$printer->{cupsconfig}{rootlocation}} =
"<Location />\n" .
- "Order Deny,Allow\n" .
+ ($printer->{cupsconfig}{localprintersshared} ?
+ "Order Deny,Allow\n" :
+ "Order Allow,Deny\n") .
"Deny From All\n" .
"Allow From 127.0.0.1\n" .
- "Allow From " .
- join ("\nAllow From ",
- @{$printer->{cupsconfig}{clientnetworks}}) .
- "\n" .
+ ($#{$printer->{cupsconfig}{clientnetworks}} >= 0 ?
+ "Allow From " .
+ join ("\nAllow From ",
+ @{$printer->{cupsconfig}{clientnetworks}}) .
+ "\n" : "").
"</Location>\n";
my ($location_start, @location) =
rip_location($printer->{cupsconfig}{cupsd_conf}, "/");
insert_location($printer->{cupsconfig}{cupsd_conf}, $location_start,
@{$printer->{cupsconfig}{rootlocation}});
# "BrowseAddress" lines
- set_directive($printer->{cupsconfig}{cupsd_conf},
- 'BrowseAddress ' .
- join ("\nBrowseAddress ",
- map {broadcastaddress($_)}
- @{$printer->{cupsconfig}{clientnetworks}}));
+ if ($#{$printer->{cupsconfig}{clientnetworks}} >= 0) {
+ handle_configs::set_directive($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseAddress ' .
+ join ("\nBrowseAddress ",
+ map {broadcastaddress($_)}
+ @{$printer->{cupsconfig}{clientnetworks}}));
+ } else {
+ handle_configs::comment_directive($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseAddress')
+ }
+ # Set "BrowseAllow" lines
+ if ($#{$printer->{cupsconfig}{clientnetworks}} >= 0) {
+ handle_configs::set_directive($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseAllow ' .
+ join ("\nBrowseAllow ",
+ @{$printer->{cupsconfig}{clientnetworks}}));
+ } else {
+ handle_configs::comment_directive($printer->{cupsconfig}{cupsd_conf},
+ 'BrowseAllow');
+ }
}
}