@@ -30,6 +30,42 @@ def _run_command_as_user(user: str, command: str) -> bool:
3030 return True
3131
3232
33+ def _mkdir_for_user_with_error_checking (
34+ directory : pathops .LocalPath , user : str , mode : int = 0o755
35+ ) -> bool :
36+ """Create a directory and handle possible mkdir errors.
37+
38+ Args:
39+ directory: The directory to create, skipping if it exists.
40+ user: The user who should own this directory.
41+ mode: The permissions mode for the folder, defaults to standard rwxr-xr-x.
42+
43+ Returns:
44+ True if the folder was created, False otherwise.
45+ """
46+ try :
47+ directory .mkdir (parents = True , user = user , group = user , mode = mode )
48+ return True
49+ except FileExistsError :
50+ logger .info ("Directory %s already exists." , directory .as_posix ())
51+ return True
52+ except NotADirectoryError :
53+ logger .error ("Directory location %s already exists as a file." , directory .as_posix ())
54+ except PermissionError :
55+ logger .error (
56+ "Unable to create new directory %s: permission denied." ,
57+ directory .as_posix (),
58+ )
59+ except LookupError :
60+ logger .error (
61+ "Unable to create directory %s: unknown user/group %s" ,
62+ directory .as_posix (),
63+ user ,
64+ )
65+
66+ return False
67+
68+
3369def _clone_git_ubuntu_source (cloning_user : str , parent_directory : str , source_url : str ) -> bool :
3470 """Clone the git-ubuntu git repo to a given directory.
3571
@@ -71,31 +107,8 @@ def _write_python_keyring_config_file(user: str, home_dir: str) -> bool:
71107 python_keyring_config = pathops .LocalPath (home_dir , ".config/python_keyring/keyringrc.cfg" )
72108
73109 parent_dir = python_keyring_config .parent
74- config_dir_success = False
75-
76- try :
77- parent_dir .mkdir (parents = True , user = user , group = user )
78- config_dir_success = True
79- except FileExistsError :
80- logger .info ("User config directory %s already exists." , parent_dir .as_posix ())
81- config_dir_success = True
82- except NotADirectoryError :
83- logger .error (
84- "User config directory location %s already exists as a file." , parent_dir .as_posix ()
85- )
86- except PermissionError :
87- logger .error (
88- "Unable to create new user config directory %s: permission denied." ,
89- parent_dir .as_posix (),
90- )
91- except LookupError :
92- logger .error (
93- "Unable to create config directory %s: unknown user/group %s" ,
94- parent_dir .as_posix (),
95- user ,
96- )
97110
98- if not config_dir_success :
111+ if not _mkdir_for_user_with_error_checking ( parent_dir , user ) :
99112 return False
100113
101114 keyring_config_success = False
@@ -151,27 +164,8 @@ def setup_git_ubuntu_user_files(user: str, home_dir: str, git_ubuntu_source_url:
151164
152165 # Create the services folder if it does not yet exist
153166 services_dir = pathops .LocalPath (home_dir , "services" )
154- services_dir_success = False
155-
156- try :
157- services_dir .mkdir (parents = True , user = user , group = user )
158- logger .info ("Created services directory %s." , services_dir )
159- services_dir_success = True
160- except FileExistsError :
161- logger .info ("Services directory %s already exists." , services_dir )
162- services_dir_success = True
163- except NotADirectoryError :
164- logger .error ("Service directory location %s already exists as a file." , services_dir )
165- except PermissionError :
166- logger .error ("Unable to create new service directory %s: permission denied." , services_dir )
167- except LookupError :
168- logger .error (
169- "Unable to create service directory %s: unknown user/group %s" ,
170- services_dir ,
171- user ,
172- )
173167
174- if not services_dir_success :
168+ if not _mkdir_for_user_with_error_checking ( services_dir , user ) :
175169 return False
176170
177171 return _write_python_keyring_config_file (user , home_dir )
@@ -191,31 +185,8 @@ def update_ssh_private_key(user: str, home_dir: str, ssh_key_data: str) -> bool:
191185 ssh_key_file = pathops .LocalPath (home_dir , ".ssh/id" )
192186
193187 parent_dir = ssh_key_file .parent
194- ssh_dir_success = False
195188
196- try :
197- parent_dir .mkdir (mode = 0o700 , parents = True , user = user , group = user )
198- ssh_dir_success = True
199- except FileExistsError :
200- logger .info ("ssh directory %s already exists." , parent_dir .as_posix ())
201- ssh_dir_success = True
202- except NotADirectoryError :
203- logger .error (
204- "User ssh directory location %s already exists as a file." , parent_dir .as_posix ()
205- )
206- except PermissionError :
207- logger .error (
208- "Unable to create user ssh directory %s: permission denied." ,
209- parent_dir .as_posix (),
210- )
211- except LookupError :
212- logger .error (
213- "Unable to create user ssh directory %s: unknown user/group %s" ,
214- parent_dir .as_posix (),
215- user ,
216- )
217-
218- if not ssh_dir_success :
189+ if not _mkdir_for_user_with_error_checking (parent_dir , user , 0o700 ):
219190 return False
220191
221192 key_success = False
@@ -238,6 +209,44 @@ def update_ssh_private_key(user: str, home_dir: str, ssh_key_data: str) -> bool:
238209 return key_success
239210
240211
212+ def update_launchpad_keyring_secret (user : str , home_dir : str , lp_key_data : str ) -> bool :
213+ """Create or refresh the python keyring file for launchpad access.
214+
215+ Args:
216+ user: The git-ubuntu user.
217+ home_dir: The home directory for the user.
218+ lp_key_data: The private keyring data.
219+
220+ Returns:
221+ True if directory and file creation succeeded, False otherwise.
222+ """
223+ lp_key_file = pathops .LocalPath (home_dir , ".local/share/python_keyring/keyring_pass.cfg" )
224+
225+ parent_dir = lp_key_file .parent
226+
227+ if not _mkdir_for_user_with_error_checking (parent_dir , user ):
228+ return False
229+
230+ key_success = False
231+
232+ try :
233+ lp_key_file .write_text (
234+ lp_key_data ,
235+ mode = 0o600 ,
236+ user = user ,
237+ group = user ,
238+ )
239+ key_success = True
240+ except (FileNotFoundError , NotADirectoryError ) as e :
241+ logger .error ("Failed to create lp key entry due to directory issues: %s" , str (e ))
242+ except LookupError as e :
243+ logger .error ("Failed to create lp key entry due to issues with root user: %s" , str (e ))
244+ except PermissionError as e :
245+ logger .error ("Failed to create lp key entry due to permission issues: %s" , str (e ))
246+
247+ return key_success
248+
249+
241250def set_snap_homedirs (home_dir : str ) -> bool :
242251 """Allow snaps to run for a user with a given home directory.
243252
0 commit comments