Changeset 11628 for trunk

Show
Ignore:
Timestamp:
11/11/08 13:50:56 (8 weeks ago)
Author:
juruen@…
Message:

+ Add support for external printers configured with CUPS

Location:
trunk/client
Files:
7 modified
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/client/printers

    • Property svn:mergeinfo set to
      /branches/juruen/fix-printers/printers:11548-11627
      /branches/mailflogs/printers:11495-11498,11503
  • trunk/client/printers/ChangeLog

    r11490 r11628  
    1 0.12.99 
    2         + New release 
     10.12.1 
     2        + Add support for external printers configured with CUPS  
    330.12 
    44        + Bugfix: Create the `job` table when installing. This readds a 
  • trunk/client/printers/migration/Makefile.am

    r10308 r11628  
    33Migrationsdir = @DATADIR@/ebox-printers/migration 
    44 
    5 nobase_Migrations_SCRIPTS = 0001_add_ipp_service.pl 
     5nobase_Migrations_SCRIPTS = 0001_add_ipp_service.pl 0002_support_external_printers.pl 
    66 
    77EXTRA_DIST = $(nobase_Migrations_SCRIPTS) 
  • trunk/client/printers/src/EBox/Printers.pm

    r10308 r11628  
    3737use EBox::PrinterLogHelper; 
    3838use Foomatic::DB; 
     39use HTML::Mason::Interp; 
    3940use Net::CUPS::Destination; 
    4041use Net::CUPS; 
     
    4647use constant CUPSD              => '/etc/cups/cupsd.conf'; 
    4748use constant CUPSPPD            => '/etc/cups/ppd/'; 
    48  
     49use constant START_TAG          => '# __EBOX__ TAG #'; 
     50use constant END_TAG            => '# END __EBOX__ TAG #'; 
     51         
    4952sub _create  
    5053{ 
     
    166169} 
    167170 
    168 sub _setCupsConf 
     171sub writeOldCupsConf 
    169172{ 
    170173        my $self = shift; 
     
    185188        } 
    186189 
    187         my @array; 
    188         push(@array, 'printers' => \@conf); 
    189         $self->writeConfFile(CUPSPRINTERS, 'printers/printers.conf.mas', \@array); 
     190        $self->writeConfFile(CUPSPRINTERS,  
     191                        'printers/printers.conf.mas',  
     192                        ['printers' => \@conf]); 
     193 
     194} 
     195 
     196sub _setCupsConf 
     197{ 
     198        my $self = shift; 
     199 
     200        $self->_mergeCupsConf(); 
    190201 
    191202        # Added configuration for standalone cups 
     
    195206            @internalIfaces = @{$net->InternalIfaces()}; 
    196207        } 
    197         @array = ( standaloneCups => $self->isStandaloneCupsEnabled(), 
     208        my @array = ( standaloneCups => $self->isStandaloneCupsEnabled(), 
    198209                   ifaces => \@internalIfaces ); 
    199210        $self->writeConfFile(CUPSD, 'printers/cupsd.conf.mas', \@array); 
     
    291302        my $db = new Foomatic::DB; 
    292303        my @makes = sort($db->get_makes()); 
     304        # Add Raw 
     305        push (@makes, 'Raw'); 
    293306        return \@makes; 
    294307} 
     
    302315        my $manufacturer = $self->manufacturer($id); 
    303316        my @models = sort ($db->get_models_by_make($manufacturer)); 
     317        push (@models, 'Raw'); 
    304318        return \@models; 
    305319} 
     
    327341        my $maker = $self->manufacturer($id); 
    328342        my $model = $self->model($id); 
     343        if ($maker eq 'Raw') { 
     344                return 'Raw'; 
     345        } 
    329346        my $db = new Foomatic::DB; 
    330347        return $db->get_printer_from_make_model($maker, $model); 
     
    337354         
    338355        my $printer = $self->_printerIdDriver($id); 
    339          
     356        if ($printer eq 'Raw') { 
     357                return ['Raw']; 
     358        } 
    340359        my $db = new Foomatic::DB; 
    341         my @drivers = grep(! /^(gimp.*)|(hpdj)/,  
    342                         $db->get_drivers_for_printer($printer)); 
     360        #my @drivers = grep(! /^(gimp.*)|(hpdj)/,  
     361        my @drivers = $db->get_drivers_for_printer($printer); 
    343362        if (@drivers) { 
    344363                return \@drivers;        
     
    921940 
    922941        my $printerid = $self->_printerFromManuModel($manufacturer, $printer); 
    923         $printerid or return {}; 
     942        $printerid or return []; 
    924943         
    925944        my $db = new Foomatic::DB; 
    926945        my $dat = $db->getdat($driver, $printerid); 
    927946 
    928         my @args = keys %{$dat->{args_byname}}; 
    929         return \@args; 
     947        return [ keys %{$dat->{args_byname}} ]; 
    930948} 
    931949 
     
    10921110         
    10931111        my $printer = $self->model($id); 
     1112        if ($printer eq 'Raw') { 
     1113                return; 
     1114        } 
    10941115        my $manufacturer = $self->manufacturer($id); 
    10951116        my $driver = $self->driver($id); 
     
    13001321} 
    13011322 
     1323sub _mergeCupsConf 
     1324{ 
     1325        my ($self) = @_; 
     1326 
     1327        my  $manager = new EBox::ServiceModule::Manager(); 
     1328        if ($manager->checkUserModifications() 
     1329            and $manager->skipModification( 
     1330                $self->serviceModuleName(), CUPSPRINTERS)) { 
     1331            EBox::info('Skipping modification of ' . CUPSPRINTERS); 
     1332            #return; 
     1333        } 
     1334 
     1335        my %external = map {$_ => 1} @{$self->fetchExternalCUPSPrinters}; 
     1336        my @file; 
     1337        if ( -f CUPSPRINTERS ) { 
     1338                my $cmd = 'cat ' . CUPSPRINTERS; 
     1339                @file = @{root($cmd)}; 
     1340        } 
     1341        my $startTag = START_TAG;  
     1342        my $endTag = END_TAG; 
     1343         
     1344        my @newFile; 
     1345        my $copy = 1; 
     1346        for my $line (@file) { 
     1347                if ($line =~ /$startTag/) { 
     1348                        $copy = undef; 
     1349                }  
     1350                push (@newFile, $line) if ($copy); 
     1351                if ((not $copy) and $line =~ /$endTag/) { 
     1352                        $copy = 1; 
     1353                } 
     1354        } 
     1355         
     1356        my $output; 
     1357 
     1358        my $interp = HTML::Mason::Interp->new(comp_root =>  
     1359                                                EBox::Config::stubs, 
     1360                                                out_method => \$output); 
     1361        my $comp = $interp->make_component( 
     1362                        comp_file =>  
     1363                        EBox::Config::stubs() . 'printers/printers.conf.mas'); 
     1364        my @conf; 
     1365        my @idprinters = $self->all_dirs("printers"); 
     1366        for my $dirid (@idprinters){ 
     1367                my $id = $dirid; 
     1368                $id =~  s'.*/''; 
     1369                unless ($self->_printerConfigured($id)){ 
     1370                        $self->removePrinter($id); 
     1371                        next; 
     1372                } 
     1373                $self->_setDriverOptionsToFile($id); 
     1374                my $printer = $self->_printerInfo($id); 
     1375                next if (exists $external{$printer->{name}}); 
     1376                $printer->{location} = $self->_location($id); 
     1377                push (@conf, $printer ); 
     1378        } 
     1379 
     1380 
     1381        $interp->exec($comp, 'printers' => \@conf); 
     1382 
     1383        push (@newFile, $output); 
     1384 
     1385        my $file = EBox::Config::tmp() . '/printers.conf.tmp'; 
     1386        open (my $fd, ">$file"); 
     1387        print $fd @newFile; 
     1388        root("cp $file " . CUPSPRINTERS); 
     1389        close ($fd); 
     1390 
     1391        $manager->updateFileDigest($self->serviceModuleName(), CUPSPRINTERS); 
     1392} 
     1393 
     1394# Method: fetchExternalCUPSPrinters 
     1395# 
     1396#       This method returns those printers that haven been configured 
     1397#       by the user using CUPS and not our interface.  
     1398# 
     1399# Returns: 
     1400# 
     1401#       Array ref - containing the printer names 
     1402# 
     1403sub fetchExternalCUPSPrinters 
     1404{ 
     1405    my ($self) = @_; 
     1406 
     1407    my %eboxPrinters = map { $_->{name} => 1 } @{$self->printers()}; 
     1408 
     1409        my $cups = Net::CUPS->new(); 
     1410 
     1411        my @printers; 
     1412        foreach my $printer ($cups->getDestinations()) 
     1413        { 
     1414                my $name = $printer->getName(); 
     1415                push (@printers, $name) unless (exists $eboxPrinters{$name}); 
     1416        } 
     1417        return \@printers; 
     1418} 
     1419 
     1420 
    13021421# Method: enableStandaloneCups 
    13031422# 
  • trunk/client/printers/stubs/printers.conf.mas

    r10308 r11628  
    44<%init> 
    55use EBox::Gettext; 
     6use EBox::Printers; 
    67</%init> 
    7  
     8<% EBox::Printers::START_TAG %> 
    89% foreach my $printer (@printers) { 
    910<Printer <% $printer->{name} %>> 
     
    1920</Printer> 
    2021% } 
     22<% EBox::Printers::END_TAG %> 
  • trunk/client/samba

    • Property svn:mergeinfo set to /branches/juruen/fix-printers/samba:11548-11627
  • trunk/client/samba/src/EBox/Samba.pm

    r11511 r11628  
    718718    } 
    719719    else { 
    720         EBox::error("The user has incomplete group memberships; to be administrator he must be both member of domain Admins and Administrators group"); 
    721         return undef; 
     720        EBox::error("The user has incomplete group memberships; to be administrator he must be both member of domain Admins and Administrators group");                                                         
     721        return undef;  
    722722    } 
    723723} 
     
    882882    $self->set_list("printers/$name/users", "string", []); 
    883883    $self->set_list("printers/$name/groups", "string", []); 
    884  
     884    $self->set_bool("printers/external", undef); 
     885 
     886} 
     887 
     888sub _addExternalPrinter 
     889{ 
     890    my ($self, $name) = @_; 
     891    $self->set_list("printers/$name/users", "string", []); 
     892    $self->set_list("printers/$name/groups", "string", []); 
     893    $self->set_bool("printers/$name/external", 1); 
    885894} 
    886895 
     
    889898    my $self = shift; 
    890899 
     900    my $printers = EBox::Global->modInstance('printers'); 
     901    my %external = map { $_ => 1 } @{$printers->fetchExternalCUPSPrinters()}; 
    891902    my @printers; 
     903    my $readOnly = $self->isReadOnly(); 
    892904    for my $printer (@{$self->array_from_dir("printers")}) { 
     905        my $name = $printer->{_dir}; 
     906        my $key = "printers/$name/external"; 
     907        my $isExt = $self->get_bool($key); 
     908        if ($isExt and not exists $external{$name}) { 
     909            $self->delPrinter($name) unless ($readOnly); 
     910            $external{$name} = 'removed'; 
     911        }  elsif ($isExt) { 
     912            $external{$name} = 'exists'; 
     913        } 
    893914        push (@printers,  $printer->{'_dir'}); 
    894915    } 
    895916 
    896     return \@printers; 
     917    unless ($readOnly) { 
     918        for my $newPrinter (grep { $external{$_} == 1  } keys %external) { 
     919            $self->_addExternalPrinter($newPrinter); 
     920            push (@printers, $newPrinter); 
     921        } 
     922    } 
     923 
     924    return [sort @printers]; 
    897925} 
    898926 
     
    970998 
    971999    my @printers; 
    972     for my $printer (@{$self->array_from_dir("printers")}) { 
    973         my $name = $printer->{'_dir'}; 
     1000    for my $name (@{$self->printers()}) { 
    9741001        my $print = {   'name' => $name, 'allowed' => undef }; 
    975         my $users = $printer->{'users'}; 
     1002        my $users = $self->get_list("printers/$name/users"); 
    9761003        if (@{$users}) { 
    9771004            $print->{'allowed'} = 1 if (grep(/^$user$/, @{$users}));