Tuesday, September 22, 2009

Bash Scripting

I had some bash scripts to write a little while ago and I thought I'd share them here.

Let's start with a simple task. Say we have a load of files in a directory, e.g. null121231.xml, null3049432.xml etc. and we want to remove null from the start of the files' names:

for f in null*; do mv "$f" "${f#null}"; done

Moving onto a little more complex. I wanted to write a script that would backup these files to another machine. I felt it was more logical to trigger this script from the remote machine so I did it this way:

Remote machine: telex
Local machine (where backup is being stored): hossbox

#!/bin/bash
# Off site backup script for live database
#
#
# DATE: 27/08/2009

#################################
# Assign Date variables     #
#################################
startTime=`date`
LOGFILE=/home/java/blog_backup_jobs.txt

echo $startTime ": Starting blog backup" >> $LOGFILE

# Ping interval in seconds
PINGINTERVAL=600
numErrors=0
HOST=telex

#### functions ####
function pinghost()
{
    ping -c 1 $1 &> /dev/null
    if [ $? = 0 ]; then
        return 0
    else
        return 111
    fi
}

function notifyAdmin()
{
    # email subject
    SUBJECT="Blog backup failed, mecca failed to respond for 1 hour"
    # Email to?
    EMAIL="patrick@localhost"
    # Email text/message
    EMAILMESSAGE="/home/java/cron/emailmessage.txt"
    echo "$HOST has failed to respond for 1 hour. The blog backup script has failed" > $EMAILMESSAGE
    # Send email using /bin/mail
    /bin/mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
}


#### Script starts here ####

pinghost $HOST
errorCode=$?

while [ $errorCode -eq 111 ]
do
    numErrors=$(( $numErrors + 1 ))
    echo "`date +%r`: Ping error $numErrors to $HOST" >> $LOGFILE

    if [ $numErrors -eq 6 ]; then
        echo "`date +%r`: Couldn't ping $HOST for 1 hour, emailing admin.." >> $LOGFILE
        # calling a function to email someone here
        notifyAdmin
        echo "`date +%r`: mail sent....exiting." >> $LOGFILE
        exit 1
    else
        sleep $PINGINTERVAL
        pinghost $HOST
        errorCode=$?
    fi
done

# If we're here then mecca is up. Now we need to connect and
# check if the blog extraction job is finished
# returns 202 if the pid file exits
# returns 0 if it doesn't
PIDFILE=/home/java/extract_blog.pid
function checkBlogJobFinished()
{
    if ssh $HOST 'ls "'$PIDFILE'" >/dev/null'; then
        return 202;
    else
        return 0;
    fi
}

checkBlogJobFinished
errorCode=$?
numChecks=0
# time to sleep in seconds, 7200seconds = 2 hours
SLEEPTIME=7200
while [ $errorCode -eq 202 ]
do
    numChecks=$(( $numChecks + 1 ))
    echo "`date +%r`: Check $numChecks: job still running, going to sleep for $SLEEPTIME seconds" >> $LOGFILE
    sleep $SLEEPTIME
    checkBlogJobFinished
    errorCode=$?
done

# If we're here then the blog job has finished, time to get the blog xml files

########################################
# Backup Site Directory - files        #
########################################

# remote blog folder is of format: week{currentWeekNo_currentYear}
remoteBlogFolder=/home/java/extractor/blogs/week`date +%V_%Y`
localBlogFolder=/home/java/backup/mecca/blogs

if [ ! -e $localBlogFolder ]
then
    mkdir -p $localBlogFolder
fi

echo "`date +%r`: Starting retreival of $remoteBlogFolder" >> $LOGFILE
rsync -avz -e "ssh -i /home/java/cron/hossbox-rsync-key-java" java@$HOST:$remoteBlogFolder $localBlogFolder
echo "`date +%r`: Ending retreival of $remoteBlogFolder" >> $LOGFILE

currentWeek=`date +%V`
let previousWeek=$currentWeek-1

oldBackupFolder=/home/java/backup/telex/blogs/week$previousWeek

# remove old backup
if [ -e $oldBackupFolder ]
then
    rm -rf $oldBackupFolder
fi

endTime=`date`
echo $endTime ": Ending blog backup" >> $LOGFILE

