diff --git a/installer/README.md b/installer/README.md index 60f87b1..c1e05ff 100644 --- a/installer/README.md +++ b/installer/README.md @@ -51,6 +51,15 @@ para agregarla. # . venv/bin/activate # ./opengnsys_git_installer.py +El instalador descarga e instala Forgejo, un interfaz web de Git. La configuración se genera automáticamente. + +Forgejo gestiona los repositorios y el acceso por SSH, por lo cual debe quedarse siempre corriendo. Por defecto se instala en el puerto 3000. + +El usuario por defecto es `opengnsys` con password `opengnsys`. + + + + # Documentación Se puede generar documentación de Python con una utilidad como pdoc3 (hay multiples alternativas posibles): diff --git a/installer/opengnsys_git_installer.py b/installer/opengnsys_git_installer.py index 9be596d..0db1afb 100755 --- a/installer/opengnsys_git_installer.py +++ b/installer/opengnsys_git_installer.py @@ -113,16 +113,14 @@ class OpengnsysGitInstaller: self.testmode = False self.base_path = "/opt/opengnsys" self.git_basedir = "base.git" - self.ssh_user = "opengnsys" - self.ssh_group = "opengnsys" self.email = "OpenGnsys@opengnsys.com" + + self.forgejo_user = "opengnsys" self.forgejo_password = "opengnsys" self.forgejo_port = 3000 + self.set_ssh_user_group("oggit", "oggit") - self.ssh_homedir = pwd.getpwnam(self.ssh_user).pw_dir - self.ssh_uid = pwd.getpwnam(self.ssh_user).pw_uid - self.ssh_gid = grp.getgrnam(self.ssh_group).gr_gid self.temp_dir = None self.script_path = os.path.realpath(os.path.dirname(__file__)) @@ -175,6 +173,32 @@ class OpengnsysGitInstaller: if self.temp_dir: shutil.rmtree(self.temp_dir, ignore_errors=True) + def set_ssh_user_group(self, username, groupname): + + + self.ssh_group = groupname + self.ssh_user = username + + try: + self.ssh_gid = grp.getgrnam(self.ssh_group).gr_gid + self.__logger.info("Group %s exists with gid %i", self.ssh_group, self.ssh_gid) + except KeyError: + self.__logger.info("Need to create group %s", self.ssh_group) + subprocess.run(["/usr/sbin/groupadd", "--system", self.ssh_group], check=True) + self.ssh_gid = grp.getgrnam(groupname).gr_gid + + + try: + self.ssh_uid = pwd.getpwnam(self.ssh_user).pw_uid + self.__logger.info("User %s exists with gid %i", self.ssh_user, self.ssh_uid) + except KeyError: + self.__logger.info("Need to create user %s", self.ssh_user) + subprocess.run(["/usr/sbin/useradd", "--gid", str(self.ssh_gid), "-m", "--system", self.ssh_user], check=True) + self.ssh_uid = pwd.getpwnam(username).pw_uid + + self.ssh_homedir = pwd.getpwnam(username).pw_dir + + def init_git_repo(self, reponame): """Inicializa un repositorio Git""" # Creamos repositorio @@ -389,13 +413,14 @@ class OpengnsysGitInstaller: os.system(f"usermod -s {SHELL} opengnsys") # Creamos repositorios - self.init_git_repo('windows.git') - self.init_git_repo('linux.git') - self.init_git_repo('mac.git') + #self.init_git_repo('windows.git') + #self.init_git_repo('linux.git') + #self.init_git_repo('mac.git') + # Damos permiso al usuario opengnsys - for DIR in ["base.git", "linux.git", "windows.git"]: #, "LinAcl", "WinAcl"]: - self._recursive_chown(os.path.join(ogdir_images, DIR), ouid=self.ssh_uid, ogid=self.ssh_gid) + #for DIR in ["base.git", "linux.git", "windows.git"]: #, "LinAcl", "WinAcl"]: + # self._recursive_chown(os.path.join(ogdir_images, DIR), ouid=self.ssh_uid, ogid=self.ssh_gid) def _install_template(self, template, destination, keysvalues): @@ -427,9 +452,13 @@ class OpengnsysGitInstaller: conf_dir_path = os.path.join(self.base_path, "etc", "forgejo") - lfs_dir_path = os.path.join(self.base_path, "images", "lfs") - forgejo_work_dir_path = os.path.join(self.base_path, "var", "run", "forgejo") - forgejo_db_dir_path = os.path.join(self.base_path, "var", "run", "forgejo") + lfs_dir_path = os.path.join(self.base_path, "images", "git-lfs") + git_dir_path = os.path.join(self.base_path, "images", "git") + + forgejo_work_dir_path = os.path.join(self.base_path, "var", "lib", "forgejo/work") + forgejo_db_dir_path = os.path.join(self.base_path, "var", "lib", "forgejo/db") + forgejo_data_dir_path = os.path.join(self.base_path, "var", "lib", "forgejo/data") + forgejo_db_path = os.path.join(forgejo_db_dir_path, "forgejo.db") forgejo_log_dir_path = os.path.join(self.base_path, "log", "forgejo") @@ -453,16 +482,26 @@ class OpengnsysGitInstaller: else: self.__logger.debug("Old configuration not present, ok.") + self.__logger.debug("Wiping old data") + for dir in [conf_dir_path, git_dir_path, lfs_dir_path, forgejo_work_dir_path, forgejo_data_dir_path, forgejo_db_dir_path]: + if os.path.exists(dir): + self.__logger.debug("Removing %s", dir) + shutil.rmtree(dir) + self.__logger.debug("Creating directories") pathlib.Path(conf_dir_path).mkdir(parents=True, exist_ok=True) + pathlib.Path(git_dir_path).mkdir(parents=True, exist_ok=True) pathlib.Path(lfs_dir_path).mkdir(parents=True, exist_ok=True) pathlib.Path(forgejo_work_dir_path).mkdir(parents=True, exist_ok=True) + pathlib.Path(forgejo_data_dir_path).mkdir(parents=True, exist_ok=True) pathlib.Path(forgejo_db_dir_path).mkdir(parents=True, exist_ok=True) pathlib.Path(forgejo_log_dir_path).mkdir(parents=True, exist_ok=True) os.chown(lfs_dir_path, self.ssh_uid, self.ssh_gid) + os.chown(git_dir_path, self.ssh_uid, self.ssh_gid) + os.chown(forgejo_data_dir_path, self.ssh_uid, self.ssh_gid) os.chown(forgejo_work_dir_path, self.ssh_uid, self.ssh_gid) os.chown(forgejo_db_dir_path, self.ssh_uid, self.ssh_gid) os.chown(forgejo_log_dir_path, self.ssh_uid, self.ssh_gid) @@ -474,8 +513,9 @@ class OpengnsysGitInstaller: "forgejo_bin" : bin_path, "forgejo_app_ini" : conf_path, "forgejo_work_path" : forgejo_work_dir_path, + "forgejo_data_path" : forgejo_data_dir_path, "forgejo_db_path" : forgejo_db_path, - "forgejo_repository_root" : os.path.join(self.base_path, "images"), + "forgejo_repository_root" : git_dir_path, "forgejo_lfs_path" : lfs_dir_path, "forgejo_log_path" : forgejo_log_dir_path, "forgejo_hostname" : self._runcmd("hostname"), @@ -515,9 +555,9 @@ class OpengnsysGitInstaller: run_forge_cmd(["admin", "doctor", "check"]) - run_forge_cmd(["admin", "user", "create", "--username", self.ssh_user, "--password", self.forgejo_password, "--email", self.email]) + run_forge_cmd(["admin", "user", "create", "--username", self.forgejo_user, "--password", self.forgejo_password, "--email", self.email]) - token = run_forge_cmd(["admin", "user", "generate-access-token", "--username", self.ssh_user, "-t", "gitapi", "--scopes", "all", "--raw"]) + token = run_forge_cmd(["admin", "user", "generate-access-token", "--username", self.forgejo_user, "-t", "gitapi", "--scopes", "all", "--raw"]) with open(os.path.join(self.base_path, "etc", "ogGitApiToken.cfg"), "w+", encoding='utf-8') as token_file: token_file.write(token) @@ -591,6 +631,7 @@ if __name__ == '__main__': parser.add_argument('--testmode', action='store_true', help="Modo de prueba") parser.add_argument('--ignoresshkey', action='store_true', help="Ignorar clave de SSH") parser.add_argument('--usesshkey', type=str, help="Usar clave SSH especificada") + parser.add_argument('--test-createuser', action='store_true') args = parser.parse_args() @@ -606,9 +647,16 @@ if __name__ == '__main__': installer.install_forgejo() elif args.forgejo_addrepos: installer.add_forgejo_repo("linux") + elif args.test_createuser: + installer.set_ssh_user_group("oggit2", "oggit2") else: installer.install() installer.install_forgejo() + + installer.add_forgejo_repo("windows", "Windows") + installer.add_forgejo_repo("linux", "Linux") + installer.add_forgejo_repo("mac", "Mac") + except RequirementException as req: show_error(f"Requisito para la instalación no satisfecho: {req.message}") exit(1)