X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.rpmfactory%2Fsrc%2Forg%2Fargeo%2Fslc%2Frpmfactory%2Fcore%2FCreateRpmDistribution.java;fp=org.argeo.slc.rpmfactory%2Fsrc%2Forg%2Fargeo%2Fslc%2Frpmfactory%2Fcore%2FCreateRpmDistribution.java;h=43c6c6c1efcfb7b5c6cf1d48f2d066c83c525330;hb=2754797eb6cbee85ba2ff0b59e3be974114a49b1;hp=0000000000000000000000000000000000000000;hpb=a81b61a88cef01d294cd8956c215604d2b10ab58;p=gpl%2Fargeo-jcr.git diff --git a/org.argeo.slc.rpmfactory/src/org/argeo/slc/rpmfactory/core/CreateRpmDistribution.java b/org.argeo.slc.rpmfactory/src/org/argeo/slc/rpmfactory/core/CreateRpmDistribution.java new file mode 100644 index 0000000..43c6c6c --- /dev/null +++ b/org.argeo.slc.rpmfactory/src/org/argeo/slc/rpmfactory/core/CreateRpmDistribution.java @@ -0,0 +1,141 @@ +package org.argeo.slc.rpmfactory.core; + +import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.util.StringTokenizer; + +import javax.jcr.Node; +import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; + +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.argeo.api.cms.CmsLog; +import org.argeo.jcr.JcrUtils; +import org.argeo.slc.SlcException; +import org.argeo.slc.rpmfactory.RpmFactory; +import org.argeo.slc.runtime.tasks.SystemCall; + +/** + * Gather RPMs from various sources (local builds or third party) into a + * consistent distributable set (typically to be used to generate an ISO). + */ +public class CreateRpmDistribution implements Runnable { + private final static CmsLog log = CmsLog + .getLog(CreateRpmDistribution.class); + + private RpmFactory rpmFactory; + private RpmDistribution rpmDistribution; + + private String arch = "x86_64"; + + private String repoqueryExecutable = "/usr/bin/repoquery"; + + @Override + public void run() { + Session session = null; + // Reader reader = null; + try { + Node baseFolder = rpmFactory.newDistribution(rpmDistribution + .getId()); + session = baseFolder.getSession(); + Node targetFolder = baseFolder.addNode(arch, NodeType.NT_FOLDER); + + SystemCall repoquery = new SystemCall(); + repoquery.arg(repoqueryExecutable); + + File yumConfigFile = rpmFactory.getYumRepoFile(arch); + repoquery.arg("-c", yumConfigFile.getAbsolutePath()); + repoquery.arg("--requires"); + repoquery.arg("--resolve"); + repoquery.arg("--location"); + repoquery.arg("--archlist=" + arch); + + for (String rpmPackage : rpmDistribution.getPackages()) + repoquery.arg(rpmPackage); + + if (log.isDebugEnabled()) + log.debug("Command:\n" + repoquery.asCommand()); + + String output = repoquery.function(); + + if (log.isDebugEnabled()) + log.debug(output + "\n"); + // reader = new StringReader(output); + StringTokenizer lines = new StringTokenizer(output, "\n"); + // List dependencies = IOUtils.readLines(reader); + dependencies: while (lines.hasMoreTokens()) { + String urlStr = lines.nextToken(); + InputStream in = null; + try { + URL url = new URL(urlStr); + String fileName = FilenameUtils.getName(url.getFile()); + String[] tokens = fileName.split("-"); + if (tokens.length < 3) + continue dependencies; + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < tokens.length - 2; i++) { + if (i != 0) + buf.append('-'); + buf.append(tokens[i]); + + } + String packageName = buf.toString(); + for (RpmPackageSet excluded : rpmDistribution + .getExcludedPackages()) { + if (excluded.contains(packageName)) { + if (log.isDebugEnabled()) + log.debug("Skipped " + packageName); + continue dependencies;// skip + } + } + in = url.openStream(); + JcrUtils.copyStreamAsFile(targetFolder, fileName, in); + targetFolder.getSession().save(); + if (log.isDebugEnabled()) + log.debug("Copied " + packageName); + } catch (Exception e) { + log.error("Cannot copy " + urlStr, e); + } finally { + IOUtils.closeQuietly(in); + } + } + + // createrepo + File workspaceDir = rpmFactory.getWorkspaceDir(rpmDistribution + .getId()); + SystemCall createrepo = new SystemCall(); + createrepo.arg("createrepo"); + createrepo.arg("-q"); + createrepo.arg("-d"); + File archDir = new File(workspaceDir.getPath() + + targetFolder.getPath()); + createrepo.arg(archDir.getAbsolutePath()); + createrepo.run(); + } catch (Exception e) { + throw new SlcException("Cannot generate distribution " + + rpmDistribution.getId(), e); + } finally { + JcrUtils.logoutQuietly(session); + // IOUtils.closeQuietly(reader); + } + } + + public void setRpmDistribution(RpmDistribution rpmDistribution) { + this.rpmDistribution = rpmDistribution; + } + + public void setRpmFactory(RpmFactory rpmFactory) { + this.rpmFactory = rpmFactory; + } + + public void setArch(String arch) { + this.arch = arch; + } + + public void setRepoqueryExecutable(String yumdownloaderExecutable) { + this.repoqueryExecutable = yumdownloaderExecutable; + } + +}