Son las 22:23 , y de momento parece que en unos diez minutos me puedo dormir.

ya arreglé de entregar un cachorrrito de los que quedan el viernes.

Estuve todo el dia revisando los derivados del correo furibundo de ayer, peor la furia no era hacia mi. Lo peor del caso es que el gerente de sistemas de ese cliente quiso resolver el problema ofreciendo algo que ya no está disponible para compra venta desde hace 3 años.

Estuve probando la conexión BESTEL y mas o menos se ve decente. También tengo que subir 8 gb de información a un nuevo dominio para que sea m ireceptor en l oque organizo.

Estan corriendo dos procesos. Uno de ellos esta verificando si ya quedó un arreglo que hice en las dos ultimas horas , pero por lo que veo se va a tardar otras dos horas o mas.

El otro proceso marca los puntos a revisar del anterior. Si bien me va me duermo a las dos de la mañana

—–
23:55 Agarré práctica y reprocesé los tres lotes en menos tiempo. 23:55 y ya me puedo ir a dormir… casi… mañana va a ser un dia pesadito y me toca levantarme a las 4 en lugar de a las 5.

Recibí hace una hora un correo de un director general enojadisimo porque su gente de sistemas no hace el trabajo y esperan ahora que yo lo resuelva. Esto no es una situación de responsabilidad de pensar. Es un problema de responsabilidad de actuar. Ya comentew que hay que poner algo para bloquear la nevegacion del corporativo y lo puse en febrero. Ya dije tambien que hay que checar el antoi spyware y anti malware desde hace varios meses, se repitió hace unos dias .

Sin esos pasos previos no puede hacerse nada y si mueven el servicio de uno de mis servidores, la que se les va a armar. Básicamente ese servicio lo tengo yo desde jace unos dos años, y el precio que doy es la séptima parte en servidores mejores que la competencia. El problema no es el servidor. El problema son sus enlaces de internet, su gente de soporte y su falta de aplicación de las políticas en los dos lugares donde yo casi no voy.

En fin…

Estoy acabando al mismo tiempo de formatear seis usb usados en la semana. Esta semana programé unas 80 horas pero lo de ruby ya quedó (capistrano, claro !!), y tambipen ya quedo el primer modo alterno del proveedor web que acabo de reemplazar esta semana. En el peor de los casos a lo largo de un año sería una pérdida de 15 a 20 mil pesos(mi costo menos su pago inicial) pero tiene el potencial de no solo resolverles el problema sin crear otro problema, sino que puede dar una ganancia de unos 30 mil libres en todo el año. Debo verificar que hacer.

En este momento escribo en una computadora HP bastante poderosa, i7 16 gb de ram 23 pulgadas monitor con windows 7 , que estaba usando mi esposa pero la pc ya me esta dando problemas. Es el sistema operativo original, windows 7 home premium que tiene desde que las compré en a mediados del 2012 mas o menos. No se si me conviene instalarle otra vez desde cero, pero trataré mejor primero con windows 10 que para lo que uso esta maquina no estaría mal. El link de los isos de windows 10 es este : https://www.microsoft.com/en-us/software-download/windows10ISO

Estoy en México. Escribo este texto en un CMS, capturando al mismo tiempo que pienso. Es un software creado por mí, y voy a copiar y pegar el resultado en mi blog porque de momento me falta trabajar más en el CMS. Importa el contenido y no la forma. Mi Nombre es Alfonso Orozco Aguilar, nací en 1972 y desde que tengo memoria notaba consecuencias obvias de las acciones de terceros. Por lo general, la mayor parte de mis acciones eran para conseguir un resultado. Si no había razón para buscar algo, lo mejor era sentarse y leer. Y si no había que leer, lo mejor era sentarse y pensar.

Pertenecí a equipos de ajedrez en primaria y secundaria. Dejé de participar en torneos cuando en el año 1983 , después de quedar segundo en el torneo muncipal de secundarias del que salían tres personas para el estatal, no me mandaron a la estatal. Mandaron al clasificado 14. La explicación que dieron era que se necesitaba una edad que los primeros en ranking no teníamos, y que el 14 si.

