Find a line, and comment out the next 5 lines

J

joe shaboo

HI,

I'm new to Perl. I'm trying to write a simple script which will
comment out a domain in my named.conf file for Bind.

What I would like to do, is write a script which will comment out a
domain from my named.conf if I no longer want to host that domain.

So, what I'd like to do is create a means to search for a domain
(mydomain.com) and comment out that file and all lines associated with
the file, and put a date when it was commented out. I'd also like to
take the UID of who commented it out, so if needed, we can ask that
person why it was commented out. As a hint we use sudo, so this should
be plausible, but again, not sure of the system command. If I use id,
it says I'm root, but how can I get the name of the user before I
became root?

named.conf example

zone "mydomain.com" {
type master;
file "/path/to/zone/mydomain.com";
notify yes;
}

What I'd like to do

// Domain taken out of named.conf at request of Customer by UID, date
// zone "mydomain.com" {
// type master;
// file "/path/to/zone/mydomain.com
// notify yes;
// }

Sounds simple enough, but I am not sure how to do it.

many thanks,

joe ([email protected])
 
M

mdh

After providing you the obligatory warning about automating anything
to do with DNS (smile), what you're basically try to accomplish is the
following steps:

1) examine a multiline string for the following pattern:

\nzone "YOURTARGETZONE" {\n(arbitrary characters)\n(arbitrary
characters)\n(arbitrary characters);\n(arbitrary characters)}\n

2) take the string (the entire file) and chop it into three parts:
$prematch -- the characters before the match
$thematch -- the characters matching the pattern
$postmatch - the characters after the match

3) on $thematch, use the substitution operator to replace the
newlines with "\n//"

4) join $prematch, $thematch, and $postmatch back into one string

5) write the result joined string back out as your new zone file


Try the following code snippet...


mdh



#!/usr/bin/perl

my $UID = "joeblow\@somecompany.com";
my $datestring = `date -u "+%m/%d/%Y %H:%M:%S"`;
$datestring =~ tr/\n\r//d; # delete trailing newline or carriage
return
my $targetdomain = "mydomain.com";
# define a variable using the HERE construct for simulated zone file
input..
my $sampleinput = <<"EOF";

zone "dontchangethisdomain.com" {
type master;
file "/somepath/to/dontchangethisdomain.com";
notify yes;
}

zone "mydomain.com" {
type master;
file "/path/to/zone/mydomain.com";
notify yes;
}

zone "leavethisalonetoo.com" {
type master;
file "/other/path/to/leavethisalonetoo.com";
notify yes;
}

EOF

my $prematch;
my $thematch;
my $postmatch;

# use a regular expression with "non-greedy" matching to the token
# "zone" and the closing brace character (}) to anchor on the zone
# definition matching the domain you want to comment out -- you
# want "non-greedy" matching cuz you want the shortest string that
# starts with "zone", has your target, and ends with a closing
# brace -- if you use a greedy match (.*), you'll match on the last
# brace in the file, commenting out multiple domains in error

if ($sampleinput =~ m/\n(.?)zone "$targetdomain"
\{\n(.*)type(.*);\n(.*)file(.*);\n(.*)notify(.*);\n(.?)\}/is) {
$prematch = $`;
$thematch = $&;
$postmatch = $';
$thematch =~ s/\n/\n\/\//g; # globally replace newlines with
newline and //
print "$prematch\n";
print "//domain taken out of named.conf at request of Customer by
$UID, $datestring";
print "$thematch";
print "$postmatch\n";
}

exit;
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,534
Members
45,008
Latest member
Rahul737

Latest Threads

Top