" />

mikerochford.com Being technical

23Jul/090

Changing the I/O timeout on your SCSI disk

Changing your I/O timeout for your SCSI disks are rare. When you are running VMWare that houses the guest OS on a NFS/SAN mount you need to change the timeout. If you dont you will run into a mess with your guest OS. You will try running a snapshot and browsing your file system and bam its locks up. Below is what you need to change in your udev rules to change it.

Location: /etc/udev/rules.d/50-udev-default.rules


SUBSYSTEM=="scsi" , SYSFS{type}=="0|7|14", RUN+="/bin/sh -c 'echo 60 > /sys/block/sda/device/timeout'"
SUBSYSTEM=="scsi" , SYSFS{type}=="0|7|14", RUN+="/bin/sh -c 'echo 190 > /sys/block/sda/device/timeout'"
SUBSYSTEM=="scsi" , SYSFS{type}=="1", RUN+="/bin/sh -c 'echo 900 > /sys/block/sda/device/timeout'"

Tagged as: , No Comments
27May/090

Connecting to a machine using sockets

I work with a api system that connects on a high port. My co-work Matt came up with a great way to set the socket up and verify if the socket isn't stale. This sub-routine is specific to the api but you can use the theory and apply it to pretty much your socket needs.

sub cp_connect {
     ###############
     #
     # This function connects to a cp server
     #
     # Accepts:
     # $remote_host The server to connect to
     # $remote_port The port to connect to
     #
     # Returns:
     # A critical Path mail server socket connection.
     #
     ###############

     my $remote_host = shift;
     my $remote_port = shift;
     my $remote_password = shift;
     my $remote_conneciton_type = shift;
     my $EOL = shift;

     if($remote_conneciton_type =~ m/^rw$/){
          $remote_password = $remote_password ." write";
     }
     
     my $socket = IO::Socket::INET->new(
          PeerAddr => $remote_host,
          PeerPort        => $remote_port,
          Proto           => "tcp",
          Type            => SOCK_STREAM,
          Timeout         => 5 )
          || die "Couldn't open socket!\n\n";

     my $answer = <$socket>;
     print $socket "LOGIN $remote_password" . $EOL;
     $answer = <$socket>;
     if ($answer !~ /^OK/) {
          print "Failed to login to $remote_host : $remote_port : $answer\n\n";
          exit(1);
     }
     return $socket;
}
 

Once you have the understanding of how the sub-routine works. Building a script that interacts with the api is a piece of cake.

Here is an example of how we use the sub-routine in a script. This example will check to see if the socket is defined, if not it will try to connect and define the socket. Once the socket is defined it will issue a command and read the socket.

if(!defined $socket) {
    $socket = cp_connect($remote_host, $remote_port, $remote_rwpass,"rw",$EOL);
}
print $socket "DOMAIN ENUMERATE". $EOL;
while (defined (chomp($answer = <$socket>))){
    if($answer =~ /\*\s+(.+)\s/) {
        $domains{$1}{'users'} = ();
    }
    elsif($answer =~ /^ERROR/){
        $error = $answer;
        return 0;
        last;
    }
    elsif($answer =~ /OK/) {
        return 1;
        last;
    }
}
 
27May/090

sub-routine: gettime();

Over the years working as a systems administrator I have a large sub-routine collection on my belt. One that I use quite frequently is gettime();. This is a simple routine someone in my group wrote to return a nicely formatted timestamp. It is use mostly for logging and such.

sub gettime () {
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
    $year += 1900;
    $mon += 1;
    my $retval = sprintf("$year\-%02d\-%02d %02d:%02d:%02d",$mon,$mday,$hour,$min,$sec);
    return $retval;
}
 

Example:

#!/usr/bin/perl
print gettime(),"\n";
 

returns:

2009-05-27 07:18:43
 
26May/091

Hiding your STDIN

Ever write a script that you have to enter a elevated users password? or even your own? Check this out.

#!/usr/bin/perl
use Term::ReadKey;
print "Please enter your username: ";
chomp(my $username = <STDIN>);
print "Please enter your password for $username: ";
ReadMode('noecho');
chomp(my $password = ReadLine(0));
ReadMode('normal');

#for example only. You shouldn't print this...
print "\nYou entered $username for a username and $password for a password!!\n";
 

Using Term:ReadKey you can disable echo for STDOUT. This way no one will see your password from over your shoulder.

Tagged as: , 1 Comment
26May/090

Accessing gallery2 using the API to return information about a gallery

I designed a website for a friend to sell a litter of puppies. He wanted a simple site that had galleries for each dog and one for the litter. I didn't want to maintain the site at all so I used a lot of pre built software. I chose to use Gallery2 to do all the picture stuff. It did everything I wanted (resize,rotate,etc). I didn't like how it looked though. I wanted to just have it do the back end stuff and I wanted to design the layout. To do this all I needed was the urls to access the images. Below is a function I wrote that will output all the information of a picture and its uri.

The script is located here

which outputs:

