Conf files should be treated as a dict, file names are unique
parent
7444fa6f77
commit
bc04209423
|
@ -38,59 +38,56 @@ import drupalConf from './conf/drupal.conf';
|
|||
import magentoConf from './conf/magento.conf';
|
||||
|
||||
export default (domains, global) => {
|
||||
const files = [];
|
||||
const files = {};
|
||||
|
||||
// Base nginx config
|
||||
files.push(['nginx.conf', toConf(nginxConf(domains, global))]);
|
||||
files['nginx.conf'] = toConf(nginxConf(domains, global));
|
||||
|
||||
// Modularised configs
|
||||
if (global.tools.modularizedStructure.computed) {
|
||||
// Domain config
|
||||
for (const domain of domains) {
|
||||
files.push([
|
||||
`sites-${global.tools.symlinkVhost.computed ? 'available' : 'enabled'}/${domain.server.domain.computed}.conf`,
|
||||
toConf(websiteConf(domain, domains, global)),
|
||||
]);
|
||||
files[`sites-${global.tools.symlinkVhost.computed ? 'available' : 'enabled'}/${domain.server.domain.computed}.conf`] = toConf(websiteConf(domain, domains, global));
|
||||
}
|
||||
|
||||
// Let's encrypt
|
||||
if (domains.some(d => d.https.certType.computed === 'letsEncrypt'))
|
||||
files.push(['nginxconfig.io/letsencrypt.conf', toConf(letsEncryptConf(global))]);
|
||||
files['nginxconfig.io/letsencrypt.conf'] = toConf(letsEncryptConf(global));
|
||||
|
||||
// Security
|
||||
files.push(['nginxconfig.io/security.conf', toConf(securityConf(domains, global))]);
|
||||
files['nginxconfig.io/security.conf'] = toConf(securityConf(domains, global));
|
||||
|
||||
// General
|
||||
files.push(['nginxconfig.io/general.conf', toConf(generalConf(domains, global))]);
|
||||
files['nginxconfig.io/general.conf'] = toConf(generalConf(domains, global));
|
||||
|
||||
// PHP
|
||||
if (domains.some(d => d.php.php.computed))
|
||||
files.push(['nginxconfig.io/php_fastcgi.conf', toConf(phpConf(domains, global))]);
|
||||
files['nginxconfig.io/php_fastcgi.conf'] = toConf(phpConf(domains, global));
|
||||
|
||||
// Python
|
||||
if (domains.some(d => d.python.python.computed))
|
||||
files.push(['nginxconfig.io/python_uwsgi.conf', toConf(pythonConf(global))]);
|
||||
files['nginxconfig.io/python_uwsgi.conf'] = toConf(pythonConf(global));
|
||||
|
||||
// Reverse proxy
|
||||
if (domains.some(d => d.reverseProxy.reverseProxy.computed))
|
||||
files.push(['nginxconfig.io/proxy.conf', toConf(proxyConf())]);
|
||||
files['nginxconfig.io/proxy.conf'] = toConf(proxyConf());
|
||||
|
||||
// WordPress
|
||||
if (domains.some(d => d.php.wordPressRules.computed))
|
||||
files.push(['nginxconfig.io/wordpress.conf', toConf(wordPressConf(global))]);
|
||||
files['nginxconfig.io/wordpress.conf'] = toConf(wordPressConf(global));
|
||||
|
||||
// Drupal
|
||||
if (domains.some(d => d.php.drupalRules.computed))
|
||||
files.push(['nginxconfig.io/drupal.conf', toConf(drupalConf(global))]);
|
||||
files['nginxconfig.io/drupal.conf'] = toConf(drupalConf(global));
|
||||
|
||||
// Drupal
|
||||
if (domains.some(d => d.php.magentoRules.computed))
|
||||
files.push(['nginxconfig.io/magento.conf', toConf(magentoConf())]);
|
||||
files['nginxconfig.io/magento.conf'] = toConf(magentoConf());
|
||||
|
||||
} else {
|
||||
// PHP
|
||||
if (domains.some(d => d.php.wordPressRules.computed))
|
||||
files.push(['nginxconfig.io/php_fastcgi.conf', toConf(phpConf(domains, global))]);
|
||||
files['nginxconfig.io/php_fastcgi.conf'] = toConf(phpConf(domains, global));
|
||||
}
|
||||
|
||||
return files;
|
||||
|
|
|
@ -80,11 +80,11 @@ THE SOFTWARE.
|
|||
<div :class="`column ${splitColumn ? 'is-half' : 'is-full'} is-full-mobile is-full-tablet`">
|
||||
<h2>{{ i18n.templates.app.configFiles }}</h2>
|
||||
<div ref="files" class="columns is-multiline">
|
||||
<NginxPrism v-for="(conf, i) in confFilesOutput"
|
||||
:key="`${conf[0]}-${i}-${hash(conf[1])}`"
|
||||
:name="`${nginxDir}/${conf[0]}`"
|
||||
:conf="conf[1]"
|
||||
:half="confFilesOutput.length > 1 && !splitColumn"
|
||||
<NginxPrism v-for="(confContents, confName) in confFilesOutput"
|
||||
:key="`${confName}-${hash(confContents)}`"
|
||||
:name="`${nginxDir}/${confName}`"
|
||||
:conf="confContents"
|
||||
:half="Object.keys(confFilesOutput).length > 1 && !splitColumn"
|
||||
></NginxPrism>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -132,8 +132,8 @@ THE SOFTWARE.
|
|||
ready: false,
|
||||
splitColumn: false,
|
||||
confWatcherWaiting: false,
|
||||
confFilesPrevious: [],
|
||||
confFilesOutput: [],
|
||||
confFilesPrevious: {},
|
||||
confFilesOutput: {},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
@ -222,17 +222,21 @@ THE SOFTWARE.
|
|||
this.$nextTick(() => this.checkChange(this.confFiles));
|
||||
},
|
||||
updateDiff(newConf, oldConf) {
|
||||
const newFiles = {};
|
||||
|
||||
// Work through each file in the new config
|
||||
const newFiles = [];
|
||||
for (const [newFileName, newFileConf] of newConf) {
|
||||
for (const newFileName in newConf) {
|
||||
if (!Object.prototype.hasOwnProperty.call(newConf, newFileName)) continue;
|
||||
const newFileConf = newConf[newFileName];
|
||||
|
||||
// If a file with the same name existed before, diff!
|
||||
// TODO: Handle diffing across file renames (eg. when a user changes a domain name)
|
||||
const old = oldConf && oldConf.find(c => c[0] === newFileName);
|
||||
if (old && this.hash(old[1]) !== this.hash(newFileConf)) {
|
||||
const old = oldConf && oldConf[newFileName];
|
||||
if (old && this.hash(old) !== this.hash(newFileConf)) {
|
||||
console.info(`Diffing ${newFileName}...`);
|
||||
|
||||
// Get the diff
|
||||
const diff = diffLines(old[1], newFileConf);
|
||||
const diff = diffLines(old, newFileConf);
|
||||
|
||||
// Wrap additions in <mark>, drop removals
|
||||
const output = diff.map((change, index, array) => {
|
||||
|
@ -263,13 +267,15 @@ THE SOFTWARE.
|
|||
}).join('');
|
||||
|
||||
// Store
|
||||
newFiles.push([newFileName, output]);
|
||||
newFiles[newFileName] = output;
|
||||
continue;
|
||||
}
|
||||
|
||||
// No diffing, just store the new file
|
||||
newFiles.push([newFileName, newFileConf]);
|
||||
newFiles[newFileName] = newFileConf;
|
||||
}
|
||||
|
||||
// Store
|
||||
this.$data.confFilesOutput = newFiles;
|
||||
this.$nextTick(() => this.$data.confWatcherWaiting = false);
|
||||
},
|
||||
|
|
|
@ -114,15 +114,16 @@ THE SOFTWARE.
|
|||
const tar = pack();
|
||||
|
||||
// Add all our config files to the tar
|
||||
for (const conf of this.$props.data.confFiles) {
|
||||
tar.entry({ name: conf[0] }, conf[1]);
|
||||
for (const fileName in this.$props.data.confFiles) {
|
||||
if (!Object.prototype.hasOwnProperty.call(this.$props.data.confFiles, fileName)) continue;
|
||||
tar.entry({ name: fileName }, this.$props.data.confFiles[fileName]);
|
||||
|
||||
// If symlinks are enabled and this is in sites-available, symlink to sites-enabled
|
||||
if (this.$props.data.global.tools.symlinkVhost.computed && conf[0].startsWith('sites-available'))
|
||||
if (this.$props.data.global.tools.symlinkVhost.computed && fileName.startsWith('sites-available'))
|
||||
tar.entry({
|
||||
name: conf[0].replace(/^sites-available/, 'sites-enabled'),
|
||||
name: fileName.replace(/^sites-available/, 'sites-enabled'),
|
||||
type: 'symlink',
|
||||
linkname: `../${conf[0]}`,
|
||||
linkname: `../${fileName}`,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue