142 lines
4.0 KiB
Java
142 lines
4.0 KiB
Java
// Copyright (C) 2015 The Android Open Source Project
|
|
//
|
|
// 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 com.google.gerrit.server.config;
|
|
|
|
import static java.nio.file.Files.isExecutable;
|
|
import static java.nio.file.Files.isRegularFile;
|
|
|
|
import com.google.inject.Inject;
|
|
import com.google.inject.Singleton;
|
|
import java.nio.file.Path;
|
|
import java.nio.file.Paths;
|
|
import org.eclipse.jgit.lib.Config;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
@Singleton
|
|
public class GitwebCgiConfig {
|
|
private static final Logger log = LoggerFactory.getLogger(GitwebCgiConfig.class);
|
|
|
|
public GitwebCgiConfig disabled() {
|
|
return new GitwebCgiConfig();
|
|
}
|
|
|
|
private final Path cgi;
|
|
private final Path css;
|
|
private final Path js;
|
|
private final Path logoPng;
|
|
|
|
@Inject
|
|
GitwebCgiConfig(SitePaths sitePaths, @GerritServerConfig Config cfg) {
|
|
if (GitwebConfig.isDisabled(cfg)) {
|
|
cgi = null;
|
|
css = null;
|
|
js = null;
|
|
logoPng = null;
|
|
return;
|
|
}
|
|
|
|
String cfgCgi = cfg.getString("gitweb", null, "cgi");
|
|
Path pkgCgi = Paths.get("/usr/lib/cgi-bin/gitweb.cgi");
|
|
String[] resourcePaths = {
|
|
"/usr/share/gitweb/static", "/usr/share/gitweb", "/var/www/static", "/var/www",
|
|
};
|
|
Path cgi;
|
|
|
|
if (cfgCgi != null) {
|
|
// Use the CGI script configured by the administrator, failing if it
|
|
// cannot be used as specified.
|
|
//
|
|
cgi = sitePaths.resolve(cfgCgi);
|
|
if (!isRegularFile(cgi)) {
|
|
throw new IllegalStateException("Cannot find gitweb.cgi: " + cgi);
|
|
}
|
|
if (!isExecutable(cgi)) {
|
|
throw new IllegalStateException("Cannot execute gitweb.cgi: " + cgi);
|
|
}
|
|
|
|
if (!cgi.equals(pkgCgi)) {
|
|
// Assume the administrator pointed us to the distribution,
|
|
// which also has the corresponding CSS and logo file.
|
|
//
|
|
String absPath = cgi.getParent().toAbsolutePath().toString();
|
|
resourcePaths = new String[] {absPath + "/static", absPath};
|
|
}
|
|
|
|
} else if (cfg.getString("gitweb", null, "url") != null) {
|
|
// Use an externally managed gitweb instance, and not an internal one.
|
|
//
|
|
cgi = null;
|
|
resourcePaths = new String[] {};
|
|
|
|
} else if (isRegularFile(pkgCgi) && isExecutable(pkgCgi)) {
|
|
// Use the OS packaged CGI.
|
|
//
|
|
log.debug("Assuming gitweb at " + pkgCgi);
|
|
cgi = pkgCgi;
|
|
|
|
} else {
|
|
log.warn("gitweb not installed (no " + pkgCgi + " found)");
|
|
cgi = null;
|
|
resourcePaths = new String[] {};
|
|
}
|
|
|
|
Path css = null;
|
|
Path js = null;
|
|
Path logo = null;
|
|
for (String path : resourcePaths) {
|
|
Path dir = Paths.get(path);
|
|
css = dir.resolve("gitweb.css");
|
|
js = dir.resolve("gitweb.js");
|
|
logo = dir.resolve("git-logo.png");
|
|
if (isRegularFile(css) && isRegularFile(logo)) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
this.cgi = cgi;
|
|
this.css = css;
|
|
this.js = js;
|
|
this.logoPng = logo;
|
|
}
|
|
|
|
private GitwebCgiConfig() {
|
|
this.cgi = null;
|
|
this.css = null;
|
|
this.js = null;
|
|
this.logoPng = null;
|
|
}
|
|
|
|
/** @return local path to the CGI executable; null if we shouldn't execute. */
|
|
public Path getGitwebCgi() {
|
|
return cgi;
|
|
}
|
|
|
|
/** @return local path of the {@code gitweb.css} matching the CGI. */
|
|
public Path getGitwebCss() {
|
|
return css;
|
|
}
|
|
|
|
/** @return local path of the {@code gitweb.js} for the CGI. */
|
|
public Path getGitwebJs() {
|
|
return js;
|
|
}
|
|
|
|
/** @return local path of the {@code git-logo.png} for the CGI. */
|
|
public Path getGitLogoPng() {
|
|
return logoPng;
|
|
}
|
|
}
|