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.

 Archivo de configuració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.

    • desenv -> dev
    • homol -> pre
    • www -> pro

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();

 Acceso a base de datos.

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,
 
 ),
 ),
);
 

 Herramientas de Debug e Informe de errores

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.

 Variables de entorno en los parámetros de la aplicación.

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,
 ),
));
 

 Puesta en marcha.

El último punto es remplazar el proceso de identificación del ambiente de ejecución utilizando el subdominio por la constante WS_URI.

 Probar el servicio de Login.

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!