]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/CreateRpmDistribution.java
Filter repoquery by arch.
[gpl/argeo-slc.git] / runtime / org.argeo.slc.rpmfactory / src / main / java / org / argeo / slc / rpmfactory / core / CreateRpmDistribution.java
1 package org.argeo.slc.rpmfactory.core;
2
3 import java.io.File;
4 import java.io.InputStream;
5 import java.net.URL;
6 import java.util.StringTokenizer;
7
8 import javax.jcr.Node;
9 import javax.jcr.Session;
10 import javax.jcr.nodetype.NodeType;
11
12 import org.apache.commons.io.FilenameUtils;
13 import org.apache.commons.io.IOUtils;
14 import org.apache.commons.logging.Log;
15 import org.apache.commons.logging.LogFactory;
16 import org.argeo.jcr.JcrUtils;
17 import org.argeo.slc.SlcException;
18 import org.argeo.slc.core.execution.tasks.SystemCall;
19
20 /**
21 * Gather RPMs from various sources (local builds or third party) into a
22 * consistent distributable set (typically to be used to generate an ISO).
23 */
24 public class CreateRpmDistribution implements Runnable {
25 private final static Log log = LogFactory
26 .getLog(CreateRpmDistribution.class);
27
28 private RpmFactory rpmFactory;
29 private RpmDistribution rpmDistribution;
30
31 private String arch = "x86_64";
32
33 private String repoqueryExecutable = "/usr/bin/repoquery";
34
35 @Override
36 public void run() {
37 Session session = null;
38 // Reader reader = null;
39 try {
40 Node baseFolder = rpmFactory.newDistribution(rpmDistribution
41 .getId());
42 session = baseFolder.getSession();
43 Node targetFolder = baseFolder.addNode(arch, NodeType.NT_FOLDER);
44
45 SystemCall repoquery = new SystemCall();
46 repoquery.arg(repoqueryExecutable);
47
48 File yumConfigFile = rpmFactory.getYumRepoFile(arch);
49 repoquery.arg("-c", yumConfigFile.getAbsolutePath());
50 repoquery.arg("--requires");
51 repoquery.arg("--resolve");
52 repoquery.arg("--location");
53 repoquery.arg("--archlist=" + arch);
54
55 for (String rpmPackage : rpmDistribution.getPackages())
56 repoquery.arg(rpmPackage);
57
58 if (log.isDebugEnabled())
59 log.debug("Command:\n" + repoquery.asCommand());
60
61 String output = repoquery.function();
62
63 if (log.isDebugEnabled())
64 log.debug(output + "\n");
65 // reader = new StringReader(output);
66 StringTokenizer lines = new StringTokenizer(output, "\n");
67 // List<String> dependencies = IOUtils.readLines(reader);
68 dependencies: while (lines.hasMoreTokens()) {
69 String urlStr = lines.nextToken();
70 InputStream in = null;
71 try {
72 URL url = new URL(urlStr);
73 String fileName = FilenameUtils.getName(url.getFile());
74 String[] tokens = fileName.split("-");
75 if (tokens.length < 3)
76 continue dependencies;
77 StringBuilder buf = new StringBuilder();
78 for (int i = 0; i < tokens.length - 2; i++) {
79 if (i != 0)
80 buf.append('-');
81 buf.append(tokens[i]);
82
83 }
84 String packageName = buf.toString();
85 for (RpmPackageSet excluded : rpmDistribution
86 .getExcludedPackages()) {
87 if (excluded.contains(packageName)) {
88 if (log.isDebugEnabled())
89 log.debug("Skipped " + packageName);
90 continue dependencies;// skip
91 }
92 }
93 in = url.openStream();
94 JcrUtils.copyStreamAsFile(targetFolder, fileName, in);
95 targetFolder.getSession().save();
96 if (log.isDebugEnabled())
97 log.debug("Copied " + packageName);
98 } catch (Exception e) {
99 log.error("Cannot copy " + urlStr, e);
100 } finally {
101 IOUtils.closeQuietly(in);
102 }
103 }
104
105 // createrepo
106 File workspaceDir = rpmFactory.getWorkspaceDir(rpmDistribution
107 .getId());
108 SystemCall createrepo = new SystemCall();
109 createrepo.arg("createrepo");
110 createrepo.arg("-q");
111 createrepo.arg("-d");
112 File archDir = new File(workspaceDir.getPath()
113 + targetFolder.getPath());
114 createrepo.arg(archDir.getAbsolutePath());
115 createrepo.run();
116 } catch (Exception e) {
117 throw new SlcException("Cannot generate distribution "
118 + rpmDistribution.getId(), e);
119 } finally {
120 JcrUtils.logoutQuietly(session);
121 // IOUtils.closeQuietly(reader);
122 }
123 }
124
125 public void setRpmDistribution(RpmDistribution rpmDistribution) {
126 this.rpmDistribution = rpmDistribution;
127 }
128
129 public void setRpmFactory(RpmFactory rpmFactory) {
130 this.rpmFactory = rpmFactory;
131 }
132
133 public void setArch(String arch) {
134 this.arch = arch;
135 }
136
137 public void setRepoqueryExecutable(String yumdownloaderExecutable) {
138 this.repoqueryExecutable = yumdownloaderExecutable;
139 }
140
141 }