#log4j.logger.org.springframework.security=DEBUG
#log4j.logger.org.apache.jackrabbit=DEBUG
#log4j.logger.org.apache.jackrabbit.spi2dav=DEBUG
-log4j.logger.org.apache.jackrabbit.core.query.QueryImpl=DEBUG
+#log4j.logger.org.apache.jackrabbit.core.query.QueryImpl=DEBUG
log4j.logger.org.apache.coyote=INFO
log4j.logger.org.apache.catalina.core.ContainerBase=INFO
# development appender
log4j.appender.development=org.apache.log4j.ConsoleAppender
log4j.appender.development.layout=org.apache.log4j.PatternLayout
-#log4j.appender.development.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%16.16t] %5p %m (%F:%L) %c%n
-log4j.appender.development.layout.ConversionPattern=%d{HH:mm:ss,SSS} %5p %m [%16.16t] %c%n
+log4j.appender.development.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%16.16t] %5p %m (%F:%L) %c%n
+#log4j.appender.development.layout.ConversionPattern=%d{HH:mm:ss,SSS} %5p %m [%16.16t] %c%n
argeo.osgi.start.5=org.argeo.server.catalina.start,\
org.springframework.osgi.web.extender,\
org.argeo.jackrabbit.webapp,\
+org.argeo.slc.server.repo.webapp,\
slc.executionModules=org.argeo.slc.demo.ant,\
org.argeo.slc.demo.basic,\
eclipse.application=org.argeo.slc.client.rcp.application
org.argeo.security.ui.initialPerspective=org.argeo.slc.client.ui.slcExecutionPerspective
-#org.argeo.security.ui.initialPerspective=org.argeo.slc.client.ui.dist.distributionPerspective
log4j.configuration=file:../../log4j.properties
<item name="Home" href="${project.url}/index.html" />
<!--<item name="Getting Started" href="${project.url}/gettingStarted.html" />-->
<!--<item name="FAQ" href="${project.url}/faq.html" />-->
- <item name="API (Javadoc)" href="${project.url}/apidocs/index.html" target="argeo_slc_javadoc" />
- <item name="Browse Code" href="${project.url}/xref/index.html" target="argeo_slc_code" />
+ <item name="API (Javadoc)" href="${project.url}/apidocs/index.html" />
+ <item name="Browse Code" href="${project.url}/xref/index.html" />
<item name="FIXMEs / TODOs" href="${project.url}/taglist.html" />
</menu>
<!--
</bean>
<bean id="mavenProxyServlet" class="org.argeo.jcr.mvc.ResourceProxyServlet">
- <property name="jcrSession" ref="jcrSession" />
<property name="proxy" ref="mavenProxy" />
</bean>
-
- <bean id="jcrSession" class="org.argeo.security.jcr.SecureThreadBoundSession">
- <property name="workspace" value="localrepo" />
- <property name="repository" ref="jcrRepository" />
- </bean>
</beans>
\ No newline at end of file
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\r
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd">\r
\r
- <!-- REFRENCES -->\r
+ <!-- REFERENCES -->\r
<!-- Security -->\r
<reference id="authenticationManager"\r
interface="org.springframework.security.AuthenticationManager" />\r
filter="(argeo.jcr.repository.alias=java)" />\r
\r
<!-- Maven -->\r
- <reference id="mavenProxy" interface="org.argeo.slc.repo.maven.proxy.MavenProxyService" />\r
+ <reference id="mavenProxy" interface="org.argeo.slc.repo.MavenProxyService" />\r
+ <reference id="rpmProxy" interface="org.argeo.slc.rpmfactory.RpmProxyService" />\r
\r
</beans:beans>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
+ ">
+
+ <bean
+ class="org.springframework.web.servlet.handler.SimpleServletPostProcessor" />
+
+ <bean id="servletHandler"
+ class="org.springframework.web.servlet.handler.SimpleServletHandlerAdapter" />
+
+ <bean id="handlerMapping"
+ class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
+ <property name="mappings">
+ <props>
+ <prop key="*">rpmProxyServlet</prop>
+ </props>
+ </property>
+ </bean>
+
+ <bean id="rpmProxyServlet" class="org.argeo.jcr.mvc.ResourceProxyServlet">
+ <property name="proxy" ref="rpmProxy" />
+ </bean>
+</beans>
\ No newline at end of file
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
+ <welcome-file-list>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
<display-name>Argeo SLC Repo Webapp</display-name>
<param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value>
</context-param>
+ <!-- RPM -->
+ <servlet>
+ <servlet-name>rpm</servlet-name>
+ <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+ <init-param>
+ <param-name>contextClass</param-name>
+ <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>rpm</servlet-name>
+ <url-pattern>/rpm/*</url-pattern>
+ </servlet-mapping>
+
<!-- Maven -->
-<!-- <servlet> -->
-<!-- <servlet-name>maven</servlet-name> -->
-<!-- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> -->
-<!-- <init-param> -->
-<!-- <param-name>contextClass</param-name> -->
-<!-- <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value> -->
-<!-- </init-param> -->
-<!-- <load-on-startup>1</load-on-startup> -->
-<!-- </servlet> -->
-<!-- <servlet-mapping> -->
-<!-- <servlet-name>maven</servlet-name> -->
-<!-- <url-pattern>/maven/*</url-pattern> -->
-<!-- </servlet-mapping> -->
+ <!-- <servlet> -->
+ <!-- <servlet-name>maven</servlet-name> -->
+ <!-- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> -->
+ <!-- <init-param> -->
+ <!-- <param-name>contextClass</param-name> -->
+ <!-- <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value> -->
+ <!-- </init-param> -->
+ <!-- <load-on-startup>1</load-on-startup> -->
+ <!-- </servlet> -->
+ <!-- <servlet-mapping> -->
+ <!-- <servlet-name>maven</servlet-name> -->
+ <!-- <url-pattern>/maven/*</url-pattern> -->
+ <!-- </servlet-mapping> -->
<!-- Security -->
<filter>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.argeo.slc</groupId>
org.argeo.security.core,
org.argeo.security.jcr,
org.argeo.slc.aether.spring,
- org.argeo.slc.repo.maven.proxy,
+ org.argeo.slc.repo,
+ org.argeo.slc.rpmfactory,
org.springframework.osgi.web.context.support,
org.springframework.security,
org.springframework.security.context,
<reference id="authenticationManager"\r
interface="org.springframework.security.AuthenticationManager" />\r
\r
+ <set id="defaultRpmRepositories" cardinality="0..N"\r
+ interface="org.argeo.slc.rpmfactory.RpmRepository" />\r
+\r
<!-- SERVICES -->\r
<service ref="javaRepository" interface="javax.jcr.Repository">\r
<service-properties>\r
</service-properties>\r
</service>\r
\r
- <service ref="mavenProxyService" interface="org.argeo.slc.repo.maven.proxy.MavenProxyService" />\r
+ <service ref="mavenProxyService" interface="org.argeo.slc.repo.MavenProxyService" />\r
+ <service ref="rpmProxyService" interface="org.argeo.slc.rpmfactory.RpmProxyService" />\r
\r
<!-- LABEL -->\r
<beans:bean class="org.argeo.security.core.OsgiModuleLabel">\r
</property>
</bean>
- <bean id="mavenProxyService" class="org.argeo.slc.repo.maven.proxy.MavenProxyServiceImpl"
+ <!--Caching Proxy Services -->
+ <bean id="mavenProxyService" class="org.argeo.slc.repo.maven.MavenProxyServiceImpl"
init-method="init" destroy-method="destroy">
<property name="jcrRepository" ref="javaRepository" />
<property name="defaultRepositories" ref="defaultMavenRepositories" />
</bean>
+ <bean id="rpmProxyService" class="org.argeo.slc.rpmfactory.core.RpmProxyServiceImpl"
+ init-method="init" destroy-method="destroy">
+ <property name="jcrRepository" ref="rpmRepository" />
+ <property name="defaultRepositories" ref="defaultRpmRepositories" />
+ </bean>
+
</beans>
\ No newline at end of file
--- /dev/null
+/*
+ * 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.repo;
+
+import org.argeo.jcr.proxy.ResourceProxy;
+
+/** Marker interface (useful for OSGi servcies references), maybe extended later */
+public interface MavenProxyService extends ResourceProxy {
+}
--- /dev/null
+/*
+ * 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.repo.maven;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
+
+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.SlcException;
+import org.argeo.slc.jcr.SlcNames;
+import org.argeo.slc.jcr.SlcTypes;
+import org.argeo.slc.repo.MavenProxyService;
+import org.argeo.slc.repo.RepoConstants;
+import org.sonatype.aether.repository.RemoteRepository;
+
+/** Synchronises the node repository with remote Maven repositories */
+public class MavenProxyServiceImpl extends AbstractUrlProxy implements
+ MavenProxyService, ArgeoNames, SlcNames {
+ private final static Log log = LogFactory
+ .getLog(MavenProxyServiceImpl.class);
+
+ private List<RemoteRepository> defaultRepositories = new ArrayList<RemoteRepository>();
+
+ /** Initialises the artifacts area. */
+ @Override
+ protected void beforeInitSessionSave(Session session)
+ throws RepositoryException {
+ JcrUtils.mkdirsSafe(session, RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH);
+ Node proxiedRepositories = JcrUtils.mkdirsSafe(session,
+ RepoConstants.PROXIED_REPOSITORIES);
+ for (RemoteRepository repository : defaultRepositories) {
+ if (!proxiedRepositories.hasNode(repository.getId())) {
+ Node proxiedRepository = proxiedRepositories.addNode(repository
+ .getId());
+ proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE);
+ JcrUtils.urlToAddressProperties(proxiedRepository,
+ repository.getUrl());
+ // proxiedRepository.setProperty(SLC_URL, repository.getUrl());
+ proxiedRepository.setProperty(SLC_TYPE,
+ repository.getContentType());
+ }
+ }
+ }
+
+ /**
+ * Retrieve and add this file to the repository
+ */
+ @Override
+ protected Node retrieve(Session session, String path) {
+ try {
+ if (session.hasPendingChanges())
+ throw new SlcException("Session has pending changed");
+ Node node = null;
+ for (Node proxiedRepository : getBaseUrls(session)) {
+ String baseUrl = JcrUtils
+ .urlFromAddressProperties(proxiedRepository);
+ node = proxyUrl(session, baseUrl, path);
+ if (node != null) {
+ node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
+ Node origin = node
+ .addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED);
+ origin.setProperty(SLC_PROXY, proxiedRepository);
+ JcrUtils.urlToAddressProperties(origin, baseUrl + path);
+ if (log.isDebugEnabled())
+ log.debug("Imported " + baseUrl + path + " to " + node);
+ return node;
+ }
+ }
+ if (log.isDebugEnabled())
+ log.warn("No proxy found for " + path);
+ return null;
+ } catch (Exception e) {
+ throw new SlcException("Cannot proxy " + path, e);
+ }
+ }
+
+ protected synchronized List<Node> getBaseUrls(Session session)
+ throws RepositoryException {
+ List<Node> baseUrls = new ArrayList<Node>();
+ for (NodeIterator nit = session.getNode(
+ RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit.hasNext();) {
+ Node proxiedRepository = nit.nextNode();
+ baseUrls.add(proxiedRepository);
+ }
+ return baseUrls;
+ }
+
+ public void setDefaultRepositories(
+ List<RemoteRepository> defaultRepositories) {
+ this.defaultRepositories = defaultRepositories;
+ }
+}
+++ /dev/null
-/*
- * 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.repo.maven.proxy;
-
-import org.argeo.jcr.proxy.ResourceProxy;
-
-/** Marker interface (useful for OSGi servcies references), maybe extended later */
-public interface MavenProxyService extends ResourceProxy {
-}
+++ /dev/null
-/*
- * 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.repo.maven.proxy;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-
-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.SlcException;
-import org.argeo.slc.jcr.SlcNames;
-import org.argeo.slc.jcr.SlcTypes;
-import org.argeo.slc.repo.RepoConstants;
-import org.sonatype.aether.repository.RemoteRepository;
-
-/** Synchronizes the node repository with remote Maven repositories */
-public class MavenProxyServiceImpl extends AbstractUrlProxy implements
- MavenProxyService, ArgeoNames, SlcNames {
- private final static Log log = LogFactory
- .getLog(MavenProxyServiceImpl.class);
-
- private List<RemoteRepository> defaultRepositories = new ArrayList<RemoteRepository>();
-
- private String artifactsBasePath = RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH;
-
- /** Inititalizes the artifacts area. */
- @Override
- protected void beforeInitSessionSave(Session session)
- throws RepositoryException {
- JcrUtils.mkdirsSafe(session, RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH);
- Node proxiedRepositories = JcrUtils.mkdirsSafe(session,
- RepoConstants.PROXIED_REPOSITORIES);
- for (RemoteRepository repository : defaultRepositories) {
- if (!proxiedRepositories.hasNode(repository.getId())) {
- Node proxiedRepository = proxiedRepositories.addNode(repository
- .getId());
- proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE);
- JcrUtils.urlToAddressProperties(proxiedRepository,
- repository.getUrl());
- // proxiedRepository.setProperty(SLC_URL, repository.getUrl());
- proxiedRepository.setProperty(SLC_TYPE,
- repository.getContentType());
- }
- }
- }
-
- /**
- * Retrieve and add this file to the repository
- */
- @Override
- protected Node retrieve(Session session, String path) {
- try {
- if (session.hasPendingChanges())
- throw new SlcException("Session has pending changed");
- Node node = null;
- for (Node proxiedRepository : getBaseUrls(session)) {
- String baseUrl = JcrUtils
- .urlFromAddressProperties(proxiedRepository);
- node = proxyUrl(session, baseUrl, path);
- if (node != null) {
- node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
- Node origin = node
- .addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED);
- origin.setProperty(SLC_PROXY, proxiedRepository);
- JcrUtils.urlToAddressProperties(origin, baseUrl + path);
- if (log.isDebugEnabled())
- log.debug("Imported " + baseUrl + path + " to " + node);
- return node;
- }
- }
- if (log.isDebugEnabled())
- log.warn("No proxy found for " + path);
- return null;
- } catch (Exception e) {
- throw new SlcException("Cannot proxy " + path, e);
- }
- }
-
- protected synchronized List<Node> getBaseUrls(Session session)
- throws RepositoryException {
- List<Node> baseUrls = new ArrayList<Node>();
- for (NodeIterator nit = session.getNode(
- RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit.hasNext();) {
- Node proxiedRepository = nit.nextNode();
- baseUrls.add(proxiedRepository);
- }
- return baseUrls;
- }
-
- /** The JCR path where this file could be found */
- public String getNodePath(String path) {
- if (artifactsBasePath.equals(RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH))
- return path;
- else
- return artifactsBasePath + path;
- }
-
- public void setDefaultRepositories(
- List<RemoteRepository> defaultRepositories) {
- this.defaultRepositories = defaultRepositories;
- }
-
- public void setArtifactsBasePath(String artifactsBasePath) {
- this.artifactsBasePath = artifactsBasePath;
- }
-
-}
import org.argeo.jcr.proxy.ResourceProxy;
-/** Marker interface (useful for OSGi servcies references), maybe extended later */
+/** Marker interface (useful for OSGi services references), may be extended later */
public interface RpmProxyService extends ResourceProxy {
}
package org.argeo.slc.rpmfactory;
+/** A YUM compatible repository of RPM packages. */
public interface RpmRepository {
public String getId();
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+
+/** Rebuild an SRPM in mock. (Historical) Replaces the build-mock.sh script. */
+public class BuildInMock implements Runnable {
+ private final static Log log = LogFactory.getLog(BuildInMock.class);
+
+ /** Mock flavour provided by the EPEL repository */
+ public final static String EPEL = "EPEL";
+ /** Mock flavour provided by CentOS until v5 */
+ public final static String CENTOS = "CENTOS";
+
+ public final static String NOARCH = "noarch";
+
+ private String mockVar = "/var/lib/mock";
+
+ private String mockFlavour = EPEL;
+ private String mockConfig = null;
+
+ private String repository;
+ private String release = null;
+ private String level = null;
+ private String arch = NOARCH;
+
+ private String rpmPackage = null;
+
+ private Boolean mkdirs = true;
+
+ private RpmBuildEnvironment buildEnvironment;
+ private Executor executor;
+
+ private String debuginfoDirName = "debuginfo";
+
+ public void run() {
+ // TODO check if caller is in mock group
+
+ String cfgId = repository + "-" + release + "-" + arch;
+ String cfg = mockConfig != null ? mockConfig : "slc/" + cfgId;
+
+ // prepare mock call
+ SystemCall mock = new SystemCall();
+ if (arch != null)
+ mock.arg("setarch").arg(arch);
+ mock.arg("mock");
+ if (mockFlavour.equals(EPEL))
+ mock.arg("-v");
+ else if (mockFlavour.equals(CENTOS))
+ mock.arg("--debug");
+ if (arch != null)
+ mock.arg("--arch=" + arch);
+ mock.arg("-r").arg(cfg);
+
+ mock.arg("--scm-enable");
+ mock.arg("--scm-option").arg("package=" + rpmPackage);
+
+ mock.setLogCommand(true);
+
+ // mock command execution
+ mock.setExecutor(executor);
+ mock.run();
+
+ // File repoDir = new File(buildEnvironment.getStagingBase() + "/"
+ // + repository + "/" + level + "/" + release);
+ File repoDir = new File(buildEnvironment.getStagingBase() + "/"
+ + repository + "-" + release + "-staging");
+ File srpmDir = new File(repoDir, "SRPMS");
+ if (mkdirs)
+ srpmDir.mkdirs();
+ File archDir = null;
+ File debuginfoDir = null;
+ if (!arch.equals(NOARCH)) {
+ archDir = new File(repoDir, arch);
+ debuginfoDir = new File(archDir, debuginfoDirName);
+ debuginfoDir.mkdirs();
+ }
+
+ // copy RPMs
+ Set<File> reposToRecreate = new HashSet<File>();
+ File resultDir = new File(mockVar + "/" + cfgId + "/result");
+ 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<File> dirs = new ArrayList<File>();
+ for (String arch : buildEnvironment.getArchs())
+ dirs.add(new File(repoDir, 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);
+ }
+ }
+
+ 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 setMockFlavour(String mockFlavour) {
+ this.mockFlavour = mockFlavour;
+ }
+
+ public void setMockConfig(String mockConfig) {
+ this.mockConfig = mockConfig;
+ }
+
+ public void setRepository(String repo) {
+ this.repository = repo;
+ }
+
+ public void setRelease(String release) {
+ this.release = release;
+ }
+
+ public void setLevel(String level) {
+ this.level = level;
+ }
+
+ public void setArch(String arch) {
+ this.arch = arch;
+ }
+
+ public void setRpmPackage(String rpmPackage) {
+ this.rpmPackage = rpmPackage;
+ }
+
+ public void setMockVar(String mockVar) {
+ this.mockVar = mockVar;
+ }
+
+ public void setMkdirs(Boolean mkdirs) {
+ this.mkdirs = mkdirs;
+ }
+
+ public void setBuildEnvironment(RpmBuildEnvironment buildEnvironment) {
+ this.buildEnvironment = buildEnvironment;
+ }
+
+ public void setExecutor(Executor executor) {
+ this.executor = executor;
+ }
+
+}
--- /dev/null
+/*
+ * 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.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.io.FileUtils;
+import org.argeo.slc.SlcException;
+
+/**
+ * Defines a build environment. This information is typically used by other
+ * components performing the various actions related to RPM build.
+ */
+public class RpmBuildEnvironment {
+ static 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<String, String> rpmmacros = new HashMap<String, String>();
+
+ private List<String> archs = new ArrayList<String>();
+
+ private String stagingBase = "/mnt/slc/repos/rpm";
+
+ /** 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<String> macroLines = new ArrayList<String>();
+ macroLines.add("%_topdir " + topdir.getCanonicalPath());
+ for (String macroKey : rpmmacros.keySet()) {
+ macroLines.add(macroKey + " " + rpmmacros.get(macroKey));
+ }
+ FileUtils.writeLines(rpmmacroFile, macroLines);
+
+ List<String> rpmrcLines = new ArrayList<String>();
+ 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<String, String> getRpmmacros() {
+ return rpmmacros;
+ }
+
+ public void setRpmmacros(Map<String, String> rpmmacros) {
+ this.rpmmacros = rpmmacros;
+ }
+
+ public String getDefaultMacroFiles() {
+ return defaultMacroFiles;
+ }
+
+ public void setDefaultMacroFiles(String defaultMacroFiles) {
+ this.defaultMacroFiles = defaultMacroFiles;
+ }
+
+ public void setArchs(List<String> archs) {
+ this.archs = archs;
+ }
+
+ public List<String> getArchs() {
+ return archs;
+ }
+
+ public String getStagingBase() {
+ return stagingBase;
+ }
+
+ public void setStagingBase(String stagingBase) {
+ this.stagingBase = stagingBase;
+ }
+}
*/
package org.argeo.slc.rpmfactory.core;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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;
-/** Synchronizes the node repository with remote Maven repositories */
+/** 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 final static Log log = LogFactory.getLog(RpmProxyServiceImpl.class);
- private List<RpmRepository> defaultRepositories = new ArrayList<RpmRepository>();
-
- private String artifactsBasePath = RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH;
-
- /** Inititalizes the artifacts area. */
- @Override
- protected void beforeInitSessionSave(Session session)
- throws RepositoryException {
- JcrUtils.mkdirsSafe(session, RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH);
- Node proxiedRepositories = JcrUtils.mkdirsSafe(session,
- RepoConstants.PROXIED_REPOSITORIES);
- for (RpmRepository repository : defaultRepositories) {
- if (!proxiedRepositories.hasNode(repository.getId())) {
- Node proxiedRepository = proxiedRepositories.addNode(repository
- .getId());
- proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE);
- JcrUtils.urlToAddressProperties(proxiedRepository,
- repository.getUrl());
- // proxiedRepository.setProperty(SLC_URL, repository.getUrl());
- // proxiedRepository.setProperty(SLC_TYPE,
- // repository.getContentType());
- }
- }
- }
+ private Set<RpmRepository> defaultRepositories = new HashSet<RpmRepository>();
/**
* 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);
+ String relativePath = relativePathBuilder.toString();
+
+ RpmRepository sourceRepo = null;
+ for (Iterator<RpmRepository> 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 {
- if (session.hasPendingChanges())
- throw new SlcException("Session has pending changed");
- Node node = null;
- for (Node proxiedRepository : getBaseUrls(session)) {
- String baseUrl = JcrUtils
- .urlFromAddressProperties(proxiedRepository);
- node = proxyUrl(session, baseUrl, path);
- if (node != null) {
- node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
- Node origin = node
- .addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED);
- origin.setProperty(SLC_PROXY, proxiedRepository);
- JcrUtils.urlToAddressProperties(origin, baseUrl + path);
- if (log.isDebugEnabled())
- log.debug("Imported " + baseUrl + path + " to " + node);
- return node;
- }
+ // if (session.hasPendingChanges())
+ // throw new SlcException("Session has pending changed");
+ String baseUrl = sourceRepo.getUrl();
+ String remoteUrl = baseUrl + relativePath;
+ Node node = proxyUrl(session, remoteUrl, path);
+ if (node != null) {
+ 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);
+ // origin.setProperty(SLC_PROXY, sourceRepo.getId());
+ JcrUtils.urlToAddressProperties(origin, remoteUrl);
+
+ if (log.isDebugEnabled())
+ log.debug("Imported " + remoteUrl + " to " + node);
+ return node;
}
- if (log.isDebugEnabled())
- log.warn("No proxy found for " + path);
- return null;
} catch (Exception e) {
throw new SlcException("Cannot proxy " + path, e);
}
+ JcrUtils.discardQuietly(session);
+ throw new SlcException("No proxy found for " + path);
}
- protected synchronized List<Node> getBaseUrls(Session session)
- throws RepositoryException {
- List<Node> baseUrls = new ArrayList<Node>();
- for (NodeIterator nit = session.getNode(
- RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit.hasNext();) {
- Node proxiedRepository = nit.nextNode();
- baseUrls.add(proxiedRepository);
+ /** 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 baseUrls;
+ return workspace.toString();
}
- /** The JCR path where this file could be found */
- public String getNodePath(String path) {
- if (artifactsBasePath.equals(RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH))
- return path;
- else
- return artifactsBasePath + path;
+ @Override
+ protected Boolean shouldUpdate(Session clientSession, String nodePath) {
+ if (nodePath.contains("/repodata/"))
+ return true;
+ return super.shouldUpdate(clientSession, nodePath);
}
- public void setDefaultRepositories(List<RpmRepository> defaultRepositories) {
+ public void setDefaultRepositories(Set<RpmRepository> defaultRepositories) {
this.defaultRepositories = defaultRepositories;
}
-
- public void setArtifactsBasePath(String artifactsBasePath) {
- this.artifactsBasePath = artifactsBasePath;
- }
-
}
--- /dev/null
+/*
+ * 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<String, String> sources = new HashMap<String, String>();
+ private Map<String, String> patches = new HashMap<String, String>();
+
+ public RpmSpecFile(Resource specFile) {
+ this.specFile = specFile;
+ parseSpecFile();
+ }
+
+ public void init() {
+ parseSpecFile();
+ }
+
+ @SuppressWarnings("unchecked")
+ protected void parseSpecFile() {
+ try {
+ List<String> lines = (List<String>) 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<String, String> getSources() {
+ return sources;
+ }
+
+ public Map<String, String> getPatches() {
+ return patches;
+ }
+
+}
--- /dev/null
+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 {
+
+}
+++ /dev/null
-/*
- * 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.lib.linux.rpmfactory;
-
-import org.freecompany.redline.Builder;
-
-public class RpmBuilder {
- private Builder builder;
-
- public void run() {
- }
-}
+++ /dev/null
-/*
- * 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.lib.linux.rpmfactory;
-
-/** Initialize a repository factory. */
-public class RpmRepoInit implements Runnable {
-
- public void run() {
- // TODO Auto-generated method stub
-
- }
-
-}