Who’s On Phirst

Official blog of Phurnace Software.


Posted by: Jessica Gass on

According to a new survey by research and consulting firm Hurwitz & Associates, manual configuration errors are wreaking havoc across IT organizations, not only impacting developer and staff productivity, but also causing significant delays in the roll out of customer-facing web applications. These errors are resulting in application downtime costing companies as much as $72,000 per hour.

Key findings of the research titled: The Sources of Web Application Downtime:

Web Applications are Critical to Business Operations
  • 86 percent of companies reported their web applications were now either very important or mission-critical.
  • Web applications are now viewed as one of the primary methods for interacting with customers, partners and suppliers. When errors occur, critical customer-facing web applications fail.

Manual Scripting is Killing IT Budgets
  • The average company is spending $852,187 per year in personnel costs to create, maintain and support deployment scripts.
  • 56 percent of organizations have 11 employees or more dedicated to the ongoing configuration, installation and deployment of web applications.
  • 14 percent of respondents were shown to have more than 81 employees assigned to this task.
  • 38 percent of organizations employ 11 or more employees to write and maintain custom deployment scripts.

Downtime is Costly and Unnecessary:
  • Internal costs for large sites were shown to be as high as $72,000 an hour for downtime.
  • Almost 35 percent of respondents said that at least a quarter of their downtime was caused by configuration changes and errors. In addition, 72 percent of respondents regarded this downtime as “significant”.
  • Many errors are caused by the inability to keep track of what changes have been made to configuration and deployment scripts.

The Problem is Getting Worse, Not Better:
  • Organizations with large web applications are seeing up to a 20 percent increase in annual maintenance.
  • As more companies move to virtualization, the workloads of existing web applications are increasing. 58 percent acknowledged this as a serious problem.

Please click here to read the full report.

In Untagged 
Comment (0) Read More...


Posted by: Wesley Willard on

At this year's No Fluff Just Stuff conference, presenter Matthew McCullough, the managing partner of Ambient Ideas, LLC, gave an interesting talk on Open Source Debugging Tools, which touched on usage of freely-available tools such as cURL. cURL is a command-line tool which supports file transfer operations for a variety of protocols (HTTP, HTTPS, FTP, SFTP, SCP, etc.) and can be used for a variety of useful tasks, such as retrieving the real source page of a web site:
curl -i -H Accept:text/xml http://www.phurnace.com

You can also determine your public IP (useful for those running behind a firewall/router) with the command:
curl -q http://checkip.dyndns.org

This command will return an HTML page with your public IP address embedded.

Okay, here's an example of how you can use cURL to take advantage of Google's mail feed to obtain information about your unread e-mail, without ever using the web browser. In this example, I will show how to take the output from the mail feed, parse it with a Groovy script, and then send a text message to your cell phone number.

First the script:


#!/bin/sh
rm -f /tmp/unread.txt

export PHONE_NUMBER=5555555555
export JAVA_HOME=/usr/lib/jvm/java-6-sun

curl -K .pwd https://mail.google.com/mail/feed/atom/unread > /tmp/unread.xml 

groovy -classpath /home/admin/jars/postgresql-8.4-701.jdbc4.jar \
    /home/admin/bin/Feed.groovy /tmp/unread.xml if [ -e /tmp/unread.txt ]; then echo "Sending notification of unread mail " `date` cat /tmp/unread.txt | mail -s "Unread" $PHONE_NUMBER@txt.att.net fi
This shell script uses a script written in Groovy to parse the curl output. There is nothing particularly fancy about it. It does depend on the -K option to curl to pass in the username and password credentials. This is a more secure method than passing them directly on the command line, or worse, including them in the script itself. If the output file from the Groovy script exists after its execution, the contents are emailed to the cell phone number's text message address. Ideally, this script will run as a cron job, checking the mail feed at a specified interval.

Before you run the script, set up a database called 'mail', with one table 'processed_mail'. The table schema is:

 Column  |          Type          | Modifiers 
