PHP   72

rename domain

Guest on 25th May 2022 01:32:41 AM

  1. #! /usr/bin/php
  2. #
  3. # more info here http://www.marcogoncalves.com/qmailvpopmail-renaming-a-domain/
  4. #
  5. <?php
  6.  
  7. /*
  8.  * Config
  9.  */
  10. $many_domains     = false; // true if compiled --enable-many-domains
  11. $mysql_limits     = false; // true if compiled --enable-mysql-limts
  12. $valias           = false; // true if compiled --enable-valias
  13. $vpopmail_bin     = '/home/vpopmail/bin/';
  14. $vpopmail_etc     = '/home/vpopmail/etc/';
  15. $vpopmail_domains = '/home/vpopmail/domains/';
  16. $qmail_bin        = '/var/qmail/bin/';
  17. $qmail_control    = '/var/qmail/control/';
  18. $qmail_users      = '/var/qmail/users/';
  19. $qmailctl_bin     = '/usr/local/bin/qmailctl';       // path or false
  20. $dovecotctl_bin     = '/usr/local/bin/dovecotctl';       // path or false
  21. $roundcube_config = '/var/www/roundcube/config/config.inc.php'; // path or false
  22.  
  23. if ($qmailctl_bin) exec($qmailctl_bin.' stop');
  24. if ($dovecotctl_bin) exec($dovecotctl_bin.' stop');
  25.  
  26. /*
  27.  * Functions
  28.  */
  29. function validateDomainSyntax($domain) {
  30.         return preg_match('/^[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$/', $domain);
  31. }
  32.  
  33. function runCommand($cmd) {
  34.         try {
  35.                 system($cmd.' > /dev/null 2>&1', $return);
  36.                 if ($return > 0) die("Error in cmd: ".$cmd."\n");
  37.         } catch (Exception $e) {
  38.                 die($e->getMessage()."\n");
  39.         }
  40.  
  41.         return true;
  42. }
  43.  
  44. function replaceInFile($filePath, $search, $replace) {
  45.         if (! file_exists($filePath) || filesize($filePath) == 0) {return true;}
  46.  
  47.         $fileContent = file_get_contents($filePath);
  48.         $fileContent = str_replace($search, $replace, $fileContent);
  49.  
  50.         if(file_put_contents($filePath, $fileContent) == 0) die("Failure in ".$filePath."\n");
  51. }
  52.  
  53.  
  54. /*
  55.  * Script
  56.  */
  57. if (! isset($argv[2])) die("Usage ./rename_domain old_domain new_domain\n");
  58.  
  59. $old_domain = strtolower(trim($argv[1]));
  60. $new_domain = strtolower(trim($argv[2]));
  61.  
  62. if ($old_domain == $new_domain) die("New_domain is equal to old_domain\n");
  63.  
  64. // validate old_domain
  65. if (! validateDomainSyntax($old_domain)) die("Invalid old_domain (check syntax)\n");
  66.  
  67. exec($vpopmail_bin.'vdominfo '.$old_domain, $output);
  68.  
  69. if (! isset($output[0])) die("Invalid old_domain\n");
  70.  
  71. if ($output[0] == 'Invalid domain name')
  72. die("Invalid old_domain\n");
  73.  
  74. foreach ($output as $line) if ($line == 'alias: '.$old_domain) die("Invalid old_domain (is an alias domain)\n");
  75.  
  76. if ($output[0] != 'domain: '.$old_domain) die("Invalid old_domain\n");
  77.  
  78. // validate new_domain
  79. if (! validateDomainSyntax($new_domain)) die("Invalid new_domain (check syntax)\n");
  80.  
  81. $output = array();
  82. exec($vpopmail_bin.'vdominfo '.$new_domain, $output);
  83.  
  84. if (! isset($output[0]))
  85. die("Invalid new_domain\n");
  86.  
  87. if ($output[0] != 'Invalid domain name') {
  88.         if ($output[0] == 'domain: '.$new_domain) die("Invalid new_domain (domain exists)\n");
  89.  
  90.         foreach ($output as $line) if ($line == 'alias: '.$new_domain) die("Invalid new_domain (is an alias domain)\n");
  91.         die("Invalid new_domain\n");
  92. }
  93.  
  94.  
  95. // filesystem changes
  96. runCommand('/bin/mv '.$vpopmail_domains.$old_domain.' '.$vpopmail_domains.$new_domain);
  97.  
  98. replaceInFile($qmail_control.'rcpthosts', $old_domain, $new_domain);
  99. replaceInFile($qmail_control.'me', $old_domain, $new_domain);
  100. replaceInFile($qmail_control.'doublebouncehost', $old_domain, $new_domain);
  101. replaceInFile($qmail_control.'locals', $old_domain, $new_domain);
  102. replaceInFile($qmail_control.'bouncefrom', $old_domain, $new_domain);
  103. replaceInFile($qmail_control.'virtualdomains', $old_domain, $new_domain);
  104. replaceInFile($qmail_control.'srs_domain', $old_domain, $new_domain);
  105. replaceInFile($qmail_control.'morercpthosts', $old_domain, $new_domain);
  106. runCommand($qmail_bin.'qmail-newmrh');
  107.  
  108. replaceInFile($qmail_users.'assign', $old_domain, $new_domain);
  109. runCommand($qmail_bin.'qmail-newu');
  110.  
  111. replaceInFile($vpopmail_domains.$new_domain.'/.qmail-default', $old_domain, $new_domain);
  112.  
  113. $d = dir($vpopmail_domains.$new_domain.'/');
  114. while (false !== ($entry = $d->read())) {
  115.         if ($entry != '..' && $entry != '.' && is_dir($vpopmail_domains.$new_domain.'/'.$entry))
  116.                 replaceInFile($vpopmail_domains.$new_domain.'/'.$entry.'/.qmail',
  117.                     $old_domain,
  118.                     $new_domain);
  119. }
  120. $d->close();
  121.  
  122.  
  123. // database changes
  124. $mysql_configuration = file($vpopmail_etc.'vpopmail.mysql', FILE_SKIP_EMPTY_LINES);
  125. foreach ($mysql_configuration as $line) {
  126.         $line = trim($line);
  127.         if ($line[0] != '#') {
  128.                 $parts = explode('|', $line);
  129.                 if (count($parts) == 5) {
  130.                         $mysql_host = $parts[0];
  131.                         $mysql_port = $parts[1];
  132.                         $mysql_user = $parts[2];
  133.                         $mysql_pass = $parts[3];
  134.                         $mysql_db   = $parts[4];
  135.                 }
  136.         }
  137. }
  138.  
  139. if (! isset($mysql_db)) die("Can't get mysql configuration values in ".$vpopmail_etc."vpopmail.mysql\n");
  140.  
  141. $link = mysqli_connect($mysql_host,
  142.                        $mysql_user,
  143.                        $mysql_pass,
  144.                        $mysql_db,
  145.                        ($mysql_port ? $mysql_port : null));
  146. if (!$link) die("Connect Error (".mysqli_connect_errno().") ".mysqli_connect_error()."\n");
  147.  
  148. if ($many_domains)
  149. {
  150.         $old_domain_table = preg_replace('/[^a-zA-Z\d\s:]/', '_', $old_domain);
  151.         $new_domain_table = preg_replace('/[^a-zA-Z\d\s:]/', '_', $new_domain);
  152.         if (mysqli_query($link, "RENAME TABLE $old_domain_table TO $new_domain_table") !== true)
  153.                 die("Error (".mysqli_error($link)."\n");
  154. }
  155. else {
  156.         $new_domain_table = 'vpopmail';
  157.         if (mysqli_query($link, "UPDATE ".$new_domain_table." ".
  158.                                  "SET pw_domain = REPLACE(pw_domain, ".
  159.                                               "'".$old_domain."', ".
  160.                                               "'".$new_domain."')") !== true)
  161.                 die("Error (".mysqli_error($link)."\n");
  162. }
  163.  
  164. if (mysqli_query($link, "UPDATE ".$new_domain_table." ".
  165.                         "SET pw_dir = REPLACE(pw_dir, ".
  166.                                               "'".$old_domain."', ".
  167.                                               "'".$new_domain."')") !== true)
  168.         die("Error (".mysqli_error($link)."\n");
  169.  
  170. if (mysqli_query($link, "UPDATE dir_control ".
  171.                         "SET domain = '".$new_domain."' ".
  172.                         "WHERE domain = '".$old_domain."'") !== true)
  173.         die("Error (".mysqli_error($link)."\n");
  174.  
  175. if ($mysql_limits) {
  176.         if (mysqli_query($link, "UPDATE limits ".
  177.                                 "SET domain = '".$new_domain."' ".
  178.                                 "WHERE domain = '".$old_domain."'") !== true)
  179.                 die("Error (".mysqli_error($link)."\n");
  180. }
  181.  
  182. if ($valias) {
  183.         if (mysqli_query($link, "UPDATE valias ".
  184.                                 "SET domain = '".$new_domain."' ".
  185.                                 "WHERE domain = '".$old_domain."'") !== true)
  186.                 die("Error (".mysqli_error($link)."\n");
  187.  
  188.         if (mysqli_query($link, "UPDATE valias ".
  189.                                 "SET valias_line = REPLACE(valias_line, ".
  190.                                                    "'".$old_domain."', ".
  191.                                                    "'".$new_domain."')") !== true)
  192.                 die("Error (".mysqli_error($link)."\n");
  193. }
  194.  
  195. mysqli_close($link);
  196.  
  197. // roundcube (optional)
  198. if ($roundcube_config) {
  199.         include($roundcube_config);
  200.  
  201.         if (! isset($config['db_dsnw'])) die("Unable to load Roundcube configuration\n");
  202.  
  203.         $tmp = explode('://', $config['db_dsnw']);
  204.  
  205.         if (! (isset($tmp[0]) && (strtolower($tmp[0]) == 'mysql') || strtolower($tmp[0]) == 'mysqli')) die("Roundcube database is not mysql nore mariadb");
  206.  
  207.         $tmp = preg_replace('/[^a-zA-Z0-9_.]/', ' ', $tmp[1]);
  208.         $rc_config = explode(' ', $tmp);
  209.         $rc_config = array_filter($rc_config);
  210.  
  211.         $link = mysqli_connect($rc_config[2], $rc_config[0], $rc_config[1], $rc_config[3]);
  212.         if (!$link) die("Connect Error (".mysqli_connect_errno().") ".mysqli_connect_error()."\n");
  213.  
  214.         if (mysqli_query($link, "UPDATE users "." ".
  215.                                 "SET username = REPLACE(username, ".
  216.                                                         "'".$old_domain."', ".
  217.                                                         "'".$new_domain."')") !== true)
  218.                 die("Error (".mysqli_error($link)."\n");
  219.  
  220.         if (mysqli_query($link, "UPDATE identities"." ".
  221.                                 "SET email = REPLACE(email, ".
  222.                                                      "'".$old_domain."', ".
  223.                                                      "'".$new_domain."')") !== true)
  224.                 die("Error (".mysqli_error($link)."\n");
  225.  
  226.         if (mysqli_query($link, "UPDATE identities"." ".
  227.                                 "SET `reply-to` = REPLACE(`reply-to`, ".
  228.                                                           "'".$old_domain."', ".
  229.                                                           "'".$new_domain."')") !== true)
  230.                 die("Error (".mysqli_error($link)."\n");
  231. }
  232.  
  233. if ($qmailctl_bin) exec($qmailctl_bin.' start');
  234. if ($dovecotctl_bin) exec($dovecotctl_bin.' start');
  235.  
  236.  
  237. ?>

Raw Paste


Login or Register to edit or fork this paste. It's free.