From: Mathieu Baudier Date: Fri, 13 Feb 2015 15:46:23 +0000 (+0000) Subject: SLC Factory X-Git-Tag: argeo-slc-2.1.7~107 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=3b90a33b36baac839b376a71a4efcd90cacd3eac;p=gpl%2Fargeo-slc.git SLC Factory git-svn-id: https://svn.argeo.org/slc/trunk@7846 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/dep/org.argeo.slc.dep.backend/pom.xml b/dep/org.argeo.slc.dep.backend/pom.xml index 3224adba0..dc950424f 100644 --- a/dep/org.argeo.slc.dep.backend/pom.xml +++ b/dep/org.argeo.slc.dep.backend/pom.xml @@ -64,16 +64,16 @@ - - - - - - - - - - + + org.argeo.slc + org.argeo.slc.repo + 2.1.1-SNAPSHOT + + + org.argeo.slc + org.argeo.slc.factory + 2.1.1-SNAPSHOT + diff --git a/org.argeo.slc.factory/bnd.bnd b/org.argeo.slc.factory/bnd.bnd index e69de29bb..e2184b61d 100644 --- a/org.argeo.slc.factory/bnd.bnd +++ b/org.argeo.slc.factory/bnd.bnd @@ -0,0 +1,4 @@ +Import-Package: javax.jcr.nodetype,\ +org.argeo.slc.repo,\ +* + \ No newline at end of file diff --git a/org.argeo.slc.factory/pom.xml b/org.argeo.slc.factory/pom.xml index 9c1bb050c..1fa08d25d 100644 --- a/org.argeo.slc.factory/pom.xml +++ b/org.argeo.slc.factory/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 org.argeo.slc @@ -8,4 +9,12 @@ org.argeo.slc.factory SLC Factory + + + + org.argeo.slc + org.argeo.slc.repo + 2.1.1-SNAPSHOT + + \ No newline at end of file diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/RpmFactory.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/RpmFactory.java new file mode 100644 index 000000000..aee295693 --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/RpmFactory.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.slc.rpmfactory; + +import java.io.File; +import java.util.List; + +import javax.jcr.Node; + +/** + * Defines a build environment. This information is typically used by other + * components performing the various actions related to RPM build. + */ +public interface RpmFactory { + // + // DIRECT ACTIONS ON JCR REPOSITORY + // + public void indexWorkspace(String workspace); + + public Node newDistribution(String distributionId); + + // + // CONFIG FILES GENERATION + // + /** Creates a mock config file. */ + public File getMockConfigFile(String arch, String branch); + + /** Creates a yum config file. */ + public File getYumRepoFile(String arch); + + // + // WORKSPACES + // + public String getStagingWorkspace(); + + /** + * @return the name of the testing workspace, or null if and only if the + * testing workspace was not enabled. + */ + public String getTestingWorkspace(); + + public String getStableWorkspace(); + + public File getWorkspaceDir(String workspace); + + // + // ARCH DEPENDENT INFOS + // + public List getArchs(); + + public String getMockConfig(String arch); + + public String getIdWithArch(String arch); + + public File getResultDir(String arch); + + // + // DEPLOYMENT + // + public String getGitBaseUrl(); + + public Boolean isDeveloperInstance(); + +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/RpmProxyService.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/RpmProxyService.java new file mode 100644 index 000000000..8f86253b6 --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/RpmProxyService.java @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.slc.rpmfactory; + +import org.argeo.jcr.proxy.ResourceProxy; + +/** Marker interface (useful for OSGi services references), may be extended later */ +public interface RpmProxyService extends ResourceProxy { +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/RpmRepository.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/RpmRepository.java new file mode 100644 index 000000000..24d7c727c --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/RpmRepository.java @@ -0,0 +1,9 @@ +package org.argeo.slc.rpmfactory; + +/** A YUM compatible repository of RPM packages. */ +public interface RpmRepository { + public String getId(); + + public String getUrl(); + +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/AbstractRpmRepository.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/AbstractRpmRepository.java new file mode 100644 index 000000000..19418b61d --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/AbstractRpmRepository.java @@ -0,0 +1,28 @@ +package org.argeo.slc.rpmfactory.core; + +import org.argeo.slc.rpmfactory.RpmRepository; + +/** Common method to RPM repositories. */ +public abstract class AbstractRpmRepository implements RpmRepository { + private String id; + private String url; + + @Override + public String getId() { + return id; + } + + @Override + public String getUrl() { + return url; + } + + public void setId(String id) { + this.id = id; + } + + public void setUrl(String url) { + this.url = url; + } + +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/BuildInMock.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/BuildInMock.java new file mode 100644 index 000000000..1f815eac5 --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/BuildInMock.java @@ -0,0 +1,206 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.slc.rpmfactory.core; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.commons.exec.Executor; +import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.SlcException; +import org.argeo.slc.core.execution.tasks.SystemCall; +import org.argeo.slc.rpmfactory.RpmFactory; + +/** Build an RPM in mock. */ +public class BuildInMock implements Runnable { + private final static Log log = LogFactory.getLog(BuildInMock.class); + private final static String NOARCH = "noarch"; + + private String rpmPackage = null; + private String branch = null; + private String arch = NOARCH; + + private RpmFactory rpmFactory; + private Executor executor; + + private String debuginfoDirName = "debuginfo"; + private String mockExecutable = "/usr/bin/mock"; + + private List preBuildCommands = new ArrayList(); + + public void run() { + if (!rpmFactory.isDeveloperInstance()) { + // clean/init + SystemCall mockClean = createBaseMockCall(); + mockClean.arg("--init"); + mockClean.run(); + } + + // pre build commands + for (String preBuildCmd : preBuildCommands) { + SystemCall mockClean = createBaseMockCall(); + mockClean.arg("--chroot").arg(preBuildCmd); + mockClean.run(); + } + + // actual build + SystemCall mockBuild = createBaseMockCall(); + mockBuild.arg("--scm-enable"); + mockBuild.arg("--scm-option").arg("package=" + rpmPackage); + mockBuild.arg("--no-clean"); + // + // + mockBuild.run(); + // + + // copy RPMs to target directories + File stagingDir = rpmFactory.getWorkspaceDir(rpmFactory + .getStagingWorkspace()); + File srpmDir = new File(stagingDir, "SRPMS"); + srpmDir.mkdirs(); + File archDir = null; + File debuginfoDir = null; + if (!arch.equals(NOARCH)) { + archDir = new File(stagingDir, arch); + debuginfoDir = new File(archDir, debuginfoDirName); + debuginfoDir.mkdirs(); + } + + Set reposToRecreate = new HashSet(); + File resultDir = rpmFactory.getResultDir(arch); + if (resultDir.exists()) + rpms: for (File file : resultDir.listFiles()) { + if (file.isDirectory()) + continue rpms; + + File[] targetDirs; + if (file.getName().contains(".src.rpm")) + targetDirs = new File[] { srpmDir }; + else if (file.getName().contains("-debuginfo-")) + targetDirs = new File[] { debuginfoDir }; + else if (!arch.equals(NOARCH) + && file.getName().contains("." + arch + ".rpm")) + targetDirs = new File[] { archDir }; + else if (file.getName().contains(".noarch.rpm")) { + List dirs = new ArrayList(); + for (String arch : rpmFactory.getArchs()) + dirs.add(new File(stagingDir, arch)); + targetDirs = dirs.toArray(new File[dirs.size()]); + } else if (file.getName().contains(".rpm")) + throw new SlcException("Don't know where to copy " + file); + else { + if (log.isTraceEnabled()) + log.trace("Skip " + file); + continue rpms; + } + + reposToRecreate.addAll(Arrays.asList(targetDirs)); + copyToDirs(file, targetDirs); + } + + // recreate changed repos + for (File repoToRecreate : reposToRecreate) { + SystemCall createrepo = new SystemCall(); + createrepo.arg("createrepo"); + // sqllite db + createrepo.arg("-d"); + // debuginfo + if (!repoToRecreate.getName().equals(debuginfoDirName)) + createrepo.arg("-x").arg(debuginfoDirName + "/*"); + // quiet + createrepo.arg("-q"); + createrepo.arg(repoToRecreate.getAbsolutePath()); + + createrepo.setExecutor(executor); + createrepo.run(); + log.info("Updated repo " + repoToRecreate); + } + + // index staging workspace + rpmFactory.indexWorkspace(rpmFactory.getStagingWorkspace()); + } + + /** Creates a mock call with all the common options such as config file etc. */ + protected SystemCall createBaseMockCall() { + String mockCfg = rpmFactory.getMockConfig(arch); + File mockConfigFile = rpmFactory.getMockConfigFile(arch, branch); + + // prepare mock call + SystemCall mock = new SystemCall(); + + if (arch != null) + mock.arg("setarch").arg(arch); + mock.arg(mockExecutable); + mock.arg("-v"); + mock.arg("--configdir=" + mockConfigFile.getAbsoluteFile().getParent()); + if (arch != null) + mock.arg("--arch=" + arch); + mock.arg("-r").arg(mockCfg); + + mock.setLogCommand(true); + mock.setExecutor(executor); + + return mock; + } + + protected void copyToDirs(File file, File[] dirs) { + for (File dir : dirs) { + try { + FileUtils.copyFileToDirectory(file, dir); + if (log.isDebugEnabled()) + log.debug(file + " => " + dir); + } catch (IOException e) { + throw new SlcException("Cannot copy " + file + " to " + dir, e); + } + } + } + + public void setArch(String arch) { + this.arch = arch; + } + + public void setRpmPackage(String rpmPackage) { + this.rpmPackage = rpmPackage; + } + + public void setBranch(String branch) { + this.branch = branch; + } + + public void setRpmFactory(RpmFactory env) { + this.rpmFactory = env; + } + + public void setExecutor(Executor executor) { + this.executor = executor; + } + + public void setMockExecutable(String mockExecutable) { + this.mockExecutable = mockExecutable; + } + + public void setPreBuildCommands(List preBuildCommands) { + this.preBuildCommands = preBuildCommands; + } + +} \ No newline at end of file diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/CreateRpmDistribution.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/CreateRpmDistribution.java new file mode 100644 index 000000000..9fd4993cf --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/CreateRpmDistribution.java @@ -0,0 +1,142 @@ +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; +import org.argeo.slc.rpmfactory.RpmFactory; + +/** + * 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() { + 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"); + repoquery.arg("--archlist=" + arch); + + 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; + } + +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/ReleaseStaging.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/ReleaseStaging.java new file mode 100644 index 000000000..76a67005a --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/ReleaseStaging.java @@ -0,0 +1,109 @@ +package org.argeo.slc.rpmfactory.core; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.exec.Executor; +import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.SlcException; +import org.argeo.slc.core.execution.tasks.SystemCall; +import org.argeo.slc.rpmfactory.RpmFactory; + +/** Releases the content of staging to a public repository. */ +public class ReleaseStaging implements Runnable { + private final static Log log = LogFactory.getLog(ReleaseStaging.class); + + private RpmFactory rpmFactory; + private Executor executor; + + private String debuginfoDirName = "debuginfo"; + + @Override + public void run() { + String sourceWorkspace = rpmFactory.getStagingWorkspace(); + File sourceRepoDir = rpmFactory.getWorkspaceDir(sourceWorkspace); + String targetWorkspace = rpmFactory.getTestingWorkspace() != null ? rpmFactory + .getTestingWorkspace() : rpmFactory.getStableWorkspace(); + File targetRepoDir = rpmFactory.getWorkspaceDir(targetWorkspace); + List reposToRecreate = new ArrayList(); + + stagingChildren: for (File dir : sourceRepoDir.listFiles()) { + if (!dir.isDirectory()) + continue stagingChildren; + if (dir.getName().equals("lost+found")) + continue stagingChildren; + + File targetDir = new File(targetRepoDir, dir.getName()); + try { + FileUtils.copyDirectory(dir, targetDir); + if (log.isDebugEnabled()) + log.debug(dir + " => " + targetDir); + } catch (IOException e) { + throw new SlcException(sourceRepoDir + + " could not be copied properly, check it manually." + + " Metadata have NOT been updated.", e); + } + + reposToRecreate.add(dir); + reposToRecreate.add(targetDir); + File debugInfoDir = new File(dir, debuginfoDirName); + if (debugInfoDir.exists()) + reposToRecreate.add(debugInfoDir); + File targetDebugInfoDir = new File(targetDir, debuginfoDirName); + if (targetDebugInfoDir.exists()) + reposToRecreate.add(targetDebugInfoDir); + + } + + // clear staging + for (File dir : sourceRepoDir.listFiles()) { + try { + if (dir.getName().equals("lost+found")) + continue; + if (dir.isDirectory()) + FileUtils.deleteDirectory(dir); + } catch (IOException e) { + log.error("Could not delete " + dir + ". " + e); + } + } + + // recreate changed repos + for (File repoToRecreate : reposToRecreate) { + repoToRecreate.mkdirs(); + SystemCall createrepo = new SystemCall(); + createrepo.arg("createrepo"); + // sqllite db + createrepo.arg("-d"); + // debuginfo + if (!repoToRecreate.getName().equals(debuginfoDirName)) + createrepo.arg("-x").arg(debuginfoDirName + "/*"); + // quiet + createrepo.arg("-q"); + createrepo.arg(repoToRecreate.getAbsolutePath()); + + createrepo.setExecutor(executor); + createrepo.run(); + log.info("Updated repo " + repoToRecreate); + } + + rpmFactory.indexWorkspace(sourceWorkspace); + rpmFactory.indexWorkspace(targetWorkspace); + } + + public void setRpmFactory(RpmFactory rpmFactory) { + this.rpmFactory = rpmFactory; + } + + public void setExecutor(Executor executor) { + this.executor = executor; + } + + public void setDebuginfoDirName(String debuginfoDirName) { + this.debuginfoDirName = debuginfoDirName; + } + +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmDistribution.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmDistribution.java new file mode 100644 index 000000000..0df31c687 --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmDistribution.java @@ -0,0 +1,35 @@ +package org.argeo.slc.rpmfactory.core; + +import java.util.List; + +/** A consistent distributable set of RPM. */ +public class RpmDistribution { + private String id; + private List packages; + private List excludedPackages; + + public List getPackages() { + return packages; + } + + public void setPackages(List packages) { + this.packages = packages; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getExcludedPackages() { + return excludedPackages; + } + + public void setExcludedPackages(List excludedPackages) { + this.excludedPackages = excludedPackages; + } + +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmFactoryImpl.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmFactoryImpl.java new file mode 100644 index 000000000..4d5df3bd4 --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmFactoryImpl.java @@ -0,0 +1,473 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.slc.rpmfactory.core; + +import java.io.File; +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.jcr.Node; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.jcr.JcrUtils; +import org.argeo.slc.SlcConstants; +import org.argeo.slc.SlcException; +import org.argeo.slc.core.execution.tasks.SystemCall; +import org.argeo.slc.repo.NodeIndexerVisitor; +import org.argeo.slc.repo.RpmIndexer; +import org.argeo.slc.rpmfactory.RpmFactory; +import org.argeo.slc.rpmfactory.RpmRepository; + +/** + * Defines a build environment. This information is typically used by other + * components performing the various actions related to RPM build. + */ +public class RpmFactoryImpl implements RpmFactory { + private Log log = LogFactory.getLog(RpmFactoryImpl.class); + + private Repository rpmRepository; + private Repository distRepository; + + private String id; + private List repositories = new ArrayList(); + private List archs = new ArrayList(); + + private String rpmBase = "/mnt/slc/repos/rpm"; + private String distBase = "/mnt/slc/repos/dist"; + private String mockVar = "/var/lib/mock"; + private String mockEtc = "/etc/mock"; + + private DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmm"); + + private String gitWorkspace = "git"; + + private String localUrlBase = "http://localhost:7070/"; + /** If not null or empty, this is a developer instance. */ + private String gitDevBaseUrl = null; + + private Boolean withTestingRepository = false; + + private String yumConfigMainSection = "cachedir=/var/cache/yum\n" + + "debuglevel=1\n" + "reposdir=/dev/null\n" + + "logfile=/var/log/yum.log\n" + "retries=20\n" + "obsoletes=1\n" + + "gpgcheck=0\n" + "assumeyes=1\n" + "syslog_ident=mock\n" + + "syslog_device=\n" + "http_caching=none\n"; + + private String defaultMacroFiles = "/usr/lib/rpm/macros:" + + "/usr/lib/rpm/ia32e-linux/macros:" + + "/usr/lib/rpm/redhat/macros:" + "/etc/rpm/macros.*:" + + "/etc/rpm/macros:" + "/etc/rpm/ia32e-linux/macros:" + + "~/.rpmmacros"; + private Map rpmmacros = new HashMap(); + + // set by init + private String proxiedReposBase; + private String managedReposBase; + + private String stagingWorkspace; + private String testingWorkspace; + private String stableWorkspace; + + private File rpmFactoryBaseDir; + private File mockConfDir; + private File yumConfDir; + + public void init() { + // local URL bases + proxiedReposBase = localUrlBase + "repo/rpm/"; + managedReposBase = localUrlBase + "data/public/rpm/"; + + // local directories + rpmFactoryBaseDir.mkdirs(); + mockConfDir = new File(rpmFactoryBaseDir.getPath() + "/conf/mock"); + mockConfDir.mkdirs(); + yumConfDir = new File(rpmFactoryBaseDir.getPath() + "/conf/yum"); + yumConfDir.mkdirs(); + + // managed repositories + stagingWorkspace = id + "-staging"; + if (withTestingRepository) + testingWorkspace = id + "-testing"; + stableWorkspace = id; + + initDistWorkspace(stableWorkspace); + initGitWorkspace(); + initRpmWorkspace(stagingWorkspace); + if (withTestingRepository) + initRpmWorkspace(testingWorkspace); + initRpmWorkspace(stableWorkspace); + } + + protected void initRpmWorkspace(String workspace) { + Session session = null; + try { + session = JcrUtils.loginOrCreateWorkspace(rpmRepository, workspace); + JcrUtils.addPrivilege(session, "/", "anonymous", "jcr:read"); + JcrUtils.addPrivilege(session, "/", SlcConstants.ROLE_SLC, + "jcr:all"); + + for (String arch : archs) { + Node archFolder = JcrUtils.mkfolders(session, "/" + arch); + session.save(); + File workspaceDir = getWorkspaceDir(workspace); + try { + if (!archFolder.hasNode("repodata")) { + // touch a file in order to make sure this is properly + // mounted. + File touch = new File(workspaceDir, ".touch"); + touch.createNewFile(); + touch.delete(); + + SystemCall createrepo = new SystemCall(); + createrepo.arg("createrepo"); + createrepo.arg("-q"); + File archDir = new File(workspaceDir, arch); + createrepo.arg(archDir.getAbsolutePath()); + createrepo.run(); + } + } catch (IOException e) { + log.error(workspaceDir + " not properly mounted.", e); + } + } + } catch (Exception e) { + throw new SlcException("Cannot initialize workspace " + workspace, + e); + } finally { + JcrUtils.logoutQuietly(session); + } + } + + /** Caller must logout the underlying session. */ + public Node newDistribution(String distributionId) { + Session session = null; + try { + session = JcrUtils.loginOrCreateWorkspace(rpmRepository, + distributionId); + JcrUtils.addPrivilege(session, "/", "anonymous", "jcr:read"); + JcrUtils.addPrivilege(session, "/", SlcConstants.ROLE_SLC, + "jcr:all"); + + Calendar now = new GregorianCalendar(); + String folderName = dateFormat.format(now.getTime()); + return JcrUtils.mkfolders(session, "/" + folderName); + } catch (Exception e) { + JcrUtils.logoutQuietly(session); + throw new SlcException("Cannot initialize distribution workspace " + + distributionId, e); + } + } + + protected void initGitWorkspace() { + Session session = null; + try { + session = JcrUtils.loginOrCreateWorkspace(rpmRepository, + gitWorkspace); + JcrUtils.addPrivilege(session, "/", "anonymous", "jcr:read"); + JcrUtils.addPrivilege(session, "/", SlcConstants.ROLE_SLC, + "jcr:all"); + } catch (Exception e) { + throw new SlcException("Cannot initialize workspace " + + gitWorkspace, e); + } finally { + JcrUtils.logoutQuietly(session); + } + } + + protected void initDistWorkspace(String workspace) { + Session session = null; + try { + session = JcrUtils + .loginOrCreateWorkspace(distRepository, workspace); + JcrUtils.addPrivilege(session, "/", "anonymous", "jcr:read"); + } catch (RepositoryException e) { + throw new SlcException("Cannot initialize workspace " + workspace, + e); + } finally { + JcrUtils.logoutQuietly(session); + } + } + + public void destroy() { + + } + + public String generateMockConfigFile(String arch, String branch) { + StringBuffer buf = new StringBuffer(); + + buf.append("config_opts['root'] = '" + getIdWithArch(arch) + "'\n"); + buf.append("config_opts['target_arch'] = '" + arch + "'\n"); + buf.append("config_opts['legal_host_arches'] = ('" + arch + "',)\n"); + buf.append("config_opts['chroot_setup_cmd'] = 'groupinstall buildsys-build'\n"); + // buf.append("config_opts['dist'] = 'el6'\n"); + buf.append("config_opts['plugin_conf']['yum_cache_enable'] = False\n"); + + buf.append("config_opts['scm'] = False\n"); + buf.append("config_opts['scm_opts']['method'] = 'git'\n"); + buf.append("config_opts['scm_opts']['spec'] = 'SCM_PKG.spec'\n"); + buf.append("config_opts['scm_opts']['ext_src_dir'] = '" + + getSourcesDir().getAbsolutePath() + "'\n"); + buf.append("config_opts['scm_opts']['git_timestamps'] = True\n"); + + // development + if (gitDevBaseUrl != null && !gitDevBaseUrl.trim().equals("")) + buf.append("config_opts['scm_opts']['git_get'] = 'git clone " + + (branch != null ? "-b " + branch : "") + " " + + gitDevBaseUrl + "/SCM_PKG SCM_PKG'\n"); + else + buf.append("config_opts['scm_opts']['git_get'] = 'git clone " + + (branch != null ? "-b " + branch : "") + " " + + getGitBaseUrl() + "/SCM_PKG.git SCM_PKG'\n"); + + buf.append("\nconfig_opts['yum.conf'] = \"\"\"\n"); + buf.append(generateYumConfigFile(arch)).append('\n'); + buf.append("\"\"\"\n"); + return buf.toString(); + } + + public String generateYumConfigFile(String arch) { + StringBuffer buf = new StringBuffer(); + buf.append("[main]\n"); + buf.append(yumConfigMainSection).append('\n'); + + for (RpmRepository repository : repositories) { + buf.append('[').append(repository.getId()).append("]\n"); + buf.append("name=").append(repository.getId()).append('\n'); + if (repository instanceof ThirdPartyRpmRepository) { + buf.append("#baseurl=").append(repository.getUrl()) + .append(arch).append('/').append("\n"); + buf.append("baseurl=").append(proxiedReposBase) + .append(repository.getId()).append('/').append(arch) + .append('/').append("\n"); + if (((ThirdPartyRpmRepository) repository).getYumConf() != null) + buf.append( + ((ThirdPartyRpmRepository) repository).getYumConf() + .trim()).append('\n'); + } + } + + // managed repos + addManagedRepository(buf, stagingWorkspace, arch); + if (withTestingRepository) + addManagedRepository(buf, testingWorkspace, arch); + addManagedRepository(buf, stableWorkspace, arch); + return buf.toString(); + } + + protected void addManagedRepository(StringBuffer buf, String workspace, + String arch) { + buf.append('[').append(workspace).append("]\n"); + buf.append("baseurl=").append(managedReposBase).append(workspace) + .append('/').append(arch).append('/').append("\n"); + buf.append("gpgcheck=0").append("\n"); + } + + /** Creates a mock config file. */ + public File getMockConfigFile(String arch, String branch) { + File mockSiteDefaultsFile = new File(mockConfDir, "site-defaults.cfg"); + File mockLoggingFile = new File(mockConfDir, "logging.ini"); + File mockConfigFile = new File(mockConfDir, getIdWithArch(arch) + + ".cfg"); + try { + if (!mockSiteDefaultsFile.exists()) + mockSiteDefaultsFile.createNewFile(); + if (!mockLoggingFile.exists()) + FileUtils.copyFile(new File(mockEtc + "/logging.ini"), + mockLoggingFile); + + FileUtils.writeStringToFile(mockConfigFile, + generateMockConfigFile(arch, branch)); + return mockConfigFile; + } catch (IOException e) { + throw new SlcException("Cannot write mock config file to " + + mockConfigFile, e); + } + } + + /** Creates a yum config file. */ + public File getYumRepoFile(String arch) { + File yumConfigFile = new File(yumConfDir, getIdWithArch(arch) + ".repo"); + try { + FileUtils.writeStringToFile(yumConfigFile, + generateYumConfigFile(arch)); + return yumConfigFile; + } catch (IOException e) { + throw new SlcException("Cannot write yum config file to " + + yumConfigFile, e); + } + } + + public File getResultDir(String arch) { + return new File(mockVar + "/" + getIdWithArch(arch) + "/result"); + } + + public File getWorkspaceDir(String workspace) { + return new File(rpmBase + "/" + workspace); + } + + public File getSourcesDir() { + return new File(distBase + "/" + stableWorkspace); + } + + public String getMockConfig(String arch) { + return getIdWithArch(arch); + } + + public String getIdWithArch(String arch) { + return id + "-" + arch; + } + + public String getGitBaseUrl() { + return managedReposBase + gitWorkspace; + } + + public void indexWorkspace(String workspace) { + Session session = null; + try { + session = rpmRepository.login(workspace); + session.getRootNode().accept( + new NodeIndexerVisitor(new RpmIndexer())); + if (log.isDebugEnabled()) + log.debug("Indexed workspace " + workspace); + } catch (RepositoryException e) { + throw new SlcException("Cannot index workspace " + workspace, e); + } finally { + JcrUtils.logoutQuietly(session); + } + } + + public Boolean isDeveloperInstance() { + return gitDevBaseUrl != null; + } + + /** Write (topdir)/rpmmacros and (topdir)/rpmrc */ + public void writeRpmbuildConfigFiles(File topdir) { + writeRpmbuildConfigFiles(topdir, new File(topdir, "rpmmacros"), + new File(topdir, "rpmrc")); + } + + public void writeRpmbuildConfigFiles(File topdir, File rpmmacroFile, + File rpmrcFile) { + try { + List macroLines = new ArrayList(); + macroLines.add("%_topdir " + topdir.getCanonicalPath()); + for (String macroKey : rpmmacros.keySet()) { + macroLines.add(macroKey + " " + rpmmacros.get(macroKey)); + } + FileUtils.writeLines(rpmmacroFile, macroLines); + + List rpmrcLines = new ArrayList(); + rpmrcLines.add("include: /usr/lib/rpm/rpmrc"); + rpmrcLines.add("macrofiles: " + defaultMacroFiles + ":" + + rpmmacroFile.getCanonicalPath()); + FileUtils.writeLines(rpmrcFile, rpmrcLines); + } catch (IOException e) { + throw new SlcException("Cannot write rpmbuild config files", e); + } + + } + + public Map getRpmmacros() { + return rpmmacros; + } + + public void setRpmmacros(Map rpmmacros) { + this.rpmmacros = rpmmacros; + } + + public String getDefaultMacroFiles() { + return defaultMacroFiles; + } + + public void setDefaultMacroFiles(String defaultMacroFiles) { + this.defaultMacroFiles = defaultMacroFiles; + } + + public void setArchs(List archs) { + this.archs = archs; + } + + public List getArchs() { + return archs; + } + + public void setRpmBase(String stagingBase) { + this.rpmBase = stagingBase; + } + + public void setId(String id) { + this.id = id; + } + + public void setMockVar(String mockVar) { + this.mockVar = mockVar; + } + + public void setRpmRepository(Repository rpmRepository) { + this.rpmRepository = rpmRepository; + } + + public void setDistRepository(Repository distRepository) { + this.distRepository = distRepository; + } + + public void setLocalUrlBase(String localUrlBase) { + this.localUrlBase = localUrlBase; + } + + public void setYumConfigMainSection(String yumConfigMainSection) { + this.yumConfigMainSection = yumConfigMainSection; + } + + public void setRepositories(List repositories) { + this.repositories = repositories; + } + + public void setRpmFactoryBaseDir(File rpmFactoryBaseDir) { + this.rpmFactoryBaseDir = rpmFactoryBaseDir; + } + + public String getStagingWorkspace() { + return stagingWorkspace; + } + + public String getTestingWorkspace() { + return testingWorkspace; + } + + public String getStableWorkspace() { + return stableWorkspace; + } + + public void setWithTestingRepository(Boolean withTestingRepository) { + this.withTestingRepository = withTestingRepository; + } + + public void setGitDevBaseUrl(String gitBaseUrl) { + this.gitDevBaseUrl = gitBaseUrl; + } +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmPackageSet.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmPackageSet.java new file mode 100644 index 000000000..16934132b --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmPackageSet.java @@ -0,0 +1,6 @@ +package org.argeo.slc.rpmfactory.core; + +/** Set of RPM packages */ +public interface RpmPackageSet { + public Boolean contains(String rpmPackage); +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmProxyServiceImpl.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmProxyServiceImpl.java new file mode 100644 index 000000000..82d9e553b --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmProxyServiceImpl.java @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.slc.rpmfactory.core; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; +import javax.jcr.security.AccessControlException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.jcr.ArgeoNames; +import org.argeo.jcr.JcrUtils; +import org.argeo.jcr.proxy.AbstractUrlProxy; +import org.argeo.slc.SlcConstants; +import org.argeo.slc.SlcException; +import org.argeo.slc.jcr.SlcNames; +import org.argeo.slc.jcr.SlcTypes; +import org.argeo.slc.repo.RepoConstants; +import org.argeo.slc.rpmfactory.RpmProxyService; +import org.argeo.slc.rpmfactory.RpmRepository; + +/** Synchronises the node repository with remote Maven repositories */ +public class RpmProxyServiceImpl extends AbstractUrlProxy implements + RpmProxyService, ArgeoNames, SlcNames { + private final static Log log = LogFactory.getLog(RpmProxyServiceImpl.class); + + private Set defaultRepositories = new HashSet(); + + @Override + protected void beforeInitSessionSave(Session session) + throws RepositoryException { + JcrUtils.addPrivilege(session, "/", "anonymous", "jcr:read"); + try { + JcrUtils.addPrivilege(session, "/", SlcConstants.ROLE_SLC, + "jcr:all"); + } catch (AccessControlException e) { + if (log.isTraceEnabled()) + log.trace("Cannot give jcr:all privileges to ROLE_SLC"); + } + + JcrUtils.mkdirsSafe(session, RepoConstants.PROXIED_REPOSITORIES); + } + + /** + * Retrieve and add this file to the repository + */ + @Override + protected Node retrieve(Session session, String path) { + StringBuilder relativePathBuilder = new StringBuilder(); + String repoId = extractRepoId(path, relativePathBuilder); + // remove starting '/' + String relativePath = relativePathBuilder.toString().substring(1); + + RpmRepository sourceRepo = null; + for (Iterator reposIt = defaultRepositories.iterator(); reposIt + .hasNext();) { + RpmRepository rpmRepo = reposIt.next(); + if (rpmRepo.getId().equals(repoId)) { + sourceRepo = rpmRepo; + break; + } + } + + if (sourceRepo == null) + throw new SlcException("No RPM repository found for " + path); + + try { + String baseUrl = sourceRepo.getUrl(); + String remoteUrl = baseUrl + relativePath; + Node node = proxyUrl(session, remoteUrl, path); + if (node != null) { + registerSource(sourceRepo, node, remoteUrl); + if (log.isDebugEnabled()) + log.debug("Imported " + remoteUrl + " to " + node); + return node; + } + } catch (Exception e) { + throw new SlcException("Cannot proxy " + path, e); + } + JcrUtils.discardQuietly(session); + throw new SlcException("No proxy found for " + path); + } + + protected void registerSource(RpmRepository sourceRepo, Node node, + String remoteUrl) throws RepositoryException { + node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN); + Node origin; + if (!node.hasNode(SLC_ORIGIN)) + origin = node.addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED); + else + origin = node.getNode(SLC_ORIGIN); + + // proxied repository + Node proxiedRepository; + String proxiedRepositoryPath = RepoConstants.PROXIED_REPOSITORIES + '/' + + sourceRepo.getId(); + Session session = node.getSession(); + if (session.itemExists(proxiedRepositoryPath)) { + proxiedRepository = session.getNode(proxiedRepositoryPath); + } else { + proxiedRepository = session.getNode( + RepoConstants.PROXIED_REPOSITORIES).addNode( + sourceRepo.getId()); + proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE); + JcrUtils.urlToAddressProperties(proxiedRepository, + sourceRepo.getUrl()); + proxiedRepository.setProperty(SLC_URL, sourceRepo.getUrl()); + } + + origin.setProperty(SLC_PROXY, proxiedRepository); + JcrUtils.urlToAddressProperties(origin, remoteUrl); + } + + /** Returns the first token of the path */ + protected String extractRepoId(String path, StringBuilder relativePath) { + StringBuilder workspace = new StringBuilder(); + StringBuilder buf = workspace; + for (int i = 1; i < path.length(); i++) { + char c = path.charAt(i); + if (c == '/') { + buf = relativePath; + } + buf.append(c); + } + return workspace.toString(); + } + + @Override + protected Boolean shouldUpdate(Session clientSession, String nodePath) { + // if (nodePath.contains("/repodata/")) + // return true; + return super.shouldUpdate(clientSession, nodePath); + } + + public void setDefaultRepositories(Set defaultRepositories) { + this.defaultRepositories = defaultRepositories; + } +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmSpecFile.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmSpecFile.java new file mode 100644 index 000000000..4b4db3b2e --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/RpmSpecFile.java @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.slc.rpmfactory.core; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.springframework.core.io.Resource; + +public class RpmSpecFile { + private Resource specFile; + + private String name; + private String version; + private String release; + private Map sources = new HashMap(); + private Map patches = new HashMap(); + + public RpmSpecFile(Resource specFile) { + this.specFile = specFile; + parseSpecFile(); + } + + public void init() { + parseSpecFile(); + } + + @SuppressWarnings("unchecked") + protected void parseSpecFile() { + try { + List lines = (List) IOUtils.readLines(specFile + .getInputStream()); + + lines: for (String line : lines) { + int indexSemiColon = line.indexOf(':'); + if (indexSemiColon <= 0) + continue lines; + String directive = line.substring(0, indexSemiColon).trim(); + String value = line.substring(indexSemiColon + 1).trim(); + if ("name".equals(directive.toLowerCase())) + name = value; + else if ("version".equals(directive.toLowerCase())) + version = value; + else if ("release".equals(directive.toLowerCase())) + release = value; + else if (directive.toLowerCase().startsWith("source")) + sources.put(directive, interpret(value)); + else if (directive.toLowerCase().startsWith("patch")) + patches.put(directive, interpret(value)); + } + + } catch (IOException e) { + throw new RuntimeException("Cannot parse spec file " + specFile, e); + } + } + + protected String interpret(String value) { + StringBuffer buf = new StringBuffer(value.length()); + StringBuffer currKey = null; + boolean mayBeKey = false; + chars: for (char c : value.toCharArray()) { + if (c == '%') + mayBeKey = true; + else if (c == '{') { + if (mayBeKey) + currKey = new StringBuffer(); + } else if (c == '}') { + if (currKey == null) + continue chars; + String key = currKey.toString(); + if ("name".equals(key.toLowerCase())) + buf.append(name); + else if ("version".equals(key.toLowerCase())) + buf.append(version); + else + buf.append("%{").append(key).append('}'); + currKey = null; + } else { + if (currKey != null) + currKey.append(c); + else + buf.append(c); + } + } + return buf.toString(); + } + + public Resource getSpecFile() { + return specFile; + } + + public String getName() { + return name; + } + + public String getVersion() { + return version; + } + + public String getRelease() { + return release; + } + + public Map getSources() { + return sources; + } + + public Map getPatches() { + return patches; + } + +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/StagingRpmRepository.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/StagingRpmRepository.java new file mode 100644 index 000000000..58977f463 --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/StagingRpmRepository.java @@ -0,0 +1,6 @@ +package org.argeo.slc.rpmfactory.core; + +/** Local build repository, used only for builds. */ +public class StagingRpmRepository extends AbstractRpmRepository { + +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/ThirdPartyRpmRepository.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/ThirdPartyRpmRepository.java new file mode 100644 index 000000000..29025301c --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/ThirdPartyRpmRepository.java @@ -0,0 +1,18 @@ +package org.argeo.slc.rpmfactory.core; + +/** + * A repository of third party RPMs used for the build. RPM used by the builds + * will be cached within the system. + */ +public class ThirdPartyRpmRepository extends AbstractRpmRepository { + private String yumConf; + + public String getYumConf() { + return yumConf; + } + + public void setYumConf(String yumConf) { + this.yumConf = yumConf; + } + +} diff --git a/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/YumListParser.java b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/YumListParser.java new file mode 100644 index 000000000..1b44dd494 --- /dev/null +++ b/org.argeo.slc.factory/src/org/argeo/slc/rpmfactory/core/YumListParser.java @@ -0,0 +1,100 @@ +package org.argeo.slc.rpmfactory.core; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.TreeSet; + +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.LineIterator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.SlcException; +import org.springframework.core.io.Resource; + +/** + * Reads the output of a 'yum list all' command and interpret the list of + * packages. + */ +public class YumListParser implements RpmPackageSet { + private final static Log log = LogFactory.getLog(YumListParser.class); + + private Set installed = new TreeSet(); + /** Not installed but available */ + private Set installable = new TreeSet(); + + private Resource yumListOutput; + + public void init() { + try { + if (yumListOutput != null) { + load(yumListOutput.getInputStream()); + if (log.isDebugEnabled()) + log.debug(installed.size() + " installed, " + + installable.size() + " installable, from " + + yumListOutput); + } + } catch (IOException e) { + throw new SlcException("Cannot initialize yum list parser", e); + } + } + + public Boolean contains(String packageName) { + if (installed.contains(packageName)) + return true; + else + return installable.contains(packageName); + } + + protected void load(InputStream in) { + try { + Boolean readingInstalled = false; + Boolean readingAvailable = false; + LineIterator it = IOUtils.lineIterator(in, "UTF-8"); + while (it.hasNext()) { + String line = it.nextLine(); + if (line.trim().equals("Installed Packages")) { + readingInstalled = true; + } else if (line.trim().equals("Available Packages")) { + readingAvailable = true; + readingInstalled = false; + } else if (readingAvailable) { + if (Character.isLetterOrDigit(line.charAt(0))) { + installable.add(extractRpmName(line)); + } + } else if (readingInstalled) { + if (Character.isLetterOrDigit(line.charAt(0))) { + installed.add(extractRpmName(line)); + } + } + } + } catch (IOException e) { + throw new SlcException("Cannot load yum list output", e); + } finally { + IOUtils.closeQuietly(in); + } + } + + protected String extractRpmName(String line) { + StringTokenizer st = new StringTokenizer(line, " \t"); + String packageName = st.nextToken(); + // consider the arch as an extension + return FilenameUtils.getBaseName(packageName); + //return packageName.split("\\.")[0]; + } + + public Set getInstalled() { + return installed; + } + + public Set getInstallable() { + return installable; + } + + public void setYumListOutput(Resource yumListOutput) { + this.yumListOutput = yumListOutput; + } + +} diff --git a/pom.xml b/pom.xml index 8d6fdae77..4d5748d55 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,7 @@ org.argeo.slc.unit org.argeo.slc.support org.argeo.slc.repo + org.argeo.slc.factory diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/RpmFactory.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/RpmFactory.java deleted file mode 100644 index aee295693..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/RpmFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2007-2012 Argeo GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.argeo.slc.rpmfactory; - -import java.io.File; -import java.util.List; - -import javax.jcr.Node; - -/** - * Defines a build environment. This information is typically used by other - * components performing the various actions related to RPM build. - */ -public interface RpmFactory { - // - // DIRECT ACTIONS ON JCR REPOSITORY - // - public void indexWorkspace(String workspace); - - public Node newDistribution(String distributionId); - - // - // CONFIG FILES GENERATION - // - /** Creates a mock config file. */ - public File getMockConfigFile(String arch, String branch); - - /** Creates a yum config file. */ - public File getYumRepoFile(String arch); - - // - // WORKSPACES - // - public String getStagingWorkspace(); - - /** - * @return the name of the testing workspace, or null if and only if the - * testing workspace was not enabled. - */ - public String getTestingWorkspace(); - - public String getStableWorkspace(); - - public File getWorkspaceDir(String workspace); - - // - // ARCH DEPENDENT INFOS - // - public List getArchs(); - - public String getMockConfig(String arch); - - public String getIdWithArch(String arch); - - public File getResultDir(String arch); - - // - // DEPLOYMENT - // - public String getGitBaseUrl(); - - public Boolean isDeveloperInstance(); - -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/RpmProxyService.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/RpmProxyService.java deleted file mode 100644 index 8f86253b6..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/RpmProxyService.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2007-2012 Argeo GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.argeo.slc.rpmfactory; - -import org.argeo.jcr.proxy.ResourceProxy; - -/** Marker interface (useful for OSGi services references), may be extended later */ -public interface RpmProxyService extends ResourceProxy { -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/RpmRepository.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/RpmRepository.java deleted file mode 100644 index 24d7c727c..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/RpmRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.argeo.slc.rpmfactory; - -/** A YUM compatible repository of RPM packages. */ -public interface RpmRepository { - public String getId(); - - public String getUrl(); - -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/AbstractRpmRepository.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/AbstractRpmRepository.java deleted file mode 100644 index 19418b61d..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/AbstractRpmRepository.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.argeo.slc.rpmfactory.core; - -import org.argeo.slc.rpmfactory.RpmRepository; - -/** Common method to RPM repositories. */ -public abstract class AbstractRpmRepository implements RpmRepository { - private String id; - private String url; - - @Override - public String getId() { - return id; - } - - @Override - public String getUrl() { - return url; - } - - public void setId(String id) { - this.id = id; - } - - public void setUrl(String url) { - this.url = url; - } - -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/BuildInMock.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/BuildInMock.java deleted file mode 100644 index 1f815eac5..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/BuildInMock.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (C) 2007-2012 Argeo GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.argeo.slc.rpmfactory.core; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.apache.commons.exec.Executor; -import org.apache.commons.io.FileUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.argeo.slc.SlcException; -import org.argeo.slc.core.execution.tasks.SystemCall; -import org.argeo.slc.rpmfactory.RpmFactory; - -/** Build an RPM in mock. */ -public class BuildInMock implements Runnable { - private final static Log log = LogFactory.getLog(BuildInMock.class); - private final static String NOARCH = "noarch"; - - private String rpmPackage = null; - private String branch = null; - private String arch = NOARCH; - - private RpmFactory rpmFactory; - private Executor executor; - - private String debuginfoDirName = "debuginfo"; - private String mockExecutable = "/usr/bin/mock"; - - private List preBuildCommands = new ArrayList(); - - public void run() { - if (!rpmFactory.isDeveloperInstance()) { - // clean/init - SystemCall mockClean = createBaseMockCall(); - mockClean.arg("--init"); - mockClean.run(); - } - - // pre build commands - for (String preBuildCmd : preBuildCommands) { - SystemCall mockClean = createBaseMockCall(); - mockClean.arg("--chroot").arg(preBuildCmd); - mockClean.run(); - } - - // actual build - SystemCall mockBuild = createBaseMockCall(); - mockBuild.arg("--scm-enable"); - mockBuild.arg("--scm-option").arg("package=" + rpmPackage); - mockBuild.arg("--no-clean"); - // - // - mockBuild.run(); - // - - // copy RPMs to target directories - File stagingDir = rpmFactory.getWorkspaceDir(rpmFactory - .getStagingWorkspace()); - File srpmDir = new File(stagingDir, "SRPMS"); - srpmDir.mkdirs(); - File archDir = null; - File debuginfoDir = null; - if (!arch.equals(NOARCH)) { - archDir = new File(stagingDir, arch); - debuginfoDir = new File(archDir, debuginfoDirName); - debuginfoDir.mkdirs(); - } - - Set reposToRecreate = new HashSet(); - File resultDir = rpmFactory.getResultDir(arch); - if (resultDir.exists()) - rpms: for (File file : resultDir.listFiles()) { - if (file.isDirectory()) - continue rpms; - - File[] targetDirs; - if (file.getName().contains(".src.rpm")) - targetDirs = new File[] { srpmDir }; - else if (file.getName().contains("-debuginfo-")) - targetDirs = new File[] { debuginfoDir }; - else if (!arch.equals(NOARCH) - && file.getName().contains("." + arch + ".rpm")) - targetDirs = new File[] { archDir }; - else if (file.getName().contains(".noarch.rpm")) { - List dirs = new ArrayList(); - for (String arch : rpmFactory.getArchs()) - dirs.add(new File(stagingDir, arch)); - targetDirs = dirs.toArray(new File[dirs.size()]); - } else if (file.getName().contains(".rpm")) - throw new SlcException("Don't know where to copy " + file); - else { - if (log.isTraceEnabled()) - log.trace("Skip " + file); - continue rpms; - } - - reposToRecreate.addAll(Arrays.asList(targetDirs)); - copyToDirs(file, targetDirs); - } - - // recreate changed repos - for (File repoToRecreate : reposToRecreate) { - SystemCall createrepo = new SystemCall(); - createrepo.arg("createrepo"); - // sqllite db - createrepo.arg("-d"); - // debuginfo - if (!repoToRecreate.getName().equals(debuginfoDirName)) - createrepo.arg("-x").arg(debuginfoDirName + "/*"); - // quiet - createrepo.arg("-q"); - createrepo.arg(repoToRecreate.getAbsolutePath()); - - createrepo.setExecutor(executor); - createrepo.run(); - log.info("Updated repo " + repoToRecreate); - } - - // index staging workspace - rpmFactory.indexWorkspace(rpmFactory.getStagingWorkspace()); - } - - /** Creates a mock call with all the common options such as config file etc. */ - protected SystemCall createBaseMockCall() { - String mockCfg = rpmFactory.getMockConfig(arch); - File mockConfigFile = rpmFactory.getMockConfigFile(arch, branch); - - // prepare mock call - SystemCall mock = new SystemCall(); - - if (arch != null) - mock.arg("setarch").arg(arch); - mock.arg(mockExecutable); - mock.arg("-v"); - mock.arg("--configdir=" + mockConfigFile.getAbsoluteFile().getParent()); - if (arch != null) - mock.arg("--arch=" + arch); - mock.arg("-r").arg(mockCfg); - - mock.setLogCommand(true); - mock.setExecutor(executor); - - return mock; - } - - protected void copyToDirs(File file, File[] dirs) { - for (File dir : dirs) { - try { - FileUtils.copyFileToDirectory(file, dir); - if (log.isDebugEnabled()) - log.debug(file + " => " + dir); - } catch (IOException e) { - throw new SlcException("Cannot copy " + file + " to " + dir, e); - } - } - } - - public void setArch(String arch) { - this.arch = arch; - } - - public void setRpmPackage(String rpmPackage) { - this.rpmPackage = rpmPackage; - } - - public void setBranch(String branch) { - this.branch = branch; - } - - public void setRpmFactory(RpmFactory env) { - this.rpmFactory = env; - } - - public void setExecutor(Executor executor) { - this.executor = executor; - } - - public void setMockExecutable(String mockExecutable) { - this.mockExecutable = mockExecutable; - } - - public void setPreBuildCommands(List preBuildCommands) { - this.preBuildCommands = preBuildCommands; - } - -} \ No newline at end of file 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 deleted file mode 100644 index 9fd4993cf..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/CreateRpmDistribution.java +++ /dev/null @@ -1,142 +0,0 @@ -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; -import org.argeo.slc.rpmfactory.RpmFactory; - -/** - * 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() { - 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"); - repoquery.arg("--archlist=" + arch); - - 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; - } - -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/ReleaseStaging.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/ReleaseStaging.java deleted file mode 100644 index 76a67005a..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/ReleaseStaging.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.argeo.slc.rpmfactory.core; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.exec.Executor; -import org.apache.commons.io.FileUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.argeo.slc.SlcException; -import org.argeo.slc.core.execution.tasks.SystemCall; -import org.argeo.slc.rpmfactory.RpmFactory; - -/** Releases the content of staging to a public repository. */ -public class ReleaseStaging implements Runnable { - private final static Log log = LogFactory.getLog(ReleaseStaging.class); - - private RpmFactory rpmFactory; - private Executor executor; - - private String debuginfoDirName = "debuginfo"; - - @Override - public void run() { - String sourceWorkspace = rpmFactory.getStagingWorkspace(); - File sourceRepoDir = rpmFactory.getWorkspaceDir(sourceWorkspace); - String targetWorkspace = rpmFactory.getTestingWorkspace() != null ? rpmFactory - .getTestingWorkspace() : rpmFactory.getStableWorkspace(); - File targetRepoDir = rpmFactory.getWorkspaceDir(targetWorkspace); - List reposToRecreate = new ArrayList(); - - stagingChildren: for (File dir : sourceRepoDir.listFiles()) { - if (!dir.isDirectory()) - continue stagingChildren; - if (dir.getName().equals("lost+found")) - continue stagingChildren; - - File targetDir = new File(targetRepoDir, dir.getName()); - try { - FileUtils.copyDirectory(dir, targetDir); - if (log.isDebugEnabled()) - log.debug(dir + " => " + targetDir); - } catch (IOException e) { - throw new SlcException(sourceRepoDir - + " could not be copied properly, check it manually." - + " Metadata have NOT been updated.", e); - } - - reposToRecreate.add(dir); - reposToRecreate.add(targetDir); - File debugInfoDir = new File(dir, debuginfoDirName); - if (debugInfoDir.exists()) - reposToRecreate.add(debugInfoDir); - File targetDebugInfoDir = new File(targetDir, debuginfoDirName); - if (targetDebugInfoDir.exists()) - reposToRecreate.add(targetDebugInfoDir); - - } - - // clear staging - for (File dir : sourceRepoDir.listFiles()) { - try { - if (dir.getName().equals("lost+found")) - continue; - if (dir.isDirectory()) - FileUtils.deleteDirectory(dir); - } catch (IOException e) { - log.error("Could not delete " + dir + ". " + e); - } - } - - // recreate changed repos - for (File repoToRecreate : reposToRecreate) { - repoToRecreate.mkdirs(); - SystemCall createrepo = new SystemCall(); - createrepo.arg("createrepo"); - // sqllite db - createrepo.arg("-d"); - // debuginfo - if (!repoToRecreate.getName().equals(debuginfoDirName)) - createrepo.arg("-x").arg(debuginfoDirName + "/*"); - // quiet - createrepo.arg("-q"); - createrepo.arg(repoToRecreate.getAbsolutePath()); - - createrepo.setExecutor(executor); - createrepo.run(); - log.info("Updated repo " + repoToRecreate); - } - - rpmFactory.indexWorkspace(sourceWorkspace); - rpmFactory.indexWorkspace(targetWorkspace); - } - - public void setRpmFactory(RpmFactory rpmFactory) { - this.rpmFactory = rpmFactory; - } - - public void setExecutor(Executor executor) { - this.executor = executor; - } - - public void setDebuginfoDirName(String debuginfoDirName) { - this.debuginfoDirName = debuginfoDirName; - } - -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmDistribution.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmDistribution.java deleted file mode 100644 index 0df31c687..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmDistribution.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.argeo.slc.rpmfactory.core; - -import java.util.List; - -/** A consistent distributable set of RPM. */ -public class RpmDistribution { - private String id; - private List packages; - private List excludedPackages; - - public List getPackages() { - return packages; - } - - public void setPackages(List packages) { - this.packages = packages; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public List getExcludedPackages() { - return excludedPackages; - } - - public void setExcludedPackages(List excludedPackages) { - this.excludedPackages = excludedPackages; - } - -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmFactoryImpl.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmFactoryImpl.java deleted file mode 100644 index 4d5df3bd4..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmFactoryImpl.java +++ /dev/null @@ -1,473 +0,0 @@ -/* - * Copyright (C) 2007-2012 Argeo GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.argeo.slc.rpmfactory.core; - -import java.io.File; -import java.io.IOException; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.jcr.Node; -import javax.jcr.Repository; -import javax.jcr.RepositoryException; -import javax.jcr.Session; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.argeo.jcr.JcrUtils; -import org.argeo.slc.SlcConstants; -import org.argeo.slc.SlcException; -import org.argeo.slc.core.execution.tasks.SystemCall; -import org.argeo.slc.repo.NodeIndexerVisitor; -import org.argeo.slc.repo.RpmIndexer; -import org.argeo.slc.rpmfactory.RpmFactory; -import org.argeo.slc.rpmfactory.RpmRepository; - -/** - * Defines a build environment. This information is typically used by other - * components performing the various actions related to RPM build. - */ -public class RpmFactoryImpl implements RpmFactory { - private Log log = LogFactory.getLog(RpmFactoryImpl.class); - - private Repository rpmRepository; - private Repository distRepository; - - private String id; - private List repositories = new ArrayList(); - private List archs = new ArrayList(); - - private String rpmBase = "/mnt/slc/repos/rpm"; - private String distBase = "/mnt/slc/repos/dist"; - private String mockVar = "/var/lib/mock"; - private String mockEtc = "/etc/mock"; - - private DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmm"); - - private String gitWorkspace = "git"; - - private String localUrlBase = "http://localhost:7070/"; - /** If not null or empty, this is a developer instance. */ - private String gitDevBaseUrl = null; - - private Boolean withTestingRepository = false; - - private String yumConfigMainSection = "cachedir=/var/cache/yum\n" - + "debuglevel=1\n" + "reposdir=/dev/null\n" - + "logfile=/var/log/yum.log\n" + "retries=20\n" + "obsoletes=1\n" - + "gpgcheck=0\n" + "assumeyes=1\n" + "syslog_ident=mock\n" - + "syslog_device=\n" + "http_caching=none\n"; - - private String defaultMacroFiles = "/usr/lib/rpm/macros:" - + "/usr/lib/rpm/ia32e-linux/macros:" - + "/usr/lib/rpm/redhat/macros:" + "/etc/rpm/macros.*:" - + "/etc/rpm/macros:" + "/etc/rpm/ia32e-linux/macros:" - + "~/.rpmmacros"; - private Map rpmmacros = new HashMap(); - - // set by init - private String proxiedReposBase; - private String managedReposBase; - - private String stagingWorkspace; - private String testingWorkspace; - private String stableWorkspace; - - private File rpmFactoryBaseDir; - private File mockConfDir; - private File yumConfDir; - - public void init() { - // local URL bases - proxiedReposBase = localUrlBase + "repo/rpm/"; - managedReposBase = localUrlBase + "data/public/rpm/"; - - // local directories - rpmFactoryBaseDir.mkdirs(); - mockConfDir = new File(rpmFactoryBaseDir.getPath() + "/conf/mock"); - mockConfDir.mkdirs(); - yumConfDir = new File(rpmFactoryBaseDir.getPath() + "/conf/yum"); - yumConfDir.mkdirs(); - - // managed repositories - stagingWorkspace = id + "-staging"; - if (withTestingRepository) - testingWorkspace = id + "-testing"; - stableWorkspace = id; - - initDistWorkspace(stableWorkspace); - initGitWorkspace(); - initRpmWorkspace(stagingWorkspace); - if (withTestingRepository) - initRpmWorkspace(testingWorkspace); - initRpmWorkspace(stableWorkspace); - } - - protected void initRpmWorkspace(String workspace) { - Session session = null; - try { - session = JcrUtils.loginOrCreateWorkspace(rpmRepository, workspace); - JcrUtils.addPrivilege(session, "/", "anonymous", "jcr:read"); - JcrUtils.addPrivilege(session, "/", SlcConstants.ROLE_SLC, - "jcr:all"); - - for (String arch : archs) { - Node archFolder = JcrUtils.mkfolders(session, "/" + arch); - session.save(); - File workspaceDir = getWorkspaceDir(workspace); - try { - if (!archFolder.hasNode("repodata")) { - // touch a file in order to make sure this is properly - // mounted. - File touch = new File(workspaceDir, ".touch"); - touch.createNewFile(); - touch.delete(); - - SystemCall createrepo = new SystemCall(); - createrepo.arg("createrepo"); - createrepo.arg("-q"); - File archDir = new File(workspaceDir, arch); - createrepo.arg(archDir.getAbsolutePath()); - createrepo.run(); - } - } catch (IOException e) { - log.error(workspaceDir + " not properly mounted.", e); - } - } - } catch (Exception e) { - throw new SlcException("Cannot initialize workspace " + workspace, - e); - } finally { - JcrUtils.logoutQuietly(session); - } - } - - /** Caller must logout the underlying session. */ - public Node newDistribution(String distributionId) { - Session session = null; - try { - session = JcrUtils.loginOrCreateWorkspace(rpmRepository, - distributionId); - JcrUtils.addPrivilege(session, "/", "anonymous", "jcr:read"); - JcrUtils.addPrivilege(session, "/", SlcConstants.ROLE_SLC, - "jcr:all"); - - Calendar now = new GregorianCalendar(); - String folderName = dateFormat.format(now.getTime()); - return JcrUtils.mkfolders(session, "/" + folderName); - } catch (Exception e) { - JcrUtils.logoutQuietly(session); - throw new SlcException("Cannot initialize distribution workspace " - + distributionId, e); - } - } - - protected void initGitWorkspace() { - Session session = null; - try { - session = JcrUtils.loginOrCreateWorkspace(rpmRepository, - gitWorkspace); - JcrUtils.addPrivilege(session, "/", "anonymous", "jcr:read"); - JcrUtils.addPrivilege(session, "/", SlcConstants.ROLE_SLC, - "jcr:all"); - } catch (Exception e) { - throw new SlcException("Cannot initialize workspace " - + gitWorkspace, e); - } finally { - JcrUtils.logoutQuietly(session); - } - } - - protected void initDistWorkspace(String workspace) { - Session session = null; - try { - session = JcrUtils - .loginOrCreateWorkspace(distRepository, workspace); - JcrUtils.addPrivilege(session, "/", "anonymous", "jcr:read"); - } catch (RepositoryException e) { - throw new SlcException("Cannot initialize workspace " + workspace, - e); - } finally { - JcrUtils.logoutQuietly(session); - } - } - - public void destroy() { - - } - - public String generateMockConfigFile(String arch, String branch) { - StringBuffer buf = new StringBuffer(); - - buf.append("config_opts['root'] = '" + getIdWithArch(arch) + "'\n"); - buf.append("config_opts['target_arch'] = '" + arch + "'\n"); - buf.append("config_opts['legal_host_arches'] = ('" + arch + "',)\n"); - buf.append("config_opts['chroot_setup_cmd'] = 'groupinstall buildsys-build'\n"); - // buf.append("config_opts['dist'] = 'el6'\n"); - buf.append("config_opts['plugin_conf']['yum_cache_enable'] = False\n"); - - buf.append("config_opts['scm'] = False\n"); - buf.append("config_opts['scm_opts']['method'] = 'git'\n"); - buf.append("config_opts['scm_opts']['spec'] = 'SCM_PKG.spec'\n"); - buf.append("config_opts['scm_opts']['ext_src_dir'] = '" - + getSourcesDir().getAbsolutePath() + "'\n"); - buf.append("config_opts['scm_opts']['git_timestamps'] = True\n"); - - // development - if (gitDevBaseUrl != null && !gitDevBaseUrl.trim().equals("")) - buf.append("config_opts['scm_opts']['git_get'] = 'git clone " - + (branch != null ? "-b " + branch : "") + " " - + gitDevBaseUrl + "/SCM_PKG SCM_PKG'\n"); - else - buf.append("config_opts['scm_opts']['git_get'] = 'git clone " - + (branch != null ? "-b " + branch : "") + " " - + getGitBaseUrl() + "/SCM_PKG.git SCM_PKG'\n"); - - buf.append("\nconfig_opts['yum.conf'] = \"\"\"\n"); - buf.append(generateYumConfigFile(arch)).append('\n'); - buf.append("\"\"\"\n"); - return buf.toString(); - } - - public String generateYumConfigFile(String arch) { - StringBuffer buf = new StringBuffer(); - buf.append("[main]\n"); - buf.append(yumConfigMainSection).append('\n'); - - for (RpmRepository repository : repositories) { - buf.append('[').append(repository.getId()).append("]\n"); - buf.append("name=").append(repository.getId()).append('\n'); - if (repository instanceof ThirdPartyRpmRepository) { - buf.append("#baseurl=").append(repository.getUrl()) - .append(arch).append('/').append("\n"); - buf.append("baseurl=").append(proxiedReposBase) - .append(repository.getId()).append('/').append(arch) - .append('/').append("\n"); - if (((ThirdPartyRpmRepository) repository).getYumConf() != null) - buf.append( - ((ThirdPartyRpmRepository) repository).getYumConf() - .trim()).append('\n'); - } - } - - // managed repos - addManagedRepository(buf, stagingWorkspace, arch); - if (withTestingRepository) - addManagedRepository(buf, testingWorkspace, arch); - addManagedRepository(buf, stableWorkspace, arch); - return buf.toString(); - } - - protected void addManagedRepository(StringBuffer buf, String workspace, - String arch) { - buf.append('[').append(workspace).append("]\n"); - buf.append("baseurl=").append(managedReposBase).append(workspace) - .append('/').append(arch).append('/').append("\n"); - buf.append("gpgcheck=0").append("\n"); - } - - /** Creates a mock config file. */ - public File getMockConfigFile(String arch, String branch) { - File mockSiteDefaultsFile = new File(mockConfDir, "site-defaults.cfg"); - File mockLoggingFile = new File(mockConfDir, "logging.ini"); - File mockConfigFile = new File(mockConfDir, getIdWithArch(arch) - + ".cfg"); - try { - if (!mockSiteDefaultsFile.exists()) - mockSiteDefaultsFile.createNewFile(); - if (!mockLoggingFile.exists()) - FileUtils.copyFile(new File(mockEtc + "/logging.ini"), - mockLoggingFile); - - FileUtils.writeStringToFile(mockConfigFile, - generateMockConfigFile(arch, branch)); - return mockConfigFile; - } catch (IOException e) { - throw new SlcException("Cannot write mock config file to " - + mockConfigFile, e); - } - } - - /** Creates a yum config file. */ - public File getYumRepoFile(String arch) { - File yumConfigFile = new File(yumConfDir, getIdWithArch(arch) + ".repo"); - try { - FileUtils.writeStringToFile(yumConfigFile, - generateYumConfigFile(arch)); - return yumConfigFile; - } catch (IOException e) { - throw new SlcException("Cannot write yum config file to " - + yumConfigFile, e); - } - } - - public File getResultDir(String arch) { - return new File(mockVar + "/" + getIdWithArch(arch) + "/result"); - } - - public File getWorkspaceDir(String workspace) { - return new File(rpmBase + "/" + workspace); - } - - public File getSourcesDir() { - return new File(distBase + "/" + stableWorkspace); - } - - public String getMockConfig(String arch) { - return getIdWithArch(arch); - } - - public String getIdWithArch(String arch) { - return id + "-" + arch; - } - - public String getGitBaseUrl() { - return managedReposBase + gitWorkspace; - } - - public void indexWorkspace(String workspace) { - Session session = null; - try { - session = rpmRepository.login(workspace); - session.getRootNode().accept( - new NodeIndexerVisitor(new RpmIndexer())); - if (log.isDebugEnabled()) - log.debug("Indexed workspace " + workspace); - } catch (RepositoryException e) { - throw new SlcException("Cannot index workspace " + workspace, e); - } finally { - JcrUtils.logoutQuietly(session); - } - } - - public Boolean isDeveloperInstance() { - return gitDevBaseUrl != null; - } - - /** Write (topdir)/rpmmacros and (topdir)/rpmrc */ - public void writeRpmbuildConfigFiles(File topdir) { - writeRpmbuildConfigFiles(topdir, new File(topdir, "rpmmacros"), - new File(topdir, "rpmrc")); - } - - public void writeRpmbuildConfigFiles(File topdir, File rpmmacroFile, - File rpmrcFile) { - try { - List macroLines = new ArrayList(); - macroLines.add("%_topdir " + topdir.getCanonicalPath()); - for (String macroKey : rpmmacros.keySet()) { - macroLines.add(macroKey + " " + rpmmacros.get(macroKey)); - } - FileUtils.writeLines(rpmmacroFile, macroLines); - - List rpmrcLines = new ArrayList(); - rpmrcLines.add("include: /usr/lib/rpm/rpmrc"); - rpmrcLines.add("macrofiles: " + defaultMacroFiles + ":" - + rpmmacroFile.getCanonicalPath()); - FileUtils.writeLines(rpmrcFile, rpmrcLines); - } catch (IOException e) { - throw new SlcException("Cannot write rpmbuild config files", e); - } - - } - - public Map getRpmmacros() { - return rpmmacros; - } - - public void setRpmmacros(Map rpmmacros) { - this.rpmmacros = rpmmacros; - } - - public String getDefaultMacroFiles() { - return defaultMacroFiles; - } - - public void setDefaultMacroFiles(String defaultMacroFiles) { - this.defaultMacroFiles = defaultMacroFiles; - } - - public void setArchs(List archs) { - this.archs = archs; - } - - public List getArchs() { - return archs; - } - - public void setRpmBase(String stagingBase) { - this.rpmBase = stagingBase; - } - - public void setId(String id) { - this.id = id; - } - - public void setMockVar(String mockVar) { - this.mockVar = mockVar; - } - - public void setRpmRepository(Repository rpmRepository) { - this.rpmRepository = rpmRepository; - } - - public void setDistRepository(Repository distRepository) { - this.distRepository = distRepository; - } - - public void setLocalUrlBase(String localUrlBase) { - this.localUrlBase = localUrlBase; - } - - public void setYumConfigMainSection(String yumConfigMainSection) { - this.yumConfigMainSection = yumConfigMainSection; - } - - public void setRepositories(List repositories) { - this.repositories = repositories; - } - - public void setRpmFactoryBaseDir(File rpmFactoryBaseDir) { - this.rpmFactoryBaseDir = rpmFactoryBaseDir; - } - - public String getStagingWorkspace() { - return stagingWorkspace; - } - - public String getTestingWorkspace() { - return testingWorkspace; - } - - public String getStableWorkspace() { - return stableWorkspace; - } - - public void setWithTestingRepository(Boolean withTestingRepository) { - this.withTestingRepository = withTestingRepository; - } - - public void setGitDevBaseUrl(String gitBaseUrl) { - this.gitDevBaseUrl = gitBaseUrl; - } -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmPackageSet.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmPackageSet.java deleted file mode 100644 index 16934132b..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmPackageSet.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.argeo.slc.rpmfactory.core; - -/** Set of RPM packages */ -public interface RpmPackageSet { - public Boolean contains(String rpmPackage); -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmProxyServiceImpl.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmProxyServiceImpl.java deleted file mode 100644 index 82d9e553b..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmProxyServiceImpl.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (C) 2007-2012 Argeo GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.argeo.slc.rpmfactory.core; - -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; - -import javax.jcr.Node; -import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.jcr.nodetype.NodeType; -import javax.jcr.security.AccessControlException; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.argeo.jcr.ArgeoNames; -import org.argeo.jcr.JcrUtils; -import org.argeo.jcr.proxy.AbstractUrlProxy; -import org.argeo.slc.SlcConstants; -import org.argeo.slc.SlcException; -import org.argeo.slc.jcr.SlcNames; -import org.argeo.slc.jcr.SlcTypes; -import org.argeo.slc.repo.RepoConstants; -import org.argeo.slc.rpmfactory.RpmProxyService; -import org.argeo.slc.rpmfactory.RpmRepository; - -/** Synchronises the node repository with remote Maven repositories */ -public class RpmProxyServiceImpl extends AbstractUrlProxy implements - RpmProxyService, ArgeoNames, SlcNames { - private final static Log log = LogFactory.getLog(RpmProxyServiceImpl.class); - - private Set defaultRepositories = new HashSet(); - - @Override - protected void beforeInitSessionSave(Session session) - throws RepositoryException { - JcrUtils.addPrivilege(session, "/", "anonymous", "jcr:read"); - try { - JcrUtils.addPrivilege(session, "/", SlcConstants.ROLE_SLC, - "jcr:all"); - } catch (AccessControlException e) { - if (log.isTraceEnabled()) - log.trace("Cannot give jcr:all privileges to ROLE_SLC"); - } - - JcrUtils.mkdirsSafe(session, RepoConstants.PROXIED_REPOSITORIES); - } - - /** - * Retrieve and add this file to the repository - */ - @Override - protected Node retrieve(Session session, String path) { - StringBuilder relativePathBuilder = new StringBuilder(); - String repoId = extractRepoId(path, relativePathBuilder); - // remove starting '/' - String relativePath = relativePathBuilder.toString().substring(1); - - RpmRepository sourceRepo = null; - for (Iterator reposIt = defaultRepositories.iterator(); reposIt - .hasNext();) { - RpmRepository rpmRepo = reposIt.next(); - if (rpmRepo.getId().equals(repoId)) { - sourceRepo = rpmRepo; - break; - } - } - - if (sourceRepo == null) - throw new SlcException("No RPM repository found for " + path); - - try { - String baseUrl = sourceRepo.getUrl(); - String remoteUrl = baseUrl + relativePath; - Node node = proxyUrl(session, remoteUrl, path); - if (node != null) { - registerSource(sourceRepo, node, remoteUrl); - if (log.isDebugEnabled()) - log.debug("Imported " + remoteUrl + " to " + node); - return node; - } - } catch (Exception e) { - throw new SlcException("Cannot proxy " + path, e); - } - JcrUtils.discardQuietly(session); - throw new SlcException("No proxy found for " + path); - } - - protected void registerSource(RpmRepository sourceRepo, Node node, - String remoteUrl) throws RepositoryException { - node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN); - Node origin; - if (!node.hasNode(SLC_ORIGIN)) - origin = node.addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED); - else - origin = node.getNode(SLC_ORIGIN); - - // proxied repository - Node proxiedRepository; - String proxiedRepositoryPath = RepoConstants.PROXIED_REPOSITORIES + '/' - + sourceRepo.getId(); - Session session = node.getSession(); - if (session.itemExists(proxiedRepositoryPath)) { - proxiedRepository = session.getNode(proxiedRepositoryPath); - } else { - proxiedRepository = session.getNode( - RepoConstants.PROXIED_REPOSITORIES).addNode( - sourceRepo.getId()); - proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE); - JcrUtils.urlToAddressProperties(proxiedRepository, - sourceRepo.getUrl()); - proxiedRepository.setProperty(SLC_URL, sourceRepo.getUrl()); - } - - origin.setProperty(SLC_PROXY, proxiedRepository); - JcrUtils.urlToAddressProperties(origin, remoteUrl); - } - - /** Returns the first token of the path */ - protected String extractRepoId(String path, StringBuilder relativePath) { - StringBuilder workspace = new StringBuilder(); - StringBuilder buf = workspace; - for (int i = 1; i < path.length(); i++) { - char c = path.charAt(i); - if (c == '/') { - buf = relativePath; - } - buf.append(c); - } - return workspace.toString(); - } - - @Override - protected Boolean shouldUpdate(Session clientSession, String nodePath) { - // if (nodePath.contains("/repodata/")) - // return true; - return super.shouldUpdate(clientSession, nodePath); - } - - public void setDefaultRepositories(Set defaultRepositories) { - this.defaultRepositories = defaultRepositories; - } -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmSpecFile.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmSpecFile.java deleted file mode 100644 index 4b4db3b2e..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmSpecFile.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2007-2012 Argeo GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.argeo.slc.rpmfactory.core; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.IOUtils; -import org.springframework.core.io.Resource; - -public class RpmSpecFile { - private Resource specFile; - - private String name; - private String version; - private String release; - private Map sources = new HashMap(); - private Map patches = new HashMap(); - - public RpmSpecFile(Resource specFile) { - this.specFile = specFile; - parseSpecFile(); - } - - public void init() { - parseSpecFile(); - } - - @SuppressWarnings("unchecked") - protected void parseSpecFile() { - try { - List lines = (List) IOUtils.readLines(specFile - .getInputStream()); - - lines: for (String line : lines) { - int indexSemiColon = line.indexOf(':'); - if (indexSemiColon <= 0) - continue lines; - String directive = line.substring(0, indexSemiColon).trim(); - String value = line.substring(indexSemiColon + 1).trim(); - if ("name".equals(directive.toLowerCase())) - name = value; - else if ("version".equals(directive.toLowerCase())) - version = value; - else if ("release".equals(directive.toLowerCase())) - release = value; - else if (directive.toLowerCase().startsWith("source")) - sources.put(directive, interpret(value)); - else if (directive.toLowerCase().startsWith("patch")) - patches.put(directive, interpret(value)); - } - - } catch (IOException e) { - throw new RuntimeException("Cannot parse spec file " + specFile, e); - } - } - - protected String interpret(String value) { - StringBuffer buf = new StringBuffer(value.length()); - StringBuffer currKey = null; - boolean mayBeKey = false; - chars: for (char c : value.toCharArray()) { - if (c == '%') - mayBeKey = true; - else if (c == '{') { - if (mayBeKey) - currKey = new StringBuffer(); - } else if (c == '}') { - if (currKey == null) - continue chars; - String key = currKey.toString(); - if ("name".equals(key.toLowerCase())) - buf.append(name); - else if ("version".equals(key.toLowerCase())) - buf.append(version); - else - buf.append("%{").append(key).append('}'); - currKey = null; - } else { - if (currKey != null) - currKey.append(c); - else - buf.append(c); - } - } - return buf.toString(); - } - - public Resource getSpecFile() { - return specFile; - } - - public String getName() { - return name; - } - - public String getVersion() { - return version; - } - - public String getRelease() { - return release; - } - - public Map getSources() { - return sources; - } - - public Map getPatches() { - return patches; - } - -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/StagingRpmRepository.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/StagingRpmRepository.java deleted file mode 100644 index 58977f463..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/StagingRpmRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.argeo.slc.rpmfactory.core; - -/** Local build repository, used only for builds. */ -public class StagingRpmRepository extends AbstractRpmRepository { - -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/ThirdPartyRpmRepository.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/ThirdPartyRpmRepository.java deleted file mode 100644 index 29025301c..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/ThirdPartyRpmRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.argeo.slc.rpmfactory.core; - -/** - * A repository of third party RPMs used for the build. RPM used by the builds - * will be cached within the system. - */ -public class ThirdPartyRpmRepository extends AbstractRpmRepository { - private String yumConf; - - public String getYumConf() { - return yumConf; - } - - public void setYumConf(String yumConf) { - this.yumConf = yumConf; - } - -} diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/YumListParser.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/YumListParser.java deleted file mode 100644 index 1b44dd494..000000000 --- a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/YumListParser.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.argeo.slc.rpmfactory.core; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.TreeSet; - -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.io.LineIterator; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.argeo.slc.SlcException; -import org.springframework.core.io.Resource; - -/** - * Reads the output of a 'yum list all' command and interpret the list of - * packages. - */ -public class YumListParser implements RpmPackageSet { - private final static Log log = LogFactory.getLog(YumListParser.class); - - private Set installed = new TreeSet(); - /** Not installed but available */ - private Set installable = new TreeSet(); - - private Resource yumListOutput; - - public void init() { - try { - if (yumListOutput != null) { - load(yumListOutput.getInputStream()); - if (log.isDebugEnabled()) - log.debug(installed.size() + " installed, " - + installable.size() + " installable, from " - + yumListOutput); - } - } catch (IOException e) { - throw new SlcException("Cannot initialize yum list parser", e); - } - } - - public Boolean contains(String packageName) { - if (installed.contains(packageName)) - return true; - else - return installable.contains(packageName); - } - - protected void load(InputStream in) { - try { - Boolean readingInstalled = false; - Boolean readingAvailable = false; - LineIterator it = IOUtils.lineIterator(in, "UTF-8"); - while (it.hasNext()) { - String line = it.nextLine(); - if (line.trim().equals("Installed Packages")) { - readingInstalled = true; - } else if (line.trim().equals("Available Packages")) { - readingAvailable = true; - readingInstalled = false; - } else if (readingAvailable) { - if (Character.isLetterOrDigit(line.charAt(0))) { - installable.add(extractRpmName(line)); - } - } else if (readingInstalled) { - if (Character.isLetterOrDigit(line.charAt(0))) { - installed.add(extractRpmName(line)); - } - } - } - } catch (IOException e) { - throw new SlcException("Cannot load yum list output", e); - } finally { - IOUtils.closeQuietly(in); - } - } - - protected String extractRpmName(String line) { - StringTokenizer st = new StringTokenizer(line, " \t"); - String packageName = st.nextToken(); - // consider the arch as an extension - return FilenameUtils.getBaseName(packageName); - //return packageName.split("\\.")[0]; - } - - public Set getInstalled() { - return installed; - } - - public Set getInstallable() { - return installable; - } - - public void setYumListOutput(Resource yumListOutput) { - this.yumListOutput = yumListOutput; - } - -}