---------+------------------------+-----------
 issued  | character varying(100) | not null
 author  | character varying(100) | 
 summary | character varying(255) | 
Indexes:

    "processed_mail_pkey" PRIMARY KEY, btree (issued)

The Groovy script is documented, but in a nutshell, here's what it does:
  • Connect to the database. I am using PostgreSQL in this case, but any database will do.
  • Set up a namespace for accessing the XML elements
  • Create an output file
  • Process each entry the XML file that is passed in as the first argument
  • For each entry, check to see if it has been processed, i.e. it is in the database
  • If it has not been processed, add an entry to the database, and output to the file
  • After processing the unread entries, delete any entries in the database which were not in the unread list
  • Delete the output file if it is empty

import groovy.util.*
import groovy.sql.*;

//
// Setup a database connection
// using Postgres
//
def DB='jdbc:postgresql://localhost/mail'
def USER='postgres'
def PASSWORD='mypassword'
def DRIVER='org.postgresql.Driver'

Class.forName(DRIVER)
def sql = Sql.newInstance(DB,USER,PASSWORD)
assert sql

//
// The XML that comes back needs a namespace
//
def ns = new groovy.xml.Namespace("http://purl.org/atom/ns#")

//
// Process each unread email
// If the unread email has not been processed then
// add an entry to the database
//
def processEntry = { it, outputFile ->
    //
    // Look for an aleady processed entry
    // If found then get out
    //
    def found = false
    def issued = it[ns.issued].text()
    sql.eachRow("select * from processed_mail where issued=${issued}") {
        found = true 
    }
    if (found) {
       return
    }

    //
    // Add the entry and output for the email text
    // 
    println "Issued on " + issued
    def author = it[ns.author][ns.name].text()
    def summary = it[ns.summary].text()
    println "Date: " + issued
    println "From: " + author 
    println summary 
    sql.execute(
    "insert into processed_mail (issued, author, summary) values(${issued}, ${author}, ${summary})")
    outputFile.append("From:  " + author + "\n")
    outputFile.append("Date:  " + issued + "\n")
    outputFile.append("Summary: " + summary  + "\n")
}

//
// Search in the list of entries for the 
// issued date passed in
//
def searchUnread = { dbIssued, entries ->
    def itFound = false
    entries.each {
        def xmlIssued = it[ns.issued].text()
        if (dbIssued.equals(xmlIssued)) {
            itFound = true
            return
        }
    }
    itFound;
}

//
// Process each row in the processed table
// If there is no entry in the list of unread email
// then delete the database row to prevent further processing
//
def cleanupDatabase = { dbIt, entries ->
    def dbIssued = dbIt.issued
    def entryFound = searchUnread(dbIssued, entries)
    if (! entryFound) {
        println "Deleting entry for " + dbIssued
        sql.execute("delete from processed_mail where issued=${dbIssued}")
    }
}

//
// Main body of code
//
def newFile = new File(args[0])
if (newFile.length() == 0) {
   println "Empty new file"
   System.exit(0)
}

//
// Create the output file
//
def output=new File("/tmp/unread.txt")

//
// Parse the input file
//
def parser = new XmlParser()
def feed = parser.parse(newFile)

//
// Gather the entries 
//
def xmlEntries = feed[ns.entry]

//
// Process each entry and output if 
// it has not already been processed
//
xmlEntries.each { processEntry(it, output) }

//
// Clean up the database
//
sql.eachRow("select * from processed_mail") { cleanupDatabase(it, xmlEntries) } 

//
// If the output file is empty then delete
//
if (output.length() == 0) {
   output.delete()
   println "Deleted empty file"
}

This mail feed utility illustrates the usefulness of the combination of a common system utility and a modern script language. This script could be modified to include finer-grained decisions about the destinations of the mail notifications.

Both cURL and Groovy are available on Windows, Linux, and other platforms, so this example can be tried out in almost any environment.

In Untagged 
Comment (0) Read More...


Posted by: Larry Warnock on

