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