diff --git a/scone/default/recipes/linux.py b/scone/default/recipes/linux.py index f988606..2c00ab2 100644 --- a/scone/default/recipes/linux.py +++ b/scone/default/recipes/linux.py @@ -21,7 +21,7 @@ from typing import Optional from scone.default.steps import linux_steps from scone.default.utensils.basic_utensils import SimpleExec -from scone.default.utensils.linux_utensils import GetPasswdEntry +from scone.default.utensils.linux_utensils import GetGroupEntry, GetPasswdEntry from scone.head.head import Head from scone.head.kitchen import Kitchen, Preparation from scone.head.recipe import Recipe, RecipeContext @@ -99,14 +99,25 @@ class LinuxGroup(Recipe): # acknowledge tracking kitchen.get_dependency_tracker() - result = await kitchen.ut1areq( - SimpleExec(["groupadd", self.group_name], "/"), SimpleExec.Result + grp_entry = await kitchen.ut1a( + GetGroupEntry(self.group_name), GetGroupEntry.Result ) - if result.exit_code != 0: - raise RuntimeError( - "Failed to create group. Error was: " + result.stderr.strip().decode() + if grp_entry: + logger.warning( + "Not updating existing os-group '%s' as it exists already.", + self.group_name, ) + else: + result = await kitchen.ut1areq( + SimpleExec(["groupadd", self.group_name], "/"), SimpleExec.Result + ) + + if result.exit_code != 0: + raise RuntimeError( + "Failed to create group. Error was: " + + result.stderr.strip().decode() + ) class DeclareLinuxUser(Recipe): diff --git a/scone/default/utensils/linux_utensils.py b/scone/default/utensils/linux_utensils.py index 5a54812..c46ebaa 100644 --- a/scone/default/utensils/linux_utensils.py +++ b/scone/default/utensils/linux_utensils.py @@ -14,7 +14,7 @@ # # You should have received a copy of the GNU General Public License # along with Scone. If not, see . - +import grp import pwd import attr @@ -50,3 +50,25 @@ class GetPasswdEntry(Utensil): shell=entry.pw_shell, ) ) + + +@attr.s(auto_attribs=True) +class GetGroupEntry(Utensil): + group_name: str + + @attr.s(auto_attribs=True) + class Result: + gid: int + + async def execute(self, channel: Channel, worktop: Worktop): + try: + entry = grp.getgrnam(self.group_name) + except KeyError: + await channel.send(None) + return + + await channel.send( + GetGroupEntry.Result( + gid=entry.gr_gid, + ) + )