/** * @param $formData * @param string $entryPoint * @return bool */ function tryCreateSubmit( $formData, $entryPoint = 'internal' ) { if ( $formData['users'] ) { $users = explode( ',', $formData['users'] ); } else { $users = array(); } if ( $formData['hosts'] ) { $hosts = explode( ',', $formData['hosts'] ); } else { $hosts = array(); } if ( $formData['commands'] ) { $commands = explode( ',', $formData['commands'] ); } else { $commands = array(); } if ( $formData['options'] ) { $options = explode( ',', $formData['options'] ); } else { $options = array(); } $success = OpenStackNovaSudoer::createSudoer( $formData['sudoername'], $users, $hosts, $commands, $options ); if ( ! $success ) { $this->getOutput()->addWikiMsg( 'openstackmanager-createsudoerfailed' ); return false; } $this->getOutput()->addWikiMsg( 'openstackmanager-createdsudoer' ); $out = '<br />'; $out .= Linker::link( $this->getTitle(), wfMsgHtml( 'openstackmanager-addadditionalsudoer' ) ); $this->getOutput()->addHTML( $out ); return true; }
/** * @param $formData * @param string $entryPoint * @return bool */ function tryCreateSubmit($formData, $entryPoint = 'internal') { if ($formData['commands']) { $commands = explode("\n", $formData['commands']); } else { $commands = array(); } if ($formData['options']) { $options = explode("\n", $formData['options']); } else { $options = array(); } if ($formData['requirepassword']) { $options[] = 'authenticate'; } else { $options[] = '!authenticate'; } $runasusers = $this->removeALLFromRunAsUserKeys($formData['runas']); $success = OpenStackNovaSudoer::createSudoer($formData['sudoername'], $formData['project'], $this->removeALLFromUserKeys($formData['users']), $runasusers, $commands, $options); if (!$success) { $this->getOutput()->addWikiMsg('openstackmanager-createsudoerfailed'); return false; } $this->getOutput()->addWikiMsg('openstackmanager-createdsudoer'); $out = '<br />'; $out .= Linker::link($this->getPageTitle(), $this->msg('openstackmanager-backsudoerlist')->escaped()); $this->getOutput()->addHTML($out); return true; }
/** * @static * @param $groupName * @param $project OpenStackNovaProject * @param $initialUser * @return null|OpenStackNovaServiceGroup */ static function createServiceGroup($inGroupName, $project, $initialUser) { global $wgAuth; global $wgOpenStackManagerLDAPUser; global $wgOpenStackManagerLDAPDefaultShell; global $wgOpenStackManagerLDAPServiceGroupBaseDN; global $wgMemc; OpenStackNovaLdapConnection::connect(); $projectPrefix = $project->getProjectName() . '.'; # We don't want naming collisions between service groups and actual groups # or users. So, prepend $projectPrefix to the requested group name. if (strpos($inGroupName, $projectPrefix, 0) === 0) { # The user was clever and already added the prefix. $groupName = $inGroupName; $simpleGroupName = substr($inGroupName, strlen($projectPrefix)); } else { $groupName = $projectPrefix . $inGroupName; $simpleGroupName = $inGroupName; } if ($initialUser) { $user = new OpenStackNovaUser($initialUser); if (!$user->userDN) { $wgAuth->printDebug("Unable to find initial user {$initialUser} for new group {$groupName}", NONSENSITIVE); return null; } $initialUserDN = $user->userDN; } $key = wfMemcKey('openstackmanager', 'servicegroup', $groupName); $wgMemc->delete($key); $group = array(); $group['objectclass'][] = 'posixgroup'; $group['objectclass'][] = 'groupofnames'; $group['cn'] = $groupName; $groupdn = 'cn=' . $groupName . ',' . $wgOpenStackManagerLDAPServiceGroupBaseDN; $group['gidnumber'] = OpenStackNovaUser::getNextIdNumber($wgAuth, 'gidnumber'); $group['member'] = array(); if ($initialUser) { $group['member'][] = $initialUserDN; } $success = LdapAuthenticationPlugin::ldap_add($wgAuth->ldapconn, $groupdn, $group); if ($success) { $wgAuth->printDebug("Successfully added service group {$groupdn}", NONSENSITIVE); } else { $wgAuth->printDebug("Failed to add service group {$groupdn}", NONSENSITIVE); return null; } # stamp out regular expressions! $homeDir = $project->getServiceGroupHomedirPattern(); $homeDir = str_ireplace('%u', $simpleGroupName, $homeDir); $homeDir = str_ireplace('%p', $projectPrefix, $homeDir); # Now create the special SG member $newGroup = self::getServiceGroupByName($groupName, $project); $userdn = $newGroup->getSpecialUserDN(); $user = array(); $user['objectclass'][] = 'shadowaccount'; $user['objectclass'][] = 'posixaccount'; $user['objectclass'][] = 'person'; $user['objectclass'][] = 'top'; $user['loginshell'] = $wgOpenStackManagerLDAPDefaultShell; $user['homedirectory'] = $homeDir; $user['uidnumber'] = $group['gidnumber']; $user['gidnumber'] = $group['gidnumber']; $user['uid'] = $groupName; $user['sn'] = $groupName; $user['cn'] = $groupName; $success = LdapAuthenticationPlugin::ldap_add($wgAuth->ldapconn, $userdn, $user); if ($success) { $wgAuth->printDebug("Successfully created service user {$userdn}", NONSENSITIVE); } else { $wgAuth->printDebug("Failed to create service user {$userdn}", NONSENSITIVE); return null; } # Create Sudo policy so that the service user can chown files in its homedir if (OpenStackNovaSudoer::createSudoer($groupName . '-chmod', $project->getProjectName(), array($groupName), array(), array('/bin/chown -R ' . $groupName . '\\:' . $groupName . ' ' . $homeDir), array('!authenticate'))) { $wgAuth->printDebug("Successfully created chmod sudo policy for {$groupName}", NONSENSITIVE); } else { $wgAuth->printDebug("Failed to creat chmod sudo policy for {$groupName}", NONSENSITIVE); } # Create Sudo policy so that members of the group can sudo as the service user if (OpenStackNovaSudoer::createSudoer('runas-' . $groupName, $project->getProjectName(), array("%" . $groupName), array($groupName), array('ALL'), array('!authenticate'))) { $wgAuth->printDebug("Successfully created run-as sudo policy for {$groupName}", NONSENSITIVE); } else { $wgAuth->printDebug("Failed to creat run-as sudo policy for {$groupName}", NONSENSITIVE); } return $newGroup; }
/** * Create a new project based on project name. This function will also create * all roles needed by the project. * * @static * @param $projectname * @return bool */ static function createProject($projectname) { global $wgAuth; global $wgOpenStackManagerLDAPUser; global $wgOpenStackManagerLDAPProjectBaseDN; OpenStackNovaLdapConnection::connect(); $project = array(); $project['objectclass'][] = 'extensibleobject'; $project['objectclass'][] = 'groupofnames'; $project['cn'] = $projectname; $project['member'] = $wgOpenStackManagerLDAPUser; $projectdn = 'cn=' . $projectname . ',' . $wgOpenStackManagerLDAPProjectBaseDN; // if we're not going to use project groups, // then create this project as a posixgroup if (!OpenStackNovaProject::useProjectGroup()) { $project['gidnumber'] = OpenStackNovaUser::getNextIdNumber($wgAuth, 'gidnumber'); $project['objectclass'][] = 'posixgroup'; } $success = LdapAuthenticationPlugin::ldap_add($wgAuth->ldapconn, $projectdn, $project); $project = new OpenStackNovaProject($projectname); if ($success) { foreach (self::$rolenames as $rolename) { OpenStackNovaRole::createRole($rolename, $project); # TODO: If role addition fails, find a way to fail gracefully # Though, if the project was added successfully, it is unlikely # that role addition will fail. } $sudoerOU = array(); $sudoerOU['objectclass'][] = 'organizationalunit'; $sudoerOU['ou'] = 'sudooers'; $sudoerOUdn = 'ou=sudoers,' . $projectdn; LdapAuthenticationPlugin::ldap_add($wgAuth->ldapconn, $sudoerOUdn, $sudoerOU); # TODO: If sudoerOU creation fails we need to be able to fail gracefully $wgAuth->printDebug("Successfully added project {$projectname}", NONSENSITIVE); // Now that we've created the Project, if we // are supposed to use a corresponding Project Group // to manage posix group permissions, do so now. if (OpenStackNovaProject::useProjectGroup()) { OpenStackNovaProjectGroup::createProjectGroup($projectname); # TODO: If project group creation fails we need to be able to fail gracefully } // Create two default, permissive sudo policies. First, // allow sudo (as root) for all members... $projectGroup = "%" . $project->getProjectGroup()->getProjectGroupName(); if (OpenStackNovaSudoer::createSudoer('default-sudo', $projectname, array($projectGroup), array(), array('ALL'), array('!authenticate'))) { $wgAuth->printDebug("Successfully created default sudo policy for {$projectname}", NONSENSITIVE); } // Now, allow all project members to sudo to all other users. $projectGroup = "%" . $project->getProjectGroup()->getProjectGroupName(); if (OpenStackNovaSudoer::createSudoer('default-sudo-as', $projectname, array($projectGroup), array("{$projectGroup}"), array('ALL'), array('!authenticate'))) { $wgAuth->printDebug("Successfully created default sudo-as policy for {$projectname}", NONSENSITIVE); } } else { $wgAuth->printDebug("Failed to add project {$projectname}", NONSENSITIVE); return false; } OpenStackNovaProject::createServiceGroupOUs($projectname); return true; }