Every recent issue of every IT publication has discussed ways to reduce spending.  Especially in this tough economy, but quite frankly, this should be a constant priority for IT management.  We are hosting a webinar on this very topic.  Forrester analyst, Evelyn Hubbert, will be our guest speaker.  Please join us.  She has experience from across a wide range of industries and talks each week with some of the most innovative IT leaders around.  Evelyn will share her latest findings on how People, Process and Technology can make a difference.   

She will point out some of the new skills that are needed in IT as well as the need for automation across all functions of the data center as a key cost savings area.  We see large companies using automation tools to quickly improve operational efficiency while reducing costs.  It is worth taking a look.  Please join our webinar on July 30th or view the on-demand replay afterwards for some thoughtful insights from Forrester Research and Phurnace.  It will only cost you 40 minutes of time, but could save you hundreds of thousands of dollars in IT.  

In phurnaceData Center Automation
Comment (0) Read More...


Posted by: Daniel Nelson on

At the beginning of March this year, I got to spend a couple of days at the BMC Lexington campus prototyping our BladeLogic integration with some of their product, architecture, and development folks. Other than the four feet of snow, it was a great experience meeting the guys there as well as seeing what Phurnace can do with a product like BladeLogic. Together we can do lots of neat things that today just aren’t possible with either product alone. Recently one of our customers brought up an interesting use case that reminded me of one of the BladeLogic features.

In BladeLogic, you can setup heuristic rules to evaluate a task, decision, etc, and then take the appropriate action based on the rule. It’s a pretty rich interface, with full support for all first-order logic. This is pretty cool in its own right. But as they were showing the product to us, I kept thinking that if we combine this with the Phurnace data model for configurations, we can do some very amazing stuff.

For example, one of the things that scares the pants off IT operations guys is there being inadvertent changes to security or tuning settings. Both of those result in big fires and lots of unwanted attention. The problem is that sometimes they get packages to deploy that aren’t as sensitive to those requirements as they should be. Or, even worse, they get an app that HAS TO BE configured in a way that violates their policy in order to work – a hard-coded port, for example. See, the problem is the system administrators know what their environment needs for things like performance and security, and the devs know what the application needs for configuration and deployment, but the melding of those two bases of knowledge is always nasty, and often explosive.

So, watching the BMC guys take us through BladeLogic, I was thinking that this would be a great way to solve that problem. Have the SAs program in their tuning and security requirements actually in the heuristic engine, and then when Phurnace provides the data model for the configuration of the application, run a check to see if it violates any of those policies. The heuristics don’t have to be explicit – they can be a range of options, or settings, or what have you. They can be as complex or as simple as desired. But the important point here is that this check is now done programmatically, in an automated fashion, with no heartache or lost time. Good things happen when you combine good data with good process.

In BladeLogic
Comment (0) Read More...


Posted by: Pete Pickerill on

In our quest to better support AIX 5L V5.3 as both a server and client platform for Phurnace Deliver, we recently got a new piece of hardware, an IBM Power 520 Express. I am the one that usually sets up any new hardware, so the job of installing and configuring AIX fell to me. I soon found that AIX is a completely different animal than Linux. The majority of my previous *nix experience has been with Red Hat. Those of you with more Unix or AIX experience than I are probably laughing at my predicament. The more charitable among you (or those of you that also started in bash on Linux) may feel a pang of pity as you remember your first days trying to navigate the Korn shell. Where’s my auto-complete? Why isn’t the up key working? I can’t use the arrows to get to my typo? No wget? No vim? No samba? No sudo? My god…I can’t even SSH or SCP! Thankfully the good folks at IBM have provided a couple of downloadable content packs to ease the transition from Red Hat to AIX: The AIX Toolbox for Linux Applications and The IBM AIX Expansion Pack.

The IBM AIX Expansion Pack features a bunch of optional packages, most of which I didn’t need. I was able to find the following packages that have been very useful: OpenSSH & OpenSSL for AIX; several versions of the Java SDK for AIX (32-bit & 64-bit); Firefox 2.0 for AIX.

