/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2007-2008 Sun Microsystems, Inc. */ package org.opends.build.tools; import org.apache.tools.ant.Task; import org.apache.tools.ant.BuildException; import static org.opends.build.tools.Utilities.*; import java.io.File; import java.io.PrintWriter; /** * Generates an RPM spec file. */ public class GenerateRpm extends Task { private File topDir; private String topDirAbsolutePath; private String sourceDirName; private File destFile; private String prefix; private String version; private String release; private boolean overwrite; private StringBuilder sb; private final String filePrefix="%{_prefix}"; private final String dirPrefix="%dir %{_prefix}"; /** * Sets the top directory for the rpm build. * @param topDir File representing top directory for rpm build directory */ public void setTopDir(File topDir) { this.topDir = topDir; topDirAbsolutePath = topDir.getAbsolutePath(); } /** * Sets the prefix for the RPM. * @param prefix Used for package relocation */ public void setPrefix(String prefix) { this.prefix = prefix; } /** * Sets the name of the source directory. * @param sourceDirName name of the source directory. */ public void setSourceDirName(String sourceDirName) { this.sourceDirName = sourceDirName; } /** * Sets the RPM spec file that will be generated. * @param dest The spec file * */ public void setSpecFileName(File dest) { this.destFile = dest; } /** * Sets the version number. * @param version The version number * */ public void setVersion(String version) { this.version = version; } /** * Sets the release number. * @param release The release number * */ public void setRelease(String release) { this.release = release; } /** * Indicates when true that an existing destination * file will be overwritten. * @param o boolean where true means overwrite */ public void setOverwrite(boolean o) { this.overwrite = o; } /** * {@inheritDoc} */ @Override public void execute() throws BuildException { try { if (!topDir.exists()) { throw new BuildException("directory " + topDir.getName() + " does not exist"); } if (!topDir.isDirectory()) { throw new BuildException(topDir.getName() + " is not a directory"); } if (destFile.exists()) { if (this.overwrite) { destFile.delete(); log("Regenerating " + destFile.getName() + " from " + topDir.getName()); } else { log(destFile.getName() + " has not been regenerated"); } } sb = new StringBuilder(); File rootDir = new File(sourceDirName); String opendsDir = rootDir.getName(); // Generate the package information sb.append("Summary : OpenDS Directory Server" + EOL); sb.append("Name : opends" + EOL); sb.append("Version : " + version + EOL); sb.append("Release : " + release + EOL); sb.append("License : CDDL" + EOL); sb.append("Group : Applications/Network" + EOL); sb.append("URL : https://opends.org" + EOL); sb.append( EOL); sb.append("BuildArchitectures : noarch" + EOL); sb.append("BuildRoot : " + topDirAbsolutePath + "/SOURCES"+ EOL); sb.append("Prefix : " + prefix + EOL); sb.append( EOL); sb.append("%define _prefix " + prefix + EOL); sb.append( EOL); sb.append("%Description" + EOL); sb.append("OpenDS Directory Server" + EOL); sb.append( EOL); sb.append("# =========================" + EOL); sb.append("# pre/post installation" + EOL); sb.append("# =========================" + EOL); sb.append("# The order is:" + EOL); sb.append("# 1. %pre new" + EOL); sb.append("# 2. install new" + EOL); sb.append("# 3. %post new" + EOL); sb.append("# 4. %preun old" + EOL); sb.append("# 5. delete old" + EOL); sb.append("# 6. %postun old" + EOL); sb.append("# Note: \"$1 equals \"1\" it means \"fresh install\"" + EOL); sb.append( EOL); sb.append("# PRE INSTALL" + EOL); sb.append("%pre" + EOL); sb.append("if [ \"$1\" != \"1\" ]; then" + EOL); sb.append("echo \" This version of the OpenDS RPM does not work\""+ EOL); sb.append("echo \" with the standard RPM upgrade mechanism\"" + EOL); sb.append("echo \" (rpm -U or rpm -F).\"" + EOL); sb.append("echo \" To perform an upgrade, use the OpenDS upgrade\""+ EOL); sb.append("echo \" tool included in the package delivery.\"" + EOL); sb.append("echo \" For more information about the upgrade process\""+ EOL); sb.append("echo \" with RPM see https://www.opends.org/wiki//page/OpendsRPM.\""+ EOL); sb.append("exit 1" + EOL); sb.append("fi" + EOL); sb.append( EOL); sb.append("# POST INSTALL" + EOL); sb.append("%post" + EOL); sb.append( EOL); sb.append("# PRE UNINSTALL" + EOL); sb.append("%preun" + EOL); sb.append("${RPM_INSTALL_PREFIX}/OpenDS-1.0.0/bin/stop-ds" + EOL); sb.append( EOL); sb.append("# POST UNINSTALL" + EOL); sb.append("%postun" + EOL); sb.append("rm -rf ${RPM_INSTALL_PREFIX}/" + opendsDir + EOL); sb.append("rmdir --ignore-fail-on-non-empty ${RPM_INSTALL_PREFIX}" + EOL); sb.append( EOL); sb.append("# =========================" + EOL); sb.append("# Prepare, Build, Install" + EOL); sb.append("# =========================" + EOL); sb.append("%prep" + EOL); sb.append("cd "+ topDirAbsolutePath +"/SOURCES" + prefix + " ; cp -r " + sourceDirName + " ." + EOL); sb.append("%build" + EOL); sb.append("%install" + EOL); sb.append( EOL); sb.append("# =========================" + EOL); sb.append("# FILES LAYOUT" + EOL); sb.append("# =========================" + EOL); sb.append("%files" + EOL); sb.append(dirPrefix + EOL); generatedLevel("", rootDir); // flush the spec file. PrintWriter destWriter = new PrintWriter(destFile); destWriter.print(sb.toString()); destWriter.close(); } catch (Exception e) { // Don't leave a malformed file laying around. Delete // it so it will be forced to be regenerated. if (destFile.exists()) { destFile.deleteOnExit(); } e.printStackTrace(); throw new BuildException("Error processing " + topDir + ": " + e.getMessage()); } } private void generatedLevel (String parent, File source ) { if (source.isDirectory()) { sb.append(dirPrefix + parent + "/" +source.getName()); sb.append(EOL); for (File child : source.listFiles()) { generatedLevel( parent + "/" +source.getName(), child); } } else { sb.append(filePrefix + parent + "/" +source.getName()); sb.append(EOL); } } }