netget
Version:
Rette Adepto/ Recibido Directamente.
289 lines (267 loc) • 9.94 kB
JavaScript
import sqlite3 from 'sqlite3';
import { open } from 'sqlite';
import { v4 as uuidv4 } from 'uuid';
import path from 'path';
import fs from 'fs';
const CONFIG_DIR = path.join('/opt/', '.get');
const USER_CONFIG_FILE = path.join(CONFIG_DIR, 'domains.db');
/**
* Function to create the table in the database
* @returns {Promise<void>}
*/
async function createTable() {
const db = await open({
filename: USER_CONFIG_FILE,
driver: sqlite3.Database
});
await db.exec(`
CREATE TABLE IF NOT EXISTS domains (
domain TEXT PRIMARY KEY,
subdomain TEXT,
email TEXT,
sslMode TEXT,
sslCertificate TEXT,
sslCertificateKey TEXT,
target TEXT,
type TEXT,
projectPath TEXT,
rootDomain TEXT,
owner TEXT
)
`);
await db.close();
}
/**
* Function to initialize the database
* @returns {Promise<sqlite3.Database>}
*/
export async function initializeDatabase() {
await createTable();
return open({
filename: USER_CONFIG_FILE,
driver: sqlite3.Database
});
}
const dbPromise = initializeDatabase();
/**
* Function to add a domain
* @param {string} domain - The domain name
* @param {string} email - The email associated with the domain
* @param {string} sslMode - The SSL mode
* @param {string} sslCertificate - The SSL certificate
* @param {string} sslCertificateKey - The SSL certificate key
* @param {string} target - The target
* @param {string} type - The type
* @param {string} projectPath - The project path
* @returns {Promise<void>}
*/
export async function registerDomain(domain, subdomain, email, sslMode, sslCertificate, sslCertificateKey, target, type, projectPath, owner) {
const db = await dbPromise;
try {
const existingDomain = await db.get('SELECT * FROM domains WHERE domain = ?', [domain]);
if (existingDomain) {
throw new Error(`The domain ${domain} already exists.`);
}
await db.run(
'INSERT INTO domains (domain, subdomain, email, sslMode, sslCertificate, sslCertificateKey, target, type, projectPath, owner) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
[domain, subdomain, email, sslMode, sslCertificate, sslCertificateKey, target, type, projectPath, owner]);
} catch (error) {
console.error(`Error adding domain ${domain}:`, error);
throw error;
}
}
/**
* Function to get all domains
* @returns {Promise<Array>}
*/
export async function getDomains() {
try {
const db = await dbPromise;
return await db.all('SELECT * FROM domains');
} catch (error) {
console.error('Error getting domains:', error);
throw error;
}
}
/**
* Function to get a domain by its name
* @param {string} domain - The domain name
* @returns {Promise<Object>}
*/
export async function getDomainByName(domain) {
try {
const db = await dbPromise;
return await db.get('SELECT * FROM domains WHERE domain = ?', [domain]);
} catch (error) {
console.error(`Error getting the domain ${domain}:`, error);
throw error;
}
}
/**
* Function to update a domain
* @param {string} domain - The domain name
* @param {string} email - The email associated with the domain
* @param {string} sslMode - The SSL mode
* @param {string} sslCertificate - The SSL certificate
* @param {string} sslCertificateKey - The SSL certificate key
* @param {string} target - The target
* @param {string} type - The type
* @param {string} projectPath - The project path
* @param {string} owner - The owner of the domain
* @returns {Promise<void>}
*/
export async function updateDomain(domain, email, sslMode, sslCertificate, sslCertificateKey, target, type, projectPath, owner) {
try {
const db = await dbPromise;
await db.run(
'UPDATE domains SET email = ?, sslMode = ?, sslCertificate = ?, sslCertificateKey = ?, target = ?, type = ?, projectPath = ?, owner = ? WHERE domain = ?',
[email, sslMode, sslCertificate, sslCertificateKey, target, type, projectPath, owner, domain]
);
}
catch (error) {
console.error(`Error updating the domain ${domain}:`, error);
throw error;
}
}
/**
* Function to update the target of a domain
* @param {string} domain - The domain name
* @param {string} target - The new target
* @returns {Promise<void>}
*/
export async function updateDomainTarget(domain, target) {
try {
const db = await dbPromise;
await db.run('UPDATE domains SET target = ? WHERE domain = ?', [target, domain]);
} catch (error) {
console.error(`Error updating the target of the domain ${domain}:`, error);
throw error;
}
}
/**
* Function to update the type of a domain
* @param {string} domain - The domain name
* @param {string} type - The new type
* @returns {Promise<void>}
*/
export async function updateDomainType(domain, type) {
try {
const db = await dbPromise;
await db.run('UPDATE domains SET type = ? WHERE domain = ?', [type, domain]);
} catch (error) {
console.error(`Error updating the type of the domain ${domain}:`, error);
throw error;
}
}
/**
* Function to delete a domain
* @param {string} domain - The domain name
* @returns {Promise<void>}
*/
export async function deleteDomain(domain) {
try {
const db = await dbPromise;
await db.run('DELETE FROM domains WHERE domain = ?', [domain]);
} catch (error) {
console.error(`Error deleting the domain ${domain}:`, error);
throw error;
}
}
/**
* Function to store configuration in the database
* @param {string} domain - The domain name
* @param {string} subdomain - The subdomain
* @param {string} sslMode - The SSL mode
* @param {string} sslCertificate - The SSL certificate
* @param {string} sslCertificateKey - The SSL certificate key
* @param {string} target - The target
* @param {string} type - The type
* @param {string} projectPath - The project path
* @param {string} owner - The owner of the domain
* @returns {Promise<void>}
*/
export async function storeConfigInDB(domain, subdomain, sslMode, sslCertificate, sslCertificateKey, target, type, projectPath, owner) {
const db = await dbPromise;
try {
const existingDomain = await db.get('SELECT * FROM domains WHERE domain = ?', [domain]);
const owner = domain.split('.').slice(-2).join('.');
if (existingDomain) {
await db.run('UPDATE domains SET subdomain = ?, sslMode = ?, sslCertificate = ?, sslCertificateKey = ?, target = ?, type = ?, projectPath = ?, owner = ? WHERE domain = ?', [subdomain, sslMode, sslCertificate, sslCertificateKey, target, type, projectPath, owner, domain]);
} else {
await db.run('INSERT INTO domains (domain, subdomain, sslMode, sslCertificate, sslCertificateKey, target, type, projectPath, owner) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', [domain, subdomain, sslMode, sslCertificate, sslCertificateKey, target, type, projectPath, owner]);
}
} catch (error) {
console.error(`Error storing config for domain ${domain}:`, error);
throw error;
}
}
/**
* Function to write existing Nginx configurations to the database
* @returns {Promise<void>}
*/
export async function writeExistingNginxConfigs() {
const db = await dbPromise;
try {
const configDir = '/etc/nginx/XBlocks-available/';
const files = fs.readdirSync(configDir);
for (const file of files) {
const domain = path.basename(file, '.conf');
const nginxConfig = fs.readFileSync(path.join(configDir, file), 'utf-8');
const existingDomain = await db.get('SELECT * FROM domains WHERE domain = ?', [domain]);
if (existingDomain) {
await db.run('UPDATE domains SET nginxConfig = ? WHERE domain = ?', [nginxConfig, domain]);
} else {
await db.run('INSERT INTO domains (domain, nginxConfig) VALUES (?, ?)', [domain, nginxConfig]);
}
}
} catch (error) {
console.error('Error writing existing nginx configs:', error);
throw error;
}
}
/**
* Function to get the configuration of a domain
* @param {string} domain - The domain name
* @returns {Promise<Object>}
*/
function getConfig(domain) {
return new Promise((resolve, reject) => {
const db = new sqlite3.Database(USER_CONFIG_FILE);
db.get('SELECT domain, type, port, sslCertificate, sslCertificateKey AS target FROM domains WHERE domain = ? OR domain = ?', [domain, '*.' + domain.split('.').slice(1).join('.')], (err, row) => {
if (err) {
reject(err);
} else {
resolve(row);
}
});
});
}
/**
* Updates the SSL certificate paths in the database for a domain.
* @param {string} domain - The domain name.
* @param {string} certPath - Path to the SSL certificate.
* @param {string} keyPath - Path to the SSL private key.
* @returns {Promise<void>}
*/
export async function updateSSLCertificatePaths(domain, certPath, keyPath) {
return new Promise((resolve, reject) => {
const db = new sqlite3.Database('/opt/.get/domains.db');
db.run(
`UPDATE domains SET
sslCertificate = ?,
sslCertificateKey = ?
WHERE domain = ?`,
[certPath, keyPath, domain],
(err) => {
db.close();
if (err) {
console.log(chalk.red('Error updating SSL certificate paths in database:'), err.message);
reject(err);
} else {
resolve();
}
}
);
});
}
export default { getConfig };