But The AIX Toolbox for Linux Applications made me feel like I had clicked together my little ruby Converse clad heels and said “There’s no Desktop like Gnome. There’s no Desktop like Gnome.” It was chock full of useful Linux applications, libraries, and utilities that made my transition to AIX much smoother. You can get a full alphabetical list here. This is where you’ll find things like wget, diffutils, alternative shells (hooray bash!), Gnome, vnc and a ton of other really useful stuff. So if you’re used to Linux and find yourself working in AIX, check out both offerings. It will save you a boat load of time.

In AIX
Comment (0) Read More...


Posted by: Larry Warnock on

We occasionally get the question, “Does HP, BMC, CA or IBM offer what Phurnace does?” The answer is simply – NO. We have a unique patent-pending approach (a software system and methodology patent) to deployment automation and there is no other vendor that addresses the problem the way that we do. This is not to say that there aren’t other ways to deploy J2EE applications and to configure web application servers. There are other ways, but they rely on hand-crafted, custom-written scripts or manual processes involving the app server console or configuration file editing. We think there is a much better way. The Phurnace way. It is a way that A.) reduces errors, B.) saves time, and C.) saves money. With the introduction of Phurnace, an entirely new way of managing web application deployment has emerged. It is quite frankly, a breakthrough.

Many of our customers have already spent a significant amount of money on I.T. operations platforms such as HP Server Automation, IBM Rational, IBM Tivoli or BMC BladeLogic, to name a few. They want to make sure that those systems don’t provide the functionality that Phurnace does. It is totally understandable and we welcome the question. What they have all found is that we provide a value-add to these systems and are not an overlap. Granted, you will find the terms “deployment automation” in each of their respective product brochures, but without exception, this means “auto launching of the custom-scripts that someone writes for your unique environment.” Phurnace replaces the mechanism of deployment, not the process. Remove the script mechanism, place Phurnace in its place. Boom -- Big cost savings immediately. No more writing of scripts, updating of scripts, maintenance of all of that “scaffolding”. And, Phurnace has integrations available directly to just about every build, source code, release and IT operation system out on the market (even open source tools).

So, feel free to ask the question – “Does Phurnace overlap with my current system?” We will answer with a confident NO and then install our software in your existing environment and prove it. Please give us a chance to put that question to bed.

In Untagged 
Comment (0) Read More...


Posted by: Casey Marshall on

Summer is here, which means it's time to cool off in the San Marcos river and escape the Texas heat. It's also time to download a new Eclipse -- Eclipse Galileo (3.5) released today. Phurnace Deliver builds on Eclipse technology, so I follow the latest developments in the community.

I want to highlight just a few of the features that have impressed me the most so far in Galileo, which has much general appeal for Java & web developers.

Eclipse Memory Analyzer
I've been using the Eclipse Memory Analyzer (MAT) for several months now, and it's helped me through some tricky memory leaks. MAT provides detailed memory usage reports and charts from a Java heap dump (created with jmap, for example). In the latest MAT release for Galileo, MAT has added stack frame information to the memory analysis -- you can more easily find where the leaks are, in addition to what's leaking. The new support for IBM JVM heap dumps could prove useful for diagnosing leaks, even in a live WebSphere instance. Once you get Galileo installed, here is a guide on getting started with the latest MAT, with some nice screenshots of the new stuff!

XML Tooling
If you muck around at all in large XML files (IBM WebSphere Portal snapshots come to mind), the new Web Tools Platform (WTP) release is reason enough to download Galileo. You can now test XPath queries directly on XML documents open in the editor and jump to the matching nodes. This has all sorts of potential for XSLT and custom XML parser development, but most importantly, it can be a powerful navigation tool. Read more in Eclipse Galileo: XML gets some love!

And More...
There are over 33 projects included in the Galileo release. For an overview of what else is included in Galileo, check out Eclipse Galileo - A Quick Glance on DZone and Eclipse Galileo Feature Top 10 List on EclipseSource.

In Eclipse GalileoEclipse
Comment (0) Read More...


Posted by: Jessica Gass on

