Hashicorp.Vault.Manager.psm1

function Get-VaultServer {
  param(
    [Parameter(Mandatory = $true)]
    [string] 
      $address,
    
    [Parameter(Mandatory = $true)]  
    [string]
      $token,
      
    [ValidateSet(
      "http",
      "https"
    )]
    [string]
      $protocol = 'https'
  )
  
  $prop = @{
    url = "{0}://{1}/v1/" -f $protocol, $address
    head = @{'X-Vault-Token' = $token}
  }
  
  $vault = new-object PSObject -property $prop
  
  $Global:defaultVault = $vault
  return $vault
}

function Get-VaultSecret {
  param(
    [parameter(ValueFromPipeline=$true)]
    [string]
      $path,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + $path
    Invoke-RestMethod -Uri $uri -Headers $vault.head |
      select -expandproperty data
  }
  end {}
}

function Get-VaultSecretList {
  param(
    [parameter(ValueFromPipeline=$true)]
    [string]
      $path,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + $path
    Invoke-RestMethod -Uri $uri -Headers $vault.head -CustomMethod 'list' |
      select -ExpandProperty data |
      select -ExpandProperty keys | %{
        if ($_ -like '*/') {
          Get-VaultSecretList -path ("$path/$_").trim("/") -vault $vault
        } else {
          "$path/$_"
        }
      }

  }
  end {}
}

function Set-VaultSecret {
  param(
    [parameter(ValueFromPipeline=$true)]
    [string]
      $path,
      
    [hashtable]
      $secret = @{password = 'this is a secret'},
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + $path
    $data = @{data = $secret} | ConvertTo-Json
    Invoke-RestMethod -Uri $uri -Headers $vault.head -Method Post -Body $data |
      select -expandproperty data
  }
  end {}
}

function Remove-VaultSecret {
  param(
    [parameter(ValueFromPipeline=$true)]
    [string]
      $path,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + $path
    Invoke-RestMethod -Uri $uri -Headers $vault.head -Method Delete
  }
  end {}
}

function Get-VaultGroup {
  param(
    [parameter(ValueFromPipeline=$true)]
    [string]
      $name,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + "identity/group/name/$name"
    Invoke-RestMethod -Uri $uri -Headers $vault.head  |
      select -expandproperty data
  }
  end {}
}

function Set-VaultGroup {
  param(
    [parameter(ValueFromPipeline=$true)]
    [hashtable]
      $group,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + "identity/group"
    $data = $group | ConvertTo-Json
    Invoke-RestMethod -Uri $uri -Headers $vault.head -Body $data -Method Post
  }
  end {}
}

function Remove-VaultGroup {
  param(
    [parameter(ValueFromPipeline=$true)]
    [string]
      $name,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + "identity/group/name/$name"
    Invoke-RestMethod -Uri $uri -Headers $vault.head -Method Delete
  }
  end {}
}

function Get-VaultGroupAliasID {
  param(  
    $vault = $defaultVault
  )
    
  $uri = $vault.url + "identity/group-alias/id?list=true"
  Invoke-RestMethod -Uri $uri -Headers $vault.head | Select -expandproperty data |
    select -expandproperty keys
}

function Get-VaultGroupAlias {
  param(
    [parameter(ValueFromPipeline=$true)]
    [string]
      $id,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + "identity/group-alias/id/$id"
    Invoke-RestMethod -Uri $uri -Headers $vault.head | Select -expandproperty data
  }
  end {}
}

function Set-VaultGroupAlias {
  param(
    [parameter(ValueFromPipeline=$true)]
    [hashtable]
      $alias,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + "identity/group-alias"
    $data = $alias | ConvertTo-Json
    Invoke-RestMethod -Uri $uri -Headers $vault.head -Body $data -Method Post
  }
  end {}
}

function Remove-VaultGroupAlias {
  param(
    [parameter(ValueFromPipeline=$true)]
    [string]
      $id,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + "identity/group-alias/id/$id"
    Invoke-RestMethod -Uri $uri -Headers $vault.head -Method Delete
  }
  end {}
}

function Get-VaultPolicyName {
  param( 
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + "sys/policy"
    Invoke-RestMethod -Uri $uri -Headers $vault.head | Select -expandproperty data |
      select -expandproperty policies
  }
  end {}
}

function Get-VaultPolicy {
  param(
    [parameter(ValueFromPipeline=$true)]
    [string]
      $name,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + "sys/policy/$name"
    Invoke-RestMethod -Uri $uri -Headers $vault.head | Select -expandproperty data
  }
  end {}
}

function Set-VaultPolicy {
  param(
    [parameter(ValueFromPipeline=$true)]
    [hashtable]
      $policy,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + "sys/policy/$($policy.name)"
    $data = $policy | ConvertTo-Json
    Invoke-RestMethod -Uri $uri -Headers $vault.head -Body $data -Method Post
  }
  end {}
}

function Remove-VaultPolicy {
  param(
    [parameter(ValueFromPipeline=$true)]
    [string]
      $name,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + "sys/policy/$name"
    Invoke-RestMethod -Uri $uri -Headers $vault.head -Method Delete
  }
  end {}
}

function Get-VaultGroupID {
  param(  
    $vault = $defaultVault
  )
    
  $uri = $vault.url + "identity/group/id?list=true"
  Invoke-RestMethod -Uri $uri -Headers $vault.head | Select -expandproperty data |
    select -expandproperty key_info | 
    get-member -MemberType NoteProperty | select -ExpandProperty name
}

function Get-VaultGroupByID {
  param(
    [parameter(ValueFromPipeline=$true)]
    [string]
      $id,
      
    $vault = $defaultVault
  )
  begin {}
  process {
    $uri = $vault.url + "identity/group/id/$id"
    Invoke-RestMethod -Uri $uri -Headers $vault.head  |
      select -expandproperty data
  }
  end {}
}

function Get-VaultUserList {
  param(
    $vault = $defaultVault
  )
  $uri = $vault.url + 'auth/userpass/users'
  Invoke-RestMethod -Uri $uri -Headers $vault.head -CustomMethod 'list' |
    select -ExpandProperty data |
    select -ExpandProperty keys
}