#!/usr/bin/env python # asn2deb - quick hack by W. Borgert to create # Debian GNU/Linux packages from ASN.1 files for Wireshark. # Copyright 2004, W. Borgert # ASN.1 module for Wireshark, use of snacc type table: # Copyright 2003, Matthijs Melchior # # Wireshark - Network traffic analyzer # By Gerald Combs # Copyright 1998 Gerald Combs # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import getopt, os, string, sys, time scriptinfo = """asn2deb version 2004-02-17 Copyright 2004, W. Borgert Free software, released under the terms of the GPL.""" options = {'asn': None, 'dbopts': "", 'email': "invalid@invalid.invalid", 'help': 0, 'name': "No Name", 'preserve': 0, 'version': 0} def bootstrap(): """Generate Makefile.in and configure script.""" os.system("aclocal-1.7") os.system("autoconf") os.system("automake-1.7 --add-missing --copy --foreign") def create_file(filename, content, mode = None): """Create a file with given content.""" global options if options['preserve'] and os.path.isfile(filename): return f = open(filename, 'w') f.write(content) f.close() if mode: os.chmod(filename, mode) def create_files(version, deb, email, asn, name, iso, rfc): """Create all files for the .deb build process.""" base = asn.lower()[:-5] create_file("Makefile.am", """# BUILT_SOURCES = %s.tt asn1ttdir = $(datadir)/wireshark/asn1 asn1tt_DATA = %s.tt %s.tt: """ % ((base,) * 3) + asn + """ snacc -u /usr/include/snacc/asn1/asn-useful.asn1 -T $@ $< """) create_file("configure.ac", """AC_INIT(%s, 1.0) AM_INIT_AUTOMAKE AM_MAINTAINER_MODE AC_PROG_INSTALL SNACC=\"`type -p snacc`\" AC_SUBST(SNACC) dnl WIRESHARK_VERSION=\"%s\" dnl plugindir=\"$prefix/share/wireshark/asn.1\" dnl AC_SUBST(plugindir) AC_OUTPUT([Makefile]) """ % (base, version)) if not os.path.isdir("debian"): os.mkdir("debian") create_file("debian/rules", """#!/usr/bin/make -f include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/autotools.mk PREFIX=`pwd`/debian/wireshark-asn1-%s binary-post-install/wireshark-asn1-%s:: rm -f $(PREFIX)/usr/lib/wireshark/plugins/%s/*.a """ % (base, base, version), 0755) create_file("debian/control", """Source: wireshark-asn1-%s Section: net Priority: optional Maintainer: %s <%s> Standards-Version: 3.6.1.0 Build-Depends: snacc, autotools-dev, debhelper, cdbs Package: wireshark-asn1-%s Architecture: all Depends: wireshark (= %s) Description: ASN.1/BER dissector for %s This package provides a type table for decoding BER (Basic Encoding Rules) data over TCP or UDP, described by an ASN.1 (Abstract Syntax Notation 1) file '%s.asn1'. """ % (base, name, email, base, deb, base, base)) create_file("debian/changelog", """wireshark-asn1-%s (0.0.1-1) unstable; urgency=low * Automatically created package. -- %s <%s> %s """ % (base, name, email, rfc + "\n (" + iso + ")")) create_file("debian/copyright", """This package has been created automatically be asn2deb on %s for Debian GNU/Linux. Wireshark: http://www.wireshark.com/ Copyright: GPL, as evidenced by existence of GPL license file \"COPYING\". (the GNU GPL may be viewed on Debian systems in /usr/share/common-licenses/GPL) """ % (iso)) def get_wrs_version(): """Detect version of wireshark-dev package.""" deb = os.popen( "dpkg-query -W --showformat='${Version}' wireshark-dev").read() debv = string.find(deb, "-") if debv == -1: debv = len(deb) version = deb[string.find(deb, ":")+1:debv] return version, deb def get_time(): """Detect current time and return ISO and RFC time string.""" currenttime = time.gmtime() return time.strftime("%Y-%m-%d %H:%M:%S +0000", currenttime), \ time.strftime("%a, %d %b %Y %H:%M:%S +0000", currenttime) def main(): global options process_opts(sys.argv) iso, rfc = get_time() version, deb = get_wrs_version() create_files(version, deb, options['email'], options['asn'], options['name'], iso, rfc) bootstrap() os.system("dpkg-buildpackage " + options['dbopts']) def process_opts(argv): """Process command line options.""" global options try: opts, args = getopt.getopt(argv[1:], "a:d:e:hn:pv", ["asn=", "dbopts=", "email=", "help", "name=", "preserve", "version"]) except getopt.GetoptError: usage(argv[0]) sys.exit(1) for o, a in opts: if o in ("-a", "--asn"): options['asn'] = a if o in ("-d", "--dbopts"): options['dbopts'] = a if o in ("-e", "--email"): options['email'] = a if o in ("-h", "--help"): options['help'] = 1 if o in ("-n", "--name"): options['name'] = a if o in ("-p", "--preserve"): options['preserve'] = 1 if o in ("-v", "--version"): options['version'] = 1 if options['help']: usage(argv[0]) sys.exit(0) if options['version']: print scriptinfo sys.exit(0) if not options['asn']: print "mandatory ASN.1 file parameter missing" sys.exit(1) if not os.access(options['asn'], os.R_OK): print "ASN.1 file not accessible" sys.exit(1) def usage(name): """Print usage help.""" print "Usage: " + name + " \n" + \ "Parameters are\n" + \ " --asn -a asn1file, ASN.1 file to use (mandatory)\n" + \ " --dbopts -d opts, options for dpkg-buildpackage\n" + \ " --email -e address, use e-mail address\n" + \ " --help -h, print help and exit\n" + \ " --name -n name, use user name\n" + \ " --preserve -p, do not overwrite files\n" + \ " --version -v, print version and exit\n" + \ "Example:\n" + \ name + " -e me@foo.net -a bar.asn1 -n \"My Name\" " + \ "-d \"-rfakeroot -uc -us\"" if __name__ == '__main__': main()