Tuesday, 6 March 2012

tcpdump localhost


Capture packets on localhost from localhost

Code Snippet
  1. sudo tcpdump -i lo
End of Code Snippet

Monday, 5 March 2012

WSDL (Web Service Description Language) - Complete Overview


The aim of this article is to describe what WSDL is, how we can utilise the technology from a development perspective and dive into technical detail on how the technology fits together and what is possible. This is an initial draft, but I will be updating it casually over the next few weeks. I have an example Math WSDL file provided by Microsoft throughout this article (Full appendix at the bottom of this post).


WSDL 1.1 (Web Service Description Language)

A WSDL file is an XML file which describes its associated web service. The WSDL XML file describes: where the web service is located, the methods available, parameters required and their return types. WSDLs are platform in-specific and can be consumed from any accessible environment, framework and/or language (Mac/Windows/Linux, Web Apps/Services, C#/C++/Python/Perl etc...)

Using the WSDL file, a consumer has enough information to query the underlying web services using one or many of it's associated operations. Most languages/frameworks have built-in or third party libraries available that can generate proxy classes based on the WSDL file (Another layer in front of the WSDL/Service you can query against using your chosen language. I.e. wsdl.exe for .NET or WSDL2Java for Java). This is only an option to make things easier, and is by no means mandatory.



Version History

WSDL 1.0 was introduced in 2000 and was developed through a collaboration by Microsoft, IBM and Ariba. The language was formalized in 2001 as version 1.1.

WSDL 2.0 became a W3C recommendation on June 2007. WSDL 1.2 was renamed to WSDL 2.0 because it has substantial differences from WSDL 1.1. The changes are:

Adding further semantics to the description language
Removal of message constructs
No support for operator overloading
PortTypes renamed to interfaces
Ports renamed to endpoint.
Offers binding to all HTTP Request methods (Not just GET and POST [WSDL 1.1]).. So it enabled better RESTful web services.

Most third-party vendors, however, have not adapted their offerings to support WSDL 2.0. For example, the Web Services Business Process Execution Language (WS-BPEL) uses WSDL 1.1.




Document Structure (One or many of these base four definitions may exist)

Code Snippet
  1. <definitions>
  2.  
  3. <types>
  4.   The data types used by the web service
  5. </types>
  6.  
  7. <message>
  8.   The messages used by the web service
  9. </message>
  10.  
  11. <portType>
  12.   The operations performed by the web service
  13. </portType>
  14.  
  15. <binding>
  16.   The communication protocols used by the web service
  17. </binding>
  18.  
  19. <service>
  20.   Information regarding the service endpoints.
  21. </service>
  22.  
  23. </definitions>
End of Code Snippet



Note:
- A WSDL can contain extension elements. For example, it is also possible to group multiple services into one WSDL. However, the core principles behind the technology remain the same.
- It is common for one or many type, mesaage, portType or binding definitions to exist within one WSDL file.




Port Types (Interfaces in 2.0)

The portType section defines all operations available within the web service. It also defines the input, output and fault messages for each operation (A fault tag can only exist with an output tag). The input/output/fault message names are mapped onto message tag names, which describe the names and types of parameters used.

Example

Code Snippet
  1. <message name="AddMessage">
  2. <part name="parameter" element="ns:Add"/>
  3. </message>
  4. <message name="AddResponseMessage">
  5. <part name="parameter" element="ns:AddResponse"/>
  6. </message>
  7. <message name="AddFaultMessage">
  8. <part name="parameter" type="ns:String"/>
  9. </message>
  10.  
  11.  
  12. <portType name="MathInterface">
  13. <operation name="Add">
  14. <input message="y:AddMessage"/>
  15. <output message="y:AddResponseMessage"/>
  16. <fault message="y:AddFaultMessage"/>
  17. </operation>
  18. <operation name="Subtract">
  19. <input message="y:SubtractMessage"/>
  20. <output message="y:SubtractResponseMessage"/>
  21. <fault  message="y:SubtractFaultMessage"/>
  22. </operation>
  23. <operation name="Multiply">
  24. <input message="y:MultiplyMessage"/>
  25. <output message="y:MultiplyResponseMessage"/>
  26. <fault  message="y:MultiplyFaultMessage"/>
  27. </operation>
  28. <operation name="Divide">
  29. <input message="y:DivideMessage"/>
  30. <output message="y:DivideResponseMessage"/>
  31. <fault  message="y:DivideFaultMessage"/>
  32. </operation>
  33. </portType>
End of Code Snippet


The above example defines a single portType/Interface with four operations (Add, Subtract, Multiply and Divide). These are all Request-response type operations (because they have input and output) that also include faults.

There are four different types of MEPs (Message exchange patterns) that exist when defining operations in WSDL files...


One-way
- Contains only an input message.

Request-response
- Contains an input message, followed by an output message (may contain a fault message)

Solicit-response
- Contains an output message, followed by an input message (may contain a fault message)

Notification
- Contains only an output message.


I will cover messages later in this article, but I have displays the tags here (For the Add operation only) to see how operations are mapped onto messages. AddFaultMessage takes a simple string type, however, complex types (Arrays, Lists, Custom Objects etc..) may exist which require definition in the Types section of the WSDL. Lets have a look at this next...




Types

The types section defines the data types that are used by the service. If the service uses only simple types I.e. Integers, Strings etc... then the types section is not required. WSDL types can also be reused across multiple services. The types section contains one or many schema tags. XML Schema's are the typical choice, however, WSDL 1.1 is not limited to this schema type.


Example

Code Snippet
  1. <types>
  2. <schema targetNamespace="http://example.com/weather.xsd" xmlns="http://www.w3.org/2000/10/XMLSchema">
  3. <xs:complexType name="MathInput">
  4. <xs:sequence>
  5. <xs:element name="x" type="xs:double"/>
  6. <xs:element name="y" type="xs:double"/>
  7. </xs:sequence>
  8. </xs:complexType>
  9. <xs:complexType name="MathOutput">
  10. <xs:sequence>
  11. <xs:element name="result" type="xs:double"/>
  12. </xs:sequence>
  13. </xs:complexType>
  14. <xs:element name="Add" type="MathInput"/>
  15. <xs:element name="AddResponse" type="MathOutput"/>
  16. <xs:element name="Subtract" type="MathInput"/>
  17. <xs:element name="SubtractResponse" type="MathOutput"/>
  18. <xs:element name="Multiply" type="MathInput"/>
  19. <xs:element name="MultiplyResponse" type="MathOutput"/>
  20. <xs:element name="Divide" type="MathInput"/>
  21. <xs:element name="DivideResponse" type="MathOutput"/>
  22. </xs:schema>
  23. </types>
End of Code Snippet



From our previous example, we can see that all four operations map to eight messages (one input, one output, four operations). These 8 messages map on to these eight elements defined in the Types section. Above these elements, you can see two complex types have been defined: MathInput and MathOutput. When contrasting these examples in terms on O-O programming, you can think of a complexType as an Object; and x and y as properties of this object.





Messages (Do not exist in WSDL 2.0 - Operations refer to types directly)

Messages define the input and output of operations. They either map onto an element or a type (Both defined within the Types section). As discussed within the portType section previously, the operation decides which message is used for it's input and output.

Code Snippet
  1. <message name="AddMessage">
  2. <part name="parameter" element="ns:Add"/>
  3. </message>
  4. <message name="AddResponseMessage">
  5. <part name="parameter" element="ns:AddResponse"/>
  6. </message>
  7. <message name="SubtractMessage">
  8. <part name="parameter" element="ns:Subtract"/>
  9. </message>
  10. <message name="SubtractResponseMessage">
  11. <part name="parameter" element="ns:SubtractResponse"/>
  12. </message>
End of Code Snippet



Bindings

Bindings provides specific details on how the portType section will actually be transmitted over the wire. The bindings can be made available via. multiple transports: HTTP GET, HTTP POST and/or SOAP.

You can specify multiple bindings for a single portType. I.e. Making an operation available via GET, POST and SOAP.

The following example illustrates a SOAP/HTTP binding for the MathInterface portType (Defined above)...


Example


Code Snippet
  1. <definitions
  2. xmlns="http://schemas.xmlsoap.org/wsdl/"
  3. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  4. xmlns:xs="http://www.w3.org/2001/XMLSchema"
  5. xmlns:y="http://example.org/math/"
  6. xmlns:ns="http://example.org/math/types/"
  7. targetNamespace="http://example.org/math/">
  8. ...
  9. <binding name="MathSoapHttpBinding" type="y:MathInterface">
  10. <soap:binding style="document"
  11. transport="http://schemas.xmlsoap.org/soap/http"/>
  12. <operation name="Add">
  13. <soap:operation soapAction="http://example.org/math/#Add"/>
  14. <input>
  15. <soap:body use="literal"/>
  16. </input>
  17. <output>
  18. <soap:body use="literal"/>
  19. </output>
  20. <fault>
  21. <soap:body use="literal"/>
  22. </fault>
  23. </operation>
  24. ...
  25. </binding>
  26. ...
  27. </definitions>
End of Code Snippet



Binding Info
- The NAME of the binding must be given a unique name. I.e. MathSoapHttpBinding - so it can be referenced from within the WSDL.
- The TYPE of the binding must map onto the name of the portType (Interface WSDL 2.0)

soap:binding Info
- This element indicates that this is a SOAP 1.1 binding.
- The style of service is "document" (See section below on WSDL Styles)
- The transport protocol is HTTP
- The soap:operation element defines the SOAPAction HTTP header value for each operation
- The soap:body element defines how the message parts appear inside of the SOAP Body element (possible values include literal or encoded)




WSDL Styles


A WSDL SOAP binding can be either a Remote Procedure Call (RPC) style binding or a document style binding. A SOAP binding can also have an encoded use or a literal use.

Using document style in SOAP indicates that the body will contain an XML document, and that the message parts specify the XML elements that will be placed there. Using rpc style in SOAP indicates that the body will contain an XML representation of a method call and that the message parts represent the parameters to the method.

This gives you four style/use models:

RPC/encoded
RPC/literal
Document/encoded
Document/literal


The use attribute specifies the encoding that should be used to translate the abstract message parts into a concrete representation. In the case of 'encoded', the abstract definitions are translated into a concrete format by applying the SOAP encoding rules. In the case of 'literal', the abstract type definitions become the concrete definitions themselves (they're 'literal' definitions). In this case, you can simply inspect the XML Schema type definitions to determine the concrete message format. For example, the Add operation for the above document/literal binding looks like this on the wire:

Using literal definitions is much cleaner and easier for the tools to get right. Using the encoding rules has led to significant interoperability problems across toolkits. It also leads to weird situations like not being able to validate the wire-level message against the original schema definition (since it's abstract and not a true representation of the message)

More info on WSDL Styles here: http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/



Service


The service element defines a collection of endpoints/ports that expose our bindings (Listed above). Each port must be given a name and assigned a binding.

Example

Code Snippet
  1. <definitions
  2. xmlns="http://schemas.xmlsoap.org/wsdl/"
  3. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  4. xmlns:xs="http://www.w3.org/2001/XMLSchema"
  5. xmlns:y="http://example.org/math/"
  6. xmlns:ns="http://example.org/math/types/"
  7. targetNamespace="http://example.org/math/">
  8. ...
  9. <service name="MathService">
  10. <port name="MathEndpoint" binding="y:MathSoapHttpBinding">
  11. <soap:address
  12. location="http://localhost/math/math.asmx"/>
  13. </port>
  14. </service>
  15. </definitions>
End of Code Snippet



Full WSDL Example (For all above examples)

Code Snippet
  1. <definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
  2. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  3. xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
  4. xmlns:xs="http://www.w3.org/2001/XMLSchema"
  5. xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
  6. xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
  7. xmlns:y="http://example.org/math/"
  8. xmlns:ns="http://example.org/math/types/"
  9. targetNamespace="http://example.org/math/">
  10. <types>
  11. <xs:schema targetNamespace="http://example.org/math/types/"
  12. xmlns="http://example.org/math/types/"
  13. elementFormDefault="unqualified" attributeFormDefault="unqualified">
  14. <xs:complexType name="MathInput">
  15. <xs:sequence>
  16. <xs:element name="x" type="xs:double"/>
  17. <xs:element name="y" type="xs:double"/>
  18. </xs:sequence>
  19. </xs:complexType>
  20. <xs:complexType name="MathOutput">
  21. <xs:sequence>
  22. <xs:element name="result" type="xs:double"/>
  23. </xs:sequence>
  24. </xs:complexType>
  25. <xs:element name="Add" type="MathInput"/>
  26. <xs:element name="AddResponse" type="MathOutput"/>
  27. <xs:element name="Subtract" type="MathInput"/>
  28. <xs:element name="SubtractResponse" type="MathOutput"/>
  29. <xs:element name="Multiply" type="MathInput"/>
  30. <xs:element name="MultiplyResponse" type="MathOutput"/>
  31. <xs:element name="Divide" type="MathInput"/>
  32. <xs:element name="DivideResponse" type="MathOutput"/>
  33. </xs:schema>
  34. </types>
  35. <message name="AddMessage">
  36. <part name="parameters" element="ns:Add"/>
  37. </message>
  38. <message name="AddResponseMessage">
  39. <part name="parameters" element="ns:AddResponse"/>
  40. </message>
  41. <message name="SubtractMessage">
  42. <part name="parameters" element="ns:Subtract"/>
  43. </message>
  44. <message name="SubtractResponseMessage">
  45. <part name="parameters" element="ns:SubtractResponse"/>
  46. </message>
  47. <message name="MultiplyMessage">
  48. <part name="parameters" element="ns:Multiply"/>
  49. </message>
  50. <message name="MultiplyResponseMessage">
  51. <part name="parameters" element="ns:MultiplyResponse"/>
  52. </message>
  53. <message name="DivideMessage">
  54. <part name="parameters" element="ns:Divide"/>
  55. </message>
  56. <message name="DivideResponseMessage">
  57. <part name="parameters" element="ns:DivideResponse"/>
  58. </message>
  59. <portType name="MathInterface">
  60. <operation name="Add">
  61. <input message="y:AddMessage"/>
  62. <output message="y:AddResponseMessage"/>
  63. </operation>
  64. <operation name="Subtract">
  65. <input message="y:SubtractMessage"/>
  66. <output message="y:SubtractResponseMessage"/>
  67. </operation>
  68. <operation name="Multiply">
  69. <input message="y:MultiplyMessage"/>
  70. <output message="y:MultiplyResponseMessage"/>
  71. </operation>
  72. <operation name="Divide">
  73. <input message="y:DivideMessage"/>
  74. <output message="y:DivideResponseMessage"/>
  75. </operation>
  76. </portType>
  77. <binding name="MathSoapHttpBinding" type="y:MathInterface">
  78. <soap:binding style="document"
  79. transport="http://schemas.xmlsoap.org/soap/http"/>
  80. <operation name="Add">
  81. <soap:operation soapAction="http://example.org/math/#Add"/>
  82. <input>
  83. <soap:body use="literal"/>
  84. </input>
  85. <output>
  86. <soap:body use="literal"/>
  87. </output>
  88. </operation>
  89. <operation name="Subtract">
  90. <soap:operation soapAction="http://example.org/math/#Subtract"/>
  91. <input>
  92. <soap:body use="literal"/>
  93. </input>
  94. <output>
  95. <soap:body use="literal"/>
  96. </output>
  97. </operation>
  98. <operation name="Multiply">
  99. <soap:operation soapAction="http://example.org/math/#Multiply"/>
  100. <input>
  101. <soap:body use="literal"/>
  102. </input>
  103. <output>
  104. <soap:body use="literal"/>
  105. </output>
  106. </operation>
  107. <operation name="Divide">
  108. <soap:operation soapAction="http://example.org/math/#Divide"/>
  109. <input>
  110. <soap:body use="literal"/>
  111. </input>
  112. <output>
  113. <soap:body use="literal"/>
  114. </output>
  115. </operation>
  116. </binding>
  117. <service name="MathService">
  118. <port name="MathEndpoint" binding="y:MathSoapHttpBinding">
  119. <soap:address location="http://localhost/math/math.asmx"/>
  120. </port>
  121. </service>
  122. </definitions>
End of Code Snippet




References
http://msdn.microsoft.com/en-us/library/ms996486.aspx



TODO: Add more info on WSDL 2.0

Connect via. sftp to specific port


Attempts to connect via. port 115 for SFTP

Code Snippet
  1. sftp -oPort=115 user@host
End of Code Snippet

Friday, 2 March 2012

SOAP - A Complete Low-Level Guide to the Technology


I have been using SOAP for a number of years now (lol), mainly SOAP based services within the .NET architecture. However, i've never really sat down and drilling into the inner workings on a lower level.


SOAP (Simple Object Access Protocol)
- Used to accomplish internet communication between systems (software, programs, web apps, services etc.)
- HTTP is supported by all internet browsers and servers.
- SOAP therefore uses HTTP to enable this communication.
- SOAP relies on XML for its messaging format.
- Simple!


Common Misconceptions
- There is no such thing as a SOAP Protocol... It's more of a schema (a subset of XML). Therefore, SOAP based web services will typically use HTTP (Port 80) or HTTPS (Port 443).


Architecture
- A SOAP request could be a HTTP GET or a HTTP POST. For example, a HTTP POST request specifies at least two HTTP headers: Content-Type and Content-Length.
- When a GET/POST request is made to a SOAP based web service, the HTTP message will detail two parts: Header information (content length/type, host etc...) and a SOAP Envelope (All in XML)...

Here is a sample HTTP POST request using SOAP...

Code Snippet
  1. POST /InStock HTTP/1.1
  2. Host: www.example.org
  3. Content-Type: application/soap+xml; charset=utf-8
  4. Content-Length: nnn
  5.  
  6. <?xml version="1.0"?>
  7. <soap:Envelope
  8. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
  9. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
  10.  
  11. <soap:Body xmlns:m="http://www.example.org/stock">
  12.   <m:GetStockPrice>
  13.     <m:StockName>IBM</m:StockName>
  14.   </m:GetStockPrice>
  15. </soap:Body>
  16.  
  17. </soap:Envelope>
End of Code Snippet


Once the service has processed the request, it will provide a response back in the following format...


Code Snippet
  1. HTTP/1.1 200 OK
  2. Content-Type: application/soap+xml; charset=utf-8
  3. Content-Length: nnn
  4.  
  5. <?xml version="1.0"?>
  6. <soap:Envelope
  7. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
  8. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
  9.  
  10. <soap:Body xmlns:m="http://www.example.org/stock">
  11.   <m:GetStockPriceResponse>
  12.     <m:Price>34.5</m:Price>
  13.   </m:GetStockPriceResponse>
  14. </soap:Body>
  15.  
  16. </soap:Envelope>
End of Code Snippet



SOAP Envelope Architecture
A SOAP envelope details header information, message body and any fault codes or statues that may occur/exist. Full schema can be found here: http://www.w3.org/2001/12/soap-envelope



Header (Optional)

Typically, the header is used to hold security information, I.e. authentication into the target system.


Body (Required)

The message body is used to hold all information passed or received from the SOAP service. This includes: Methods, parameters, return values etc...


Example

The Request may look like this...
Code Snippet
  1. <soap:Body>
  2.   <m:GetPrice xmlns:m="http://www.w3schools.com/prices">
  3.     <m:Item>Apples</m:Item>
  4.   </m:GetPrice>
  5. </soap:Body>
End of Code Snippet


Once the service has finished processing, probably by checking a database for the price of apples, the SOAP service will return the following message body...

Code Snippet
  1. <soap:Body>
  2.   <m:GetPriceResponse xmlns:m="http://www.w3schools.com/prices">
  3.     <m:Price>1.90</m:Price>
  4.   </m:GetPriceResponse>
  5. </soap:Body>
End of Code Snippet


Fault Codes (Optional - Contained in the SOAP Body)
Fault codes are used to indicate error messages. They are entirely optional. If a fault code is present, it will contain the following information: faultcode, faultstring, faultactor, detail.

The following XML displays an example of a SOAP fault in a SOAP response message.

Code Snippet
  1. <soap:Body>
  2.     <soap:Fault>
  3.         <faultcode xsi:type="xsd:string">soap:Client</faultcode>
  4.         <faultstring xsi:type="xsd:string">
  5.             Failed to locate method (ValidateCreditCard) in class
  6.             (examplesCreditCard) at /usr/local/ActivePerl-5.6/lib/
  7.             site_perl/5.6.0/SOAP/Lite.pm line 1555.
  8.         </faultstring>
  9.     </soap:Fault>
  10. </soap:Body>
End of Code Snippet


Interoperability
So if your wondering how the heck you can utilise this technology, you already know it's used to solve communication between programs over HTTP, so here's an example...

1. You wish to create a website that displays the latest weather information on the homepage.

2. Rather than spending thousands of pounds/dollars/euro on weather equipment (and learning how to use it!), you decide it would be better to import data from an external website.

3. Rather than "Screen Scraping" (stripping weather information out of the HTML), if we could tap right into their data store, we can display the information however we would like.

4. We now need to find a weather site that exposes a SOAP service for us to consume'... Visit: http://www.service-repository.com/ this is a good public listing of popular SOAP web services.

5. You may see GlobalWeather on the homepage. They provide a nice and easy to use SOAP service to access weather information based on city and country: http://www.webservicex.com/globalweather.asmx... It exposes two methods: GetCitiesByCountry and GetWeather.

6. By clicking on one of these methods, you can view the sample SOAP request and response messages. This provides you with how your HTTP Request should be formatted for the SOAP service to understand your request. It also tells you (from the response) what to expect back from the service. Simple!


NOTE: By understanding the inner workings of SOAP, you can call SOAP services from programming languages/environments that may not DIRECTLY support web service proxies (I.e. iPhone/iOS, Python etc...). So by sending a SOAP request using a standard HTTP Request (which most languages do support), you can achieve the same result.

Tuesday, 28 February 2012

Solaris [SunOS] - Installing and Managing packages using the package manager


Managing packages with Solaris is easy with pkg utilities... The post discusses the basics in adding, removing and querying packages on a Solaris system.

Finding out details of installed packages

Code Snippet
  1. pkginfo | grep python
End of Code Snippet


pkginfo will display a list of all packages managed by the package manager. By searching for 'python', this gives us it's package name: SMCpython... and tells us its an application.

application SMCpython python


Obtaining Packages

1. Firstly find out your processor type and your Solaris/SunOS version.

Code Snippet
  1. uname -a
End of Code Snippet


SunOS servername 5.9 Generic_117171-07 sun4u sparc SUNW,Sun-Fire-V440

This tells me that im running SunOS 5.9 (Solaris v9) and using the SPARC processor type.


2. You can optionally use pkg-get or pkgutil to automatically download and install packages (This will also automatically download package dependencies). See my blog post on how to take this option!


3. Downloading packages manually (like a boss - also if its a server/system that does not have internet access). Find and download the appropriate package from one of these mirror sites using your Solaris version and processor type from step 1...

Package Download Websites
http://www.mirrorservice.org/sites/ftp.sunfreeware.com/pub/unixpackages/
http://www.mmnt.net/db/0/0/ftp.tiscali.nl/pub/mirror/sunfreeware/


Installing Packages

Once you have obtained a package to install, you will have a file similar to this: 'gcc-3.4.6-sol9-sparc-local'. We can then use the pkgadd utility to install the package into the system. You will be warned if the package has any dependencies (in which case, you will need to install these first). The following example will install version 3.4.6 of the GCC compiler for Solaris 9 [SPARC processor]...

Code Snippet
  1. pkgadd -d gcc-3.4.6-sol9-sparc-local
End of Code Snippet


Removing Packages

Packages can be removed using the pkgrm utility, alongside the name of the package. To get the name of the package, you will need to use pkginfo...

Code Snippet
  1. pkginfo | grep gcc
End of Code Snippet


This gives...
application SMCgcc gcc


We can then use pkgrm on the package name SMCgcc

Code Snippet
  1. pkgrm SMCgcc
End of Code Snippet


Check which package owns a file

If you would like to find out which package owns a file on your system, then you can run the following command...

Code Snippet
  1. pkgchk -l -p /usr/local/lib/python2.6/genericpath.pyc
End of Code Snippet


Pathname: /usr/local/lib/python2.6/genericpath.pyc
Type: regular file
Expected mode: 0644
Expected owner: root
Expected group: bin
Expected file size (bytes): 3332
Expected sum(1) of contents: 54794
Expected last modification: Sep 09 12:02:14 2009
Referenced by the following packages:
SMCpython
Current status: installed



Creating Solaris Packages
Here are a couple of good guides on creating packages for Solaris...

http://www.ibiblio.org/pub/packages/solaris/sparc/html/creating.solaris.packages.html
http://www.bolthole.com/solaris/makeapackage.html


Misc

Solaris Package Cheatsheet

MYSQL - Backup database to a file


The mysqldump utility will allow you to backup your entire database to a file (tables definitions, relationships and data). The following statement will extract the tablenamehere definition to a file called test.sql...

Code Snippet
  1. mysqldump -u root -p tablenamehere > test.sql
End of Code Snippet

MYSQL - Reset root password [Unix Systems]


1. Stop the MYSQL Service

Code Snippet
  1. service mysqld stop
End of Code Snippet

or

Code Snippet
  1. /etc/init.d/mysqld stop
End of Code Snippet


2. Execute the following SQL (Replace 'rootpass' woith password first)

Code Snippet
  1. mysqld_safe --skip-grant-tables &
  2. mysql -uroot mysql
  3. UPDATE user SET password=PASSWORD("rootpass") WHERE user="root";
  4. FLUSH PRIVILEGES;
End of Code Snippet


3. Start the MYSQL Service

Code Snippet
  1. service mysqld start
End of Code Snippet

or

Code Snippet
  1. /etc/init.d/mysqld start
End of Code Snippet



Windows Users

I imagine by typing in 'services.msc' into Start > Run, you can stop the MYSQL service there, follow the steps above, then restart the service.

Monday, 27 February 2012

Disable multiprocessing in Python


I recently installed Python 2.6 onto a dev server, and I had a few problems when running a script with logging. For some reason, the multiprocessing module wasn't being recognized/installed.

Here is a quick example, if not using multiprocessing, how you can disable it within your script.

Disable Multiprocessing
Code Snippet
  1. import logging
  2. logging.logMultiprocessing = 0
End of Code Snippet

Wednesday, 22 February 2012

How To Remove Packages With RPM "Error: ... Specifies Multiple Packages "


Simple steps to remove multiple packages installed on your linux box

Code Snippet
  1. rpm -qa | grep e2fsprogs*
End of Code Snippet

This gives...
e2fsprogs-libs-1.39-15.el5
e2fsprogs-libs-1.39-15.el5
e2fsprogs-devel-1.39-15.el5
e2fsprogs-1.39-15.el5
e2fsprogs-devel-1.39-15.el5


You will see a duplicate files e2fsprogs-libs-1.39-15.el5 and gets the following error
error: "e2fsprogs-libs-1.39-15.el5" specifies multiple packages


You can solve this problem with the command below..
Code Snippet
  1. rpm -e --allmatches e2fsprogs-libs-1.39-15.el5
End of Code Snippet

Monday, 6 February 2012

Python - Sending emails using smtplib


Here is a snippet that will send emails to one or more recipients. It will also send the name alongside the FROM email address.

Just plug in the SMTP server details and toggle AUTH if required.


Send an email to one or more recipients
Code Snippet
  1. import smtplib
  2. import email.utils
  3. from email.mime.text import MIMEText
  4. from email.utils import formataddr
  5.  
  6.  
  7. def emailer():
  8.  
  9.             # Email Settings
  10.             MESSAGEBODY = 'Test Email body.'
  11.             SUBJECT = 'Test Email Subject'
  12.             FROM = ('Some User', 'donotreply@someurl.com')
  13.             TO = ['recipient1@someurl.com', 'recipient2@someurl.com']
  14.  
  15.             # SMTP Settings
  16.             smtpserver = 'SMTP SERVER ADDRESS'
  17.             smtpport = 25
  18.             AUTHREQUIRED = 0   # If you need to use SMTP AUTH set to 1
  19.             smtpuser = 'foo'  # For SMTP AUTH, set SMTP username here
  20.             smtppass = 'bar'   # For SMTP AUTH, set SMTP password here
  21.  
  22.             # Create the message
  23.             msg = MIMEText(MESSAGEBODY)
  24.             msg['To'] = ', '.join(TO)
  25.             msg['From'] = email.utils.formataddr(FROM)
  26.             msg['Subject'] = SUBJECT
  27.            
  28.             try:
  29.                 smtpObj = smtplib.SMTP(smtpserver, smtpport)
  30.            
  31.                 if AUTHREQUIRED:
  32.                     session.login(smtpuser, smtppass)
  33.            
  34.                 smtpObj.sendmail(msg['From'], TO, msg.as_string())
  35.                
  36.                 print "Email has been sent successfully to: " + msg['To']
  37.             except Exception, err:
  38.                 print "Error: unable to send error email notification. %s"  % str(err)
  39.  
  40.  
  41.  
  42. # Invoke Emailer
  43. emailer()
End of Code Snippet

Python Email Examples
http://docs.python.org/library/email-examples.html