X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.rpmfactory%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Frpmfactory%2Fcore%2FCreateRpmDistribution.java;h=625193aa924aaaf7b431b9c3aab259bcdeb3d44c;hb=e03b993a84bb39e3f146a0ef8782a09661239be7;hp=cd893acd9317cee5c749f37956b9f45c3e6ebeb2;hpb=b301144d5f9dc598da7d75bd1eb515f02f32f5ca;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/CreateRpmDistribution.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/CreateRpmDistribution.java index cd893acd9..625193aa9 100644 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/CreateRpmDistribution.java +++ b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/CreateRpmDistribution.java @@ -1,16 +1,140 @@ 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.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.jcr.JcrUtils; +import org.argeo.slc.SlcException; +import org.argeo.slc.core.execution.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 Log log = LogFactory + .getLog(CreateRpmDistribution.class); + + private RpmFactory rpmFactory; + private RpmDistribution rpmDistribution; + + private String arch = "x86_64"; + + private String repoqueryExecutable = "/usr/bin/repoquery"; @Override public void run() { - // TODO Auto-generated method stub + 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"); + + 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; } }