Hello all, the registration is now open for our July 30th webinar with Evelyn Hubbert from Forrester Research.   She is going to talk about ways that you can cut immediate costs in your I.T. organization.  Daniel Nelson from Phurnace will discuss some recent case studies on how customers have seen quick ROI with Phurnace.   We are excited to host this event with such a great analyst.

 Click here to learn more and register.  See you there! 

In Untagged 
Comment (0) Read More...


Posted by: Wesley Willard on

Amazon Elastic Compute Cloud (EC2) has generated enormous amounts of buzz in the last couple of months. EC2 allows scalable deployment of applications by providing a way for customers to create server “instances” which can run any number of operating systems, such as Windows XP and Vista, and any number of Linux distributions. The customer can load any software of their choice on to the machines, and customize them at will. A customer can create, launch, and terminate server instances as needed, paying only for usage.

In addition to providing a Amazon Management Console to manage these instances, Amazon also provides command line tools which allow for the automation of instance administration. By combining these tools with some basic shell commands, you can customize the startup of your EC2 instances. I will provide an example that shows how this can be accomplished.

This example assumes you have the following available:


Okay, let's get started. First of all, we'll define some basic shell variables:

export EC2_HOME=/opt/ec2/tools/ec2-api-tools-1.3-30349/
export EC2_PRIVATE_KEY=~/ec2/pk-HGHEBCKY657B2ZUH7YIVXZKT5QVNBWFM.pem
export EC2_CERT=~/ec2/cert-HGHEBCKY657B2ZUH7YIVXZKT5QVNBWFM.pem
export amiid="ami-cccb2ca5"
export key="mykey"
export zone="us-east-1c"
export group="server"
export id_file="mykey.pem"
export vol_name="vol-8abe59e3"
export mount_point="/mnt/vol"
export device_name="/dev/sdf"
export ip="174.129.232.50"

The variables that start with the name “EC2” are used by the Tools API. They are the directory where you downloaded your Tools installation and the key and cert files provided to you by Amazon when you created your instance. The other variables are used by the shell commands in this example, and include:
  • Amazon Image ID
  • Key name associated with this instance
  • The zone in which this instance was created
  • The group associated with this instance
  • The name of the user's EC2 identity file
  • The ESB volume ID
  • The mount directory within the EC2 instance
  • The device name to associate with the ESB volume when attached
  • The Elastic IP address to associate with the instance

Now it's time to start the instance, and then loop until it is running.

#
# Start the instance
# Capture the output so that
# we can grab the INSTANCE ID field
# and use it to determine when
# the instance is running 
#
echo Launching AMI ${amiid}
${EC2_HOME}/bin/ec2-run-instances ${amiid} -z ${zone} -k ${key} --group ${group} 
--group default > /tmp/a if [ $? != 0 ]; then echo Error starting instance for image ${amiid} exit 1 fi export iid=`cat /tmp/a | grep INSTANCE | cut -f2` # # Loop until the status changes to “running” # sleep 30 echo Starting instance ${iid} export RUNNING="running" export done="false" while [ $done == "false" ] do export status=`${EC2_HOME}/bin/ec2-describe-instances ${iid} | grep INSTANCE | cut -f6` if [ $status == ${RUNNING} ]; then export done="true" else echo Waiting... sleep 10 fi done echo Instance ${iid} is running

Now we have the running instance ID, which we will use going forward. We next attach the ESB volume to the running instance, associating a device name. After we attach the volume, we wait until its status indicates that it is attached.

#
# Attach the volume to the running instance
#
echo Attaching volume ${vol_name}
${EC2_HOME}/bin/ec2-attach-volume ${vol_name} -i ${iid} -d ${device_name} 
sleep 15

#
# Loop until the volume status changes
# to "attached" 
#
export ATTACHED="attached"
export done="false"
while [ $done == "false" ]
do
   export status=`${EC2_HOME}/bin/ec2-describe-volumes | grep ATTACHMENT | grep ${iid} | cut -f5`
   if [ $status == ${ATTACHED} ]; then
      export done="true"
   else 
      echo Waiting...
      sleep 10
   fi