Supongo que no fui el único que pensé que nos habían hecho perder el tiempo a todos los demás. Además, aunque era inexperto en los modos del mundo, era evidente que las jugadas verdaderas, del mundo real, eran mas simples. No es necesario pensar SIEMPRE mas allá de tres jugadas por lo general, ya que de todas formas vas dos jugadas adelante de los que no piensan. Y los modos del mundo me han mostrado que la mayor parte de la gente es predecible, y que si revisas a cinco jugadas tienes un 90% o más probabilidades de tener razón. Solo necesitas seguir un razonamiento sólido, usar premisas verificadas, y por lo general mejoras con la práctica.

Era evidente también que el ajedrez no era un juego para todos. Hay personas que con trabajos saben en que dia viven. Las reglas del ajedrez son simples, pero es un reto que lo hace dejar de ser juego. Un juego es una actividad que nos da un resultado agradable para el mundo real, y donde hay cierto grado de dificultad. Pero para algunos, no era pensar un problema sino obsesionarse. Pensar en lo mismo sin necesidad.

Aunque pensar siempre ha sido una herramienta, empezó siendo un juego. Tratar de preveer y obtener un resultado en el mundo real. Carlos Castaneda llamaba a una forma simplificada de pensar, acecho. Solo que Castaneda huía de la parte mas importante de pensar. La RESPONSABILIDAD DE PENSAR

Algunas cosas son divertidas y dan información útil pero no son pensar. Por ejemplo, en la época del ajedrez leía El Prisionero de Zenda, Beau Geste, El hijo del León de Damasco. Y cosas menos tradicionales como Estados alterados, de Chayefsky. Nada que ver con la película. Mi padre era cantante de ópera, así que las idas al cine no eran a lo tradicional. Podía ser ir a ver un ciclo de cine al Bella Época, o un ciclo de Películas de ópera a Casa Wagner. O ver a mi papá cantando papeles centrales como Calaf, Radamés, Cavaradossi, Pinkerton en Bellas Artes.

Moralmente hablando, ciertos libros obligaban a pensar. Leer Principe de la Ciudad, de Robert Daley era menos entretenido que leer Miguel Strogoff, por ejemplo. Pero era evidente, también, que leer Miguel Strogoff no servía de nada práctico a menos que estuvieras a punto de quedarte ciego por un cuchillo al rojo vivo, o como enfrentrarte con un Oso con solo un cuchillo. Además era poco probable que Julio Verne hubiera matado a un oso usando un cuchillo así que era probable que fuera conocimiento de segunda mano.

Después de enfrentarme a diversos parteaguas en mi vida, allá por los diecisiete, dedicaba mi tiempo a hacer levantamiento de pesas, oír clases, leer, y tratar de entender porqué la mayor parte de los que encontraba en mi vida cotidiana tenían problemas en entender ‘La Marca’ de Demíán de Hessee. Mucho menos podían entender preocuparte de lo que comías, de lo que oías, de lo que pensabas.

No me quedaban dudas que si no enfocabas adecuadamente tu atención, no podías pensar, menos ser, y si no podías pensar y no eras, no tenías las mas mínimas ganas de HACER. Tuve la fortuna de estudiar lógica simbólica antes de los 20 y eran premisas normales que abrían el futuro. Enseñaban a pensar y enfocar tu atención.

Empecé a escribir materiales diversos sobre Nagualismo y sobre tradiciones mesoamericanas desde 1995. Conocí en los 80s a dos grandes hombres que me explicaron una nueva forma de ver el mundo, y sobre todo, que al ver el mundo y no dejarte dominar por el, podías enfrentarte a los modos del mundo y desatar un cambio.

En diversos momentos de mi vida, quise escribir un sitio sobre lo que parecen ser conclusiones obvias, esas jugadas a corto plazo de información innecesaria pero útil a veces, era necesario. Hace unas semanas, viajando entre la ciudad de México y la ciudad donde murió mi madre , después de crear la cuarta empresa ante Hacienda a largo plazo desde 2009, me di cuenta que era el momento.

El problema fueron los nombres. Pensé dos o tres nombres de dominios. Tengo mas de 800 dominios propios. Pensé uno que podía ser, pero estaba ocupado y querían dos mil dolares a pesar que no valía ni 15. Pero el nombre es lo de menos. Lo que importaba era la RESPONSABILIDAD DE PENSAR. Una responsabilidad autoaceptada sin siquiera dudarlo.

Sin embargo, aunque encontré algunas alternativas, me resulktaba obvio que era mejor hacerlo en el sitio de mi nombre. Los dos temas que mas tenía presente par empezar era el porqué de la palabra de acceso de El pendulo de FOucault, o las razones que hay atrás , en términos de lógica simbólica, a que enfocando mi atención, desde mi juventud puedo resolver problemas medianamente complejos en menos de un minuto, aunque suele pasar que me tarde un poco más en ejecutar el proceso que pensé o en desplazarme al lugar necesario para resolver el problema.

A final de cuentas decidí enfocarme en el asunto del ajedrez y dejar para otro día la palabra der acceso.

En 1992 empecé a programar en Turbo Pascal y lenguaje C. Era obligatorio pensar, y a veces ver planeación estratégica. Encontré desde años anteriores que era mejor funcionar en silencio, cerrar ciclos y al que no le guste que use el cerebro, quitarlo del entorno inmediato. El ser humano tiene el cerebro como herramienta principal, decidir no usar tus herramientas es autodestructivo. Años de cumplir con la RESPONSABILIDAD DE PENSAR me llevaron a poder ‘ser’ en otras circunstancias. Al tener mas experiencia era posible HACER mas cosas. Por lo mismo, Pensar ser y Hacer eran y son una responsabilidad y una herramienta invaluable en el mundo real.

Al entenderlo era mejor considerar estas premisas en el mundo real:

* Lo simple tiene valor de supervivencia. Salvo casos extremos lo mas simple sobrevive mejor.
* Si quieres ganar más o ser promovido, debes HACER mas de lo que exige tu trabajo.
* La libertad es solo de tu mente. Si consigues que te paguen por pensar, te pagan por ser humano.
* Y como dijo un amigo, puedes tener razones o resultados. Trata de tener las dos.

Con este mensaje empiezo una nueva serie con la etiqueta Pensar. Ser. Hacer. La premisa de esta serie, es mostrar ideas, y obligarme a estructurar responsabilidades primarias, que son base para lo demás.

Pensar. Ser. Hacer.

Ayer llevé a lo cachorritos al veterninario a desparasitar; ya se quedó a sus dos cachorros que había elegido. En principio son chicos para entregarlos, pero como estan comiendo no parecen cachorros de cinco semanas.

En este momento tengo tres: Uno se lo queda una persona del antiguo cliente principal y le puso Loki. Ese cachorrito es el mas chico de todos, pesa 1.150 kilos, la perrita que queda es la mole, de 1.600 kilos, y al otro jaspeado lo estamos llamando Thor para diferenciarlo de Loki y creo que se lo quedan la ayudante de la veterinaria donde le hicieron las placas a la mamá. Tenemos que echarnos una vuelta a ver si todavia lo va aquerer. Ese pesa 1.590 kilos.

Dice el veterinario que solo Loki de los cinco parece de un mes.

Los otros ya estan del otro lado. Solo he visto el caracter de la mole nteriormente en una maltés, pero se ve ue es buen animalito.

MI idea era hacer la prueba de caracter el 6 de octubre, así que creo que los entrego el 10. Quizá aporvecho y entrego a Loki el 6 de octubre después de comprobar el caracter que tiene.

4 .15 am

ya quiero que sea viernes.

Podría hacer una list de pendiente pero en realidad son dos.

1 ) Programnar las ultimas 200 lineas de codigo para lo de 2 proveedores
2 ) El martes despues de ver a los clientes del centro histórico quedarme de guardia en mi casa revisando si hay algun problema con la liberación de el módulo a trves de mi como proveedor.

Lo demás es lo de menos.

Hoy tuve que despedir a un DevOps.

¿Porqué TRATAN de pasarse de listos?

Básicamente me pusieron como pretexto que estaba pasando un problema con Linux y servidores que configuré hace unos cuatro meses y en los que yo entro perfectamente desde hace varios meses. LO verifiqué y era mentira. Todo por justificar un problema de deployment de un gem ruby.

