I had to install subversion on a couple HP-UX boxes. Fortunately, there's an HP-UX software archive out there with precompiled versions of lots of software. Unfortunately, dependency resolution is like the bad old days of 1997: entirely manual. And there's fifteen or so dependencies for subversion.
So, I wrote a script to parse the dependencies and download the packages automatically. It requires Python -- which you can install from the archive with just the Python package and the Db package -- and BeautifulSoup, which you can google for. Usage is
hpuxinstaller <archive package url> <package name> [e.g., hpuxinstaller http://hpux.cs.utah.edu/hppd/hpux/Development/Tools/subversion-1.4.4/ subversion] [wait for packages to download] gunzip *.gz [paste in conveniently given swinstall commands]
Here is the script:
#!/usr/local/bin/python
import urlparse, urllib2, sys, os
from subprocess import Popen, PIPE
from BeautifulSoup import BeautifulSoup
required = {}
if not os.path.exists('cache'):
os.mkdir('cache')
def getcachedpage(url):
fname = 'cache/' + url.replace('/', '-')
try:
page = file(fname).read()
except IOError:
print 'fetching ' + url
page = urllib2.urlopen(url).read()
file(fname, 'wb').write(page)
return page
def dependencies(url):
scheme, netloc, _, _, _, _ = urlparse.urlparse(url)
soup = BeautifulSoup(getcachedpage(url))
text = soup.find('td', text='Run-time dependencies:')
if not text:
return
tr = text.parent.parent
td = tr.findAll('td')[1]
for a in td.findAll('a'):
yield (a.contents[0], '%s://%s%s' % (scheme, netloc, a['href']))
def add(name, url):
required[name] = url
for depname, depurl in dependencies(url):
if depname in required:
continue
print "%s requires %s" % (name, depname)
required[depname] = depurl
add(depname, depurl)
def download(full_url):
print 'downloading ' + full_url
_, _, path, _, _, _ = urlparse.urlparse(full_url)
fname = os.path.basename(path)
f = file(fname, 'wb')
def chunkify_to_eof(stream, chunksize=64*1024):
while True:
data = stream.read(chunksize)
if not data:
break
yield data
for chunk in chunkify_to_eof(urllib2.urlopen(full_url)):
f.write(chunk)
# Compute dependencies before checking for installed files, since swinstall
# can let a package be installed w/o its dependencies. If there are such
# packages installed we don't want to skip their [missing] dependencies.
add(sys.argv[2], sys.argv[1])
try:
p = Popen(['swlist'], stdout=PIPE)
except:
print 'Warning: unable to list installed packages'
installed = {}
else:
installed = set(line.strip().split()[0] for line in p.stdout if line.strip())
to_install = []
for name, url in required.iteritems():
if name in installed:
print name + ' is already installed'
continue
full_url = '%s%s-ia64-11.23.depot.gz' % (url.replace('/hppd/', '/ftp/'), url.split('/')[-2])
to_install.append(os.path.basename(full_url))
download(full_url)
if to_install:
print "\nAfter gunzip, run:"
for fname in to_install:
print "swinstall -s %s/%s %s" % (os.getcwd(), fname[:-3], fname.split('-')[0])
else:
print 'Everything is already installed'
Comments
http://forums11.itrc.hp.com/service/forums/familyhome.do?familyId=117
incidentally - swinstall is quite capable of checking for dependencies durng install - its just those that build the packages for the software porting & archive centre don't bother with this. anything that comes direct from HP generally does check dependencies...
Download From:
http://hpux.connect.org.uk/hppd/hpux/Sysadmin/depothelper-2.00/
Usages:
Install: # depothelper wget
Un-Install: # depothelper -u wget
Only List Dependencies: # depothelper -l wget
Thnk!
Shirish Shukla
Learn & Implement !!