PageRenderTime 25ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/php/test-installer.php

https://github.com/letolabs/DIY
PHP | 258 lines | 212 code | 14 blank | 32 comment | 31 complexity | 54a5b89649a569ee9755ab0a4cb84175 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1
  1. <?php
  2. /**
  3. * CASH Music Test Installer
  4. *
  5. * Takes the CASH DIY repo and sets it up as a working platform instance so
  6. * tests can be run against it.
  7. *
  8. * USAGE:
  9. * php tests/php/test-installer.php
  10. *
  11. *
  12. * @package diy.org.cashmusic
  13. * @author CASH Music
  14. * @link http://cashmusic.org/
  15. *
  16. * Copyright (c) 2011, CASH Music
  17. * Licensed under the Affero General Public License version 3.
  18. * See http://www.gnu.org/licenses/agpl-3.0.html
  19. */
  20. if(!defined('STDIN')) { // force CLI, the browser is *so* 2007...
  21. echo "Please run installer from the command line. usage:<br / >&gt; php tests/php/test-installer.php";
  22. } else {
  23. require_once(dirname(__FILE__) .'/../../tests/php/functions.php');
  24. function findReplaceInFile($filename,$find,$replace) {
  25. if (is_file($filename)) {
  26. $file = file_get_contents($filename);
  27. $file = str_replace($find, $replace, $file);
  28. if (file_put_contents($filename, $file)) {
  29. return true;
  30. } else {
  31. return false;
  32. }
  33. } else {
  34. return false;
  35. }
  36. }
  37. $success = false;
  38. echo "\n \n"
  39. . " WELCOME TO R'LYEH\n"
  40. . "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  41. . "MMMMMMMMMMMMMMMMMMMMMMMMMMMWKO0KXO0KKOKKXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  42. . "MMMMMMMMMMMMMMMMMMMMMMMN0doxcoK0xkO0OKXMWkONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  43. . "MMMMMMMMMMMMMMMMMMNKdoxollok:,ol::clod;kKMX;xNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  44. . "MMMMMMMMMMMMMMMMKo,;lOl.,llco,,..:o,c;,:dMMNll0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  45. . "MMMMMMMMMMMMMKx::dOoc',.,Okokl'...'::l:;oWXONWdXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  46. . "MMMMMMMMMMMXKdlxo:c.;'. .'dooc;o,;..:::;kWl,:kk:KMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  47. . "MMMMMMMMMMXlccc..',.:.'.. .;,okxxddll.,:c, ..;'x.cdOKNMMMMMMMMMMMMMMMMMMMMMMMM\n"
  48. . "MMMMMMMMNOxllx::,... .;.....:ooldOdko;..''..kxoXloc:oONMMMMMMMMMMMMMMMMMMMMMM\n"
  49. . "MMMMMMMNo:c,oko:,:..l;c':';'.,c:xkodxkd,;,c,xMcxN0KOXd:cKMMMMMMMMMMMMMMMMMMMMM\n"
  50. . "MMMMMWO::.;';co',okkc,,'odOkdc,.';odo,xkcdk'xNlck;..,dcklklXMMMMMMMMMMMMMMMMMM\n"
  51. . "MMMMNkc:'l:l,:;.c.;c..'dxldKkxx:'..dl:oo:dlxkl..:d0XK0xocxXMMMMMMMMMMMMMMMMMMM\n"
  52. . "MMMWo;';:',::,. ;o. .'OMMMMKc;'::' ..'.:ool,;;..'oWMMMW:.';okMMMMMMMMMMXddNMMM\n"
  53. . "MMM0;c.:.'c;,,'',:; .'0MMMMMMNO:;'.... ..... 'dWMMMMM;';:dWMMMMMMWWKol;dNMMM\n"
  54. . "MMO.;;'.,;,''';:cl:,,;'l0XWMMMWd'... .... ...'cNMMMM0.''olMMMMMWOllo:oKMMMMM\n"
  55. . "MMkx;''...,.,c.c:;,,dooxc,;,,. .:,. .;.. ;:. 'dxX0o''oxXMMMMXdxO:ckMMMMMMMMMM\n"
  56. . "MMMMWX0OWO;.'.;;,,:'.''' . . .;,; ,,.. o0. .lxc:llXMMMMN;kl.OMMMMMMMMMMMM\n"
  57. . "MMMMMMMMMMMMKo',co:... ..... ,;;,. lc;'.'dK. ...,,ollNMMMMMOc0.lWMMMMMMMMMMMM\n"
  58. . "MMMMMMMMMMMMMMW0c,,cc.:' .. .;'', ,OXc, cko ;l.;xx:.NMMMMMMXcOcXMMMMMMMMMMMMM\n"
  59. . "MMMMMMMMWkx0NMMMMMk l,'l. c; :xc:;.oW0o.:ok'cX0:K0x dMMMMMMMX'o:kMMMMMMMMMMMMM\n"
  60. . "MMMMMM0dlcolldxNMNl ';.:l.cx'clll,;xNx 'cx.cXN'dcoK.xMMMMMMMM:,olMMMMMMMMMMMMM\n"
  61. . "MMMMXd0kc.:dc,'';:;..x :l; c''lOWc'0X' ,o,;KW:.K'.kd,NMMMMMMMo.0;NMMMMMMMMMMMM\n"
  62. . "MMMMdoXx.kMMMNOlc:xd:d..dl..l;oKMx.OX..:l.cK0.,Xl .:c.xWMMMMN':d KMMMMMMMMMMMM\n"
  63. . "MMMMl:x0.oWMMMMMKk:,l:'.;c:.cc,kMK.:Nc'cc.,lO.'co'. ,lcoxlc;'dO,cMMMMMMMMMMMMM\n"
  64. . "MMMMK'co:..dxOkc,'l:'.. .dc.lk'lkXo'kXl:',.:c,' ,odddo;ox0xoo:'0WMMMMMMMMMMMMM\n"
  65. . "MMMMMk.,kxl;;l;ldl;:':KX:l,.co.,xOX:.dX0;,,.,odddl,.:xXl.,..,xNMMMMMMMMMMMMMMM\n"
  66. . "MMMMMMMO,...,ccldk0KWMMN.l',oc.. cNx. :odo:okOc.. . ,Oc0WKOOKWMMMMMMMMMMMMMM\n"
  67. . "MMMMMMMMMNKKNMMMWKxol:c;;:,lc... 'OOl. . . .:'.'; ;k.,xklxd0MMMMMMMMMMMMMM\n"
  68. . "MMMMMMMMMMMMM0lc:';:lc:;,, .. l;..oKl. c, .. .''..,' .xo.NMMX;OdXMMMMMMMMMMMMM\n"
  69. . "MMMMMMMMMMNOl:cc;.::okO0,. ;,x'co,..,k;KNd'c0. ,,cl,0MMMMx:d0MMMMMMMMMMMMM\n"
  70. . "MMMMMMMMM0:dxlxKNNMMMMWxx..:..c:c.cO;. .kloMX,.d: 'c.lXMMMMMco:KMMMMMMMMMMMMM\n"
  71. . "MMMMMMMMK:o,xWMMMMMMMK;oc'kN':,cKWoxc. .OcdMMo.dx .;.xWMMMMMxclOMMMMMMMMMMMMMM\n"
  72. . "MMMMMMMX:o.KMMMMMMMXl.,c.kN::ccNMWdl. ,l.kMMk.c..: dMMMMMMX;o,NMMNMMMMMMMMMMM\n"
  73. . "MMMMMMMO:.'KMMMMM0;:od'xN0.ccxMMMKlc' cl.XMN;': '; xMMMMMMX.l:':o'NMMMMMMMMMM\n"
  74. . "MMMMMMMNoc,cxkXWxcdc,;OMN:d;dMMMMddc' kl:MMc,'cXkocXMMMMMMMNoxKxlOMMMMMMMMMMM\n"
  75. . "MMMMMMMMMWXKXNKc,,oXMMMk.d;cMMMMk:o; ,k'NMk:c'NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  76. . "MMMMMMMMX0OOd;..;XMMMMW';;:WMMM0:x;.. o:XMN':.0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  77. . "MMMMMMMMNOcok0WMMMMMMMK.lcWMMM0loc.oW:ldMMX.;'WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  78. . "MMMMMMMMMMMMMMMMMMMMMMo.,cMMWOlo' ,WN':xMMMo';XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  79. . "MMMMMMMMMMMMMMMMMMMMMM:',KWx;dl. :WMMO'dMMMMNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  80. . "MMMMMMMMMMMMMMMMMMMMMM:.'lc,l;.cOWMMMMNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  81. . "MMMMMMMMMMMMMMMMMMMMMMx. :c..kWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  82. . "MMMMMMMMMMMMMMMMMMMMMMM0..; :KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  83. . "MMMMMMMMMMMMMMMMMMMMMMMMK,,OWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  84. . "MMMMMMMMMMMMMMMMMMMMMMMMMNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  85. . "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
  86. . " C A S H M U S I C\n"
  87. . " PLATFORM TEST INSTALLER\n";
  88. echo "\nPh'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn!\n\n";
  89. $db_engine = 'sqlite';
  90. $installer_root = dirname(__FILE__);
  91. if (getTestEnv("CASHMUSIC_DB_TYPE")) {
  92. $db_engine = getTestEnv("CASHMUSIC_DB_TYPE");
  93. if ($db_engine != 'mysql' && $db_engine != 'sqlite') {
  94. echo "\nOh. Shit. Something's wrong: first argument must be either 'sqlite' or 'mysql' \n\n";
  95. exit(1);
  96. }
  97. if ($db_engine == 'mysql') {
  98. $db_server = getTestEnv("CASHMUSIC_DB_SERVER");
  99. $db_name = getTestEnv("CASHMUSIC_DB_NAME");
  100. $db_username = getTestEnv("CASHMUSIC_DB_USERNAME");
  101. $db_password = getTestEnv("CASHMUSIC_DB_PASSWORD");
  102. }
  103. }
  104. if ($db_engine == 'mysql') {
  105. if (@new PDO()) {
  106. echo "\nOh. Shit. Something's wrong: PDO is required.\n\n";
  107. exit(1);
  108. }
  109. // set up database, add user / password
  110. $db_port = 3306;
  111. if (strpos($db_server,':') !== false) {
  112. $host_and_port = explode(':',$db_server);
  113. $db_address = $host_and_port[0];
  114. $db_port = $host_and_port[1];
  115. } else {
  116. $db_address = $db_server;
  117. }
  118. try {
  119. $pdo = new PDO ("mysql:host=$db_address;port=$db_port;dbname=$db_name",$db_username,$db_password);
  120. $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  121. } catch (PDOException $e) {
  122. echo "\nOh. Shit. Something's wrong: Couldn't connect to the database. $e\n\n";
  123. exit(1);
  124. break;
  125. }
  126. if ($pdo->query(file_get_contents(dirname(__FILE__) . '/../../framework/php/settings/sql/cashmusic_db.sql'))) {
  127. $success = true;
  128. } else {
  129. echo "\nOh. Shit. Something's wrong. Couldn't create database tables.\n\n";
  130. exit(1);
  131. break;
  132. }
  133. } else if ($db_engine == 'sqlite') {
  134. // if the file exists already, rename it as a backup
  135. if (file_exists($installer_root . '/../../framework/db/cashmusic_test.sqlite')) {
  136. rename($installer_root . '/../../framework/db/cashmusic_test.sqlite',$installer_root . '/../../framework/db/cashmusic_test.sqlite.pretest.bak');
  137. } else {
  138. // if the directory was never created then create it now
  139. if (!file_exists($installer_root . '/../../framework/db')) {
  140. mkdir($installer_root . '/../../framework/db');
  141. }
  142. }
  143. // connect to the new db...will create if not found
  144. try {
  145. $pdo = new PDO ('sqlite:' . $installer_root . '/../../framework/db/cashmusic_test.sqlite');
  146. $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  147. chmod($installer_root . '/../../framework/db/cashmusic_test.sqlite',0755);
  148. } catch (PDOException $e) {
  149. echo "\nOh. Shit. Something's wrong: Couldn't connect to the database. $e\n\n";
  150. exit(1);
  151. break;
  152. }
  153. // push in all the tables
  154. // TO-DO:
  155. // what the fuck?
  156. //
  157. // $pdo->query doesn't work here. fails and doesn't write to the DB. exec works like a charm
  158. // but for the MySQL version the behavior is reversed. should both (seemingly) work interchangeably
  159. //
  160. // i don't fucking know.
  161. try {
  162. $pdo->exec(file_get_contents($installer_root . '/../../framework/php/settings/sql/cashmusic_db_sqlite.sql'));
  163. $success = true;
  164. } catch (PDOException $e) {
  165. echo "\nOh. Shit. Something's wrong: Couldn't write to the database. $e\n\n";
  166. exit(1);
  167. break;
  168. }
  169. }
  170. if ($success) {
  171. $user_email = 'root@localhost';
  172. $system_salt = md5($user_email . time());
  173. $user_password = 'hack_my_gibson';
  174. $password_hash = hash_hmac('sha256', $user_password, $system_salt);
  175. $data = array(
  176. 'email_address' => $user_email,
  177. 'password' => $password_hash,
  178. 'is_admin' => true,
  179. 'api_key' => '42',
  180. 'api_secret' => '43',
  181. 'creation_date' => time()
  182. );
  183. $query = "INSERT INTO people (email_address,password,is_admin,api_key,api_secret,creation_date) VALUES (:email_address,:password,:is_admin,:api_key,:api_secret,:creation_date)";
  184. try {
  185. $q = $pdo->prepare($query);
  186. $success = $q->execute($data);
  187. } catch(PDOException $e) {
  188. echo "\nOh. Shit. Something's wrong. Couldn't add the user to the database. $e\n\n";
  189. exit(1);
  190. break;
  191. }
  192. // modify settings files
  193. if (file_exists($installer_root . '/../../framework/php/settings/cashmusic.ini.php')) {
  194. rename($installer_root . '/../../framework/php/settings/cashmusic.ini.php',$installer_root . '/../../framework/php/settings/cashmusic.ini.pretest.bak');
  195. }
  196. if (
  197. !copy($installer_root.'/../../framework/php/settings/cashmusic_template.ini.php',$installer_root.'/../../framework/php/settings/cashmusic.ini.php')
  198. ) {
  199. echo '\nOh. Shit. Something\'s wrong. Couldn\'t write the config file.\n\n'
  200. . 'the directory you specified for the framework.</p>';
  201. break;
  202. }
  203. // move source files into place
  204. $file_write_success = false;
  205. $test_url = getTestEnv("CASHMUSIC_TEST_URL");
  206. if (!$test_url) { $test_url = "http://dev.cashmusic.org:8080"; }
  207. if ($db_engine == 'sqlite') {
  208. if (
  209. findReplaceInFile($installer_root.'/../../framework/php/settings/cashmusic.ini.php','driver = "mysql','driver = "sqlite') &&
  210. findReplaceInFile($installer_root.'/../../framework/php/settings/cashmusic.ini.php','debug = 0','debug = 1') &&
  211. findReplaceInFile($installer_root.'/../../framework/php/settings/cashmusic.ini.php','database = "cashmusic','database = "cashmusic_test.sqlite') &&
  212. findReplaceInFile($installer_root.'/../../framework/php/settings/cashmusic.ini.php','apilocation = "http://localhost:8888/interfaces/php/api/','apilocation = "'.$test_url.'/interfaces/php/api/') &&
  213. findReplaceInFile($installer_root.'/../../framework/php/settings/cashmusic.ini.php','salt = "I was born of sun beams; Warming up our limbs','salt = "' . $system_salt)
  214. ) {
  215. $file_write_success = true;
  216. }
  217. } else {
  218. if (
  219. findReplaceInFile($installer_root.'/../../framework/php/settings/cashmusic.ini.php','hostname = "127.0.0.1:8889','hostname = "' . $db_server) &&
  220. findReplaceInFile($installer_root.'/../../framework/php/settings/cashmusic.ini.php','username = "root','username = "' . $db_username) &&
  221. findReplaceInFile($installer_root.'/../../framework/php/settings/cashmusic.ini.php','password = "root','password = "' . $db_password) &&
  222. findReplaceInFile($installer_root.'/../../framework/php/settings/cashmusic.ini.php','database = "cashmusic','database = "' . $db_name) &&
  223. findReplaceInFile($installer_root.'/../../framework/php/settings/cashmusic.ini.php','debug = 0','debug = 1') &&
  224. findReplaceInFile($installer_root.'/../../framework/php/settings/cashmusic.ini.php','apilocation = "http://localhost:8888/interfaces/php/api/','apilocation = "'.$test_url.'/interfaces/php/api/') &&
  225. findReplaceInFile($installer_root.'/../../framework/php/settings/cashmusic.ini.php','salt = "I was born of sun beams; Warming up our limbs','salt = "' . $system_salt)
  226. ) {
  227. $file_write_success = true;
  228. }
  229. }
  230. if (!$file_write_success) {
  231. echo "\nOh. Shit. Something's wrong. We had trouble editing a few files. Please try again.\n\n";
  232. break;
  233. } else {
  234. try {
  235. $pdo->exec(file_get_contents(dirname(__FILE__) . '/../../framework/php/settings/sql/cashmusic_demo_data.sql'));
  236. echo "\n" . strtoupper($db_engine) . " TEST DB DEPLOYED! Fear of testing is the mind-killer.\n";
  237. } catch (PDOException $e) {
  238. echo "\nSOME SUCCESS, SOME FAILURE:\nEverything is set up properly, but there was an error writing demo data.\n$e\n";
  239. }
  240. }
  241. }
  242. }
  243. ?>