Lo malo es que perdí unas siete horas reales para demostrarlo. Necesitaba una pc con Linux no emulado para tener acceso a un entorno de Eclispse , y hacer algo con wireshark.

Por casualidad y otras razones, me traje el viernes de la oficina del cliente a mi casa la computadora Brix. Uno de los pasos previos fue instalar en un USB de 4 gb un Live CD de la versión 17.2 Cinnamon de 64 bits de Linux Mint, que tiene muy buen soporte de hardware raro y que se supone que si jala la Brix. Solo que, como necesitaba hardware no emulado, era necesario borrar todo e instalarle desde el USB. Varios problemas.

Tuve que configurar la Pc para que arrancara el disco SATA en modo IDE. Instalar como tres veces. Luego bajar wireshark. Firefox. Etc.

Luego ir a la oficina donde se supone estaban justificando los tiempos extras de domingo, porque capistrano, una herramienta práctica para deployment no estaba funcionando o estaba mal automatizado.

LLego junto con el socio de esa empresa, a la zona de Polanco.

A ver, muestrame que problema tienes con Docker y con Capistrano.

Es que …

Se supone que llevas con eso una semana. Conozco lo suficiente para saber que no estas usando control de versiones y que lo que me describes es Vagrant y no capistrano.

(Explicacion larga del DEVOPS que se resume a las direcciones ip no checan, el .gem esta mal y se esta mandando lo mismo y no la actual).

Me doy cuenta que a pesar que la gem está preparada para distribuirse con Capistrano y en su caso pasarse a un contenedor Docker (a los que detesto por varias razones, entre ellas que tiene derecho de root interno y externo asi como los problemas de conflictos de ip si n o es la misma en el docker que en el desarrollo), el esta usando rubygems.org o algo que se le parece.

Es que no se puede con capistrano !!!, dice.

Le pregunto enfrente de las otras dos personas, al socio que esta terco en agarrar cosas de Ruby en lugar de .net o .php …. que hacemos ?

– Que sugieres ?

– Les parece bien que si puedo hacer yo deployment de la versión de hace ocho dias por Capistrano, revisemos que esta pasando ?

– Si , pero necesitarías una computadora.

Saco de la bolsa del super una caja pequeña, le digo al programnador no docker que quite el teclado y raton de la pc del problema, mientras yo desconecto un monitor.

Conecto la Brix., Selecciono correo, slecciono lugar. Abro el SSH. Cambio una linea para que sea

require ‘bundler/capistrano’

Problema demostrado. Instalo el gem de hace ocho dias, y claro que se soluciona el problema.

Voy entonces a la maquina a la que le quitamos el teclado y veo que ni suqiera estan haciendo el deployment en el docker correcto. Así que aunque cedí en el uso de docker (cosa que fue un error ya que aunque es una forma rápida y mas o menos directa de hacer deployment en Ruby tiene detalles que complican su uso ), todo el probelma fue porque alguien actualizaba en base a su vagrant y no al deploymento que yo mandaba por Capistrano.

Resultado: Doce mil pesos tirados a la basura. Lo bueno es que no lo contraté yo, que el tipo no tenía siquiera un mes, y verificar que Capistrano, al ser herramienta de ruby, es mas estable que la via de Docker / Vagrant.

La razón de correrlo NO fue desobedecer ordenes, se supone que el era mas experto que yo en Ruby. Lo tuvimos que correr porque el menso no se dió cuenta que estaba haciendo deployment de algo de su computadora y no lo que yo le mandé. Así que no se dio cuenta de la versión y tampoco estaba usando el GIT. Nos hizo perder dos semanas, y las pruebas las hacía en su docker, no en el del cliente, que pudo haber sido en un principio un sitio web. Supongo que tendremos que hablar de nuevo con el gerente de sistemas del cliente para verificar que quiere docker y no sitio web. Probablemente no está consciente de la necesidad de root, o lo marearon con las ventajas de docker.

Pero a final de cuentas es mejor para todos hacer deployment a traves de una maquina virtual , un sitio web y el camino antiguo de Ruby on Rails, que meterse con docker.

Cuando descubro que esta haciendo deployment por Vagrant y no por capistrano, me pregunto porqué alguien que no programa en Ruby (mi socio) contrata a programadores Ruby sin pasarlos primero para visto bueno.

