in reply to Re: Deleting lines from named.conf file
in thread Deleting lines from named.conf file

hello Shmem how are i would thank your for you help
but i cannot really understand the code of the zone master the link you provided in your replay
and as i saw this zone master depend on connection to database not reladted to a file .
and i will be thankful if you could help me
  • Comment on Re^2: Deleting lines from named.conf file

Replies are listed 'Best First'.
Re^3: Deleting lines from named.conf file
by shmem (Chancellor) on Nov 10, 2007 at 20:07 UTC
    The answers to your very first post here provided all you need to do the task. I gave you a solution which can be tweaked to not comment lines out, but not print them instead (untested):
    my $comment = 0; my $block = 0; while(<$in>) { if (/^zone\s+"$targetdomain"/) { $comment++; $block += () = /(\{)/g; # print $out '// '.$_; next; } if($comment) { $block += () = /(\{)/g; s!^!// ! if $comment or $block; $block -= () = /(\})/g; $comment = 0 unless $block; } print $out $_ unless $comment; }

    Since that trivial task seems to be too difficult for you, I gave you a link to a tool which handles all things zone file related. Yes, it relies on a database, but if you have to do more than casual changes to zone files, for which you could also fire up your editor and do changes by hand, it is the right way to go.

    --shmem

    _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                  /\_¯/(q    /
    ----------------------------  \__(m.====·.(_("always off the crowd"))."·
    ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
      s!^!// ! if $comment or $block;

      What does that do? (I know it's untested code, but still...)

        It comments out the current line. In the context of deleting lines, it's superfluous - a leftover of the original code.

        --shmem

        _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                      /\_¯/(q    /
        ----------------------------  \__(m.====·.(_("always off the crowd"))."·
        ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
      thanks shmem but why you describe my task as trivial
      i want to let you know that i have tried many times before i posted here and i search google and also used the super search provided here and i cannot solve it
      so i provide a description of what is the problem and the way i thought that will solve the problem like as i mentioned before
      #the first part of the code as the same last code i provided #!/usr/bin/perl -w use strict; print " please enter the domain name: "; my $targetdomain = <STDIN>; my $susdate = `date -u "+%m/%d/%Y %H:%M"`; my $char = "This Domain is Suspended at "; chomp $targetdomain; my $file = "/home/adam/Desktop/hello"; rename $file, "$file.bak" or die "Can't rename file '$file': $!\n"; open my $in, '<', "$file.bak" or die "Can't read file '$file': $!\n"; open my $out, '>', $file or die "Can't write file '$file': $!\n"; my $block = 0; while(<$in>) { if (/^zone\s+"$targetdomain"/) { #here i want to start to deleting lines i think it will done by s// /; #by replacing the lines with an empty lines #then i need to increase the $block by 1 to add the first #open bracke +t by using $block += () = /(\{)/g; #then i want to make something like condition if the block #variable i +s exist add one also to block and then continue #deleting lines if ($block) { s// /; #or if it find a closed bracket decrease the $block by $block -= () = /(\})/g; #and if the block equal to 0 stop deleting lines #then print the output
      i just want to provide some of what i think about my program
      by the way the code you provide me didn't work
      my $comment = 0; my $block = 0; while(<$in>) { if (/^zone\s+"$targetdomain"/) { $comment++; $block += () = /(\{)/g; # print $out '// '.$_; next; } if($comment) { $block += () = /(\{)/g; s!^!// ! if $comment or $block; $block -= () = /(\})/g; $comment = 0 unless $block; } print $out $_ unless $comment; }
      i think it may need a loop to loop throw target domain zone and then delete the files from the zone header to the end of zone
        by the way the code you provide me didn't work

        Which part didn't work? did you add some print statements to your code to see what each variable holds at each state of execution?

        I suspect your main problem is

        my $targetdomain = <STDIN>;

        $targetdomain is a line from STDIN complete with the newline char. This will match your targetdomain only if it is written as

        zone "foo.bar.com " {

        and only if you read the file as one chunk and do a multiline match. So change that to

        chomp (my $targetdomain = <STDIN>);

        to remove the trailing newline.

        update: To get help without suspecting, it is best to provide a complete set of data: input, program, expected output, actual output. Do so with the snippet that "didn't work".

        --shmem

        _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                      /\_¯/(q    /
        ----------------------------  \__(m.====·.(_("always off the crowd"))."·
        ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}