convert.pl
上传用户:xiao730204
上传日期:2007-01-04
资源大小:141k
文件大小:10k
源码类别:

WEB邮件程序

开发平台:

PHP

  1. #!/usr/bin/perl
  2. # convert.pl
  3. # Converts standard named files into sql format 
  4. # for the sqlbind-8 project
  5. #
  6. # Init the variables
  7. local @file_contents = ();
  8. $soa_flag       = 0;
  9. $soa_text       = '';
  10. $previous_name  = '';
  11. $table_name     = '';
  12. $domain         = '';
  13. $CONVERT_FILE   = '';
  14. $OUTPUT_FILE    = '';
  15. $QUIET_MODE     = 0;
  16. $AUTO_REVERSE   = 0;
  17. $quiet_arg              = '--quiet';
  18. $short_quiet_arg        = '--q';
  19. $input_file_arg         = '--input_file=';
  20. $short_input_file_arg   = '--input=';
  21. $output_file_arg        = '--output_file=';
  22. $short_output_file_arg  = '-output=';
  23. $auto_reverse_arg       = '--with-auto-reverse';
  24. $short_auto_reverse_arg = '--auto-reverse';
  25. foreach $arg ( @ARGV ) {
  26.    if ( $arg eq $quiet_arg || $arg eq $short_quiet_arg ) { 
  27.       $QUIET_MODE = 1;
  28.    }
  29.    if ( $arg eq $auto_reverse_arg || $arg eq $short_auto_reverse_arg ) {
  30.       $AUTO_REVERSE = 1; 
  31.    }
  32.    if ( 
  33.       $arg =~ /$input_file_arg(.*)/ || 
  34.       $arg =~ /$short_input_file_arg(.*)/ ) {
  35.       $CONVERT_FILE = $1;
  36.    }
  37.    if ( 
  38.       $arg =~ /$output_file_arg(.*)/ || 
  39.       $arg =~ /$short_output_file_arg(.*)/ ) {
  40.       $OUTPUT_FILE  = $2;
  41.    }
  42. }
  43. if ( $CONVERT_FILE ne "" ) {
  44.    # File name passed 
  45.    open( INPUT_FILE, $CONVERT_FILE ) 
  46.       or die "Could not open input file : $CONVERT_FILE, $!n";
  47. }
  48. if ( $CONVERT_FILE eq "" || !-f $CONVERT_FILE ) {
  49. die <<"USAGE";
  50. convert.pl (Mixture of options)
  51. Description :
  52. Converts a zone file to a sql script for usage within
  53. the sqlbind-8 project.
  54. Options :
  55. --input_file=InputFile
  56. --input=InputFile
  57.    The input file to be converted.
  58. --output_file=OutputFile
  59. --output=OutputFile
  60.    The output file created by the conversion process.
  61. --with-auto-reverse
  62. --auto-reverse
  63.    The output includes reverse ptr mappings for the in.addr tables.
  64.    !Warning! - There is no checking for table existence, so you may
  65.    have to create them.
  66. --quiet
  67. --q
  68.    Turns off confirmation of guessed domains.
  69. Examples :
  70. convert.pl --input_file=zerodivide.net.db
  71. Converts the zone file of zerodivide.net and outputs it to STDOUT
  72. convert.pl --input_file=zerodivide.net.db --output_file=zerodivide.net.sql
  73. Converts the zone file of zerodivide.net and outputs it to the 
  74. zerodivide.net.sql file.
  75. This script brought to you by : Jason "ZeroDiVide" Orcutt
  76. You can also thank Scott Kamp AKA "TrouBle" for extensive testing of 
  77. the script.
  78. USAGE
  79. }
  80. if ( $OUTPUT_FILE ne "" ) {
  81.    open( OUTPUT_FILE, "> " . $OUTPUT_FILE ) 
  82.       or die "Could not open output file : $OUTPUT_FILE, $!n";
  83.    select(OUTPUT_FILE );
  84.    $| = 1;
  85. }
  86. while( $input_line = <INPUT_FILE> ) { 
  87.    # Read a line from stdin
  88.    chomp( $input_line );
  89.    # Charlie test this line below  -- Removes ^M
  90.    $input_line =~ s/rr//g;
  91.    ( $content, $comment ) = split( ';', $input_line );
  92.    if ( $content =~ /SOA/i ) {
  93.       $soa_flag = 1;
  94.       $soa_text = $content;
  95.       next;
  96.    }
  97.    if ( $soa_flag == 1 && $content !~ /)/ ) {
  98.       $soa_text .= $content;
  99.       next;
  100.    }
  101.    if ( $soa_flag == 1 && $content =~ /)/ ) {
  102.       $soa_text .= $content;
  103.       $content  = $soa_text;
  104.       $soa_flag = 2;
  105.    }
  106.    $content =~ s/t/ /g;
  107.    while( $content =~ /  / ) {
  108.       $content =~ s/  / /g;
  109.    }
  110.    $content =~ s/^ //;
  111.    if ( $content eq "" ) { next; }
  112.    # Process the line
  113.    if (
  114.    $content =~ /(.*)sINsSOAs(.*)s(.*)s(s(d*)s(d*)s(d*)s(d*)s(d*)s)/ ||
  115.    $content =~ /(.*)sINsSOAs(.*)s(.*)s(s(d*)s(d*)s(d*)s(d*)s(d*))/ ) {
  116.       local $origin     = $1;
  117.       $domain     = $2;
  118.       local $contact    = $3;
  119.       local $serial     = $4;
  120.       local $refresh    = $5;
  121.       local $retry      = $6;
  122.       local $expire     = $7;
  123.       local $min_ttl    = $8;      
  124.       $domain =~ s/.$//g;
  125.       $contact =~ s/.$//g;
  126.       if ( $domain == '@' ) {
  127.          print STDERR "Whoa darlin we were not able to guess the domain!n";
  128.          print STDERR "Maybee it's within the file name : $CONVERT_FILEn";
  129.          print STDERR "I'm trying to guess it.n";
  130.          if ( $CONVERT_FILE ne "" ) {
  131.             $input_domain = "";
  132.             if ( $QUIET_MODE == 1 ) {
  133.             $input_domain = $CONVERT_FILE;
  134.             # Splice off the .db
  135.             $input_domain =~ s/.db$//;
  136.             # Splice off the .hosts
  137.             $input_domain =~ s/.hosts$//;
  138.             # Splice off the .dom
  139.             $input_domain =~ s/.dom$//;
  140.             } else {
  141.             # Prompt em
  142.             while( $input_domain eq "" ) {
  143.             $input_domain = $CONVERT_FILE;
  144.             print STDERR "Removing extensions (.db, .hosts, .dom)n";
  145.             # Splice off the .db
  146.             $input_domain =~ s/.db$//;
  147.             # Splice off the .hosts
  148.             $input_domain =~ s/.hosts$//;
  149.             # Splice off the .dom
  150.             $input_domain =~ s/.dom$//;
  151.             print STDERR "Domain name [ $input_domain ] : ";
  152.             $t_domain = <STDIN>;
  153.             chomp( $t_domain );
  154.             if ( $t_domain ne "" ) {
  155.                $input_domain = $t_domain; 
  156.             } else {
  157.                # We guessed correctly
  158.             }
  159.             } # End while
  160.             } #end if not quiet
  161.             $domain = $input_domain;
  162.          } else {
  163.          print STDERR "Unable to guess it. I really tried hard. Sorryn";
  164.          die "Exitingn";
  165.          }
  166.       }
  167.       print "#n";
  168.       print "# Domain converted with convert.pln";
  169.       print "# By: Jason "ZeroDiVide" Orcuttn";
  170.       print "# " . $input_line . "n";
  171.       print "#n";
  172.       print "# Origin   - $originn";
  173.       print "# Domain   - $domainn";
  174.       print "# Contact  - $contactn";
  175.       print "# Serial   - $serialn";
  176.       print "# Refresh  - $refreshn";
  177.       print "# Retry    - $retryn";
  178.       print "# Expire   - $expiren";
  179.       print "# Min TTL  - $min_ttln";
  180.       print "#n";
  181.       $previous_name = $domain;
  182.       $table_name    = $domain;
  183.       $table_name    =~ s/-/__/g;
  184.       $table_name    =~ s/./_/g;
  185.       print <<"TABLE_DEF";
  186. CREATE TABLE $table_name (
  187.   sqlID        BIGINT         DEFAULT '0'          NOT NULL       AUTO_INCREMENT,
  188.   sqlOrigin    TEXT           DEFAULT ''           NOT NULL,
  189.   sqlOwner     TEXT           DEFAULT '',
  190.   sqlClass     TEXT           DEFAULT ''           NOT NULL,
  191.   sqlTTL       BIGINT         DEFAULT '0',
  192.   sqlType      TEXT           DEFAULT ''           NOT NULL,
  193.   sqlPref      INT            DEFAULT '0',
  194.   sqlData      TEXT           DEFAULT ''           NOT NULL,
  195.   sqlTime      timestamp(14),
  196.   sqlComment         TEXT,
  197.   sqlSerialNumber    BIGINT   DEFAULT '0'          NOT NULL,
  198.   sqlRefresh         BIGINT   DEFAULT '0'          NOT NULL,
  199.   sqlRetry           BIGINT   DEFAULT '0'          NOT NULL,
  200.   sqlExpire          BIGINT   DEFAULT '0'          NOT NULL,
  201.   sqlMinTTL          BIGINT   DEFAULT '0'          NOT NULL,
  202.   PRIMARY KEY (sqlID),
  203.   INDEX( sqlID )
  204. );
  205. TABLE_DEF
  206.    insert_record( 
  207.       $domain, '@', 'IN', '', 'SOA', '', $domain, 'NULL', '',
  208.       $serial, $refresh, $retry, $expire, $min_ttl
  209.    );
  210.    next;
  211.    }
  212.    if ( $content =~ /INsNS(.*)/ ) {
  213.       $server = $1;
  214.       $server =~ s/.$//;
  215.       print "# $input_linen";
  216.       insert_record( $domain, '', 'IN', '', 'NS', '', $server, 'NULL', $comment );
  217.       next;
  218.    }
  219.    $name          = '';
  220.    $target_addr   = '';
  221.    $mx_weight     = '';
  222.    $mx_target     = '';
  223.    if ( $content =~ /^INsAs(.*)/ ) {
  224.       $target_addr = $1;
  225.       $target_addr =~ s/.$//;
  226.       print "# $input_linen";
  227.       insert_record( $domain, $previous_name, 'IN', '', 'A', '', $target_addr, 'NULL', $comment );
  228.       next;
  229.    }
  230.    if ( $content =~ /^INsMXs(d*)s(.*)/ ) {
  231.       $mx_weight = $1;
  232.       $mx_target = $2;
  233.       $mx_target =~ s/.$//;
  234.       $mx_weight =~ s/.$//;
  235.       print "# $input_linen";
  236.       insert_record( $domain, $previous_name, 'IN', '', 'MX', $mx_weight, $mx_target, 'NULL', $comment );
  237.       next;
  238.    }
  239.    if ( $content =~ /(.*)sINsAs(.*)/ ) {
  240.       $name          = $1;
  241.       $target_addr   = $2;
  242.       $name          =~ s/.$//;
  243.       $target_addr   =~ s/.$//;
  244.       $previous_name = $name;
  245.       print "# $input_linen";
  246.       insert_record( $domain, $name, 'IN', '', 'A', '', $target_addr, 'NULL', $comment );
  247.       next;
  248.    }
  249.    if ( $content =~ /(.*)sINsMXs(d*)s(.*)/ ) {
  250.       $name          = $1;
  251.       $mx_weight     = $2;
  252.       $mx_addr       = $2;
  253.       $name          =~ s/.$//;
  254.       $mx_weight     =~ s/.$//;
  255.       $mx_addr       =~ s/.$//;
  256.       $previous_name = $name;
  257.       print "# $input_linen";
  258.       insert_record( $domain, $name, 'IN', '', 'MX', $mx_weight, $mx_target, 'NULL', $comment );
  259.       next;
  260.    }
  261.    if ( $content =~ /(.*)sINsCNAMEs(.*)/ ) {
  262.       $name          = $1;
  263.       $target_addr   = $2;
  264.       $name          =~ s/.$//;
  265.       $target_addr =~ s/.$//;
  266.       $previous_name = $name;
  267.       print "# $input_linen";
  268.       insert_record( $domain, $name, 'IN', '', 'CNAME', '', $target_addr, 'NULL', $comment );
  269.       next;
  270.    }
  271.    if ( $content =~ /(d*)sINsPTRs(.*)/ ) {
  272.       $octet         = $1;
  273.       $target_name   = $2;
  274.       $octet         =~ s/.$//;
  275.       $target_name   =~ s/.$//;
  276.       print "# $input_linen";
  277.       insert_record( $domain, $octet, 'IN', '', 'PTR', '', $target_name, 'NULL', $comment );
  278.    }
  279.    print "# -- " . $input_line . "n";
  280. }
  281. close( INPUT_FILE );
  282. if ( $OUTPUT_FILE ne "" ) {
  283. close( OUTPUT_FILE );
  284. }
  285. #### - subs - ####
  286. sub insert_record {
  287.    local $origin     = shift;
  288.    local $owner      = shift;
  289.    local $class      = shift;
  290.    local $ttl        = shift;
  291.    local $type       = shift;
  292.    local $pref       = shift;
  293.    local $data       = shift;
  294.    local $time       = shift;
  295.    local $comment    = shift;
  296.    local $serial_number       = shift;
  297.    local $refresh             = shift;
  298.    local $retry               = shift;
  299.    local $expire              = shift;
  300.    local $min_ttl             = shift;
  301.    $sql = 
  302. 'INSERT INTO ' . 
  303. $table_name .
  304. ' ( sqlOrigin, sqlOwner, sqlClass, sqlTTL, sqlType, sqlPref, sqlData, sqlTime, sqlComment';
  305. if ( $serial_number ne '' ) {
  306. $sql .= ',
  307. sqlSerialNumber, sqlRefresh, sqlRetry, sqlExpire, sqlMinTTL';
  308. }
  309. $sql .= ' ) VALUES ( ' ;
  310. $sql .= <<"VALS";
  311. "$origin", "$owner", "$class", "$ttl",
  312. "$type", "$pref", "$data", NOW(), "$comment"
  313. VALS
  314. if ( $serial_number ne '' ) {
  315. $sql .= <<"SQL_STMT";
  316. , "$serial_number", "$refresh", "$retry", "$expire", "$min_ttl"
  317. SQL_STMT
  318. }
  319. $sql .= ');';
  320. print $sql . "nn";
  321. }