Merge ~afreiberger/charm-local-users:bug/1964807 into charm-local-users:main

Proposed by Drew Freiberger
Status: Merged
Approved by: Xav Paice
Approved revision: ef0ea618e0012d508331e784b89e7c71d40362fe
Merged at revision: 84de21ec629938836f80a110ea235509ab00157f
Proposed branch: ~afreiberger/charm-local-users:bug/1964807
Merge into: charm-local-users:main
Diff against target: 144 lines (+65/-13)
4 files modified
charmcraft.yaml (+13/-7)
requirements.txt (+0/-1)
src/charm.py (+4/-4)
src/lib/local_users.py (+48/-1)
Reviewer Review Type Date Requested Status
Xav Paice (community) Approve
BootStack Reviewers Pending
Review via email: mp+416830@code.launchpad.net

Commit message

Remove charmhelpers requirement and import group add functions

To post a comment you must log in.
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote :

This merge proposal is being monitored by mergebot. Change the status to Approved to merge.

Revision history for this message
Xav Paice (xavpaice) wrote :

lgtm, we really really need this charm to have proper test coverage

review: Approve
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote :

Change successfully merged at revision 84de21ec629938836f80a110ea235509ab00157f

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/charmcraft.yaml b/charmcraft.yaml
index fd5e934..663c211 100644
--- a/charmcraft.yaml
+++ b/charmcraft.yaml
@@ -1,9 +1,15 @@
1type: "charm"1type: "charm"
2bases:2bases:
3 - name: "ubuntu"3 - build-on:
4 channel: "20.04"4 - name: ubuntu
5 - name: "ubuntu"5 channel: "20.04"
6 channel: "18.04"6 architectures: ["amd64"]
7parts:7 run-on:
8 charm:8 - name: ubuntu
9 charm-python-packages: [setuptools < 58]9 channel: "20.04"
10 architectures:
11 - amd64
12 - name: ubuntu
13 channel: "18.04"
14 architectures:
15 - amd64
diff --git a/requirements.txt b/requirements.txt
index 7d3a551..5d6fa96 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,2 +1 @@
1ops >= 1.2.01ops >= 1.2.0
2charmhelpers >= 0.20.24
3\ No newline at end of file2\ No newline at end of file
diff --git a/src/charm.py b/src/charm.py
index f71608d..e9875e5 100755
--- a/src/charm.py
+++ b/src/charm.py
@@ -23,13 +23,13 @@ from ops.framework import StoredState
23from ops.main import main23from ops.main import main
24from ops.model import ActiveStatus, BlockedStatus24from ops.model import ActiveStatus, BlockedStatus
2525
26from charmhelpers.core import host
27
28from lib.local_users import (26from lib.local_users import (
27 add_group,
29 configure_user,28 configure_user,
30 check_sudoers_file,29 check_sudoers_file,
31 delete_user,30 delete_user,
32 get_group_users,31 get_group_users,
32 group_exists,
33 is_unmanaged_user,33 is_unmanaged_user,
34 parse_gecos,34 parse_gecos,
35 remove_group,35 remove_group,
@@ -76,7 +76,7 @@ class CharmLocalUsersCharm(CharmBase):
76 self.unit.status = BlockedStatus("'group' config option value is required")76 self.unit.status = BlockedStatus("'group' config option value is required")
77 return77 return
7878
79 if not host.group_exists(group):79 if not group_exists(group):
80 if self._stored.group and self._stored.group != group:80 if self._stored.group and self._stored.group != group:
81 log.debug(81 log.debug(
82 "renaming charm managed group: '%s' to '%s'",82 "renaming charm managed group: '%s' to '%s'",
@@ -85,7 +85,7 @@ class CharmLocalUsersCharm(CharmBase):
85 )85 )
86 rename_group(self._stored.group, group)86 rename_group(self._stored.group, group)
87 else:87 else:
88 host.add_group(group)88 add_group(group)
8989
90 # save the current managed group name in StoredState so that the charm can detect if rename90 # save the current managed group name in StoredState so that the charm can detect if rename
91 # is needed on future config_changed events91 # is needed on future config_changed events
diff --git a/src/lib/local_users.py b/src/lib/local_users.py
index 531458f..dba53e7 100755
--- a/src/lib/local_users.py
+++ b/src/lib/local_users.py
@@ -20,6 +20,7 @@ import re
20import subprocess20import subprocess
21import logging21import logging
22import tempfile22import tempfile
23import grp
23from collections import namedtuple24from collections import namedtuple
2425
25from charmhelpers.core import host26from charmhelpers.core import host
@@ -179,7 +180,7 @@ def update_gecos(user):
179180
180181
181def parse_gecos(raw):182def parse_gecos(raw):
182 """Helper to convert a raw GECOS string into a 5 elements list."""183 """Convert a raw GECOS string into a 5 elements list."""
183 gecos = [""] * 5184 gecos = [""] * 5
184 fields = raw.split(",")185 fields = raw.split(",")
185 for i in range(5):186 for i in range(5):
@@ -220,3 +221,49 @@ def write_sudoers_file(sudoers):
220 sudoers_file.close()221 sudoers_file.close()
221 os.chmod(NEW_FILE, 0o440)222 os.chmod(NEW_FILE, 0o440)
222 os.replace(NEW_FILE, SUDOERS_FILE)223 os.replace(NEW_FILE, SUDOERS_FILE)
224
225
226def group_exists(groupname):
227 """Check if a group exists."""
228 try:
229 grp.getgrnam(groupname)
230 group_exists = True
231 except KeyError:
232 group_exists = False
233 return group_exists
234
235
236def add_group(group_name, system_group=False, gid=None):
237 """Add a group to the system.
238
239 Will log but otherwise succeed if the group already exists.
240 :param str group_name: group to create
241 :param bool system_group: Create system group
242 :param int gid: GID for user being created
243 :returns: The password database entry struct, as returned by `grp.getgrnam`
244 """
245 try:
246 group_info = grp.getgrnam(group_name)
247 log('group {0} already exists!'.format(group_name))
248 if gid:
249 group_info = grp.getgrgid(gid)
250 log('group with gid {0} already exists!'.format(gid))
251 except KeyError:
252 log('creating group {0}'.format(group_name))
253 add_new_group(group_name, system_group, gid)
254 group_info = grp.getgrnam(group_name)
255 return group_info
256
257
258def add_new_group(group_name, system_group=False, gid=None):
259 cmd = ['addgroup']
260 if gid:
261 cmd.extend(['--gid', str(gid)])
262 if system_group:
263 cmd.append('--system')
264 else:
265 cmd.extend([
266 '--group',
267 ])
268 cmd.append(group_name)
269 subprocess.check_call(cmd)

Subscribers

People subscribed via source and target branches

to all changes: