By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
464,325 Members | 1,244 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 464,325 IT Pros & Developers. It's quick & easy.

Find a line, and comment out the next 5 lines

P: n/a
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 (js*****@hotmail.com)
Jul 19 '05 #1
Share this Question
Share on Google+
1 Reply

P: n/a
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;
Jul 19 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.