Ignore:
Timestamp:
08/17/17 14:04:41 (7 years ago)
Author:
nanardon
Message:

allow to use optionnal template for zone type radius, dhcp, puppet, factorize code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Task/Buildnet.pm

    r2058 r2059  
    7474    } 
    7575 
    76     my %headers; 
    7776    foreach my $zone ($self->_base->search_objects('netzone', 'exported=*')) { 
    7877        my $ozone = $self->_base->get_object('netzone', $zone) 
     
    8382            next; 
    8483        }; 
    85         my $header = $self->_pre_zone($ozone) or next; 
    86         $headers{$zone} = $header; 
    87     } 
    88     $self->_base->commit; 
    89  
    90     foreach (keys %headers) { 
    91         $self->gen_zone($_, $headers{$_}) or return; 
    92     } 
    93     $self->_base->rollback; 
     84        $self->gen_zone($zone) or do { 
     85            $self->_base->rollback; 
     86            return; 
     87        }; 
     88        $self->_base->commit; 
     89    } 
    9490 
    9591    if (my $cmd = $self->_la->val('_network_', 'post')) { 
     
    220216 
    221217 
    222     if ($ozone->get_attributes('type') !~ /^(dhcp|radius)$/ && $ozone->get_attributes('templateD')) { 
     218    if ($ozone->get_attributes('templateD')) { 
    223219        my $template = $self->_template_file($ozone); 
    224220        my $output = $self->_output_file($ozone); 
    225         my @tstat = stat($template); 
     221        my @tstat = stat($template) or return; 
    226222        my @ostat = stat($output); 
    227223        if (($ostat[9] || 0) <= ($tstat[9] || 0)) { 
     
    250246 
    251247    my $textzone = $self->_comment_zone($ozone); 
    252     if ($ozone->get_attributes('type') =~ /^(dns|reverse)$/) { 
    253         my $tzone = $self->_read_template($ozone) or return; 
     248    my $tzone = $self->_read_template($ozone); 
     249    if (defined($tzone)) { 
    254250        $textzone .= $tzone; 
    255     } 
     251    } else { 
     252        return; 
     253    } 
     254 
    256255    $self->_set_last_build($ozone); 
    257256 
     
    265264=cut 
    266265 
    267 # TODO what is $header 
    268  
    269266sub gen_zone { 
    270     my ($self, $zone, $header) = @_; 
     267    my ($self, $zone) = @_; 
    271268 
    272269    my $ozone = $self->_base->get_object('netzone', $zone) 
     
    276273        $ozone->get_attributes('type')); 
    277274 
    278     $header ||= $self->_pre_zone($ozone) or return; 
     275    my $header = $self->_pre_zone($ozone); 
    279276 
    280277    my $type = $ozone->get_attributes('type'); 
     
    287284        undef; 
    288285 
    289     if ($res) { 
    290  
    291         if (my $cmd = $self->_la->val('_network_', 'post_file', 
    292                 $self->_la->val('_network_', 'post_zone'))) { 
    293             exec_command( 
    294                 $cmd, 
    295                 { 
     286    if (!defined($res)) { 
     287    } 
     288 
     289    my $textzone = 
     290        $header . 
     291        "\n" . 
     292        $self->_comment($ozone, "Comming from database:\n") . 
     293        $res . 
     294        $self->_comment($ozone, "End of data from database\n"); 
     295 
     296 
     297    if ($type =~ /^(dns|reverse)$/) { 
     298        if (!$self->_checkzone_output($ozone, $textzone)) { 
     299            la_log(LA_ERR, "Output of DNS zone %s not ok, not updating this zone", 
     300                $ozone->id); 
     301            return; 
     302        } 
     303    } 
     304 
     305    if (open(my $handle, '>', $self->_output_file($ozone))) { 
     306        print $handle $textzone; 
     307        close($handle); 
     308        la_log(LA_INFO, "zone %s written into %s", $ozone->id, 
     309            $self->_output_file($ozone)); 
     310    } else { 
     311       la_log(LA_ERR, "Can't open output file for zone %s", $ozone->id); 
     312       return; 
     313    } 
     314 
     315    if (my $cmd = $self->_la->val('_network_', 'post_file', 
     316            $self->_la->val('_network_', 'post_zone'))) { 
     317        exec_command( 
     318            $cmd, 
     319            { 
    296320                TEMPLATE_DIR => $self->_la->val('_network_', 'template_dir', ''), 
    297321                OUTPUT_DIR => $self->_la->val('_network_', 'output_dir', ''), 
     
    300324                OUTPUT_FILE => $ozone->get_attributes('outputD'), 
    301325                HOOK_TYPE => 'POSTFILE', 
    302                 }, 
    303             ); 
    304         } 
    305  
    306         $self->_bnet_state->newval($ozone->id, 'dbrev', 
    307             $ozone->get_attributes('rev')); 
    308         la_log LA_DEBUG, "Zone rev build point is %d for %s", 
    309             $ozone->get_attributes('rev'), 
    310             $ozone->id; 
    311         $self->_bnet_state->SetParameterComment( 
    312             $ozone->id, 'dbrev', 
    313             scalar(localtime)); 
    314         $self->_write_state_file; 
    315  
    316     } else { 
    317         $self->_base->rollback; 
    318     } 
    319     $res 
     326            }, 
     327        ); 
     328    } 
     329 
     330    $self->_bnet_state->newval($ozone->id, 'dbrev', 
     331        $ozone->get_attributes('rev')); 
     332    la_log LA_DEBUG, "Zone rev build point is %d for %s", 
     333    $ozone->get_attributes('rev'), 
     334    $ozone->id; 
     335    $self->_bnet_state->SetParameterComment( 
     336        $ozone->id, 'dbrev', 
     337        scalar(localtime)); 
     338    $self->_write_state_file; 
     339 
     340    1; 
    320341} 
    321342 
     
    349370    } 
    350371    $res 
     372} 
     373 
     374sub _comment { 
     375    my ($self, $ozone, $message, @args) = @_; 
     376    my $com_prefix = 
     377        $ozone->get_attributes('type') =~ /^(dhcp|puppet|radius)$/ ? '#' : ';'; 
     378 
     379    if ($message) { 
     380        return(sprintf("$com_prefix $message", @args)); 
     381    } else { 
     382        $com_prefix 
     383    } 
    351384} 
    352385 
     
    398431} 
    399432 
     433 
     434# return undef on fatal error, depending zone type 
    400435sub _read_template { 
    401436    my ($self, $ozone) = @_; 
    402437 
    403438    my $revision = $self->get_zone_rev($ozone) or return; 
    404     my $textzone = ''; 
    405439    if (open(my $handle, '<', $self->_template_file($ozone))) { 
     440        my $textzone = ''; 
    406441        while (my $line = <$handle>) { 
    407442            $line =~ s/(\d+\s*;\s*)?\@REVISION@/$revision/; 
     
    409444        } 
    410445        close($handle); 
     446        return $textzone; 
    411447    } else { 
    412         la_log(LA_ERR, "Can't open template file for zone %s", $ozone->id); 
    413         return; 
    414     } 
    415     return $textzone; 
     448        if ($ozone->get_attributes('type') =~ /^(dns|reverse)$/) { 
     449            la_log(LA_ERR, "Can't open template file for zone %s: %s", $ozone->id, $!); 
     450            return; 
     451        } else { 
     452            return ''; 
     453        } 
     454    } 
    416455} 
    417456 
    418457sub _gen_dns_zone { 
    419     my ($self, $ozone, $textzone) = @_; 
    420  
    421     my $dbzone = "\n; Comming from database:\n"; 
     458    my ($self, $ozone) = @_; 
     459 
     460    my $dbzone = ''; 
    422461    if ($ozone->get_attributes('net')) { 
    423462        my $findhost = $self->_base->db->prepare_cached(q{ 
     
    506545    } 
    507546 
    508     $dbzone .= "; End of data from database\n"; 
    509  
    510     if (!$self->_checkzone_output($ozone, $textzone . $dbzone)) { 
    511         la_log(LA_ERR, "Output of DNS zone %s not ok, not updating this zone", 
    512             $ozone->id); 
    513         return; 
    514     } 
    515  
    516     if (open(my $handle, '>', $self->_output_file($ozone))) { 
    517         print $handle $textzone; 
    518         print $handle $dbzone; 
    519         close($handle); 
    520         la_log(LA_INFO, "zone %s written into %s", $ozone->id, 
    521             $self->_output_file($ozone)); 
    522     } else { 
    523        la_log(LA_ERR, "Can't open output file for zone %s", $ozone->id); 
    524        return; 
    525    } 
    526    1; 
     547    return $dbzone; 
    527548} 
    528549 
    529550sub _gen_reverse_zone { 
    530     my ($self, $ozone, $textzone) = @_; 
     551    my ($self, $ozone) = @_; 
    531552 
    532553    my $domain = $ozone->get_attributes('domain') || ''; 
    533     my $dbzone = "\n; Comming from database:\n"; 
     554    my $dbzone = ''; 
    534555    if ($ozone->get_attributes('net')) { 
    535556        my $findhost = $self->_base->db->prepare_cached(q{ 
     
    605626    } 
    606627 
    607     $dbzone .= "; End of data from database\n"; 
    608  
    609     if (!$self->_checkzone_output($ozone, $textzone . $dbzone)) { 
    610         la_log(LA_ERR, "Output of DNS zone %s not ok, not updating this zone", 
    611             $ozone->id); 
    612         return; 
    613     } 
    614  
    615     if (open(my $handle, '>', $self->_output_file($ozone))) { 
    616         print $handle $textzone; 
    617         print $handle $dbzone; 
    618         close($handle); 
    619         la_log(LA_INFO, "zone %s written into %s", $ozone->id, 
    620             $self->_output_file($ozone)); 
    621     } else { 
    622        la_log(LA_ERR, "can't open output file %s (%s)", 
    623            $self->_output_file($ozone), $!); 
    624        return; 
    625    } 
    626    1; 
     628    return $dbzone; 
    627629} 
    628630 
    629631sub _gen_dhcp_zone { 
    630     my ($self, $ozone, $output) = @_; 
     632    my ($self, $ozone) = @_; 
    631633 
    632634    my $outzone = $ozone; 
     635    my $output = ''; 
    633636 
    634637    my @net; 
     
    771774    } 
    772775 
    773     $output .= "# End of data from database\n"; 
    774     if (open(my $handle, '>', $self->_output_file($outzone))) { 
    775         print $handle $output; 
    776         close($handle); 
    777         la_log(LA_INFO, "zone %s written into %s", $outzone->id, 
    778             $self->_output_file($outzone)); 
    779     } else { 
    780         la_log(LA_ERR, "Can't open output file for dhcp zone %s (%s)", 
    781             $outzone->id, $!); 
    782         return; 
    783     } 
    784     1; 
     776    $output 
    785777} 
    786778 
    787779sub _gen_radius_zone { 
    788     my ($self, $ozone, $output) = @_; 
     780    my ($self, $ozone) = @_; 
    789781 
    790782    my $outzone = $ozone; 
     783    my $output = ''; 
    791784 
    792785    my @net; 
     
    906899    } 
    907900 
    908     $output .= "# End of data from database\n"; 
    909     if (open(my $handle, '>', $self->_output_file($outzone))) { 
    910         print $handle $output; 
    911         close($handle); 
    912         la_log(LA_INFO, "zone %s written into %s", $outzone->id, 
    913             $self->_output_file($outzone)); 
    914     } else { 
    915         la_log(LA_ERR, "Can't open output file for dhcp zone %s (%s)", 
    916             $outzone->id, $!); 
    917         return; 
    918     } 
    919     1; 
     901    $output; 
    920902} 
    921903 
    922904sub _gen_puppet_zone { 
    923     my ($self, $ozone, $output) = @_; 
     905    my ($self, $ozone) = @_; 
     906 
     907    my $output = ''; 
    924908 
    925909    if ($ozone->get_attributes('net')) { 
     
    970954    } 
    971955 
    972     $output .= "# End of data from database\n"; 
    973     my $file = $self->_output_file($ozone); 
    974     if (open(my $handle, '>', $file)) { 
    975         print $handle $output; 
    976         close($handle); 
    977         la_log(LA_INFO, "zone %s written into %s", $ozone->id, 
    978             $self->_output_file($ozone)); 
    979     } else { 
    980         la_log(LA_ERR, "Can't open output file for puppet zone %s (%s)", 
    981             $ozone->id, $!); 
    982         return; 
    983     } 
    984     1; 
     956    $output 
    985957} 
    986958 
Note: See TracChangeset for help on using the changeset viewer.