Author: Oriol Rius

PHP5: passant i tornant objectes com a paràmetre en una crida SOAP (Part II)

Reading time: 5 – 8 minutes

El mes de març vaig escriure un article titulat gairebé igual que aquest, en aquell article explicava com s’ho feia el PHP5 per rebre i retornar tipus complexes (p.e. objectes) com a paràmetres de crides SOAP. Doncs bé havia trobat una cosa que em tenia una mica mosca i és que quan enviava una objecte del client cap al servidor o alrevés en perdia el tipus. Doncs bé aquesta tarda he descobert com aconseguir fer això sense perdren el tipus. Ja sabeu que quan se’m posa una cosa al cap…

El tema no és senzill i el generador de WSDL del ZendStudio és una mica tiquis-miquis fent aquestes coses així doncs s’ha de fer tot molt maco perquè ho entengui el generador WSDL. De fet, la gràcia esta en definir el tipus complexe dins del fitxer WSDL, per això el generador necessita que li donem tota la informació com ell vol sinó no és capaç de generar bé el fitxer.

En l’exemple que us poso a continuació he creat la classe persona amb tres atributs dos de públics i un de privat. El privat al contrari del que comentava en l’article anterior no perd el seu valor. Així doncs, en principi tenim l’objecte 100% replicat amb el mètode que ara us explicaré.

La classe persona:

<?php
/**
 * classe persona
 *
 */
class persona {
	/**
	 * propietat nom
	 *
	 * @var string $nom
	 * @var string $cognom
	 * @var string $dni
	 */
	public $nom;
	private $cognom;
	public $dni;
	/**
	 * setter function
	 *
	 * @param string $nom
	 */
	function set($nom) {
		$this-?>nom=$nom;
	}
	/**
	 * setter cognom
	 *
	 *  @param string $cognom
	 */
	function setCognom($cognom)
	{
		$this-?>cognom=$cognom;
	}
	/**
	 * getter function
	 *
	 * @return string valor a tornar
	 */
	function get()
	{
		return $this-?>nom;
	}
	/**
	 * getter cognom
	 *
	 * @return string valor a tornar
	 */
	function getCognom()
	{
		return $this-?>cognom;
	}
}
?>

Fixeu-vos que comentem el codi segons la sintaxis del phpDoc això es fa perquè és d’aquests comentaris d’on el generador WSDL extreurà els tipus de les variables per poder-les exportar sense perdre informació. La propietat dni no té ni getter ni setter perquè hi accedirem directament. Per la resta de coses és una classe completament normal i senzilla.

El servidor és força simple:

<?php
require_once("persona.class.php");
/**
 * servidor soap
 *
 */
class soapservice {
	/**
	 * funcio soap publicada
	 *
	 * @param persona $per
	 * @return persona
	 */
	function peticion($per) {
		$per->dni="38147000x";
		return $per;
  }
}
	$server = new SoapServer("server.wsdl",array("classmap"=>array("persona"=>"persona")));
$server->setClass("soapservice");
$server->handle();
?>

Comentar que la classe soapservice rep un objecte de tipus persona afegeix un valor a la propietat dni i retorna el mateix objecte. Aquí també hem de documentar el codi segons la sintaxis del phpDoc així el model WSDL ens dirà explicitament el tipus dels objectes que rep i torna el mètode peticion.

Pel que fa a la creació de l’objecte server del tipus SoapServer fixeu-vos que mapegem amb l’opció classmap l’objecte de tipus persona que es passa com a paràmetre amb la classe local també anomenada persona. Gràcies a aquest mapeig quan rebem l’objecte per al soapservice aquest ja és del tipus persona.

Ara toca veure el codi del client, aquest codi també té un mapeig igual que el servidor de SOAP, però en aquest cas serveix per capturar la sortida del servidor i com que l’objecte que es torna a la sortida també és del tipus persona el classmap és igual que el del servidor.

<?php
require_once("persona.class.php");
// creem objecte tipus persona
$myPersona=new persona;
$myPersona->set("el_nom");
$myPersona->setCognom("el_cognom");
	$client = new SoapClient("server.wsdl",array("classmap"=>array("persona"=>"persona")));
	$localPersona=$client->peticion($myPersona);
	var_dump($client->__getFunctions());