done
echo Volume ${vol_name} is attached

Now we associate the Elastic IP address with the running instance. This capability is important in an environment where instances are being started and stopped at various points for scalability reasons, so these operations will happen with no interruption for the user.

#
# Associate the Elastic IP with the instance
# After this operation we just sleep a bit
#
echo Associating elastic IP address ${ip}
${EC2_HOME}/bin/ec2-associate-address 174.129.232.50 -i ${iid}
sleep 30

Our final step for starting our instance is to copy and execute some additional commands within the running instance. These operations will create a mount point and mount the volume. Our commands assume that any partitioning and file system type creation has already been setup in the Amazon image’s /etc/fstab file. We use SSH to copy and execute these commands. Because EC2 does not allow username/password authentication, we must provide our identity file to SSH.

#
# Start the operations within the instance
# Copy over the mount script and execute it
# The script setup_vol does:
#     mkdir /mnt/vol
#     mount /mnt./vol
# 
scp -i ${id_file} setup_vol root@${ip}:/root
ssh -i ${id_file} root@${ip} . ./setup_vol

Finally, because this instance was created with an Ubuntu Desktop image, we can set up an NX Server to allow us to access our running instance with a remote desktop:

ssh -i ${id_file} root@${ip} /usr/NX/bin/nxserver --stop
ssh -i ${id_file} root@${ip} /usr/NX/bin/nxserver --start

Last, but not least, tell the user that we are ready to start using the running instance.

echo Image ${amiid} instance ${iid} is ready to go!
echo ${iid} > current_instance

I have attempted to demonstrate how you can use automation to facilitate the easy startup of your Amazon EC2 instance. This example can serve as a starting point for further customizations specific to your environment.

In Amazon Web ServicesAmazon EC2
Comment (6) Read More...


Posted by: Robert Reeves on

Both WebSphere Virtual Enterprise (VE) and ND 7.0 have the ability to remotely stop and start Node Agents, install WebSphere on remote servers and a whole host of handy remote activities. To perform these actions, WebSphere takes advantage of Tivoli Remote Execution and Access (RXA).

Luckily, you too can take advantage of RXA to manage your remote servers. Below, I’ll show you how to create a very simple Java class that will connect to your local windows machine and perform a directory listing.

First, you will need to create a new Eclipse project and add the following JAR to your Build Path as an external library: ${WAS_INSTALL_DIR}/plugins/com.ibm.ws.prereq.rxa.jar.

Second, create a new class and add the following main method.

      public static void main(String[] args) throws Exception {

            RemoteAccess ra = new LocalWindowsProtocol();
            ra.beginSession();
      }

At this point, you can really take advantage of the RemoteAccess object to gather information about your Local Windows host, or to run commands, manage processes, you name it. For example, the following lines added to the main method will perform a directory listing on your Local Windows host:

            ProgramOutput programOutput = ra.run("dir");
            String stdOut = programOutput.getStdout();

Of course, you might want to get STDERR while you’re at it…

Finally, RXA is not just limited to a Local Windows host. Here is an example on how to connect to a Remote SSH host:

            String username = new String("root");
            String strPassword = new String("p4ssw0rd");
            byte[] bPassword = strPassword.getBytes();
            ra = new SSHProtocol(username, bPassword);
            ra.setHostname("myhost.domain.com");
            ra.beginSession();

If you are going to be running a series of identical commands on a bunch of different servers, all with different OS types, I would recommend using the Factory design pattern to generate a RemoteAccess object of the correct Protocol type. Below is a list of the Protocol objects. As you can see, you have a very broad assortment.

AS400Protocol
LocalAS400Protocol
LocalUNIXProtocol
LocalWindowsProtocol
REXECProtocol
RSHProtocol
SSHProtocol
UNIXProtocol
WindowsProtocol

In WebSphere VEWebSphere 7.0Tivoli Remote Execution and Access
Comment (0) Read More...