Y perdí muchas horas. Alcancé a activar en el proyecto del martes la interfaz para proveedores y programar una de las dos, pero no terminé la segunda.

Son las once de la noche, mañana que regrese de mi viaje, tengo además que llevar los cachorros al veterinario.

Dejaré bajando Rosa, la versión 17.3 de Mint y hora de acostarse. El miércoles tendré que dejar esta lnux para trabajar, pero por lo menos geany y bluefish ya funcionan.

Y vamos de vuelta.

Lo primero que hay que hacer hoy es revisar punto por punto que se quiere hacer,

Considerando que mañana estoy todo el santo día fuera de la ciudad, creo que la proridad es preparar una interfaz para cambiar al vuelo lo que hace el sistema en cuestion de dos proveedores. Se supone que la diferencia es que en vez de salir SOLAMENTE por el proveedor actual, debería tener un switch para que sin programar pueda cambiar el destino de lo que está haciendo; la primera opción no lo es. Simplemente se trata de crear un parametro en la tabla de datos que detecte porqué proveedor salir.

En cuanto a programar por el nuevo proveedor, se supone que son unas 100 a 200 lineas de código por proveedor, en procesos que se llaman por un rénglon solitario en un solo archivo.

No va a ser un dia agradable.

Sacaré a pasar a los perros y a darle.

Es poco mas de la una de la mañana de domingo.

Programé casi 14 horas seguidas. Una hora y media mas o menos para la parte inicial de los tres correos anteriores, el resto para crear un ambiente de pruebas para mi trabajo de mañana. Pero ya esta migrado y probado un sistema de 85 pantallas , LEGACY, en otro server.

Nada mal.

Esto nos implica dos necesidades primordiales :

1 ) modificar installer
2 ) Crear funciones en el servidor original

EL codigo es simple pero por cuestiones tecnicas no conviene ponerlo en un gist. Lo pongo como php html entities encode, aunque hay varios htmlentities en linea, sugiero este :
https://mothereff.in/html-entities

Por cierto, por necesidades Tecnicas se recomienda no usar campos (bit) en mysql sino int . EN exportaciones de contenido se pueden crerar muchos problemas. Debe quedar claro que el código que sigue es borrador pero funcional.

Por simplicidad voy a codificar en el servidor AUTORIDAD a donde debe enviar por ftp. Hay borrador de como pasar el dato del server de cada instalación.

Installer.php en el server deseado, ojo que viene como htmlentities