print_r($localPersona);
echo $localPersona->getCognom();
?>

Una de les coses interssants que fem és preguntar quines funcions s’estan publicant al servidor SOAP. Aquesta informació esta descrita al WSDL i la funció __getFunctions() ens la formateja per humans. Així doncs podem veure que hi ha disponible la funció peticion que té com a paràmetre un objecte del tipus persona i que retorna un altre objecte de tipus.

array(1) {
  [0]=>
  string(30) "persona peticion(persona $per)"
}

Després mostrem (print_r) l’objecte localPersona que ens ha tornat la crida al mètode peticion ($localPersona=$client->peticion($myPersona);):

persona Object
(
    [nom] => el_nom
)

Finalment fem una prova de concepte i obtenim el valor de la propietat nom a través del getter, o sigui, echo $localPersona->getCognom();:

el_nom 

Com podeu veure ha quedat ben demostrat que és relativament senzill enviar i rebre tipus complexes a través dels serveis SOAP. Tota la gràcia esta en el fitxer WSDL, a continuació us enganxo el que m’ha generat el Zend Studio per fer aquestes proves fixeu-vos com al prinicipi de tot el primer que fa és declarar el tipus complexe de dades que ha de traspassar, en el nostre cas la classe persona.

<?xml version='1.0' encoding='UTF-8'?>
	<!-- WSDL file generated by Zend Studio. -->
	<definitions name="server" targetNamespace="urn:server" xmlns:typens="urn:server" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:typens0="http://oriol.joor.net/fotoprix/web/cu.php/soap/server">
	<types>
		<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:server">
			<xsd:complexType name="persona">
				<xsd:all>
					<xsd:element name="nom" type="xsd:string"/>
					<xsd:element name="cognom" type="xsd:string"/>
					<xsd:element name="dni" type="xsd:string"/>
				</xsd:all>
			</xsd:complexType>
		</xsd:schema>
	</types>
	<message name="peticion">
		<part name="per" type="typens:persona"/>
	</message>
	<message name="peticionResponse">
		<part name="peticionReturn" type="typens:persona"/>
	</message>
	<portType name="soapservicePortType">
		<documentation>
			servidor soap
		</documentation>
		<operation name="peticion">
			<documentation>
				provem de descriure
			</documentation>
			<input message="typens:peticion"/>
			<output message="typens:peticionResponse"/>
		</operation>
	</portType>
	<binding name="soapserviceBinding" type="typens:soapservicePortType">
		<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
		<operation name="peticion">
			<soap:operation soapAction="urn:soapserviceAction"/>
			<input>
				<soap:body namespace="urn:server" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</input>
			<output>
				<soap:body namespace="urn:server" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</output>
		</operation>
	</binding>
	<service name="serverService">
		<port name="soapservicePort" binding="typens:soapserviceBinding">
			<soap:address location="http://oriol.joor.net/soap/server.php"/>
		</port>
	</service>
</definitions>

php: SimpleXML i xml2array

Reading time: < 1 minute

Dues funcions potentissimes de PHP, sobretot ara que cada dos per tres hem de treballar amb fitxers XML.

$xml = simplexml_load_file('fitxer.xml');

Llegeix el fitxer.xml del disc dur i el converteix en un objecte de la classe SimpleXMLElement. Per veure en què es converteix es pot usar print_r.

Ara que ja tenim les dades en forma d’objecte si encara no ens agraden podem convertir-les en un array amb una sola funció:

$varArray = get_object_vars($objXml);

També amb un print_r podem veure un array dels de tota la vida.

Sovint la potència esta en la simplicitat… val la pena no perdre de vista aquestes funcions.

SVN: Tortoise per Linux i Nautilus-scripts

Reading time: 2 – 2 minutes

Per windows tenim disponible el TortoiseSVN una aplicació que queda instal·lada com a opcions de contexte de l’explorer de windows. Ens permet treballar amb el VCS de forma súper còmode. De fet, el subversion es converteix en algo d’allò més senzill gràcies a aquest aplicació i acabes agafant dependència de l’eina.

Doncs bé aquesta eina com passa sovint no existeix per linux i més concretament com a extenció del nautilus per gnome encara menys. Però avui m’he instal·lat un script de nautilus (concepte que desconeixia fins avui) que ens permet d’una forma força rudimentaria, però eficaç, treballar amb el menú de contexte del nautilus directament contra el subversion. Sense haver de sortir a la consola per llençar manualment les comandes més típiques.

Concretament l’script l’he trobat al mariuss’ blog en l’article Nautilus Script for Subversion ens explica com s’ha currat aquest script. De fet, m’he informat sobre aquests scripts del nautilus i són trivials de fer. Quan els domini una mica més ús explico com es fan. De moment ús deixo amb el gusanillo.

Si useu el subversion i no voleu haver d’anar amb la línia de comandes amunt i aball cada dos per tres, us recomano que descomprimiu el fitxer: nautilus-svn-scripts-0.9.2.tar.gz dins del directori ~/.gnome2/nautilus-scripts, després reinicieu el nautilus i llestos ja podeu veure el menú de contexte apretant el botó dret del ratolí, el menú és algo així:

NautilusSubversionScripts.png

MAGMA: Slot CardBus to PCI Expansion System

Reading time: 2 – 2 minutes

Molta gent usa l’ordinador portatil com a ordinador de sobretaula, però a vegades cal tenir slots PCI per poder connectar les targetes de dispositius, per exemple: capturadores de TV, targetes gràfiques més potents, etc. fa quatre dies em pensava que això no es podia fer però fent recerca d’un altre producte vaig trobar una empresa que es diu magma i que tenen uns chasis on es poden endollar targetes PCI també disposen de targetes PCMCIA que es connecten al chasis i des del portàtil ja tenim els anciats slots PCI.

magma.jpg

A part de ser una solució per portàtils també disposen de targetes PCI que permeten ampliar els slots PCI de que disposa la placa base.

Com podeu veure el chasis és molt professional, la fotografia suporta 4 PCI’s però hi ha chasis de només 1 slot.

magma2.jpg

Ara ve el dolent, el preu. Un slot PCI amb una targeta PCMCIA costa uns ~850€. Malgrat com a solució domèstica ho he descartat com a solució professional crec que val la pena no perdre de vista aquests productes.

Un dia com un altre…

Reading time: < 1 minute

o no!!!

ja són 29!!! a veure si em puc regalar un dia light, tot i que no sé si serà possible.

Per cert, moltes gràcies als molts SMS que ja he rebut només encendre el mòbil aquest matí, que no teniu son vosaltres 🙂

Poques ganes de treballar…

Reading time: 2 – 2 minutes

godspeedyoublackemperor.jpg

Suposo que és normal sent el dia que és deu ser normal que no tingui ganes de treballar. Però volia aprofitar que la Daphne no arriba fins ben tard per fer mil coses que tinc pendents. Però la veritat a vegades estas espès i no tens ganes de posar-te a fer res. És curiós perquè ni ganes de mirar una pel·lícula tens. Malgrat això he aconseguit trobar un grup que em venien ganes d’escoltar mentre escribia aquesta extranya sensació que m’omple en aquesta tarda de diumenge.

Es tracta de Godspeed you! Black Emperor fa molt de temps que tinc música d’aquest grup, el vaig descobrir gràcies a l’Aurora una de les germanes de la Daphne i de veritat que fan una música molt especial no sabria ni per on començar a descriure-la. Això si és capaç de fer-te sentir coses molt especials. Et fa submergir per sota l’aigua i de cop et fa fer un sal que t’aixeca centenars de metres fins a barrejar-te en els núvols i notes com vas planejant pel cel.

Ja ho sabeu doncs, una bona tearapia per dies grisos i solitaris com aquest diumenge. A vegades no saps què és el que més t’agobia si que sigui diumenge o que demà hagis d’anar a treballar perquè és dilluns així doncs potser millor no pensar-hi, millor oblidar les dues coses i només buscar alguna cosa que et faci sentir viu!!!

i 3!!!!

Reading time: < 1 minute

Apa ja són tres!!! si nois si… ja va tres anys que vaig tornar a neixer. Així doncs avui és el meu segon aniversari que sempre es dona dos dies abans que el meu primer aniversari… hi hi hi! enrabassat eh!!!

pastis.gif

