UNPKG

penguins-eggs

Version:

A remaster system tool, compatible with Arch, Debian, Devuan, Ubuntu and others

338 lines (337 loc) 14.3 kB
/** * ./src/classes/xdg.ts * penguins-eggs v.10.0.0 / ecmascript 2020 * author: Piero Proietti * email: piero.proietti@gmail.com * license: MIT */ import fs from 'node:fs'; import path from 'node:path'; import shx from 'shelljs'; // libraries import { exec } from '../lib/utils.js'; import Distro from './distro.js'; import Pacman from './pacman.js'; import Utils from './utils.js'; const xdg_dirs = ['DESKTOP', 'DOWNLOAD', 'TEMPLATES', 'PUBLICSHARE', 'DOCUMENTS', 'MUSIC', 'PICTURES', 'VIDEOS']; /** * Xdg: xdg-user-dirs, etc * @remarks all the utilities */ export default class Xdg { /** * * @param olduser * @param newuser * @param chroot */ static async autologin(olduser, newuser, chroot = '/') { // console.log("old: " + olduser, "new: " + newuser, "chroot: " + chroot) if (Pacman.isInstalledGui()) { /** * SLIM & SLIMSKI */ let slimConf = ''; if (Pacman.packageIsInstalled('slim')) { slimConf = 'slim.conf'; if (fs.existsSync('/etc/slim.local.conf')) { slimConf = 'slim.local.conf'; } } if (Pacman.packageIsInstalled('slimski')) { slimConf = 'slimski.conf'; if (fs.existsSync('/etc/slimski.local.conf')) { slimConf = 'slimski.local.conf'; } } if (slimConf !== '') { let content = fs.readFileSync(`${chroot}/etc/${slimConf}`, 'utf8'); const regexAutoLogin = new RegExp(`auto_login\\s*no`, 'g'); content = content.replaceAll(regexAutoLogin, 'auto_login yes'); const regexDefaultUser = new RegExp(`default_user\\s*${olduser}`, 'g'); content = content.replace(regexDefaultUser, `default_user ${newuser}`); fs.writeFileSync(`${chroot}/etc/${slimConf}`, content, 'utf8'); /** * LIGHTDM */ } else if (Pacman.packageIsInstalled('lightdm')) { const dc = `${chroot}/etc/lightdm/`; const files = fs.readdirSync(dc); for (const elem of files) { const curFile = dc + elem; if (!fs.statSync(`/${curFile}`).isDirectory()) { let content = fs.readFileSync(curFile, 'utf8'); const find = '[Seat:*]'; if (content.includes(find)) { const regex = new RegExp(`autologin-user\\s*=\\s*${olduser}`, 'g'); // remove spaces content = content.replace(regex, `autologin-user=${newuser}`); fs.writeFileSync(curFile, content, 'utf8'); } } } } else if (Pacman.packageIsInstalled('lxdm')) { let lxdmConf = '/etc/lxdm/lxdm.conf'; if (fs.existsSync(lxdmConf)) { let content = fs.readFileSync(lxdmConf, 'utf8'); const regex = new RegExp(`autologin\\s*=\\s*${olduser}`, 'g'); // remove spaces content = content.replace(regex, `autologin=${newuser}`); fs.writeFileSync(lxdmConf, content, 'utf8'); } } else if (Pacman.packageIsInstalled('sddm')) { /** * SDDM */ let sddmChanged = false; const curFile = `${chroot}/etc/sddm.conf`; if (fs.existsSync(curFile)) { let content = fs.readFileSync(curFile, 'utf8'); const find = '[Autologin]'; if (content.includes(find)) { const regex = new RegExp(`User\\s*=\\s*${olduser}`, 'g'); // replace space content = content.replace(regex, `User=${newuser}`); fs.writeFileSync(curFile, content, 'utf8'); sddmChanged = true; } } if (!sddmChanged) { const dc = `${chroot}/etc/sddm.conf.d/`; if (fs.existsSync(dc)) { const files = fs.readdirSync(dc); for (const elem of files) { const curFile = dc + elem; let content = fs.readFileSync(curFile, 'utf8'); const find = '[Autologin]'; if (content.includes(find)) { const regex = new RegExp(`User\\s*=\\s*${olduser}`, 'g'); // replace space content = content.replace(regex, `User=${newuser}`); fs.writeFileSync(curFile, content, 'utf8'); sddmChanged = true; } } } } // sddm.conf don't exists, generate it if (!sddmChanged) { let session = 'plasma'; if (Pacman.isInstalledWayland()) { session = 'plasma-wayland'; } const content = `[Autologin]\nUser=${newuser}\nSession=${session}\n`; const curFile = `${chroot}/etc/sddm.conf`; fs.writeFileSync(curFile, content, 'utf8'); } } else if (Pacman.packageIsInstalled('gdm') || Pacman.packageIsInstalled('gdm3')) { /** * GDM/GDM3 * in manjaro è /etc/gdm/custom.conf */ let gdmConf = `${chroot}/etc/gdm3`; if (Pacman.packageIsInstalled('gdm3')) { gdmConf = `${chroot}/etc/gdm3`; } else if (Pacman.packageIsInstalled('gdm')) { gdmConf = `${chroot}/etc/gdm`; } if (fs.existsSync(`${gdmConf}/custom.conf`)) { gdmConf += '/custom.conf'; } else if (fs.existsSync(`${gdmConf}/daemon.conf`)) { gdmConf += '/daemon.conf'; } else { gdmConf = `}/etc/${gdmConf}/custom.conf`; } const content = `[daemon]\nAutomaticLoginEnable=true\nAutomaticLogin=${newuser}\n`; Utils.write(gdmConf, content); } } } /** * * @param user * @param chroot * @param verbose */ static async create(user, chroot, traduce = true, verbose = false) { const echo = Utils.setEcho(verbose); /** * Creo solo la cartella DESKTOP perchè serve per i link, eventualmente posso creare le altre * ma c'è il problema di traduce/non traduce */ xdg_dirs.forEach(async (dir) => { if (dir === 'DESKTOP') { await Xdg.mk(chroot, `/home/${user}/` + this.traduce(dir, traduce), verbose); } }); } /** * * @param chroot * @param path * @param verbose */ static async mk(chroot, path, verbose = false) { const echo = Utils.setEcho(verbose); if (!fs.existsSync(chroot + path)) { await exec(`mkdir ${chroot}${path}`, echo); } } /** * Copia della configurazione in /etc/skel * @param user * @param verbose */ static async skel(user, verbose = false) { const echo = Utils.setEcho(verbose); // Remove and create /etc/skel await exec('rm /etc/skel -rf', echo); await exec('mkdir -p /etc/skel', echo); // copy .bash_logout, .bashrc and .profile to /etc/skel await exec(`cp /home/${user}/.bash_logout /etc/skel`, echo); await exec(`cp /home/${user}/.bashrc /etc/skel`, echo); await exec(`cp /home/${user}/.profile /etc/skel`, echo); /** * copy desktop configuration */ if (Pacman.packageIsInstalled('gnome-session')) { // we need a more clean solution await rsyncIfExist(`/home/${user}/.config`, '/etc/skel', verbose); await rsyncIfExist(`/home/${user}/.gtkrc-2.0`, '/etc/skel', verbose); } else if (Pacman.packageIsInstalled('cinnamon-common')) { // before the check was against cinnamon-core await rsyncIfExist(`/home/${user}/.config`, '/etc/skel', verbose); // use .cinnamon NOT cinnamon/ // removed because it's not necessary // await rsyncIfExist(`/home/${user}/.cinnamon`, '/etc/skel', verbose) } else if (Pacman.packageIsInstalled('plasma-desktop')) { // use .kde NOT .kde/ await rsyncIfExist(`/home/${user}/.config`, '/etc/skel', verbose); await rsyncIfExist(`/home/${user}/.kde`, '/etc/skel', verbose); } else if (Pacman.packageIsInstalled('lxde-core')) { // we need a more clean solution await rsyncIfExist(`/home/${user}/.config`, '/etc/skel', verbose); await rsyncIfExist(`/home/${user}/.gtkrc-2.0`, '/etc/skel', verbose); } else if (Pacman.packageIsInstalled('lxqt-session')) { // we need a more clean solution await rsyncIfExist(`/home/${user}/.config/lxqt`, '/etc/skel/.config', verbose); await rsyncIfExist(`/home/${user}/.gtkrc-2.0`, '/etc/skel', verbose); } else if (Pacman.packageIsInstalled('mate-session-manager')) { // we need a more clean solution await rsyncIfExist(`/home/${user}/.config`, '/etc/skel', verbose); await rsyncIfExist(`/home/${user}/.gtkrc-2.0`, '/etc/skel', verbose); } else if (Pacman.packageIsInstalled('xfce4-session')) { // use .config/xfce4 NOT .config/xfce4/ await rsyncIfExist(`/home/${user}/.config/xfce4`, '/etc/skel/.config', verbose); await exec('mkdir /etc/skel/.local/share -p', echo); await rsyncIfExist(`/home/${user}/.local/share/recently-used.xbel`, '/etc/skel/.local/share', verbose); } /** * special cases */ // Riccardo suggestion await rsyncIfExist(`/home/${user}/.mozilla`, '/etc/skel', verbose); await rsyncIfExist(`/home/${user}/.kodi`, '/etc/skel', verbose); // waydroid if (fs.existsSync(`/home/${user}/waydroid-package-manager`)) { await rsyncIfExist(`/home/${user}/waydroid-package-manager`, '/etc/skel', verbose); } // LinuxFX if (fs.existsSync(`/home/${user}/.linuxfx`)) { // we need to copy: .linuxfx ,kde and ,cinnamon await rsyncIfExist(`/home/${user}/.cinnamon`, '/etc/skel', verbose); await rsyncIfExist(`/home/${user}/.kde`, '/etc/skel', verbose); await rsyncIfExist(`/home/${user}/.linuxfx`, '/etc/skel', verbose); await rsyncIfExist(`/home/${user}/.local`, '/etc/skel', verbose); } await exec('chown root:root /etc/skel -R', echo); await exec('chmod a+rwx,g-w,o-w /etc/skel/ -R', echo); await execIfExist('chmod a+rwx,g-w-x,o-wx', '/etc/skel/.bashrc', verbose); await execIfExist('chmod a+rwx,g-w-x,o-wx', '/etc/skel/.bash_logout', verbose); await execIfExist('chmod a+rwx,g-w-x,o-wx', '/etc/skel/.profile', verbose); // quirinux const distro = new Distro(); if (distro.distroId === 'Quirinux') { await exec('chmod -R 777 /etc/skel/.config'); await exec('chmod -R 777 /etc/xdg/autostart'); // here we must change *** await exec('chmod -R 777 /home/*/.config'); await exec('chmod -R 777 /opt/estilos-general/.config'); await exec('chmod -R 777 /opt/estilos/.config'); await exec('chmod -R 777 /usr/bin/iniciar-asistente'); // Copy xfce4-theme-switcher await exec('mkdir /etc/skel/.config/xfce4-theme-switcher -p', echo); await rsyncIfExist(`/home/${user}/.config/xfce4-theme-switcher`, '/etc/skel/.config/xfce4-theme-switcher', verbose); } /** * ALL Desktops: */ // Emer Chen suggestion await rmIfExist('/etc/skel/.config/user-dirs.dirs'); await rmIfExist('/etc/skel/.config/user-dirs.locale'); await rmIfExist('/etc/skel/.config/gtk-3.0/bookmarks/', 'r'); // Manuel Senpai suggestion // await exec(`grep -IE -r /etc/skel -e ${user}`) await rmIfExist('/etc/skel/.local/share/recently-used.xbel'); await rmIfExist('/etc/skel/.config/xfce4/desktop/', 'r'); } /** * * @param xdg_dir */ static traduce(xdg_dir = '', traduce = true) { let retval = ''; if (traduce === false) { // Capitalize retval = xdg_dir.charAt(0).toUpperCase() + xdg_dir.slice(1).toLowerCase(); console.log(retval); } else { xdg_dirs.forEach(async (dir) => { if (dir === xdg_dir) { retval = path.basename(shx.exec(`sudo -u ${await Utils.getPrimaryUser()} xdg-user-dir ${dir}`, { silent: true }).stdout.trim()); } }); } return retval; } } /** * execIfExist * @param cmd * @param file * @param verbose */ async function execIfExist(cmd, file, verbose = false) { const echo = Utils.setEcho(verbose); if (fs.existsSync(file)) { await exec(`${cmd} ${file}`, echo); } } /** * */ async function rsyncIfExist(source, dest = '/etc/skel/', verbose = false) { const echo = Utils.setEcho(verbose); if (fs.existsSync(source)) { await exec(`rsync -avx ${source} ${dest}`, echo); } } /** * * @param file2Remove * @param recursive */ async function rmIfExist(file2Remove, recursive = '') { if (fs.existsSync(file2Remove)) { await exec(`rm -f${recursive} ${file2Remove}`); } }