@ -2,18 +2,49 @@
<?php
<?php
$ename = 'DB';
$ename = 'DB';
$eport = 5432;
$confpath = '/var/www/config.php';
$confpath = '/var/www/config.php';
// check DB_NAME, which will be set automatically for a linked "db" container
$config = array();
if (!env($ename . '_PORT', '')) {
if(getenv($ename . '_TYPE') !== false) {
$config['DB_TYPE'] = getenv($ename . '_TYPE');
}
elseif(getenv($ename . '_PORT_5432_TCP_ADDR') !== false) {
// postgres container linked
$config['DB_TYPE'] = 'pgsql';
$eport = 5432;
}
elseif(getenv($ename . '_PORT_3306_TCP_ADDR') !== false) {
// mysql container linked
$config['DB_TYPE'] = 'mysql';
$eport = 3306;
}
if(!empty($eport)) {
$config['DB_HOST'] = env($ename . '_PORT_' . $eport . '_TCP_ADDR');
$config['DB_PORT'] = env($ename . '_PORT_' . $eport . '_TCP_PORT');
}
elseif(getenv($ename . '_PORT') === false) {
error('The env ' . $ename .'_PORT does not exist. Make sure to run with "--link mypostgresinstance:' . $ename . '"');
error('The env ' . $ename .'_PORT does not exist. Make sure to run with "--link mypostgresinstance:' . $ename . '"');
}
}
elseif(is_numeric(getenv($ename . '_PORT')) & & getenv($ename . '_HOST') !== false) {
// numeric DB_PORT provided; assume port number passed directly
$config['DB_HOST'] = env($ename . '_HOST');
$config['DB_PORT'] = env($ename . '_PORT');
$config = array();
if(empty($config['DB_TYPE'])) {
$config['DB_TYPE'] = 'pgsql';
switch($config['DB_PORT']) {
$config['DB_HOST'] = env($ename . '_PORT_' . $eport . '_TCP_ADDR');
case 3306:
$config['DB_PORT'] = env($ename . '_PORT_' . $eport . '_TCP_PORT');
$config['DB_TYPE'] = 'mysql';
break;
case 5432:
$config['DB_TYPE'] = 'pgsql';
break;
default:
error('Database on non-standard port '.$config['DB_PORT'].' and env ' . $ename .'_TYPE not present');
}
}
}
// database credentials for this instance
// database credentials for this instance
// database name (DB_NAME) can be supplied or detaults to "ttrss"
// database name (DB_NAME) can be supplied or detaults to "ttrss"
@ -36,8 +67,16 @@ if (!dbcheck($config)) {
$super['DB_PASS'] = env($ename . '_ENV_PASS', $super['DB_USER']);
$super['DB_PASS'] = env($ename . '_ENV_PASS', $super['DB_USER']);
$pdo = dbconnect($super);
$pdo = dbconnect($super);
$pdo->exec('CREATE ROLE ' . ($config['DB_USER']) . ' WITH LOGIN PASSWORD ' . $pdo->quote($config['DB_PASS']));
$pdo->exec('CREATE DATABASE ' . ($config['DB_NAME']) . ' WITH OWNER ' . ($config['DB_USER']));
if($super['DB_TYPE'] == 'mysql') {
$pdo->exec('CREATE DATABASE ' . ($config['DB_NAME']));
$pdo->exec('GRANT ALL PRIVILEGES ON ' . ($config['DB_NAME']) . '.* TO ' . $pdo->quote($config['DB_USER']) . '@"%" IDENTIFIED BY ' . $pdo->quote($config['DB_PASS']));
}
else {
$pdo->exec('CREATE ROLE ' . ($config['DB_USER']) . ' WITH LOGIN PASSWORD ' . $pdo->quote($config['DB_PASS']));
$pdo->exec('CREATE DATABASE ' . ($config['DB_NAME']) . ' WITH OWNER ' . ($config['DB_USER']));
}
unset($pdo);
unset($pdo);
if (dbcheck($config)) {
if (dbcheck($config)) {
@ -89,14 +128,14 @@ function error($text)
function dbconnect($config)
function dbconnect($config)
{
{
$map = array('host' => 'HOST', 'port' => 'PORT', 'dbname' => 'NAME', 'user' => 'USER', 'password' => 'PASS' );
$map = array('host' => 'HOST', 'port' => 'PORT', 'dbname' => 'NAME');
$dsn = $config['DB_TYPE'] . ':';
$dsn = $config['DB_TYPE'] . ':';
foreach ($map as $d => $h) {
foreach ($map as $d => $h) {
if (isset($config['DB_' . $h])) {
if (isset($config['DB_' . $h])) {
$dsn .= $d . '=' . $config['DB_' . $h] . ';';
$dsn .= $d . '=' . $config['DB_' . $h] . ';';
}
}
}
}
$pdo = new \PDO($dsn);
$pdo = new \PDO($dsn, $config['DB_USER'], $config['DB_PASS'] );
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
return $pdo;
}
}