Skip to content

Commit 6f10cbe

Browse files
leefine02leefine02
authored andcommitted
Merge branch 'ab92696' of https://github.com/Keyfactor/citrix-adc-orchestrator into ab92696
2 parents 7d705c2 + d3c3572 commit 6f10cbe

4 files changed

Lines changed: 347 additions & 0 deletions

File tree

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
#!/usr/bin/env bash
2+
3+
# Creates all 1 store types via the Keyfactor Command REST API using curl.
4+
#
5+
# Authentication (first matching method is used):
6+
# OAuth access token: KEYFACTOR_AUTH_ACCESS_TOKEN
7+
# OAuth client creds: KEYFACTOR_AUTH_CLIENT_ID + KEYFACTOR_AUTH_CLIENT_SECRET
8+
# + KEYFACTOR_AUTH_TOKEN_URL
9+
# Basic auth (AD): KEYFACTOR_USERNAME + KEYFACTOR_PASSWORD + KEYFACTOR_DOMAIN
10+
#
11+
# Always required:
12+
# KEYFACTOR_HOSTNAME Command hostname (e.g. my-command.example.com)
13+
#
14+
# Auto-generated by doctool generate-store-type-scripts — do not edit by hand.
15+
16+
if [ -z "${KEYFACTOR_HOSTNAME}" ]; then
17+
echo "ERROR: KEYFACTOR_HOSTNAME is required"
18+
exit 1
19+
fi
20+
21+
BASE_URL="https://${KEYFACTOR_HOSTNAME}/keyfactorapi"
22+
23+
# ---------------------------------------------------------------------------
24+
# Resolve auth
25+
# ---------------------------------------------------------------------------
26+
if [ -n "${KEYFACTOR_AUTH_ACCESS_TOKEN}" ]; then
27+
BEARER_TOKEN="${KEYFACTOR_AUTH_ACCESS_TOKEN}"
28+
elif [ -n "${KEYFACTOR_AUTH_CLIENT_ID}" ] && [ -n "${KEYFACTOR_AUTH_CLIENT_SECRET}" ] && [ -n "${KEYFACTOR_AUTH_TOKEN_URL}" ]; then
29+
echo "Fetching OAuth token..."
30+
BEARER_TOKEN=$(curl -s -X POST "${KEYFACTOR_AUTH_TOKEN_URL}" \
31+
-H "Content-Type: application/x-www-form-urlencoded" \
32+
--data-urlencode "grant_type=client_credentials" \
33+
--data-urlencode "client_id=${KEYFACTOR_AUTH_CLIENT_ID}" \
34+
--data-urlencode "client_secret=${KEYFACTOR_AUTH_CLIENT_SECRET}" | jq -r '.access_token')
35+
if [ -z "${BEARER_TOKEN}" ] || [ "${BEARER_TOKEN}" = "null" ]; then
36+
echo "ERROR: Failed to fetch OAuth token from ${KEYFACTOR_AUTH_TOKEN_URL}"
37+
exit 1
38+
fi
39+
elif [ -n "${KEYFACTOR_USERNAME}" ] && [ -n "${KEYFACTOR_PASSWORD}" ] && [ -n "${KEYFACTOR_DOMAIN}" ]; then
40+
BEARER_TOKEN=""
41+
else
42+
echo "ERROR: Authentication required. Set one of:"
43+
echo " KEYFACTOR_AUTH_ACCESS_TOKEN"
44+
echo " KEYFACTOR_AUTH_CLIENT_ID + KEYFACTOR_AUTH_CLIENT_SECRET + KEYFACTOR_AUTH_TOKEN_URL"
45+
echo " KEYFACTOR_USERNAME + KEYFACTOR_PASSWORD + KEYFACTOR_DOMAIN"
46+
exit 1
47+
fi
48+
49+
if [ -n "${BEARER_TOKEN}" ]; then
50+
CURL_AUTH=("-H" "Authorization: Bearer ${BEARER_TOKEN}")
51+
else
52+
CURL_AUTH=("-u" "${KEYFACTOR_USERNAME}@${KEYFACTOR_DOMAIN}:${KEYFACTOR_PASSWORD}")
53+
fi
54+
55+
create_store_type() {
56+
local name="$1"
57+
local body="$2"
58+
echo "Creating ${name} store type..."
59+
response=$(curl -s -o /dev/null -w "%{http_code}" \
60+
-X POST "${BASE_URL}/certificatestoretypes" \
61+
-H "Content-Type: application/json" \
62+
-H "x-keyfactor-requested-with: APIClient" \
63+
"${CURL_AUTH[@]}" \
64+
-d "${body}")
65+
if [ "$response" = "200" ] || [ "$response" = "201" ]; then
66+
echo " OK (HTTP ${response})"
67+
else
68+
echo " FAILED (HTTP ${response})"
69+
fi
70+
}
71+
72+
# ---------------------------------------------------------------------------
73+
# CitrixAdc — The DNS or IP Address of the Citrix ADC Appliance.
74+
# ---------------------------------------------------------------------------
75+
create_store_type "CitrixAdc" '{
76+
"Name": "CitrixAdc",
77+
"ShortName": "CitrixAdc",
78+
"Capability": "CitrixAdc",
79+
"ServerRequired": true,
80+
"BlueprintAllowed": false,
81+
"CustomAliasAllowed": "Required",
82+
"PowerShell": false,
83+
"PrivateKeyAllowed": "Required",
84+
"SupportedOperations": {
85+
"Add": true,
86+
"Create": false,
87+
"Discovery": false,
88+
"Enrollment": false,
89+
"Remove": true
90+
},
91+
"PasswordOptions": {
92+
"Style": "Default",
93+
"EntrySupported": false,
94+
"StoreRequired": true,
95+
"StorePassword": {
96+
"Description": "Enter a password that matches your Citrix validation rules to encrypt private keys when adding/replacing certificates. Select 'No Value' if you desire an unencrypted private key to be uploaded.",
97+
"IsPAMEligible": true
98+
}
99+
},
100+
"Properties": [
101+
{
102+
"Name": "linkToIssuer",
103+
"DisplayName": "Link To Issuer",
104+
"Type": "Bool",
105+
"DependsOn": "",
106+
"DefaultValue": "false",
107+
"Required": false
108+
},
109+
{
110+
"Name": "timeout",
111+
"DisplayName": "Login Timeout in seconds",
112+
"Type": "String",
113+
"DependsOn": "",
114+
"DefaultValue": "3600",
115+
"Required": false
116+
}
117+
],
118+
"EntryParameters": [
119+
{
120+
"Name": "virtualServerName",
121+
"DisplayName": "Virtual Server Name",
122+
"Type": "String",
123+
"Description": "When adding a certificate, this can be a single VServer name or a comma separated list of VServers to bind to Note: must match the number of Virtual SNI Cert values.",
124+
"RequiredWhen": {
125+
"HasPrivateKey": false,
126+
"OnAdd": false,
127+
"OnRemove": false,
128+
"OnReenrollment": false
129+
}
130+
},
131+
{
132+
"Name": "sniCert",
133+
"DisplayName": "SNI Cert",
134+
"Type": "String",
135+
"Description": "When adding a certificate, this can be a single boolean value (true/false) or a comma separated list of boolean values to determine whether the binding should use server name indication. Note: must match the number of Virtual Server Name values.",
136+
"RequiredWhen": {
137+
"HasPrivateKey": false,
138+
"OnAdd": false,
139+
"OnRemove": false,
140+
"OnReenrollment": false
141+
}
142+
}
143+
],
144+
"StorePathDescription": "The path where certificate files are located on the Citrix ADC appliance. This value will likely be /nsconfig/ssl/"
145+
}'
146+
147+
148+
echo "Completed."
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/usr/bin/env bash
2+
3+
# Creates all 1 store types using kfutil.
4+
# kfutil reads definitions from the Keyfactor integration catalog.
5+
#
6+
# Auth environment variables (first matching method is used):
7+
# OAuth access token: KEYFACTOR_AUTH_ACCESS_TOKEN
8+
# OAuth client creds: KEYFACTOR_AUTH_CLIENT_ID + KEYFACTOR_AUTH_CLIENT_SECRET
9+
# + KEYFACTOR_AUTH_TOKEN_URL
10+
# Basic auth (AD): KEYFACTOR_HOSTNAME + KEYFACTOR_USERNAME + KEYFACTOR_PASSWORD
11+
# + KEYFACTOR_DOMAIN
12+
#
13+
# Auto-generated by doctool generate-store-type-scripts — do not edit by hand.
14+
15+
if ! command -v kfutil &> /dev/null; then
16+
echo "kfutil could not be found. Please install kfutil"
17+
echo "See https://github.com/Keyfactor/kfutil#quickstart"
18+
exit 1
19+
fi
20+
21+
if [ -z "$KEYFACTOR_HOSTNAME" ]; then
22+
echo "KEYFACTOR_HOSTNAME not set — launching kfutil login"
23+
kfutil login
24+
fi
25+
26+
kfutil store-types create --name "CitrixAdc"
27+
28+
echo "Done. All store types created."
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Creates all 1 store types using kfutil.
2+
# kfutil reads definitions from the Keyfactor integration catalog.
3+
#
4+
# Auth environment variables (first matching method is used):
5+
# OAuth access token: KEYFACTOR_AUTH_ACCESS_TOKEN
6+
# OAuth client creds: KEYFACTOR_AUTH_CLIENT_ID + KEYFACTOR_AUTH_CLIENT_SECRET
7+
# + KEYFACTOR_AUTH_TOKEN_URL
8+
# Basic auth (AD): KEYFACTOR_HOSTNAME + KEYFACTOR_USERNAME + KEYFACTOR_PASSWORD
9+
# + KEYFACTOR_DOMAIN
10+
#
11+
# Auto-generated by doctool generate-store-type-scripts — do not edit by hand.
12+
13+
# Uncomment if kfutil is not in your PATH
14+
# Set-Alias -Name kfutil -Value 'C:\Program Files\Keyfactor\kfutil\kfutil.exe'
15+
16+
if ($null -eq (Get-Command "kfutil" -ErrorAction SilentlyContinue)) {
17+
Write-Host "kfutil could not be found. Please install kfutil"
18+
Write-Host "See https://github.com/Keyfactor/kfutil#quickstart"
19+
exit 1
20+
}
21+
22+
if (-not $env:KEYFACTOR_HOSTNAME) {
23+
Write-Host "KEYFACTOR_HOSTNAME not set — launching kfutil login"
24+
& kfutil login
25+
}
26+
27+
& kfutil store-types create --name "CitrixAdc"
28+
29+
Write-Host "Done. All store types created."
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
# Creates all 1 store types via the Keyfactor Command REST API
2+
# using PowerShell Invoke-RestMethod.
3+
#
4+
# Authentication (first matching method is used):
5+
# OAuth access token: KEYFACTOR_AUTH_ACCESS_TOKEN
6+
# OAuth client creds: KEYFACTOR_AUTH_CLIENT_ID + KEYFACTOR_AUTH_CLIENT_SECRET
7+
# + KEYFACTOR_AUTH_TOKEN_URL
8+
# Basic auth (AD): KEYFACTOR_USERNAME + KEYFACTOR_PASSWORD + KEYFACTOR_DOMAIN
9+
#
10+
# Always required:
11+
# KEYFACTOR_HOSTNAME Command hostname (e.g. my-command.example.com)
12+
#
13+
# Auto-generated by doctool generate-store-type-scripts — do not edit by hand.
14+
15+
if (-not $env:KEYFACTOR_HOSTNAME) {
16+
Write-Error "KEYFACTOR_HOSTNAME is required"
17+
exit 1
18+
}
19+
20+
$uri = "https://$($env:KEYFACTOR_HOSTNAME)/keyfactorapi/certificatestoretypes"
21+
$headers = @{
22+
'Content-Type' = "application/json"
23+
'x-keyfactor-requested-with' = "APIClient"
24+
}
25+
26+
# ---------------------------------------------------------------------------
27+
# Resolve auth
28+
# ---------------------------------------------------------------------------
29+
if ($env:KEYFACTOR_AUTH_ACCESS_TOKEN) {
30+
$headers['Authorization'] = "Bearer $($env:KEYFACTOR_AUTH_ACCESS_TOKEN)"
31+
} elseif ($env:KEYFACTOR_AUTH_CLIENT_ID -and $env:KEYFACTOR_AUTH_CLIENT_SECRET -and $env:KEYFACTOR_AUTH_TOKEN_URL) {
32+
Write-Host "Fetching OAuth token..."
33+
$tokenBody = @{
34+
grant_type = 'client_credentials'
35+
client_id = $env:KEYFACTOR_AUTH_CLIENT_ID
36+
client_secret = $env:KEYFACTOR_AUTH_CLIENT_SECRET
37+
}
38+
$tokenResp = Invoke-RestMethod -Method Post -Uri $env:KEYFACTOR_AUTH_TOKEN_URL -Body $tokenBody
39+
$headers['Authorization'] = "Bearer $($tokenResp.access_token)"
40+
} elseif ($env:KEYFACTOR_USERNAME -and $env:KEYFACTOR_PASSWORD -and $env:KEYFACTOR_DOMAIN) {
41+
$cred = [System.Convert]::ToBase64String(
42+
[System.Text.Encoding]::ASCII.GetBytes(
43+
"$($env:KEYFACTOR_USERNAME)@$($env:KEYFACTOR_DOMAIN):$($env:KEYFACTOR_PASSWORD)"))
44+
$headers['Authorization'] = "Basic $cred"
45+
} else {
46+
Write-Error ("Authentication required. Set one of:`n" +
47+
" KEYFACTOR_AUTH_ACCESS_TOKEN`n" +
48+
" KEYFACTOR_AUTH_CLIENT_ID + KEYFACTOR_AUTH_CLIENT_SECRET + KEYFACTOR_AUTH_TOKEN_URL`n" +
49+
" KEYFACTOR_USERNAME + KEYFACTOR_PASSWORD + KEYFACTOR_DOMAIN")
50+
exit 1
51+
}
52+
53+
function New-StoreType {
54+
param([string]$Name, [string]$Body)
55+
Write-Host "Creating $Name store type..."
56+
try {
57+
Invoke-RestMethod -Method Post -Uri $uri -Headers $headers -Body $Body -ContentType "application/json" | Out-Null
58+
Write-Host " OK"
59+
} catch {
60+
Write-Warning " FAILED: $($_.Exception.Message)"
61+
}
62+
}
63+
64+
# ---------------------------------------------------------------------------
65+
# CitrixAdc — The DNS or IP Address of the Citrix ADC Appliance.
66+
# ---------------------------------------------------------------------------
67+
New-StoreType "CitrixAdc" @'
68+
{
69+
"Name": "CitrixAdc",
70+
"ShortName": "CitrixAdc",
71+
"Capability": "CitrixAdc",
72+
"ServerRequired": true,
73+
"BlueprintAllowed": false,
74+
"CustomAliasAllowed": "Required",
75+
"PowerShell": false,
76+
"PrivateKeyAllowed": "Required",
77+
"SupportedOperations": {
78+
"Add": true,
79+
"Create": false,
80+
"Discovery": false,
81+
"Enrollment": false,
82+
"Remove": true
83+
},
84+
"PasswordOptions": {
85+
"Style": "Default",
86+
"EntrySupported": false,
87+
"StoreRequired": true,
88+
"StorePassword": {
89+
"Description": "Enter a password that matches your Citrix validation rules to encrypt private keys when adding/replacing certificates. Select 'No Value' if you desire an unencrypted private key to be uploaded.",
90+
"IsPAMEligible": true
91+
}
92+
},
93+
"Properties": [
94+
{
95+
"Name": "linkToIssuer",
96+
"DisplayName": "Link To Issuer",
97+
"Type": "Bool",
98+
"DependsOn": "",
99+
"DefaultValue": "false",
100+
"Required": false
101+
},
102+
{
103+
"Name": "timeout",
104+
"DisplayName": "Login Timeout in seconds",
105+
"Type": "String",
106+
"DependsOn": "",
107+
"DefaultValue": "3600",
108+
"Required": false
109+
}
110+
],
111+
"EntryParameters": [
112+
{
113+
"Name": "virtualServerName",
114+
"DisplayName": "Virtual Server Name",
115+
"Type": "String",
116+
"Description": "When adding a certificate, this can be a single VServer name or a comma separated list of VServers to bind to Note: must match the number of Virtual SNI Cert values.",
117+
"RequiredWhen": {
118+
"HasPrivateKey": false,
119+
"OnAdd": false,
120+
"OnRemove": false,
121+
"OnReenrollment": false
122+
}
123+
},
124+
{
125+
"Name": "sniCert",
126+
"DisplayName": "SNI Cert",
127+
"Type": "String",
128+
"Description": "When adding a certificate, this can be a single boolean value (true/false) or a comma separated list of boolean values to determine whether the binding should use server name indication. Note: must match the number of Virtual Server Name values.",
129+
"RequiredWhen": {
130+
"HasPrivateKey": false,
131+
"OnAdd": false,
132+
"OnRemove": false,
133+
"OnReenrollment": false
134+
}
135+
}
136+
],
137+
"StorePathDescription": "The path where certificate files are located on the Citrix ADC appliance. This value will likely be /nsconfig/ssl/"
138+
}
139+
'@
140+
141+
142+
Write-Host "Completed."

0 commit comments

Comments
 (0)