Per no perdre la costum, aquí teniu l’enllaç del fet que em va fer re-eneixer. Ara com ja dic cada any el que toca és no oblidar la sort que tinc i el bé que em va tot. Així que A VIURE!!!

llibre: La Buena Suerte

Reading time: 2 – 4 minutes

labuenasuerte.jpg

Un dels llibres que em varen regalar aquest St. Jordi va ser La Buena Suerte (ISBN: 84-95787-55-5). El llibre esta força bé, de fet es fa una mica massa llarg per les poques coses que diu. Però la lectura és amena i ràpida en molt poc temps me l’he pogut acabar (lletra grossa i unes 100 i poque pàgines). El que volia no oblidar és els consells que dona per la bona sort. És important fixar-se en que no és el mateix la bona sort que la sort. Seria la moraleja del llibre, realment són bons consells així que no us els perdeu:

  • 1a regla: la sort no dura gaire temps perquè no depèn de tu. La bona sort la crea un mateix, per això dura sempre.
  • 2a regla: molts decideixen tenir bona sort, però pocs els que decideixen anar a buscar.
  • 3a regla: si ara no tens bona sort potser és perquè les circumstàncies són les de sempre. Perquè la bona sort arribi les circumstàncies han de canviar.
  • 4a regla: preparar circumstàncies per la bona sort no significa buscar només el benefici propi. Crear circumstàncies perquè els altres també hi guanyin atrau la bona sort.
  • 5a regla: Si deixes per demà la preparació de les circumstàncies, la bona sort potser no arribi mai. Crear circumstàncies requereix fer el primer pas… Fes-lo avui!
  • 6a regla: fins hi tot sota les circumstàncies aparenment necessaries, a vegades la bona sort no arriba. Busca en els petits detalls circumstàncies aparenment innecessaries…, però imprescindibles!
  • 7a regla: als que només creuen en l’atzar crear circumstàncies els resulta absurd. Als que es dediquen a crear circumstàncies l’atzar no els preocupa.
  • 8a regla: ningú pot vendre sort. La bona sort no es ben. Desconfia dels que venen sort.
  • 9a regla: quan ja hagis creat totes les circumstàncies tingues paciència, no abandonis. Perquè la bona sort arribi has de confiar.
  • 10a regla: crear bona sort és preparar les circumstàncies a l’oportunitat. Per+ò l’oportunitat no és qüestió de sort o atzar, sempre hi és.

Una bona sintesis de les regles: crear bona sort és crear circumstàncies. Si voleu passar una estona agradable i aprendre quatre cosetes quí us queda la referència del llibre.

mailgateway: postfix+amavisd+clamav+spamassassin+sasl

Reading time: 3 – 5 minutes

Algunes empreses disposen de servidors de correu amb infraestructures internes realment complexes i que seguint la màxima de la informàtica el millor que podem fer és: si alguna cosa va no la toquis. El problema és que sovint aquestes estructures tan complexes no disposen de filtres de correu mailiciós. O sigui, no són capaces de passar antivirus al correu, filtrar l’spam i controlar altres enviaments maliciosos de correu. A més intentar afegir un software dins el propi servidor que ens fassi aquestes funcions sobre l’Mail Transport Agent (MTA) que ja tenim corrent és un risc innecessari i poc rentable moltes vegades.

diagrama-xarxa.png

Una solució que s’usa sovint és afegir un servidor només per filtrar el correu que entre i surt de l’empresa i intentar eliminar amb aquest mail-gateway tots els correus no dessitjats. Bàsicament doncs el que fem és col·locar l’SMTP (Simple Mail Transport Protocol) del mail-gateway com a porta d’entrada del correu extern. Després modifiquem el servidor intern de correu perquè tots els correus que hagi d’enviar cap a fora ho fassi a través del mail-gateway. O sigui, posem com a servidor de relay fix del servidor intern la direcció del MTA del gateway.

Amb aquest escenari els usuaris no han de canviar res de res, ja que només estem intervenint el port 25/tcp, o sigui, l’SMTP. A més al servidor intern de correu podem crear una compte de gestió de correo mailiciós, per exemple mailgateway@exemple.com (sent exemple.com el nostre domini). En aquest compte li creem dues carpetes una que es digui spam i l’altre que es digui ham. El que farem és sincronitzar el correu d’aquestes comptes amb una carpeta del mail-gateway (si les comptes són IMAP és bona idea sincronitzar-les amb l’offlineimap). Quan tinguem aquests correus al mail-gateway li direm als filtres bayessians de l’antispam que aprenguin com és el correu maliciós que no és capaç de filtrar i com és el correu que ha filtrat i que era legítim.

