4 * FusionForge Installation Dependency Setup
6 * Copyright 2006 GForge, LLC
11 * This file is part of GInstaller, it is called by install.sh.
13 * FusionForge is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
18 * FusionForge is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with GForge; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 US
29 define ('GREEN', "\033[01;32m" );
30 define ('NORMAL', "\033[00m" );
31 define ('RED', "\033[01;31m" );
33 $STDOUT = fopen('php://stdout','w');
34 $STDIN = fopen('php://stdin','r');
36 show("\n-=# Welcome to FusionForge DB-Installer #=-");
38 //TO DO: add dependency check
39 //if (!run("php check-deps.php", true)) {
40 // echo RED.'Not all the necessary dependencies were found. aborting.'.NORMAL."\n";
44 // Make sure the DB is initialized by starting postgresql service
45 if (is_file('/etc/init.d/postgresql'))
47 $pgservice='/etc/init.d/postgresql';
49 elseif (is_file('/etc/init.d/postgresql-8.2'))
51 $pgservice='/etc/init.d/postgresql-8.2';
53 elseif (is_file('/etc/init.d/postgresql-8.3'))
55 $pgservice='/etc/init.d/postgresql-8.3';
57 elseif (is_file('/etc/init.d/postgresql-8.4'))
59 $pgservice='/etc/init.d/postgresql-8.4';
61 elseif (is_file('/etc/init.d/cswpostgres'))
63 $pgservice='/etc/init.d/cswpostgres';
67 die("ERROR: Could not find Postgresql init script\n");
70 # Fedora9 (an maybe newer) requires running initdb
71 if ($pgservice == '/etc/init.d/postgresql') {
72 if (!is_dir("/var/lib/pgsql/data/base")) {
73 run("service postgresql initdb &>/dev/null", true);
77 // Might fail if it's already running, so we'll ingnore the result
78 run("$pgservice start", true);
80 require_once 'install-common.inc' ;
82 if (!is_dir($fusionforge_src_dir))
84 die("Error: GForge folder doesn't exist. Run fusionforge-install-2.php first.");
87 // Where the PGHBA config file is
88 if (is_file("/var/lib/pgsql/data/pg_hba.conf"))
91 $PGHBA='/var/lib/pgsql/data/pg_hba.conf';
93 elseif (is_file('/etc/postgresql/8.2/main/pg_hba.conf'))
95 $PGHBA='/etc/postgresql/8.2/main/pg_hba.conf';
97 elseif (is_file('/etc/postgresql/8.4/main/pg_hba.conf'))
99 $PGHBA='/etc/postgresql/8.4/main/pg_hba.conf';
101 elseif (is_file('/opt/csw/var/pgdata/pg_hba.conf'))
103 $PGHBA='/opt/csw/var/pgdata/pg_hba.conf';
107 die("ERROR: Could not find pg_hba.conf file\n");
111 if (is_file('/usr/share/pgsql/contrib/tsearch2.sql'))
114 $tsearch2_sql='/usr/share/pgsql/contrib/tsearch2.sql';
116 elseif (is_file('/usr/share/postgresql/contrib/tsearch2.sql'))
119 $tsearch2_sql='/usr/share/postgresql/contrib/tsearch2.sql';
121 elseif (is_file('/usr/share/postgresql/8.2/contrib/tsearch2.sql'))
123 $tsearch2_sql='/usr/share/postgresql/8.2/contrib/tsearch2.sql';
125 elseif (is_file('/usr/share/postgresql/8.3/contrib/tsearch2.sql'))
127 $tsearch2_sql='/usr/share/postgresql/8.3/contrib/tsearch2.sql';
129 elseif (is_file('/usr/share/postgresql/8.4/contrib/tsearch2.sql'))
131 $tsearch2_sql='/usr/share/postgresql/8.4/contrib/tsearch2.sql';
133 elseif (is_file('/opt/csw/postgresql/share/contrib/tsearch2.sql'))
136 $tsearch2_sql='/opt/csw/postgresql/share/contrib/tsearch2.sql';
140 die("ERROR: Could not find tsearch2.sql file\n");
146 global $PGHBA, $fusionforge_src_dir, $fusionforge_etc_dir, $tsearch2_sql, $pgservice, $STDIN, $STDOUT;
148 show("\n * Enter the Database Name (gforge): ");
150 if (getenv('FFORGE_DB')) {
151 $gforge_db = getenv('FFORGE_DB');
153 $gforge_db = trim(fgets($STDIN));
154 if (strlen($gforge_db) == 0) {
155 $gforge_db = 'gforge';
158 show(" ...using '$gforge_db'");
160 show(' * Enter the Database Username (gforge): ');
162 if (getenv('FFORGE_USER')) {
163 $gforge_user = getenv('FFORGE_USER');
165 $gforge_user = trim(fgets($STDIN));
166 if (strlen($gforge_user) == 0) {
167 $gforge_user = 'gforge';
170 show(" ...using '$gforge_user'");
172 show(" * Modifying DB Access Permissions...");
173 if (!file_exists("$PGHBA.fforge.backup")) {
174 run("cp $PGHBA $PGHBA.fforge.backup", true);
176 run("echo \"# GFORGE\nlocal all all trust\" > $PGHBA");
177 show(' * Restarting PostgreSQL...');
178 run("$pgservice stop", true);
179 run("$pgservice start");
182 show(" * Creating '$gforge_user' Group...");
183 run("/usr/sbin/groupadd $gforge_user", true);
185 show(" * Creating '$gforge_user' User...");
186 run("/usr/sbin/useradd -g $gforge_user $gforge_user", true);
188 show(" * Creating Database User '$gforge_user'...");
189 run("su - postgres -c \"createuser -A -R -d -E $gforge_user\"", true);
191 show(' * Creating Language...');
192 run("su - postgres -c \"createlang plpgsql template1\"", true);
194 if (!is_dir("/home/$gforge_user")) {
200 show(" * Creating '$gforge_db' Database...");
201 run("su $susufix $gforge_user -c \"createdb --encoding UNICODE $gforge_db\"", true);
203 # Detect postgresql version, load tsearch2 for pg < 8.3
204 $pg_version = explode(' ', shell_exec("postgres --version"));
205 $pgv = $pg_version[2];
207 if (preg_match('/^(7\.|8\.1|8\.2)/', $pgv)) {
208 show(" * Dumping tsearch2 Database Into '$gforge_db' DB");
209 run("su - postgres -c \"psql $gforge_db < $tsearch2_sql\" >> /tmp/gforge-import.log");
211 $tables = array('pg_ts_cfg', 'pg_ts_cfgmap', 'pg_ts_dict', 'pg_ts_parser');
212 foreach ($tables as $table) {
213 run('su - postgres -c "psql '.$gforge_db.' -c \\"GRANT ALL on '.$table.' TO '.$gforge_user.';\\""');
216 // show(" * Creating FTS default configuation (Full Text Search)");
217 // run("su - postgres -c \"psql $gforge_db < $fusionforge_src_dir/db/FTS-20081108.sql\" >> /tmp/gforge-import.log");
221 show(' * Dumping FusionForge DB');
222 run("su $susufix $gforge_user -c \"psql $gforge_db < $fusionforge_src_dir/db/gforge.sql\" >> /tmp/gforge-import.log");
224 // show(' * Dumping FusionForge FTI DB');
225 // run("su $susufix $gforge_user -c \"psql $gforge_db < $fusionforge_src_dir/db/FTI.sql\" >> /tmp/gforge-import.log");
226 // run("su $susufix $gforge_user -c \"psql $gforge_db < $fusionforge_src_dir/db/FTI-20050315.sql\" >> /tmp/gforge-import.log");
227 // run("su $susufix $gforge_user -c \"psql $gforge_db < $fusionforge_src_dir/db/FTI-20050401.sql\" >> /tmp/gforge-import.log");
228 // run("su $susufix $gforge_user -c \"psql $gforge_db < $fusionforge_src_dir/db/FTI-20050530.sql\" >> /tmp/gforge-import.log");
229 // run("su $susufix $gforge_user -c \"psql $gforge_db < $fusionforge_src_dir/db/FTI-20060130.sql\" >> /tmp/gforge-import.log");
230 // run("su $susufix $gforge_user -c \"psql $gforge_db < $fusionforge_src_dir/db/FTI-20061025.sql\" >> /tmp/gforge-import.log");
232 show(" * Enter the Admin Username (fforgeadmin): ");
233 if (getenv('FFORGE_ADMIN_USER')) {
234 $admin_user = getenv('FFORGE_ADMIN_USER');
236 $admin_user = trim(fgets($STDIN));
238 if (strlen($admin_user) == 0) {
239 $admin_user = 'fforgeadmin';
242 show(" ...using '$admin_user'");
244 if (getenv('FFORGE_ADMIN_PASSWORD')) {
246 $pwd1 = getenv('FFORGE_ADMIN_PASSWORD');
253 while ($bad_pwd && $retries < 5) {
254 if ($bad_pwd && $retries > 0) {
255 show(' * ' . $error);
257 $pwd1 = readMasked(" * Enter the Site Admin Password:");
258 $error = validatePassword($pwd1);
262 $pwd2 = readMasked(" * Please enter it again: \n");
263 if ($pwd1 == $pwd2) {
266 $error = 'Passwords don\'t match. Please try again.';
274 show('Passwords didn\'t match! Aborting.');
277 $pw_md5 = md5($pwd1);
278 $pw_crypt = crypt($pwd1);
279 $pw_crypt = str_replace('$', '\\\\\\$', $pw_crypt);
280 //run( 'su - postgres -c "psql ' .
282 // ' -c \\"UPDATE \\\\\"user\\\\\" SET unix_name=\'' .
283 // $admin_user . '\', password_md5=\'' .
284 // $pw_md5 . '\', password_crypt=\'' .
285 // $pw_crypt . '\' WHERE user_id=101;\\""'); // MODIFIQUE ESTO
287 //run( 'su - postgres -c "psql ' .
289 // ' -c \\"UPDATE \\\\\"users\\\\\" SET user_name=\'' .
290 // $admin_user . '\', user_pw=\'' .
291 // $pw_md5 . '\', unix_pw=\'' .
292 // $pw_crypt . '\' WHERE user_id=101;\\""');
293 //echo "BREAKPOINT 1\n";
294 //$t = trim(fgets($STDIN));
296 // run("su - postgres -c \"psql $gforge_db -c \\\"INSERT INTO users (user_name, user_pw, unix_pw) VALUES ('$admin_user', '$pw_md5', '$pw_crypt')\\\"\"");
297 if (file_exists ('/tmp/fusionforge-use-pfo-rbac')) { // USE_PFO_RBAC
298 run("su - postgres -c \"psql $gforge_db -c \\\"INSERT INTO users (user_name, email, user_pw, unix_pw, status, theme_id) VALUES ('$admin_user', 'root@localhost.localdomain', '$pw_md5', '$pw_crypt', 'A', 1); INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (currval('users_pk_seq'), 1, 'A'); INSERT INTO pfo_user_role (user_id, role_id) VALUES (currval('users_pk_seq'), 3)\\\"\"");
300 run("su - postgres -c \"psql $gforge_db -c \\\"INSERT INTO users (user_name, email, user_pw, unix_pw, status, theme_id) VALUES ('$admin_user', 'root@localhost.localdomain', '$pw_md5', '$pw_crypt', 'A', 1); INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (currval('users_pk_seq'), 1, 'A')\\\"\"");
303 //echo "BREAKPOINT 2\n";
304 //$t = trim(fgets($STDIN));
306 // run("su - postgres -c \"psql $gforge_db -c \\\"INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (currval('users_pk_seq'), 1, 'A')\\\"\"" );
308 //echo "BREAKPOINT 3\n";
309 //$t = trim(fgets($STDIN));
312 if (!is_dir($fusionforge_etc_dir)) {
313 mkdir($fusionforge_etc_dir);
317 show(' * Saving database configuration in FForge config file');
318 $data = file_get_contents("$fusionforge_etc_dir/local.inc");
319 $lines = explode("\n",$data);
321 foreach ($lines as $l) {
322 $l = preg_replace("/^.sys_dbname\s*=\s*'(.*)'/", "\$sys_dbname='$gforge_db'", $l);
323 $l = preg_replace("/^.sys_dbuser\s*=\s*'(.*)'/", "\$sys_dbuser='$gforge_user'", $l);
327 if ($fp = fopen("$fusionforge_etc_dir/local.inc", "w")) {
328 fwrite ($fp, $config);
332 show(' * Saving installation log in /tmp/gforge-import.log');
335 function uninstall() {
336 global $PGHBA, $fusionforge_src_dir, $gforge_var_dir, $fusionforge_etc_dir, $gforge_db, $gforge_user, $tsearch2_sql;
338 show(" * Removing DATABASE \n";
339 system("su - $gforge_user -c \"dropdb $gforge_db\"", $ret );
340 show(" done . ($ret)\n";
342 show(" * Removing Language \n";
343 system("su - postgres -c \"droplang plpgsql template1\"", $ret );
344 show(" done. ($ret)\n";
346 show(" * Removing GForge DATABASE User: \n";
347 system("su - postgres -c \"dropuser $gforge_user\"", $ret );
348 show(" done.($ret)");
350 show(" * Removing GForge User: \n";
351 system("userdel $gforge_user");
354 show(" * Restoring $PGHBA file: ... ";
355 system("cp $PGHBA.gforge.backup $PGHBA");
358 show(" * Restarting PostgreSQL: ...\n";
359 system("/etc/init.d/postgresql restart");
364 function validatePassword($password) {
365 if (strlen($password)<6) {
366 return 'Password is too short. Please try again.';
368 if (!preg_match('/[[:alnum:]]*/', $password)) {
369 return 'Password contains invalid characters. Please try again.';
374 function readMasked($prompt) {
376 if (strtolower(php_uname('s')) == 'sunos') {
378 $text_entered = fgets($STDIN);
380 $options="-er -s -p";
381 $returned=popen("read $options \"".GREEN.$prompt.NORMAL."\n\"; echo \$REPLY", 'r');
382 $text_entered=fgets($returned, 100);
384 $text_entered=substr($text_entered, 0, strlen($text_entered));
388 return trim($text_entered);
392 show(NORMAL."Done.\nYou are ready to run install-gforge-3.php");
395 function show($text, $newLine = true) {
398 $hd = fopen ("/tmp/gforge-import.log", "a+");
399 fwrite($hd, "*** $text\n");
403 $text = GREEN.$text .NORMAL."\n";
405 fwrite($STDOUT, $text);
408 function run($command, $ignore = false) {
410 $hd = fopen ("/tmp/gforge-import.log", "a+");
411 fwrite($hd, "CMD ".$command."\n");
414 system($command, $ret);
423 echo RED.'An error ocurred running the last command... aborting.'.NORMAL."\n";