Move configuration files under $site_path/etc
Most applications store their configuration files below some sort of etc directory within the application's "home place". We should do the same thing given that we have quite a few top level items in our $site_path directory (db, cache, logs, static, etc). Change-Id: Ia38ddab0174433acb59f271e33f32b5061121ea1 Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
@@ -55,8 +55,8 @@ abstract class GitWebCssServlet extends HttpServlet {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected File path(File sitePath, GitWebConfig gitWebConfig) {
|
||||
return new File(sitePath, "GerritSite.css");
|
||||
protected File path(File etc, GitWebConfig gitWebConfig) {
|
||||
return new File(etc, "GerritSite.css");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ abstract class GitWebCssServlet extends HttpServlet {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected File path(File sitePath, GitWebConfig gitWebConfig) {
|
||||
protected File path(File etc, GitWebConfig gitWebConfig) {
|
||||
return gitWebConfig.getGitwebCSS();
|
||||
}
|
||||
}
|
||||
@@ -80,7 +80,7 @@ abstract class GitWebCssServlet extends HttpServlet {
|
||||
|
||||
GitWebCssServlet(@SitePath final File sitePath,
|
||||
final GitWebConfig gitWebConfig) throws IOException {
|
||||
final File src = path(sitePath, gitWebConfig);
|
||||
final File src = path(new File(sitePath, "etc"), gitWebConfig);
|
||||
final File dir = src.getParentFile();
|
||||
final String name = src.getName();
|
||||
final String raw = HtmlDomUtil.readFile(dir, name);
|
||||
|
@@ -133,6 +133,7 @@ class GitWebServlet extends HttpServlet {
|
||||
_env.set("GIT_DIR", ".");
|
||||
_env.set("GITWEB_CONFIG", myconf.getAbsolutePath());
|
||||
|
||||
final File etc = new File(sitePath, "etc");
|
||||
final PrintWriter p = new PrintWriter(new FileWriter(myconf));
|
||||
try {
|
||||
p.print("# Autogenerated by Gerrit Code Review \n");
|
||||
@@ -142,11 +143,11 @@ class GitWebServlet extends HttpServlet {
|
||||
// We are mounted at the same level in the context as the main
|
||||
// UI, so we can include the same header and footer scheme.
|
||||
//
|
||||
final File hdr = new File(sitePath, "GerritSiteHeader.html");
|
||||
final File hdr = new File(etc, "GerritSiteHeader.html");
|
||||
if (hdr.isFile()) {
|
||||
p.print("$site_header = " + quoteForPerl(hdr) + ";\n");
|
||||
}
|
||||
final File ftr = new File(sitePath, "GerritSiteFooter.html");
|
||||
final File ftr = new File(etc, "GerritSiteFooter.html");
|
||||
if (ftr.isFile()) {
|
||||
p.print("$site_footer = " + quoteForPerl(ftr) + ";\n");
|
||||
}
|
||||
@@ -159,7 +160,7 @@ class GitWebServlet extends HttpServlet {
|
||||
p.print("$favicon = 'favicon.ico';\n");
|
||||
p.print("$logo = 'gitweb-logo.png';\n");
|
||||
p.print("@stylesheets = ('gitweb-default.css');\n");
|
||||
final File css = new File(sitePath, "GerritSite.css");
|
||||
final File css = new File(etc, "GerritSite.css");
|
||||
if (css.isFile()) {
|
||||
p.print("push @stylesheets, 'gitweb-site.css';\n");
|
||||
}
|
||||
@@ -209,7 +210,7 @@ class GitWebServlet extends HttpServlet {
|
||||
// If the administrator has created a site-specific gitweb_config,
|
||||
// load that before we perform any final overrides.
|
||||
//
|
||||
final File sitecfg = new File(sitePath, "gitweb_config.perl");
|
||||
final File sitecfg = new File(etc, "gitweb_config.perl");
|
||||
if (sitecfg.isFile()) {
|
||||
p.print("$GITWEB_CONFIG = " + quoteForPerl(sitecfg) + ";\n");
|
||||
p.print("if (-e $GITWEB_CONFIG) {\n");
|
||||
|
@@ -51,21 +51,19 @@ import javax.servlet.http.HttpServletResponse;
|
||||
@Singleton
|
||||
public class HostPageServlet extends HttpServlet {
|
||||
private final Provider<CurrentUser> currentUser;
|
||||
private final File sitePath;
|
||||
private final GerritConfig config;
|
||||
private final Provider<String> urlProvider;
|
||||
private final boolean wantSSL;
|
||||
private final Document hostDoc;
|
||||
|
||||
@Inject
|
||||
HostPageServlet(final Provider<CurrentUser> cu, @SitePath final File path,
|
||||
final GerritConfig gc,
|
||||
HostPageServlet(final Provider<CurrentUser> cu,
|
||||
@SitePath final File sitePath, final GerritConfig gc,
|
||||
@CanonicalWebUrl @Nullable final Provider<String> up,
|
||||
@CanonicalWebUrl @Nullable final String configuredUrl,
|
||||
final ServletContext servletContext) throws IOException {
|
||||
currentUser = cu;
|
||||
urlProvider = up;
|
||||
sitePath = path;
|
||||
config = gc;
|
||||
wantSSL = configuredUrl != null && configuredUrl.startsWith("https:");
|
||||
|
||||
@@ -74,14 +72,16 @@ public class HostPageServlet extends HttpServlet {
|
||||
if (hostDoc == null) {
|
||||
throw new FileNotFoundException("No " + pageName + " in webapp");
|
||||
}
|
||||
|
||||
final File etc = new File(sitePath, "etc");
|
||||
fixModuleReference(hostDoc, servletContext);
|
||||
injectCssFile(hostDoc, "gerrit_sitecss", sitePath, "GerritSite.css");
|
||||
injectXmlFile(hostDoc, "gerrit_header", sitePath, "GerritSiteHeader.html");
|
||||
injectXmlFile(hostDoc, "gerrit_footer", sitePath, "GerritSiteFooter.html");
|
||||
injectCssFile(hostDoc, "gerrit_sitecss", etc, "GerritSite.css");
|
||||
injectXmlFile(hostDoc, "gerrit_header", etc, "GerritSiteHeader.html");
|
||||
injectXmlFile(hostDoc, "gerrit_footer", etc, "GerritSiteFooter.html");
|
||||
}
|
||||
|
||||
private void injectXmlFile(final Document hostDoc, final String id,
|
||||
final File sitePath, final String fileName) throws IOException {
|
||||
final File etc, final String fileName) throws IOException {
|
||||
final Element banner = HtmlDomUtil.find(hostDoc, id);
|
||||
if (banner == null) {
|
||||
return;
|
||||
@@ -91,7 +91,7 @@ public class HostPageServlet extends HttpServlet {
|
||||
banner.removeChild(banner.getFirstChild());
|
||||
}
|
||||
|
||||
final Document html = HtmlDomUtil.parseFile(sitePath, fileName);
|
||||
final Document html = HtmlDomUtil.parseFile(etc, fileName);
|
||||
if (html == null) {
|
||||
banner.getParentNode().removeChild(banner);
|
||||
return;
|
||||
@@ -102,7 +102,7 @@ public class HostPageServlet extends HttpServlet {
|
||||
}
|
||||
|
||||
private void injectCssFile(final Document hostDoc, final String id,
|
||||
final File sitePath, final String fileName) throws IOException {
|
||||
final File etc, final String fileName) throws IOException {
|
||||
final Element banner = HtmlDomUtil.find(hostDoc, id);
|
||||
if (banner == null) {
|
||||
return;
|
||||
@@ -112,7 +112,7 @@ public class HostPageServlet extends HttpServlet {
|
||||
banner.removeChild(banner.getFirstChild());
|
||||
}
|
||||
|
||||
final String css = HtmlDomUtil.readFile(sitePath, fileName);
|
||||
final String css = HtmlDomUtil.readFile(etc, fileName);
|
||||
if (css == null) {
|
||||
banner.getParentNode().removeChild(banner);
|
||||
return;
|
||||
|
@@ -75,6 +75,8 @@ public class Init extends SiteProgram {
|
||||
ui = ConsoleUI.getInstance(batchMode);
|
||||
|
||||
try {
|
||||
upgradeFrom_Pre2_0_25();
|
||||
|
||||
initSitePath();
|
||||
inject();
|
||||
initGit();
|
||||
@@ -93,17 +95,60 @@ public class Init extends SiteProgram {
|
||||
return 0;
|
||||
}
|
||||
|
||||
private void upgradeFrom_Pre2_0_25() throws IOException {
|
||||
final File sitePath = getSitePath();
|
||||
|
||||
boolean isPre2_0_25 = false;
|
||||
final String[] etcFiles =
|
||||
{"gerrit.config", "secure.config", "replication.config",
|
||||
"ssh_host_rsa_key", "ssh_host_rsa_key.pub", "ssh_host_dsa_key",
|
||||
"ssh_host_dsa_key.pub", "ssh_host_key", "contact_information.pub",
|
||||
"gitweb_config.perl", "keystore", "GerritSite.css",
|
||||
"GerritSiteFooter.html", "GerritSiteHeader.html"};
|
||||
for (String name : etcFiles) {
|
||||
if (new File(sitePath, name).exists()) {
|
||||
isPre2_0_25 = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isPre2_0_25) {
|
||||
if (!ui.yesno("Upgrade '%s'", sitePath.getCanonicalPath())) {
|
||||
throw die("aborted by user");
|
||||
}
|
||||
|
||||
final File etc_dir = new File(sitePath, "etc");
|
||||
if (!etc_dir.exists() && !etc_dir.mkdirs()) {
|
||||
throw die("Cannot create directory " + etc_dir);
|
||||
}
|
||||
for (String name : etcFiles) {
|
||||
final File src = new File(sitePath, name);
|
||||
final File dst = new File(etc_dir, name);
|
||||
if (src.exists()) {
|
||||
if (dst.exists()) {
|
||||
throw die("File " + src + " would overwrite " + dst);
|
||||
}
|
||||
if (!src.renameTo(dst)) {
|
||||
throw die("Cannot rename " + src + " to " + dst);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void initSitePath() throws IOException, InterruptedException {
|
||||
final File sitePath = getSitePath();
|
||||
|
||||
final File gerrit_config = new File(sitePath, "gerrit.config");
|
||||
final File secure_config = new File(sitePath, "secure.config");
|
||||
final File replication_config = new File(sitePath, "replication.config");
|
||||
final File etc_dir = new File(sitePath, "etc");
|
||||
final File lib_dir = new File(sitePath, "lib");
|
||||
final File logs_dir = new File(sitePath, "logs");
|
||||
final File static_dir = new File(sitePath, "static");
|
||||
final File cache_dir = new File(sitePath, "cache");
|
||||
|
||||
final File gerrit_config = new File(etc_dir, "gerrit.config");
|
||||
final File secure_config = new File(etc_dir, "secure.config");
|
||||
final File replication_config = new File(etc_dir, "replication.config");
|
||||
|
||||
if (gerrit_config.exists()) {
|
||||
if (!gerrit_config.exists()) {
|
||||
throw die("'" + sitePath + "' is not a Gerrit server site");
|
||||
@@ -117,6 +162,9 @@ public class Init extends SiteProgram {
|
||||
if (!sitePath.mkdirs()) {
|
||||
throw die("Cannot make directory " + sitePath);
|
||||
}
|
||||
if (!etc_dir.mkdir()) {
|
||||
throw die("Cannot make directory " + etc_dir);
|
||||
}
|
||||
deleteOnFailure = true;
|
||||
|
||||
final FileBasedConfig cfg = new FileBasedConfig(gerrit_config);
|
||||
@@ -139,16 +187,17 @@ public class Init extends SiteProgram {
|
||||
}
|
||||
}
|
||||
|
||||
etc_dir.mkdir();
|
||||
lib_dir.mkdir();
|
||||
logs_dir.mkdir();
|
||||
static_dir.mkdir();
|
||||
|
||||
if (!secure_config.exists()) {
|
||||
chmod600(secure_config);
|
||||
}
|
||||
if (!replication_config.exists()) {
|
||||
replication_config.createNewFile();
|
||||
}
|
||||
|
||||
lib_dir.mkdir();
|
||||
logs_dir.mkdir();
|
||||
static_dir.mkdir();
|
||||
}
|
||||
|
||||
private void initGit() throws OrmException, IOException {
|
||||
@@ -412,14 +461,15 @@ public class Init extends SiteProgram {
|
||||
.setSHA1("6327a5f7a3dc45e0fd735adb5d08c5a74c05c20c").download();
|
||||
loadSiteLib();
|
||||
|
||||
final File etc_dir = new File(getSitePath(), "etc");
|
||||
System.err.print("Generating SSH host key ...");
|
||||
System.err.flush();
|
||||
if (SecurityUtils.isBouncyCastleRegistered()) {
|
||||
// Generate the SSH daemon host key using ssh-keygen.
|
||||
//
|
||||
final String comment = "gerrit-code-review@" + hostname();
|
||||
final File rsa = new File(getSitePath(), "ssh_host_rsa_key");
|
||||
final File dsa = new File(getSitePath(), "ssh_host_dsa_key");
|
||||
final File rsa = new File(etc_dir, "ssh_host_rsa_key");
|
||||
final File dsa = new File(etc_dir, "ssh_host_dsa_key");
|
||||
|
||||
System.err.print(" rsa...");
|
||||
System.err.flush();
|
||||
@@ -448,7 +498,7 @@ public class Init extends SiteProgram {
|
||||
// short period of time. We try to reduce that risk by creating
|
||||
// the key within a temporary directory.
|
||||
//
|
||||
final File tmpdir = new File(getSitePath(), "tmp.sshkeygen");
|
||||
final File tmpdir = new File(etc_dir, "tmp.sshkeygen");
|
||||
if (!tmpdir.mkdir()) {
|
||||
throw die("Cannot create directory " + tmpdir);
|
||||
}
|
||||
@@ -466,7 +516,7 @@ public class Init extends SiteProgram {
|
||||
p.loadKeys(); // forces the key to generate.
|
||||
chmod600(tmpkey);
|
||||
|
||||
final File key = new File(getSitePath(), keyname);
|
||||
final File key = new File(etc_dir, keyname);
|
||||
if (!tmpkey.renameTo(key)) {
|
||||
throw die("Cannot rename " + tmpkey + " to " + key);
|
||||
}
|
||||
@@ -522,7 +572,8 @@ public class Init extends SiteProgram {
|
||||
final String dname =
|
||||
"CN=" + certName + ",OU=Gerrit Code Review,O=" + domainOf(certName);
|
||||
|
||||
final File tmpdir = new File(getSitePath(), "tmp.sslcertgen");
|
||||
final File etc_dir = new File(getSitePath(), "etc");
|
||||
final File tmpdir = new File(etc_dir, "tmp.sslcertgen");
|
||||
if (!tmpdir.mkdir()) {
|
||||
throw die("Cannot create directory " + tmpdir);
|
||||
}
|
||||
@@ -541,7 +592,7 @@ public class Init extends SiteProgram {
|
||||
}).waitFor();
|
||||
chmod600(tmpstore);
|
||||
|
||||
final File store = new File(getSitePath(), "keystore");
|
||||
final File store = new File(etc_dir, "keystore");
|
||||
if (!tmpstore.renameTo(store)) {
|
||||
throw die("Cannot rename " + tmpstore + " to " + store);
|
||||
}
|
||||
|
@@ -58,9 +58,10 @@ import java.util.Set;
|
||||
public class JettyServer {
|
||||
static class Lifecycle implements LifecycleListener {
|
||||
private final JettyServer server;
|
||||
|
||||
@Inject
|
||||
Lifecycle(final JettyServer server) {
|
||||
this.server=server;
|
||||
this.server = server;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -129,7 +130,7 @@ public class JettyServer {
|
||||
|
||||
} else if ("https".equals(u.getScheme())) {
|
||||
final SslSelectChannelConnector ssl = new SslSelectChannelConnector();
|
||||
final File keystore = getFile(cfg, "sslkeystore", "keystore");
|
||||
final File keystore = getFile(cfg, "sslkeystore", "etc/keystore");
|
||||
String password = cfg.getString("httpd", null, "sslkeypassword");
|
||||
if (password == null) {
|
||||
password = "gerrit";
|
||||
|
@@ -41,8 +41,9 @@ class GerritServerConfigProvider implements Provider<Config> {
|
||||
|
||||
@Override
|
||||
public Config get() {
|
||||
final File gerrit_config = new File(sitePath, "gerrit.config");
|
||||
final File secure_config = new File(sitePath, "secure.config");
|
||||
final File etc = new File(sitePath, "etc");
|
||||
final File gerrit_config = new File(etc, "gerrit.config");
|
||||
final File secure_config = new File(etc, "secure.config");
|
||||
|
||||
FileBasedConfig cfg = new FileBasedConfig(gerrit_config);
|
||||
|
||||
|
@@ -63,7 +63,7 @@ public class ContactStoreProvider implements Provider<ContactStore> {
|
||||
}
|
||||
|
||||
final String storeAPPSEC = config.getString("contactstore", null, "appsec");
|
||||
final File pubkey = new File(sitePath, "contact_information.pub");
|
||||
final File pubkey = new File(sitePath, "etc/contact_information.pub");
|
||||
if (!pubkey.exists()) {
|
||||
throw new ProvisionException("PGP public key file \""
|
||||
+ pubkey.getAbsolutePath() + "\" not found");
|
||||
|
@@ -131,7 +131,8 @@ public class PushReplication implements ReplicationQueue {
|
||||
|
||||
private List<ReplicationConfig> allConfigs(final File path)
|
||||
throws ConfigInvalidException, IOException {
|
||||
final File cfgFile = new File(path, "replication.config");
|
||||
final File etc = new File(path, "etc");
|
||||
final File cfgFile = new File(etc, "replication.config");
|
||||
final FileBasedConfig cfg = new FileBasedConfig(cfgFile);
|
||||
|
||||
if (!cfg.getFile().exists()) {
|
||||
|
@@ -38,9 +38,10 @@ class HostKeyProvider implements Provider<KeyPairProvider> {
|
||||
|
||||
@Override
|
||||
public KeyPairProvider get() {
|
||||
final File anyKey = new File(sitePath, "ssh_host_key");
|
||||
final File rsaKey = new File(sitePath, "ssh_host_rsa_key");
|
||||
final File dsaKey = new File(sitePath, "ssh_host_dsa_key");
|
||||
final File etc = new File(sitePath, "etc");
|
||||
final File anyKey = new File(etc, "ssh_host_key");
|
||||
final File rsaKey = new File(etc, "ssh_host_rsa_key");
|
||||
final File dsaKey = new File(etc, "ssh_host_dsa_key");
|
||||
|
||||
final List<String> keys = new ArrayList<String>(2);
|
||||
if (rsaKey.exists()) {
|
||||
@@ -63,6 +64,9 @@ class HostKeyProvider implements Provider<KeyPairProvider> {
|
||||
//
|
||||
final SimpleGeneratorHostKeyProvider keyp;
|
||||
|
||||
if (!etc.exists() && !etc.mkdirs()) {
|
||||
throw new ProvisionException("Cannot create directory " + etc);
|
||||
}
|
||||
keyp = new SimpleGeneratorHostKeyProvider();
|
||||
keyp.setPath(anyKey.getAbsolutePath());
|
||||
return keyp;
|
||||
|
Reference in New Issue
Block a user