Added script which rebuilds gitadmin configuration
It generates new gitosis.conf and public key files. Actual commit to repo would likely be done with a wrapper script which will run in cron.
This commit is contained in:
		
							
								
								
									
										129
									
								
								scripts/gitadmin/rebuild_gitadmin.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										129
									
								
								scripts/gitadmin/rebuild_gitadmin.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,129 @@ | ||||
| #!/usr/bin/env php | ||||
| <?php | ||||
|  | ||||
| $root = dirname(dirname(dirname(__FILE__))); | ||||
| require_once $root.'/scripts/__init_script__.php'; | ||||
|  | ||||
| function escape_name($name) { | ||||
|   return preg_replace('/[^A-Za-z0-9\-]/', '_', $name); | ||||
| } | ||||
|  | ||||
| function startswith($string, $prefix) { | ||||
|   return substr($string, 0, strlen($prefix)) == $prefix; | ||||
| } | ||||
|  | ||||
| function write_ini_file($array, $file) { | ||||
|   $res = array(); | ||||
|   foreach ($array as $key => $val) { | ||||
|     if (is_array($val)) { | ||||
|       $res[] = "[$key]"; | ||||
|       foreach ($val as $skey => $sval) { | ||||
|         $res[] = "$skey = $sval"; | ||||
|       } | ||||
|       $res[] = ''; | ||||
|     } else { | ||||
|       $res[] = "$key = $val"; | ||||
|     } | ||||
|   } | ||||
|   file_put_contents($file, implode("\n", $res)); | ||||
| } | ||||
|  | ||||
| if (count($argv) != 2) { | ||||
|   print("Usage: {$argv[0]} /path/to/gitosis-admin\n"); | ||||
|   exit(1); | ||||
| } | ||||
|  | ||||
| $gitosis_root = $argv[1]; | ||||
| $configuration_file = "$gitosis_root/gitosis.conf"; | ||||
| $keydir = "$gitosis_root/keydir"; | ||||
| if (!file_exists($configuration_file)) { | ||||
|   print("Not found: $configuration_file\n"); | ||||
|   exit(1); | ||||
| } | ||||
|  | ||||
| $projects_to_repo_map = | ||||
|   array('Addons' => 'blender-addons', | ||||
|         'Blender 2.x Release' => 'blender', | ||||
|         'Blender UI Translations' => 'blender-translations'); | ||||
|  | ||||
| $viewer = id(new PhabricatorUser()) | ||||
|   ->loadOneWhere('username = %s', 'sergey'); | ||||
|  | ||||
| $projects = id(new PhabricatorProjectQuery()) | ||||
|   ->setViewer($viewer) | ||||
|   ->needMembers(true) | ||||
|   ->execute(); | ||||
|  | ||||
| $old_configuration = parse_ini_file( | ||||
|   $configuration_file, true, INI_SCANNER_RAW); | ||||
| $new_configuration = array(); | ||||
|  | ||||
| // Remove groups from previous automated configuration built | ||||
| foreach ($old_configuration as $group => $values) { | ||||
|   if (!startswith($group, 'group PHAB')) { | ||||
|     $new_configuration[$group] = $values; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // Fill in new ocnfiguration and keys | ||||
| $used_keys = array(); | ||||
| foreach ($projects as $project_id => $project) { | ||||
|   if (!array_key_exists($project->getName(), | ||||
|     $projects_to_repo_map)) { | ||||
|     continue; | ||||
|   } | ||||
|  | ||||
|   $memberPHIDs = $project->getMemberPHIDs(); | ||||
|   $members = array(); | ||||
|   foreach ($memberPHIDs as $memberPHID) { | ||||
|     $user = id(new PhabricatorPeopleQuery()) | ||||
|       ->setViewer($viewer) | ||||
|       ->withPHIDs(array($memberPHID)) | ||||
|       ->executeOne(); | ||||
|  | ||||
|     $keys = id(new PhabricatorUserSSHKey())->loadAllWhere( | ||||
|       'userPHID = %s', | ||||
|        $user->getPHID()); | ||||
|  | ||||
|     foreach ($keys as $key) { | ||||
|       $escaped_key_name = escape_name($key->getName()); | ||||
|       $member = 'PHAB_'.$user->getUserName(). | ||||
|         '@'.$escaped_key_name. | ||||
|         '_'.$key->getID(); | ||||
|       $members[] = $member; | ||||
|       if (!array_key_exists($member, $used_keys)) { | ||||
|         $used_keys[$member] = true; | ||||
|         $full_key_content = | ||||
|           $key->getKeyType().' '. | ||||
|           $key->getKeyBody().' '. | ||||
|           $key->getKeyComment()."\n"; | ||||
|         file_put_contents("$keydir/$member", $full_key_content); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if (count($members)) { | ||||
|     $escaped_project_name = escape_name($project->getName()); | ||||
|     $repo = $projects_to_repo_map[$project->getName()]; | ||||
|     $group_name = "PHAB_${escaped_project_name}"; | ||||
|     $values = array(); | ||||
|     $values['members'] = join(' ', $members); | ||||
|     $values['readonly'] = '@all'; | ||||
|     $values['writable'] = $repo; | ||||
|     $new_configuration["group $group_name"] = $values; | ||||
|   } | ||||
| } | ||||
|  | ||||
| write_ini_file($new_configuration, $configuration_file); | ||||
|  | ||||
| // Remove unused keys | ||||
| $files = scandir($keydir); | ||||
| foreach ($files as $file) { | ||||
|   if (startswith($file, "PHAB")) { | ||||
|     if (!array_key_exists($file, $used_keys)) { | ||||
|       unlink("$keydir/$file"); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| ?> | ||||
		Reference in New Issue
	
	Block a user