Merge branch 'erp5-component' into erp5
[slapos.git] / component / rpm2cpio / rpm2cpio
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 #
4 # Standalone RPM to CPIO converter
5 # Copyright (c) 2012 Rudá Moura
6 #
7
8 '''Extract cpio archive from RPM package.
9
10 rpm2cpio converts the RPM on standard input or first parameter to a CPIO archive on standard output.
11
12 Usage:
13 rpm2cpio < adjtimex-1.20-2.1.i386.rpm  | cpio -it
14 ./sbin/adjtimex
15 ./usr/share/doc/adjtimex-1.20
16 ./usr/share/doc/adjtimex-1.20/COPYING
17 ./usr/share/doc/adjtimex-1.20/COPYRIGHT
18 ./usr/share/doc/adjtimex-1.20/README
19 ./usr/share/man/man8/adjtimex.8.gz
20 133 blocks
21 '''
22
23 import sys
24 import StringIO
25 import gzip
26
27 RPM_MAGIC = '\xed\xab\xee\xdb'
28 GZIP_MAGIC = '\x1f\x8b'
29
30 def rpm2cpio(stream_in=sys.stdin, stream_out=sys.stdout):
31     lead = stream_in.read(96)
32     if lead[0:4] != RPM_MAGIC:
33         raise IOError, 'the input is not a RPM package'
34     data = stream_in.read()
35     idx = data.find(GZIP_MAGIC)
36     if idx == -1:
37         raise IOError, 'could not find compressed cpio archive'
38     gzstream = StringIO.StringIO(data[idx:])
39     gzipper = gzip.GzipFile(fileobj=gzstream)
40     data = gzipper.read()
41     stream_out.write(data)
42     
43 if __name__ == '__main__':
44     if sys.argv[1:]:
45         try:
46             fin = open(sys.argv[1])
47             rpm2cpio(fin)
48             fin.close()
49         except IOError, e:
50             print 'Error:', sys.argv[1], e
51     else:
52         try:
53             rpm2cpio()
54         except IOError, e:
55             print 'Error:', e