1 package org
.argeo
.slc
.rpmfactory
.core
;
4 import java
.io
.InputStream
;
6 import java
.util
.StringTokenizer
;
9 import javax
.jcr
.Session
;
10 import javax
.jcr
.nodetype
.NodeType
;
12 import org
.apache
.commons
.io
.FilenameUtils
;
13 import org
.apache
.commons
.io
.IOUtils
;
14 import org
.argeo
.api
.cms
.CmsLog
;
15 import org
.argeo
.jcr
.JcrUtils
;
16 import org
.argeo
.slc
.SlcException
;
17 import org
.argeo
.slc
.rpmfactory
.RpmFactory
;
18 import org
.argeo
.slc
.runtime
.tasks
.SystemCall
;
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).
24 public class CreateRpmDistribution
implements Runnable
{
25 private final static CmsLog log
= CmsLog
26 .getLog(CreateRpmDistribution
.class);
28 private RpmFactory rpmFactory
;
29 private RpmDistribution rpmDistribution
;
31 private String arch
= "x86_64";
33 private String repoqueryExecutable
= "/usr/bin/repoquery";
37 Session session
= null;
38 // Reader reader = null;
40 Node baseFolder
= rpmFactory
.newDistribution(rpmDistribution
42 session
= baseFolder
.getSession();
43 Node targetFolder
= baseFolder
.addNode(arch
, NodeType
.NT_FOLDER
);
45 SystemCall repoquery
= new SystemCall();
46 repoquery
.arg(repoqueryExecutable
);
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
);
55 for (String rpmPackage
: rpmDistribution
.getPackages())
56 repoquery
.arg(rpmPackage
);
58 if (log
.isDebugEnabled())
59 log
.debug("Command:\n" + repoquery
.asCommand());
61 String output
= repoquery
.function();
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;
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
++) {
81 buf
.append(tokens
[i
]);
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
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
);
101 IOUtils
.closeQuietly(in
);
106 File workspaceDir
= rpmFactory
.getWorkspaceDir(rpmDistribution
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());
116 } catch (Exception e
) {
117 throw new SlcException("Cannot generate distribution "
118 + rpmDistribution
.getId(), e
);
120 JcrUtils
.logoutQuietly(session
);
121 // IOUtils.closeQuietly(reader);
125 public void setRpmDistribution(RpmDistribution rpmDistribution
) {
126 this.rpmDistribution
= rpmDistribution
;
129 public void setRpmFactory(RpmFactory rpmFactory
) {
130 this.rpmFactory
= rpmFactory
;
133 public void setArch(String arch
) {
137 public void setRepoqueryExecutable(String yumdownloaderExecutable
) {
138 this.repoqueryExecutable
= yumdownloaderExecutable
;