This script sleeps for 2 hours if a blog extraction job is running on the remote machine. It sleeps for 10 minutes if the remote machine isn't responding.

Monday, July 27, 2009

Accessing Oracle's Web Interface (Oracle Enterprise Manager)

I wanted to access the Oracle Web Interface for administering the database on a Cent OS system. However, I hadn't performed this oracle installation myself so I started by doing:

netstat -a | more

And looking carefully through the list to see if I could spot it but I couldn't!

Eventually I found the answer here. There is a file which contains the Oracle Enterprise Manager URL for each database installed and that file's location is:

$ORACLE_HOME/install/readme.txt

For example:
/home/oracle/app/oracle/product/11.1.0/db_1/install

Here's what mine looked like:
Enterprise Manager Database Control URL - (orcl) :
https://localhost:1158/em

Enterprise Manager Database Control URL - (bbb) :
https://localhost:5501/em

Enterprise Manager Database Control URL - (aaa) :
https://localhost:5500/em

And there you have it! Enjoy!

Monday, June 15, 2009

nmefwmi.exe stopped working and was closed

I installed Oracle 11g last week on my laptop (Windows Vista Business Edition) and had no issues except a reduction in my machine's performance.

However yeseterday windows update wanted to install some updates and one of which was Service Pack 2 which I let it install. Ever since then every 5 minutes I get this error message in a popup:

nmefwmi.exe stopped working and was closed


After doing some searching this is apparently a bug in Oracle 11g that is yet to be resolved by Oracle. I found hearing that strange since the problem only started occuring for me after a windows update.

I found this answer which explains how to fix the issue:

* nmefwimi.exe is Oracle Enterprise Manager process and it is not critical in the sense what when it stops working it will not affect the database.
* nmefwmi.exe process is associated with OracleDBConsoleorcl service.
* Go to Administrative Tools -> Services, stop the service and set the startup type to "Manual".
* When you need to use dbconsole, start the service manually, ignore the error, do what you have to do, and stop it again.

Sunday, May 10, 2009

Update & Documentation Submitted

[Week 31]

These past two weeks I've been very busy with the project and finishing off continuous assessment projects.

I started by looking at my method for generating the JTree. While taking Martin's comments on board I came up with a new method for constructing the tree correctly. This was great as I could then produce correct XPath expressions.

I moved onto to integrating Martin's code for querying. I learned about the SQL packages and classes that come with Java. More specifically which object to instantiate for passing an SQL statement, sending that to the database and collecting the results. This works well now and was a big milestone as I had then achieved all basic functionality with the project.

The meeting with Mark on Thursday was good as he gave some good suggestions on how to improve on what I had done. They were:
- Show before and after times (how my querying performs over eXist)
- Introduce the ability to specify a predicate on a node
- Introduce support for more datasets

I have managed to get basic predicates working. So a user may select a node, e.g. name and actually specify a name.

Martin provided me with lots more datasets. All XML files so I needed to write the schemas for these. I managed to complete this today. I may need to look into support attributes.

Submitted my Technical Specification, User Manual and Sample Code on Friday so good to get all that out of the way. I forgot to attach a print out of this blog, hopefully that will not be a problem. I'll contact GK tomorrow.

That's about it for now. It's time to focus on exams!

Sunday, May 3, 2009

Update on progress with XSOM

[Week 29]

I managed to parse some XML schema files with XSOM, produce a tree and XPath expressions this week so decided it was good time to meet with MOC again.

He informed me that the tree I was producing was not fully correct for the XML schema I was using. Therefore I need to look at my parsing method again and adapt it correctly. If the tree is incorrect then it will produce incorrect XPath expressions. Therefore it is critical that I get this method correct.

We did discuss the next stages in detail and Martin has written code to insert XML documents into a relational database in a specialised way. He also has code to query the relational database. As part of my project specification I do not insert any data into a relational database. I do, however query it. Therefore I will use his Index Builder program to insert some XML documents into the database and integrate his query program with mine so that the XPath expressions produced from my program can be used to query the data.

I have arranged a meeting with MR for Thursday this coming week to go over the project so my next post will discuss how the integration of Martin's code went and the outcome of the meeting with MR.