Aquesta compte de correu (mailgateway@exemple.com) que hem creat al servidor intern, la podem configurar com a compte de correu secundaria a un administrador de la xarxa. Així aquest podrà gestionar el manteniment sense haver de tocar el mail-gateway. En cas de que hi hagi algún usuari de la xarxa que vulgui localitzar un correu que s’ha filtrat l’administrador ho podrà fer des d’aquesta compte.

A més pels usuaris que estan fora de l’empresa, delegacions o d’altres similars ens pot interessar autenticar l’SMTP per tal de que aquests usuaris puguin usar l’SMTP del mailgateway per enviar correu. Així doncs, aprofitarem el servei d’IMAP (Internet Message Access Protocol) del servidor intern per validar l’autenticació en l’SMTP. Sona una mica extrany però el mètode és ben senzill. Es tracta d’aprofitar la compte l’usuari i clau que tenen els usuaris en el servidor IMAP intern, llavors es configura el MUA perquè usi aquestes dades com a informació per autenticar l’SMTP i el servidor d’MTA quan rep una autenticació via SMTP el que fa és obrir una connexió IMAP contra el servidor intern i provar l’usuari i clau que el client l’hi ha enviat a l’SMTP si això és correcte l’MTA permet enviar correu al MUA amb l’origen i destí que vulgui.

La documentació d’aquest projecte la podeu trobar al wiki:

mail-gateway_amb_amavisd-new

Tenir-la al wiki em permet anar-a millorant i esta sempre localitzada.

Si teniu alguna cosa que no esta clara, petició o demanda del tipus que sigui sobre aquesta documentació podeu penjar els comentaris en aquest post.

La comanda EHLO (del SMTP) no funciona en remot amb un Postfix

Reading time: 2 – 2 minutes

Just el problema que descric al títol m’ha fet perdre una bona estona aquest matí, de fet, m’ha fet anar de cul. M’estava tornant boig connectava al port 25 des de dintre de la LAN:

$ telnet IP_XARXA_LOCAL 25
Trying IP_XARXA_LOCAL...
Connected to IP_XARXA_LOCAL.
Escape character is '^]'.
220 ESMTP
ehlo prova
250-nom_servidor
250-PIPELINING
250-SIZE 20480000
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
quit
221 Bye
Connection closed by foreign host.

Si connectava des d’una IP de fora de la xarxa local:

$ telnet IP_PUBLICA 25
Trying IP_PUBLICA...
Connected to IP_PUBLICA.
Escape character is '^]'.
220 ******************
ehlo prova
502 Error: command not implemented
quit
221 Bye
Connection closed by foreign host.

M’he repassat tropocientes vegades la documentació del postfix a veure quina opció era la que feia comportar al servidor SMTP de forma diferent si estava en una IP de la xarxa local o una IP externa a la xarxa. Però no he trobat res de res, al final he trobat en un fòrum la inspiració divina. El problema era del coi de Cisco PIX que tenia entremig. El molt cabron m’estava filtrant la connexió!!!

Així que m’he hagut de connectar al PIX i dir-li que deixes de tractar el tràfic del port 25 com a tràfic SMTP, perquè no l’hi apliqués cap filtre:

pix # show fixup
fixup protocol dns maximum-length 512
fixup protocol ftp 21
fixup protocol h323 h225 1720
fixup protocol h323 ras 1718-1719
fixup protocol http 80
fixup protocol rsh 514
fixup protocol rtsp 554
fixup protocol sip 5060
fixup protocol sip udp 5060
fixup protocol skinny 2000
fixup protocol smtp 25
fixup protocol sqlnet 1521
fixup protocol tftp 69
pix # conf te
pix(config)# no fixup protocol smtp 25

Només amb aquest tonteria ja podia saludar al postfix (servidor SMTP) amb la comanda EHLO que em permet cursar autenticacions i d’altres comandes avançades de l’SMTP (ESMTP).

Scroll to Top