PageRenderTime 52ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/scripts/install.php

https://github.com/PHPFrame/Mashine
PHP | 247 lines | 217 code | 27 blank | 3 comment | 11 complexity | 490e292e423f58433522ecfd6f43e9ba MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1
  1. <?php
  2. if ($_SERVER["REQUEST_METHOD"] == "POST") {
  3. header("Content-Type: application/json");
  4. try {
  5. install();
  6. echo json_encode(array("ok"=>true));
  7. } catch (Exception $e) {
  8. echo json_encode(array("error"=>$e->getMessage()));
  9. }
  10. exit;
  11. }
  12. function install()
  13. {
  14. function execCmd($cmd)
  15. {
  16. exec($cmd, $out, $ret_val);
  17. if ($ret_val > 0) {
  18. throw new Exception("Command ".$cmd." failed. Output: ".implode("\n", $out));
  19. }
  20. }
  21. $install_dir = str_replace("/scripts", "", dirname(__FILE__));
  22. $ini_file = $install_dir.DS."etc".DS."phpframe.ini";
  23. $plugins_file = $install_dir.DS."etc".DS."plugins.xml";
  24. $app_name = @$_POST["app_name"];
  25. $base_url = @$_POST["base_url"];
  26. $admin_email = @$_POST["admin_email"];
  27. $admin_pass = @$_POST["admin_pass"];
  28. $db_host = @$_POST["db_host"];
  29. $db_user = @$_POST["db_user"];
  30. $db_pass = @$_POST["db_pass"];
  31. $db_name = @$_POST["db_name"];
  32. $drop_tables = (bool) @$_POST["drop_tables"];
  33. $dummy_content = (bool) @$_POST["dummy_content"];
  34. $secret = md5(uniqid());
  35. $db = PHPFrame_DatabaseFactory::getDB(array(
  36. "driver" => "mysql",
  37. "host" => $db_host,
  38. "user" => $db_user,
  39. "pass" => $db_pass,
  40. "name" => $db_name
  41. ));
  42. if ($drop_tables) {
  43. $sql = "DROP TABLE IF EXISTS `api_methods`, `contacts`, `content`,";
  44. $sql .= "`content_data`, `countries`, `groups`, `notifications`,";
  45. $sql .= "`oauth_acl`, `oauth_clients`, `oauth_tokens`, `options`, `users`,";
  46. $sql .= "`users_social`";
  47. $db->query($sql);
  48. }
  49. $cmd = "/usr/local/bin/mysql -u ".$db_user." -p".$db_pass." ".$db_name;
  50. $cmd .= " < ".$install_dir."/scripts/install.sql";
  51. execCmd($cmd);
  52. require_once $install_dir.DS."src".DS."models".DS."user".DS."User.php";
  53. require_once $install_dir.DS."src".DS."models".DS."user".DS."UsersMapper.php";
  54. $user = new User();
  55. $user->groupId(1);
  56. $user->email($admin_email);
  57. $crypt = new PHPFrame_Crypt($secret);
  58. $salt = $crypt->genRandomPassword(32);
  59. $encrypted = $crypt->encryptPassword($admin_pass, $salt);
  60. $user->password($encrypted.":".$salt);
  61. $user->status("active");
  62. $user->owner(1);
  63. $user->group(1);
  64. $user->perms(440);
  65. $mapper = new UsersMapper($db);
  66. $mapper->insert($user);
  67. if ($dummy_content) {
  68. $cmd = "/usr/local/bin/mysql -u ".$db_user." -p".$db_pass." ".$db_name;
  69. $cmd .= " < ".$install_dir."/scripts/dummy.sql";
  70. execCmd($cmd);
  71. }
  72. if (!copy($ini_file."-dist", $ini_file)) {
  73. //...
  74. }
  75. if (!copy($plugins_file."-dist", $plugins_file)) {
  76. //...
  77. }
  78. $config = new PHPFrame_Config($ini_file);
  79. $config->set("app_name", "\"".$app_name."\"");
  80. $config->set("base_url", "\"".$base_url."\"");
  81. $config->set("secret", $secret);
  82. $config->set("db.host", $db_host);
  83. $config->set("db.user", $db_user);
  84. $config->set("db.pass", $db_pass);
  85. $config->set("db.name", $db_name);
  86. $config->set("debug.informer_recipients", $admin_email);
  87. $config->store();
  88. PHPFrame_Filesystem::ensureWritableDir($install_dir.DS."tmp");
  89. PHPFrame_Filesystem::ensureWritableDir($install_dir.DS."var");
  90. // set up eb backup
  91. $eb_path = $install_dir.DS."lib".DS."BackupServer";
  92. $eb_pass = md5(uniqid(rand()));
  93. $cmd = "htpasswd -bc ".$eb_path.DS.".htpasswd";
  94. $cmd .= " eb ".$eb_pass;
  95. execCmd($cmd);
  96. $eb_htaccess = file_get_contents($eb_path.DS."src".DS.".htaccess");
  97. $eb_htaccess = str_replace("#Auth", "Auth", $eb_htaccess);
  98. $eb_htaccess = str_replace("#Require", "Require", $eb_htaccess);
  99. $eb_htaccess = str_replace("/path/to/.htpasswd", $eb_path.DS.".htpasswd", $eb_htaccess);
  100. file_put_contents($eb_path.DS."src".DS.".htaccess", $eb_htaccess);
  101. $sql = "INSERT INTO `options` (`name`, `value`, `autoload`) ";
  102. $sql .= "VALUES ('mashineplugin_backup_pass', '".$eb_pass."', 1)";
  103. $db->query($sql);
  104. if (is_link($install_dir.DS."public".DS."eb")) {
  105. unlink($install_dir.DS."public".DS."eb");
  106. }
  107. $cmd = "cd ".$install_dir.DS."public && ln -s ../lib/BackupServer/src ./eb";
  108. execCmd($cmd);
  109. }
  110. $uri = new PHPFrame_URI();
  111. $base_url = $uri->getBase();
  112. ?>
  113. <html>
  114. <head>
  115. <title>Mashine installer</title>
  116. <style>
  117. body {
  118. font-family: Georgia;
  119. font-size: 13px;
  120. width: 520px;
  121. margin: 20px auto;
  122. }
  123. fieldset {
  124. margin: 0 0 10px;
  125. padding: 15px;
  126. border: 1px solid #CCC;
  127. }
  128. legend {
  129. font-size: 1.4em;
  130. }
  131. label {
  132. display: inline-block;
  133. width: 150px;
  134. }
  135. input {
  136. width: 200px;
  137. }
  138. .error {
  139. display: inline-block;
  140. color: red;
  141. font-size: 0.9em;
  142. padding: 0 0 0 4px;
  143. }
  144. </style>
  145. </head>
  146. <body>
  147. <h1>Mashine installer</h1>
  148. <form id="install-form">
  149. <fieldset>
  150. <legend>App info</legend>
  151. <label>App name</label>
  152. <input name="app_name" class="required" value="mashine" />
  153. <br />
  154. <label>Base URL</label>
  155. <input name="base_url" class="required" value="<?php echo $base_url; ?>" />
  156. </fieldset>
  157. <fieldset>
  158. <legend>Admin user</legend>
  159. <label>Email</label>
  160. <input name="admin_email" class="required email" value="root@example.com" />
  161. <br />
  162. <label>Password</label>
  163. <input type="password" name="admin_pass" class="required" />
  164. </fieldset>
  165. <fieldset>
  166. <legend>MySQL DB Credentials</legend>
  167. <label>Host</label>
  168. <input name="db_host" value="localhost" class="required" />
  169. <br />
  170. <label>Username</label>
  171. <input name="db_user" class="required" value="mashine" />
  172. <br />
  173. <label>Password</label>
  174. <input name="db_pass" class="required" value="HV9WmKjrTF3bx4HV" />
  175. <br />
  176. <label>Database name</label>
  177. <input name="db_name" class="required" value="mashine" />
  178. </fieldset>
  179. <fieldset>
  180. <legend>Options</legend>
  181. <label>Drop tables before installing?</label>
  182. <input type="checkbox" name="drop_tables" value="1" />
  183. <br />
  184. <label>Install dummy content?</label>
  185. <input type="checkbox" name="dummy_content" value="1" />
  186. </fieldset>
  187. <p>
  188. <input type="submit" value="Install" />
  189. </p>
  190. </form>
  191. <script src="assets/js/jquery/jquery-1.5.1.js"></script>
  192. <script src="assets/js/jquery/jquery.validate.js"></script>
  193. <script>
  194. jQuery(document).ready(function ($) {
  195. $('#install-form').validate({
  196. errorElement: 'div',
  197. submitHandler: function (form) {
  198. var btn = $('input[type=submit]');
  199. btn.val('Installing...');
  200. $.ajax({
  201. url: '<?php echo $base_url; ?>',
  202. type: 'POST',
  203. data: $(form).serialize(),
  204. success: function (data) {
  205. if (!data.ok) {
  206. alert(data.error);
  207. } else {
  208. window.location = '<?php echo $base_url; ?>';
  209. }
  210. },
  211. complete: function () {
  212. btn.val('Install');
  213. }
  214. });
  215. }
  216. });
  217. });
  218. </script>
  219. </body>
  220. </html>