Friday, May 30, 2008

Parsing the Download Manager file

When using the Download Director from IBM, a file is created called dlmgr.pro. This file is created in the directory that you download your files to. I have often found it annoying with the naming convention of files that I download to determine what a file is after I have downloaded it and left it for a while. I found that the dlmgr.pro file does contain pretty much all the info needed to identify the file information. So I thought I would create a quick perl script to parse the file. It is not the prettiest script, but it does what I need.

The script requires the path and file name to the dlmgr.pro file as an argument, and then creates a file called dlmgr.csv in the current directory.

Click here to download

6 comments:

Robert said...

Hi,

There might be a bit of a bug - line 7 is missing a closing semi-colon.

Even after fixing that, it hasn't created the csv file in my directory :(

Great idea though!

Martin Carnegie said...

Hi Robert,

Thanks for pointing that out. I guess when I cleaned up some stuff, I forgot to test it again. That will teach me to whip up a quick script ;)

It is fixed now.

Enjoy

Robert said...

Nice!

How about a MDL for an Universal Agent which monitors my download directory?

:)

Robert said...

I know I'm beating a dead horse, but:
1. I really like this script
2. More people should be leaving comments on this blog ;)

The titles of the files sometimes have commas in them - messing up the csv.
I added this line just before printing to fix that:

$filelist{$dlmgr_file}{title} = ~s/,/;/g;

Martin Carnegie said...

Hi Robert,

Interesting, I guess I was lucky enough not to download one with a comma in the name. Of course that is something that I should have anticipated ;)

Anyway, I have added that to the file available for download.

Thanks again for the feedback.

Jim Sander said...

I wrote a similar script last year out of the same frustration.

I wanted the files renamed such that they were abbreviated, yet maintained the product code and version info.

Its more "intrusive" because it actually renames the files, but a simple hack can take care of that.

jdsmedia@deantp1 /cygdrive/c/DownloadDirector
$ ls
C473DIE.exe dlmgr.pro

jdsmedia@deantp1 /cygdrive/c/DownloadDirector
$ cat dlmgr.pro
prompt=false
dir=C:\DownloadDirector
unpackDir=C:\DownloadDirector
family=esdDownloadV2
.file=C473DIE
..title=IBM Tivoli Enterprise Console (TME New Installations) V3.8 Multi
..size=511275008
..sha=A1F6199791CF3919CCFE6D32666730061B9CA38F
..stat=1
..name=C473DIE.exe
..path=C:\DownloadDirector
..crc=3361542140
..date=1032401529
.allFiles=false
.srvURL=http://www16.software.ibm.com/tqd

jdsmedia@deantp1 /cygdrive/c/DownloadDirector
$ /usr/local/bin/parse_ddpro.pl
PWD is /cygdrive/c/DownloadDirector
mv C473DIE.exe IBM_Tivoli_Enterprise_Console_TME_New_Installations_V3_8_Multi_C4
73DIE.exe

-- < snip > --
#!/usr/bin/env perl
#
# Written by Jim Sander (dev@jdsmedia.net)
#
# Rename the files created by Download Director
# to something meaningful

%subtext = (
'IBM Tivoli Provisioning Manager','ITPM',
'Intelligent Orchestrator and Provisioning Manager', 'IOandPM',
'Software','SW',
'Inventory','INV',
'IBM Tivoli Intelligent ThinkDynamic Orchestrator','IntellThinkDynOrch',

'IBM Tivoli Monitoring','ITM',
'Netcool_OMNIbus','NC_OMNI',
'Netccol_OMNIbus','NC_OMNI',
);

printf("PWD is $ENV{PWD}\n");
#chdir($ENV{PWD});
die("No File found for $ARGV[0]\n") if ($ARGV[0] && ! -f $ARGV[0]);
$defpro = ($ARGV[0])?$ARGV[0]:"dlmgr.pro";
open(PRO, "< $defpro") || die("Can't open $defpro : $!");

while (<PRO>){
s/^\.+//;
chomp;
($left,$right)=split('=');
if ($left =~ /file/){
push(@cmds, sprintf("mv %s %s_%s.%s\n",
$stanza{$file}{name},
$stanza{$file}{title},
$file,
$stanza{$file}{suffix})) if ($file);
$file = $right;
next;
}
next unless ($file =~ /\S+/);

if ($left =~ /title/){
foreach $string (keys %subtext){
$right =~ s/$string/$subtext{$string}/g;
}
$stanza{$file}{title} = $right;
$stanza{$file}{title} =~ s/\s+$//;
$stanza{$file}{title} =~ s/^\s+//;
$stanza{$file}{title} =~ s/\s/_/g;
$stanza{$file}{title} =~ s/[\\\/\.]/_/g;
$stanza{$file}{title} =~ s/[:\(\),]/_/g;
$stanza{$file}{title} =~ s/__/_/g;

}elsif ($left =~ /name/){
$stanza{$file}{name} = $right;
$stanza{$file}{suffix} = $1 if ($right =~ /\.(\S+)$/);
}

}

push(@cmds, sprintf("mv %s %s_%s.%s\n",
$stanza{$file}{name},
$stanza{$file}{title},
$file,
$stanza{$file}{suffix})) if ($file);

foreach (@cmds) {
printf;
system("$_");
}
-- < /snip > --