Array
(
    [0] => Array
        (
            [title] => IMG_0028.JPG
            [width] => 2272
            [height] => 1704
            [large_picture] => /p/d/71-1/IMG_0028.JPG
            [thumb_picture] => /p/d/72-2/IMG_0028.JPG
            [resized_picture] => Array
                (
                    [0] => /p/d/73-2/IMG_0028.JPG
                    [1] => /p/d/74-2/IMG_0028.JPG
                    [2] => /p/d/75-2/IMG_0028.JPG
                )

        )

    [1] => Array
        (
            [title] => IMG_0029.JPG
            [width] => 2272
            [height] => 1704
            [large_picture] => /p/d/77-1/IMG_0029.JPG
            [thumb_picture] => /p/d/78-2/IMG_0029.JPG
            [resized_picture] => Array
                (
                    [0] => /p/d/79-2/IMG_0029.JPG
                    [1] => /p/d/80-2/IMG_0029.JPG
                    [2] => /p/d/81-2/IMG_0029.JPG
                )

        )
)

You will need to modify the paths in the function to your installation.

A side note... To find gallery ids you will need to to run the following query.

mysql> SELECT g2_id,g2_title FROM g2_Item WHERE g2_canContainChildren=1;
26May/090

Howto access an array that is in a hash

Say you have a hash element that contains an array and you want to loop through the array set. You usually have these types of data sets when you are trying to gather data.

example:
We will use the following code to build the hash:

#!/usr/bin/perl
use Data::Dumper;
my %data_set;
$data_set{'users'} = ();
$data_set{'users'}[0] = "testA";
$data_set{'users'}[1] = "testB";
$data_set{'users'}[2] = "testC";
$data_set{'users'}[3] = "testD";
$data_set{'users'}[4] = "testE";
$data_set{'users'}[5] = "testF";
print Dumper(%data_set);

Output:

$VAR1 = 'users';
$VAR2 = [
'testA',
'testB',
'testC',
'testD'
];

Now that we know the hash element is populated we want to access each array element. This can be done with making some crazy counter in a while loop. Check it out.

foreach my $user (@{$data_set{'users'}}){
print $user,"\n";
}

Now knowing you can access a array with in a hash using @{} you can push,pop,splice and shift on the array that is in a hash.

Here is the same script above but using push:

#!/usr/bin/perl
use Data::Dumper;
my %data_set;
$data_set{'users'} = ();
push(@{$data_set{'users'}},"testA");
push(@{$data_set{'users'}},"testB");
push(@{$data_set{'users'}},"testC");
push(@{$data_set{'users'}},"testD");

foreach my $user (@{$data_set{'users'}}){
print $user,"\n";
}

26May/090

Howto push a hash onto an array

This information was giving to me by my friend Matt
use Data::Dumper;
my @array;
push @array, {'key1' => 'value1', 'key2' => 'value2'};
push @array, {'key1' => 'value1', 'key2' => 'value2'};
push @array, {'key1' => 'value1', 'key2' => 'value2'};
print Dumper(@array);

Will give you:

$VAR1 = {
'key2' => 'value2',
'key1' => 'value1'
};
$VAR2 = {
'key2' => 'value2',
'key1' => 'value1'
};
$VAR3 = {
'key2' => 'value2',
'key1' => 'value1'
};

26May/090

Finding a hostheader in IIS using Perl and Win32::OLE

There is no easy way to find a host header in IIS. Unless you think clicking on each site is easy. I have found it difficult to find them in large installations. I wrote a script that will go through each site on the server and look at the host headers and then if found it will print the Site comment. You then use the site comment to find the main site in the MMC.

Here is the script.

26May/090

Changing all directory paths in Microsoft IIS/Active Directory using perl and WIN32::OLE

I was put in charge of a filer migration from a old netapp f810 to a new netapp 3040 cluster. One of the systems we have that used the netapp backend was a web cluster running MS Windows 2003. When it was first built it was using a cifs shares by system name (ie: \\f810..tld\customer-home). This is great if you never changed filers but a poor idea on our part. In theory you could have just changed the record to point at the new filer, but that was a temporary fix. We wanted to change the path completely to a arbitrary name like "web". This will allow us to change it to any back end device no matter what it is. I like to do things programmaticly so below are the two scripts I used to get the job done. You will need to modify these script to fit your needs (ie: Paths).

Bulk IIS path change script: Link

Bulk Active Directory change script: Link

26May/090

Making your own ringtones for your Iphone (mp3 to m4r)

I have done much searching on the internet on how to convert mp3 files to Itunes m4r files. I really dont like using Itunes if I dont have to so I thought I would write something that will use my unix box.

This perl script will convert most mp3s to m4r.

I used 4 applications that can be installed on any GNU based system.

  • mp3info - An MP3 technical info viewer and ID3 1.x tag editor
  • mp3splt - Mp3Splt-project is a utility to split mp3 and ogg files selecting a begin and an end time position, without decoding.
  • Mplayer
  • Faac - FAAC is an open source MPEG-4 and MPEG-2 AAC encoder, it is licensed under the LGPL license.

or if you are running debian/ubuntu:

apt-get install mp3info mp3splt mplayer faac