<?php nocache(); echo "Installer v 0.001"; crearconfig(); require "configmysql.php"; // datos de conexion de tu sitio define ('FTPSERVER',"ftp.desiredserver.com"); define ('FTPUSER',"user"); define ('FTP_PWD',"password"); define ('PATH',"/public_html/"); define ('MAIN_REPO','http://your-auth-domain.com/shachecker.php'); echo "<h3>Checking versions of the files</h3>"; bringfile("php.ini"); bringfile("robots.txt"); bringfile("favicon.ico"); bringfile("index.php"); // you need create first the images directory bringfile("images/information_ico.png"); // you need create includes directory first bringfile("includes/javafile.js"); //bringfile(".htaccess"); // NOT UPDATE .htaccess, can create MANY problems echo "<h3>Checking data struct of the tables</h3>"; bringtable("USERS"); bringtable("OTHER_TABLE"); echo "<h3>Update is done, try to run it <a href='index.php' target='_blank'>index.php</a></h3>"; function bringfile($filename){ if (file_exists($filename)==1) $mysha=sha1_file($filename); $base64=base64_encode($filename); $theurl=MAIN_REPO ."/shachecker.php?filename=$base64"; $result=curl_download($theurl); $ex=explode("|",$result); if (sizeof($ex)<>3) die ("<li><font color='red'>$result <hr>Not valid response of $theurl, check the filename</font>"); $othersha=$ex[1]; //echo "<li>tamaño de ".sizeof($ex); //echo "<li>$result<li>$othersha"; if ($othersha==$mysha) echo "<li><font color='green'>$filename is in current version</font>"; if ($othersha<>$mysha) { echo "<li><font color='red'>$filename is not in current version</font>"; askforfile($filename); } //if ($mysha<>$othersha) } // bringfile function noCache() { header("Expires: Tue, 01 Jul 2001 06:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); } function curl_download($url){ $ch = curl_init(); $timeout = 5; curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); //curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch) or die ("error in curl $url"); curl_close($ch); return $data; } function askforfile($filename){ $ftpdata="&to=".base64_encode(FTPSERVER."|".FTPUSER."|".FTP_PWD."|".PATH); $theurl=MAIN_REPO ."/shachecker.php?filename=".base64_encode($filename)."&please=send$ftpdata"; //die("<li>$theurl"); $result=curl_download($theurl); die ("<li><h2>response: $result</h2><hr>Continue with f5 if not resume itself <META http-equiv='refresh' content='0;URL=installer.php'>"); } // askforfile function asktable($tablename) { $theurl=MAIN_REPO ."/shachecker.php?tablename=".base64_encode($tablename); //die("<li>$theurl"); $result=curl_download($theurl); $result64=base64_decode($result); $allok='N'; if (left($result64,2)=='||' and right($result64,2)=="||" ) $allok='Y'; if ($allok=='N') die ("Error in table struct<hr>$result"); $sql=str_replace("||","",$result64); mysql_query($sql) or die ("Error creating table $tablename :<hr>".mysql_error()); die ("<li>Table $tablename created ... continue with f5 if not resume itself in 3 seconds < META http-equiv='refresh' content='0;URL=installer.php'>"); } // ask table function crearconfig(){ if (file_exists("configmysql.php")==1) return ; $content="<?php Define ('Z_IPSERVIDOR','localhost'); Define ('Z_USUARIODB',''); Define ('Z_PASSDB',''); Define ('Z_NOMBREBASE',''); ?" .">"; file_put_contents('configmysql.php',$content); echo "<li><font color='blue'>Config created</font>"; } // crear config function checktable($tablename){ $pass="N"; mysql_connect(Z_IPSERVIDOR,Z_USUARIODB,Z_PASSDB) or die ('Cant connect : ' . mysql_error()); mysql_select_db(Z_NOMBREBASE) or die ('Cant use database : ' . mysql_error()); $result=mysql_query("SHOW TABLES LIKE '$tablename'"); $numtables = mysql_num_rows($result); if ($numtables>0) $pass ="Y"; return $pass; } // checktable function bringtable($tablename){ $result=checktable($tablename); if ($result=='Y') { echo "<li><font color='green'>$tablename already exist</font>"; return; } if ($result<>'Y') { // no existe return asktable($tablename); } // result <>' y' } // bringtable function left($str, $length) { return substr($str, 0, $length); } function right($str, $length) { return substr($str, -$length); } ?>

shachecker.php en el server AUTORIDAD , ojo que viene como htmlentities


