Variables de entorno
Variables de entorno en máquinas "Basecentral"
El archivo de configuración del entorno provee a las aplicaciones de basecentral la independencia del modelo basado en el subdominio para identificar el entorno de ejecución.
Esto significa una mayor libertad y restricción en las configuraciones necesarias en los ambientes de desarrollo, pruebas y producción.
Las variables se han introducido al archivo de configuración utilizado para almacenar las configuraciones de acceso a base de datos.
Por ejemplo: mx_sinbdc_db.php
$AWS_REGION = "us-east-1";
$ENVIRONMENT = "dev";
$DB_HOST = "mysql-v55.dev.unoi-sc.sndinf.internal";
$DB_HOST_SLAVE = "mysql-v55.dev.unoi-sc.sndinf.internal";
$DB_PORT = "3306";
$DB_DRIVER = "pdo_mysql";
$DB_SCHEMA = "uno";
$DB_USER = "fidel_consucorp";
$DB_USER_SLAVE = "fidel_consucorp";
$DB_PASSWORD = "xxxxxxx";
$DB_PASSWORD_SLAVE = "xxxxxxx";
$AWS_ACCESS_KEY = "AKIAJSH7QNKJM2MWHEBQ";
$AWS_SECRET_KEY = "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";
$WS_URI = "http://desenv.sistemauno.com/ws/";
$AWS_BUCKET = 'prestatic-apps.uno-internacional.com';
$mySqlHost = "mysql-v55.dev.unoi-sc.sndinf.internal";
$mySqlDb = "uno";
$mySqlUser = "fidel_consucorp";
$mySqlPassword = "xxxxxxx";
La variable ENVIRONMENT puede contener los siguientes valores.
El mejor punto para incluir estas variables dentro de la aplicación es declararlas como constantes en el archivo index.php
// index.php
// set error reporting
ini_set('display_errors', 1);
error_reporting(E_ALL);
// change the following paths if necessary
define('BASECENTRAL', '/basecentral/apache/web/');
define('COMPARTIDO', BASECENTRAL . 'aplicacion/compartido/');
$yii= COMPARTIDO . 'yii-1.1.10/framework/yii.php';
require_once '/basecentral/apache/conf/br_devmonitor_db.php';
defined('AWS_REGION') or define('AWS_REGION', $AWS_REGION);
defined('ENVIRONMENT') or define('ENVIRONMENT', $ENVIRONMENT);
defined('DB_HOST') or define('DB_HOST', $DB_HOST);
defined('DB_HOST_SLAVE') or define('DB_HOST_SLAVE', $DB_HOST_SLAVE);
defined('DB_PORT') or define('DB_PORT', $DB_PORT);
defined('DB_DRIVER') or define('DB_DRIVER', $DB_DRIVER);
defined('DB_SCHEMA') or define('DB_SCHEMA', $DB_SCHEMA);
defined('DB_USER') or define('DB_USER', $DB_USER);
defined('DB_USER_SLAVE') or define('DB_USER_SLAVE', $DB_USER_SLAVE);
defined('DB_PASSWORD') or define('DB_PASSWORD', $DB_PASSWORD);
defined('DB_PASSWORD_SLAVE') or define('DB_PASSWORD_SLAVE', $DB_PASSWORD_SLAVE);
defined('AWS_ACCESS_KEY') or define('AWS_ACCESS_KEY', $AWS_ACCESS_KEY);
defined('AWS_SECRET_KEY') or define('AWS_SECRET_KEY', $AWS_SECRET_KEY);
defined('WS_URI') or define('WS_URI', $WS_URI);
defined('AWS_BUCKET') or define('AWS_BUCKET', $AWS_BUCKET);
$config=dirname(__FILE__).'/protected/config/main.php';
if(ENVIRONMENT == 'dev' || ENVIRONMENT == 'pre'){
// remove the following lines when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);
// specify how many levels of call stack should be shown in each log message
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
}else{
// No mostrar trace o detalle de errores en producción
ini_set('display_errors', 0);
}
require_once($yii);
Yii::createWebApplication($config)->run();
La "nueva versión" del archivo de configuración incluye ahora información del ambiente de ejecución y los parámetros para acceder a la base de datos Master y Slave.
// protected/config/db.php
// Ejemplo de configuración de base de datos
if(ENVIRONMENT == 'dev'){
// para realizar el trace en debug_toolbar
$yii_emulate_prepare = true;
$yii_enable_profiling = true;
$yii_enable_param_logging = true;
$schemaCachingDuration = 0;
}else{
$yii_emulate_prepare = false;
$yii_enable_profiling = false;
$yii_enable_param_logging = false;
$schemaCachingDuration = 3600;
}
return array(
'components'=>array(
'db'=>array(
'connectionString' => "mysql:host=" . DB_HOST . ";dbname=" . DB_SCHEMA,
'username' => DB_USER,
'password' => DB_PASSWORD,
'charset' => 'utf8',
'emulatePrepare' => $yii_emulate_prepare,
'enableProfiling'=>$yii_enable_profiling,
'enableParamLogging'=>$yii_enable_param_logging,
'schemaCachingDuration' => $schemaCachingDuration,
),
'dbSlave'=>array(
'connectionString' => "mysql:host=" . DB_HOST . ";dbname=" . DB_SCHEMA,
'username' => DB_USER_SLAVE,
'password' => DB_PASSWORD_SLAVE,
'charset' => 'utf8',
'emulatePrepare' => $yii_emulate_prepare,
'enableProfiling'=>$yii_enable_profiling,
'enableParamLogging'=>$yii_enable_param_logging,
'schemaCachingDuration' => $schemaCachingDuration,
),
),
);
En el archivo index.php se ha definido ya si se informan o no los errores de php al usuario (display_errors) y el nivel del trace del framework. Sin embargo, la extensión debug_toolbar provee información valiosa para el desarrollador.
// protected/config/debug_toolbar.php
return (ENVIRONMENT == 'dev')? array(
'modules'=> array(
// uncomment the following to enable the Gii tool
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'contrato',
// If removed, Gii defaults to localhost only. Edit carefully to taste.
'ipFilters' => array('127.0.0.1','10.10.*'),
),
),
'components'=>array(
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
// 'web'=>array(
// 'class'=>'CWebLogRoute',
// 'levels'=>'trace, info, error, warning',
// 'categories'=>'system.db.*',
// 'showInFireBug'=>true, //true/falsefirebug only - turn off otherwise
// 'ignoreAjaxInFireBug'=>false
// ),
array(
'class'=>'CFileLogRoute',
'enabled'=>true,
'filter'=>array(
'class'=>'CLogFilter',
'prefixSession'=>true,
'prefixUser'=>true,
'logUser'=>true,
),
'levels'=>'error, trace, info',
'logPath'=>dirname(dirname(__FILE__)).'/logs/',
'logFile'=>'yii_log',
'maxFileSize'=>2048,
'maxLogFiles'=>10
),
array(
'class'=>'compartido.extensions.yii-debug-toolbar.YiiDebugToolbarRoute',
'ipFilters'=>array('127.0.0.1','10.10.*'),
'levels'=>'error, trace, info',
)
),
),
),
) : array('components'=>array(
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'enabled'=>true,
'filter'=>array(
'class'=>'CLogFilter',
'prefixSession'=>true,
'prefixUser'=>true,
'logUser'=>true,
),
'levels'=>'error, trace, info',
'logPath'=>dirname(dirname(__FILE__)).'/logs/',
'logFile'=>'yii_log',
'maxFileSize'=>2048,
'maxLogFiles'=>10
),
),
),
),
);
En el ejemplo anterior se ha incluido en la configuración la herramienta extensión debug_toolbar y el módulo Gii que deben ser solo accesibles en los ambientes de desarrollo.
Finalmente las variables serán incluidas en el archivo main.php y formarán parte de la aplicación.
// protected/config/main.php
return CMap::mergeArray(
require_once dirname(__FILE__).'/debug_toolbar.php',
require_once dirname(__FILE__).'/db.php',
array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'Monitor',
'defaultController' => 'Site',
// preloading 'log' component
'preload'=>array('log'),
// using Yii::app()->params['paramName']
'params'=>array(
'urlService' => WS_URI,
'ambiente' => ENVIRONMENT,
),
));
El último punto es remplazar el proceso de identificación del ambiente de ejecución utilizando el subdominio por la constante WS_URI.
La primera prueba es remplazar el uso del subdominio para identificar la url del WebService de login a utilizar.
// compartido/components/LoginWsjx
class LoginWsjx extends CUserIdentity
{
protected $_allowed;
public $urlService;
/**
* Prepara el servicio para consultar uno_wsj_login
*
* @author Fidel Aquino <fidel.aquino@consucorp.com.mx>
* @copyright 2014-01-25
* @access private
* @return boolean
*/
protected function _prepare()
{
if(!$this->urlService){
$urlService = '';
if (isset($_SERVER['HTTP_X_FORWARDED_HOST']) && $_SERVER['HTTP_X_FORWARDED_HOST'] != '') {
$serverName = $_SERVER['HTTP_X_FORWARDED_HOST'];
} elseif ($_SERVER['HTTP_HOST'] != '') {
$serverName = $_SERVER['HTTP_HOST'];
}
if (preg_match('/desenv./', $serverName)) {
$urlService = 'http://desenv.sistemauno.com/ws/';
} elseif (preg_match('/homol./', $serverName)) {
$urlService = 'https://homol.sistemauno.com/ws/';
} else {
$urlService = 'https://www.sistemauno.com/source/ws/';
}
$this->urlService = $urlService;
}
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] != '') {
$this->_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif ($_SERVER['REMOTE_ADDR'] != '') {
$this->_ip = $_SERVER['REMOTE_ADDR'];
} else {
$this->_ip = CHttpRequest::getUserHostAddress();
}
$_ips = explode(',', $this->_ip);
if (sizeof($_ips) > 1) {
$this->_ip = $_ips[0];
}
return true;
}
El componente LoginWsjx ahora puede recibir la url a la que debe consultar el servicio de login, la identificación del ambiente se mantiene por compatibilidad.
Para indicar la url al componente es necesario incluir esta propiedad en la clase LoginForm.
// protected/models/LoginForm.php
class LoginForm extends CFormModel
{
public $username;
public $password;
public $rememberMe;
public $urlService;
public function authenticate($attribute,$params)
{
if (!$this->hasErrors()) {
$this->_identity=new LoginWsjx($this->username, $this->password);
// indicar la url a LoginWsjx
$this->_identity->urlService = $this->urlService;
if (!$this->_identity->authenticate()) {
if ($this->_identity->errorCode == LoginWsjx::ERROR_NOT_ALLOWED) {
$this->addError('password', Traductor::t('No cuenta con los permisos para acceder a la aplicación'));
} else {
$this->addError('password', Traductor::t('El usuario o la contraseña son incorrectos'));
}
}
}
}
public function login()
{
if ($this->_identity===null) {
$this->_identity=new LoginWsjx($this->username, $this->password);
// indicar la url a LoginWsjx
$this->_identity->urlService = $this->urlService;
$this->_identity->authenticate();
}
if ($this->_identity->errorCode===LoginWsjx::ERROR_NONE) {
$duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
Yii::app()->user->login($this->_identity, $duration);
return true;
} else {
return false;
}
}
Finalmente en el controllador responsable de validar el login asignar a LoginForm la url a utilizar.
// protected/controllers/SiteControoler.php
public function actionLogin()
{
if (!Yii::app()->user->isGuest) {
$this->redirect(Yii::app()->user->returnUrl);
}
$this->layout='//layouts/no_layout';
$model=new LoginForm;
$model->urlService = Yii::app()->params['urlService'];
EOF!