PageRenderTime 46ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/branches/1.2.0/www/app_switch.php

http://scalr.googlecode.com/
PHP | 153 lines | 117 code | 34 blank | 2 comment | 29 complexity | 871700f0a32529787b7061507ce2df5d MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, GPL-3.0
  1. <?
  2. require("src/prepend.inc.php");
  3. $display["title"] = _("Application&nbsp;&raquo;&nbsp;Switch");
  4. if ($_SESSION["uid"] != 0)
  5. $zoneinfo = $db->GetRow("SELECT * FROM zones WHERE zone=? AND clientid='{$_SESSION['uid']}'", array($req_application));
  6. else
  7. $zoneinfo = $db->GetRow("SELECT * FROM zones WHERE zone=?", array($req_application));
  8. if (!$zoneinfo)
  9. UI::Redirect("sites_view.php");
  10. $farminfo = $db->GetRow("SELECT * FROM farms WHERE id=?", array($zoneinfo['farmid']));
  11. if ($_POST)
  12. {
  13. if ($farminfo['id'] == $post_new_farmid && $zoneinfo['ami_id'] == $post_new_amiid)
  14. UI::Redirect("sites_view.php");
  15. $new_farminfo = $db->GetRow("SELECT * FROM farms WHERE id=?", array($post_new_farmid));
  16. if (!$new_farminfo || $new_farminfo['clientid'] != $zoneinfo['clientid'])
  17. UI::Redirect("sites_view.php");
  18. $new_roleinfo = $db->GetRow("SELECT farm_roles.*, roles.name FROM farm_roles INNER JOIN roles ON roles.ami_id = farm_roles.ami_id WHERE farmid=? and farm_roles.ami_id=?", array($post_new_farmid, $post_new_amiid));
  19. if (!$new_roleinfo)
  20. UI::Redirect("sites_view.php");
  21. $Logger->info(sprintf(_("Switching application '%s'"), $zoneinfo['zone']));
  22. $ZoneControler = new DNSZoneControler();
  23. $db->BeginTrans();
  24. try
  25. {
  26. $Logger->info(_("Updating zone in database"));
  27. $db->Execute("UPDATE zones SET farmid=?, ami_id=?, role_name=? WHERE id=?",
  28. array($post_new_farmid, $post_new_amiid, $new_roleinfo['name'], $zoneinfo['id'])
  29. );
  30. $vhostinfo = $db->GetRow("SELECT * FROM vhosts WHERE name=? AND farmid=?",
  31. array($zoneinfo['zone'], $zoneinfo['farmid'])
  32. );
  33. if ($vhostinfo)
  34. {
  35. $Logger->info(_("Updating vhost in database"));
  36. $db->Execute("UPDATE vhosts SET farmid=?, farm_roleid=? WHERE id=?",
  37. array($post_new_farmid, $new_roleinfo['id'], $vhostinfo['id'])
  38. );
  39. }
  40. $Logger->info(_("Updating DNS records"));
  41. //Update DNS zone
  42. $db->Execute("DELETE FROM records WHERE zoneid=? AND issystem='1' AND rtype='A'",
  43. array($zoneinfo['id'])
  44. );
  45. $records = array();
  46. $instances = $db->GetAll("SELECT * FROM farm_instances WHERE farmid=? AND state=? AND isactive='1'", array($post_new_farmid, INSTANCE_STATE::RUNNING));
  47. foreach ($instances as $instance)
  48. {
  49. $ami_info = $db->GetRow("SELECT * FROM roles WHERE ami_id=?", array($instance['ami_id']));
  50. try
  51. {
  52. $DBFarmRole = DBFarmRole::LoadByID($instance['farm_roleid']);
  53. $skip_main_a_records = ($DBFarmRole->GetSetting(DBFarmRole::SETTING_BALANCING_USE_ELB) == 1) ? true : false;
  54. }
  55. catch(Exception $e)
  56. {
  57. $Logger->fatal(sprintf("instances_view(73): %s", $e->getMessage()));
  58. $skip_main_a_records = false;
  59. }
  60. $instance_records = DNSZoneControler::GetInstanceDNSRecordsList($instance, $new_roleinfo["name"], $ami_info['alias']);
  61. $records = array_merge($records, $instance_records);
  62. }
  63. foreach ($records as $k=>$v)
  64. {
  65. if ($v["rkey"] != '' || $v["rvalue"] != '')
  66. $db->Execute("REPLACE INTO records SET zoneid=?, `rtype`=?, `ttl`=?, `rpriority`=?, `rvalue`=?, `rkey`=?, `issystem`=?", array($zoneinfo["id"], $v["rtype"], $v["ttl"], (int)$v["rpriority"], $v["rvalue"], $v["rkey"], $v["issystem"] ? 1 : 0));
  67. }
  68. //Send VHOS_RECONFIGURE trap
  69. if ($vhostinfo)
  70. {
  71. $Logger->info(_("Reconfiguring vhost on app and www instances"));
  72. $instances = $db->GetAll("SELECT * FROM farm_instances WHERE farmid=?", array($post_new_farmid));
  73. foreach ((array)$instances as $instance)
  74. {
  75. $alias = $db->GetOne("SELECT alias FROM roles WHERE ami_id=?", array($instance['ami_id']));
  76. if ($alias != ROLE_ALIAS::APP && $alias != ROLE_ALIAS::WWW)
  77. continue;
  78. if ($new_roleinfo['alias'] == ROLE_ALIAS::APP && $new_roleinfo['ami_id'] != $instance['ami_id'])
  79. continue;
  80. $DBInstance = DBInstance::LoadByID($instance['id']);
  81. $DBInstance->SendMessage(new VhostReconfigureScalrMessage());
  82. }
  83. }
  84. }
  85. catch(Exception $e)
  86. {
  87. $Logger->error($e->getMessage());
  88. $errmsg = sprintf(_("Cannot switch application. %s"), $e->getMessage());
  89. $db->RollbackTrans();
  90. }
  91. if (!$errmsg)
  92. {
  93. $db->CommitTrans();
  94. try
  95. {
  96. $Logger->info(_("Updating zone on NS servers"));
  97. $ZoneControler->Update($zoneinfo['id']);
  98. }
  99. catch(Exception $e)
  100. {
  101. $db->Execute("UPDATE zones SET isobsoleted='1' WHERE id=?", array($zoneinfo['id']));
  102. $Logger->error($e->getMessage());
  103. }
  104. $Logger->info("Application successfully switched.");
  105. $okmsg = _("Application successfully switched to another farm/role.");
  106. UI::Redirect("sites_view.php");
  107. }
  108. }
  109. $display['farminfo'] = $farminfo;
  110. $display['role_name'] = $zoneinfo['role_name'];
  111. $display['ami_id'] = $zoneinfo['ami_id'];
  112. $display['application'] = $req_application;
  113. $display['zoneinfo'] = $zoneinfo;
  114. $display['roles'] = $db->GetAll("SELECT farm_roles.*, roles.name FROM farm_roles INNER JOIN roles ON roles.ami_id = farm_roles.ami_id WHERE farmid=?", array($farminfo['id']));
  115. $display['farms'] = $db->GetAll("SELECT * FROM farms WHERE clientid=? AND status IN(?,?)", array($farminfo['clientid'], FARM_STATUS::RUNNING, FARM_STATUS::TERMINATED));
  116. foreach ($display['farms'] as &$farm)
  117. $farm['roles'] = $db->GetAll("SELECT farm_roles.*, roles.name FROM farm_roles INNER JOIN roles ON roles.ami_id = farm_roles.ami_id WHERE farmid=?", array($farm['id']));
  118. require("src/append.inc.php");
  119. ?>