<?php $filename=base64_decode($_GET['filename']); if ($_GET['please']=='send') deliverfile($filename); $pass="file not exist|$filename"; if (file_exists($filename)==1) { $perms=fileperms($filename); $pass= $filename."|".sha1_file($filename)."|$perms"; } die ($pass); } IF ($_GET['tablename']){ $tablename=base64_decode($_GET['tablename']); //conectar(); include "configmysql.php"; mysql_connect(Z_IPSERVIDOR,Z_USUARIODB,Z_PASSDB) or die ('Cant connect : ' . mysql_error()); mysql_select_db(Z_NOMBREBASE) or die ('Cant use database : ' . mysql_error()); list($dummy,$data) = avalues3192("show create table $tablename"); $data="||$data||"; // || for not tamper $pass=base64_encode($data); die ($pass); } function deliverfile($filename){ $ftp_server="ftp.example.com"; // your domain DESIRED //$ftp_server="93.184.216.34"; // sometimes is better put the ip directly $ftp_user_name="your user"; $ftp_user_pass="your pass"; // a safe password $source=$filename; $target="public_html/$filename"; $conn_id = ftp_connect($ftp_server); // set up a connection to ftp server // login with username and password $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // check connection and login result if ((!$conn_id) || (!$login_result)) { echo "<li>FTP connection has encountered an error! <br />Attempted to connect to $ftp_server for user $ftp_user_name...."; exit; } else { echo "<li>Connected to $ftp_server, for user $ftp_user_name"."....."; // upload the file to the path specified $upload = ftp_put($conn_id, $target, $source, FTP_BINARY); // check the upload status if (!$upload) { echo "<li>FTP upload has encountered an error!"; } else { echo "<li>Uploaded file with name $target to $ftp_server "; } } // close the FTP connection ftp_close($conn_id); die(); } // subir archivo por ftp function aValues3192($Qx){ $rsX = mysql_query($Qx) or SQL_ERROR("Avalues 3192",$Qx); $aDataX = array(); $Campos = mysql_num_fields($rsX); while ($regX = mysql_fetch_array($rsX, MYSQL_ASSOC)) { for($iX=0; $iX<$Campos; $iX++){ $aDataX[] = $regX[ mysql_field_name($rsX,$iX) ]; } } return $aDataX; } ?>

En pseudo código la respuesta es para cada proyecto individual mas o menos simple.

La necesidad real de seguridad sale a travpes de archivos que se actualizarán por FTP. La versión master no debe dar sus datos de acceso a ftp enos que sea de solo lectura, por l oque se sugiere que el ftp autoridad no maneje datos de conexion pero la receptora si puede darlos de su propio sistema.

Una vez considerado eso, Solo es necesario crear un validador de clave de sha1_file o su equivalente en el server autoridad, para revisar que sean los mismos.

Paso 1 : En el server nuevo Entrar el installer.php, que es el unico archivo existente. Ese luego actualizará inclusive el index.php
Paso 2 : Verificar quye haya conexión con el server autoridad. El dato del server autoridad incluso puede leerse de twitter. En casos extremos incluso claves de ftp temporales pueden pasarse por twitter.
Paso 3 : Revisa si existe updater.php que debería tener un nombre genérico como ePGTXbw87B96KuP77.php , pero para fines prácticos lo llamaeremos udpater.php
Paso 4 : Revisa con la autoridad (server viejo) que la versión de updater.php sea la misma en ambos servidores. Si no lo es, copiar el de la autoridad por FTP
Paso 5 : Update revisa la existencia y versión de cada archivo del poryecto, así como crear directorios para todos lo que se utilicen y checar que el chmod, por lo menos de directorios, sea el mismo.
Paso 6 : Verificar la versión de MYSQL y avisar
Paso 7 : Verificar si hay conexión con la base de datos local, y si no la hay, pedir datos para configuración
Paso 8 : Crear todas las tablas de datos sin informacion pero con llaves primarias y foráneas, si las hay (preferentemente deben estar definidas en código asi como el generador de índices tipo lo que se hacía en foxpro/clipper a mediados de los 90s)
Paso 9 : Crear / validar que ls tablas tengan los mismos campos. Probablemente un numero de versión de la estructura de base de datos, NO solamente versión del manejador de base de datos.
Paso 10 : Ideal pero para etapa posterior, crear un validador de la integridad referencial.
Paso 11 : Si todo esta ok, borrar solito el installer.php y dejar una función interna que actualice bajo demanda o automático haciendo lo mismo que hacia installer.php que a su ve el nuevo archivo debe actualizarse solo al buscar / detectar nueva versión

Una vez hecho esto, la respuesta es prueba y error obligando a que exista la información básica y creando pantallas temporales de captura o metiendo el dato default a mano.

Considerando que los nombres pueden ser unicode o extraños, el código de sha debe considerar encriptado simple y no texto llano, además es mejor si se enuentra en un archivo igual con nombre raro como JRnBxzYy272YqFPA.php pero lo llamaremos de momento verificador_de_sha.php y debe tener algo similar a :

suponiendo que base64_encode de index.php es aW5kZXgucGhw,

< ? php
IF ($_GET['filename']){
$filename=base64_decode($_GET['filename']);
$pass="file not exist|$filename";
if (file_exists($filename)==1) {
  $perms=fileperms($filename);
  $pass= $filename."|".sha1_file($filename)."|$perms";
}  
DIE ($pass);
}
? > 

y lo llamaríamos como : http://example.com/verificador_de_sha.php?filename=aW5kZXgucGhw obteniendo como respuesta un :

index.php|9bd598f9e8d4f889aa18bc733c2c95b64091a6d4|33188