package javaforce.utils; /** jpkginfo * * Generates Linux package info files. * * debian : deb/control * fedora : rpm.spec * arch : .PKGINFO * * @author pquiring */ import java.io.*; import java.util.*; import javaforce.*; public class jpkginfo { private static void error(String msg) { System.out.print(msg); System.exit(1); } private static XML xml; private static String app, desc, archtype, ver; private static long size; //in bytes public static void main(String args[]) { if (args == null || args.length < 3) { System.out.println("jpkginfo : build linux package info files"); System.out.println(" Usage : jpkginfo distro archtype files.list"); System.out.println(" distro = debian fedora arch"); System.out.println(" archtype = x32 x64 a32 a64"); System.exit(1); } String distro = args[0]; archtype = args[1]; size = calcSize(args[2]); //load build.xml and extract app , desc , etc. xml = loadXML(); app = getProperty("app"); desc = getTag("description"); ver = getProperty("version"); switch (distro) { case "debian": debian(); break; case "fedora": fedora(); break; case "arch": arch(); break; default: error("Unknown distro:" + distro); } } private static long calcSize(String files_list) { try { String files[] = new String(JF.readAll(new FileInputStream(files_list))).replaceAll("\r", "").split("\n"); long size = 0; for(int a=0;a<files.length;a++) { size += new File(files[a]).length(); } return size; } catch (Exception e) { e.printStackTrace(); System.exit(1); return -1; } } private static XML loadXML() { XML xml = new XML(); try { xml.read(new FileInputStream("build.xml")); return xml; } catch (Exception e) { e.printStackTrace(); System.exit(1); } return null; } private static String getTag(String name) { XML.XMLTag tag = xml.getTag(new String[] {"project", name}); if (tag == null) return ""; return tag.content; } private static String getProperty(String name) { //<project> <property name="name" value="value"> int cnt = xml.root.getChildCount(); for(int a=0;a<cnt;a++) { XML.XMLTag tag = xml.root.getChildAt(a); if (!tag.name.equals("property")) continue; int attrs = tag.attrs.size(); String attrName = null; String attrValue = null; for(int b=0;b<attrs;b++) { XML.XMLAttr attr = tag.attrs.get(b); if (attr.name.equals("name")) { attrName = attr.value; } if (attr.name.equals("value")) { attrValue = attr.value; } } if (attrName != null && attrName.equals(name)) { return attrValue; } } return ""; } private static String[] getDepends(String tagName) { ArrayList<String> depends = new ArrayList<String>(); String list[] = getProperty(tagName).split(","); if (!app.equals("javaforce")) depends.add("javaforce"); for(int a=0;a<list.length;a++) { String depend = list[a].trim(); if (depend.length() == 0) continue; depends.add(depend); } return depends.toArray(new String[0]); } private static void debian() { try { StringBuffer sb = new StringBuffer(); //mandatory sb.append("Package: " + app + "\n"); sb.append("Version: " + ver + "\n"); sb.append("Architecture: "); switch (archtype) { case "any": sb.append("noarch"); break; case "x32": sb.append("i386"); break; case "x64": sb.append("amd64"); break; case "a32": sb.append("armhf"); break; case "a64": sb.append("aarch64"); break; } sb.append("\n"); sb.append("Description: " + desc + "\n"); sb.append("Maintainer: Peter Quiring <pquiring@gmail.com>\n"); //optional sb.append("Installed-Size: " + Long.toString(size / 1024L) + "\n"); sb.append("Depends: "); String depends[] = getDepends("debian.depends"); for(int a=0;a<depends.length;a++) { if (a > 0) sb.append(","); sb.append(depends[a]); } sb.append("\n"); new File("deb").mkdir(); { FileOutputStream fos = new FileOutputStream("deb/control"); fos.write(sb.toString().getBytes()); fos.close(); } //generate deb/postinst if not present if (!new File("deb/postinst").exists()) { FileOutputStream fos = new FileOutputStream("deb/postinst"); fos.write("#!/bin/sh\nset -e\nupdate-desktop-database\n".getBytes()); fos.close(); } //generate deb/postrm if not present if (!new File("deb/postrm").exists()) { FileOutputStream fos = new FileOutputStream("deb/postrm"); fos.write("#!/bin/sh\nset -e\nupdate-desktop-database\n".getBytes()); fos.close(); } System.out.println("Debian package info created"); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } private static void fedora() { try { StringBuffer sb = new StringBuffer(); sb.append("Buildroot: /.\n"); sb.append("Name: " + app + "\n"); sb.append("Version: " + ver + "\n"); sb.append("Release: 1\n"); sb.append("License: LGPL\n"); /* sb.append("Architecture: "); switch (archtype) { case "any": sb.append("noarch"); break; case "x32": sb.append("i686"); break; case "x64": sb.append("x86_64"); break; case "a32": sb.append("armv7hl"); break; case "a64": sb.append("aarch64"); break; } sb.append("\n"); */ sb.append("Summary: " + desc + "\n"); sb.append("Requires: "); String depends[] = getDepends("fedora.depends"); for(int a=0;a<depends.length;a++) { if (a > 0) sb.append(","); sb.append(depends[a]); } sb.append("\n"); sb.append("%description\n " + desc + "\n"); sb.append("%post\n"); sb.append("#!/bin/sh\n"); sb.append("set -e\n"); sb.append("update-desktop-database\n"); sb.append("%pre\n"); sb.append("#!/bin/sh\n"); sb.append("set -e\n"); sb.append("update-desktop-database\n"); sb.append("%files\n"); //files.lst is added by jfrpm FileOutputStream fos = new FileOutputStream("rpm.spec"); fos.write(sb.toString().getBytes()); fos.close(); System.out.println("Fedora package info created"); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } private static void arch() { try { StringBuffer sb = new StringBuffer(); sb.append("pkgname = " + app + "\n"); sb.append("pkgver = " + ver + "-1\n"); sb.append("pkgdesc = " + desc + "\n"); sb.append("builddate = " + Long.toString(Calendar.getInstance().getTimeInMillis() / 1000L) + "\n"); sb.append("packager = Peter Quiring <pquiring@gmail.com>\n"); sb.append("size = " + size + "\n"); sb.append("license = LGPL\n"); sb.append("arch = "); switch (archtype) { case "any": sb.append("any"); break; case "x32": sb.append("i686"); break; case "x64": sb.append("x86_64"); break; case "a32": sb.append("arm"); break; case "a64": sb.append("aarch64"); break; } sb.append("\n"); String depends[] = getDepends("arch.depends"); for(int a=0;a<depends.length;a++) { sb.append("depend = "); sb.append(depends[a]); sb.append("\n"); } FileOutputStream fos = new FileOutputStream(".PKGINFO"); fos.write(sb.toString().getBytes()); fos.close(); System.out.println("Arch package info created"); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } }