View Javadoc
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  import org.argeo.slc.rpmfactory.RpmFactory;
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 }