GenerateRpm.java revision a395dd575518d9e5280fc5d5d5ef47c61b174647
/*
* 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);
}
}
}