@@ -326,19 +326,28 @@ enroll_recovery_keys() {
326326 local machine_id=" $( cat /etc/machine-id) "
327327 local found_any=0
328328
329+ local marker_dir=" /var/lib/mangos/luks-recovery-keys-enrolled"
330+ mkdir -p " ${marker_dir} "
331+
329332 # Find all LUKS-encrypted partitions
330- local devices=($( lsblk -ln -o NAME,TYPE,FSTYPE | awk ' $2=="part" && $3=="crypto_LUKS" {print "/dev/"$1}' ) )
333+ local devices=" $( lsblk -ln -o NAME,TYPE,FSTYPE | awk ' $2=="part" && $3=="crypto_LUKS" {print "/dev/"$1}' | tr ' \n' ' ' ) "
334+
335+ echo " > LUKS-encrypted devices found: $devices "
331336
332- for device in " ${devices[@]} " ; do
333- local partlabel=$( lsblk -n -o PARTLABEL " $device " 2> /dev/null | tr -d ' \n\r\t' )
337+ for device in ${devices} ; do
338+ echo " > Processing device: ${device} "
339+ local partlabel=" $( lsblk -n -o PARTLABEL " ${device} " 2> /dev/null | tr -d ' \n\r\t' ) "
334340
335341 # Skip if no valid partition label
336- if [ -z " $partlabel " ]; then
342+ if [ -z " ${partlabel} " ]; then
343+ echo " > Device ${device} has no PARTLABEL, skipping"
337344 continue
338345 fi
339346
340- # Skip if recovery key already exists in Vault
341- if VAULT_TOKEN=" ${vault_token} " vault kv get " secrets/mangos/recovery-keys/${machine_id} /${partlabel} " > /dev/null 2>&1 ; then
347+ # Skip if already enrolled
348+ local marker_file=" ${marker_dir} /${partlabel} "
349+ if [ -f " ${marker_file} " ]; then
350+ echo " > Recovery key for ${partlabel} already enrolled, skipping"
342351 continue
343352 fi
344353
@@ -352,30 +361,54 @@ enroll_recovery_keys() {
352361 # Extract recovery key - format: 6 lowercase alphanumeric groups of 8, separated by dashes
353362 # Example: etklvner-lblhnbgl-kdtnujtk-ikjlgbur-lnlrjrrc-iuikkidg-feientnn-dkjeeuft
354363 LUKS_RECOVERY_KEY_REGEX=' [a-z0-9]{8}(-[a-z0-9]{8}){7}'
355- local recovery_key=$( echo " $output " | grep -oE " ${LUKS_RECOVERY_KEY_REGEX} " | head -n 1)
364+ local recovery_key=" $( echo " $output " | grep -oE " ${LUKS_RECOVERY_KEY_REGEX} " | head -n 1) "
356365
357- if [ -n " $recovery_key " ] && [[ " $recovery_key " =~ ^ ${LUKS_RECOVERY_KEY_REGEX} $ ] ]; then
358- VAULT_TOKEN=" ${vault_token} " vault kv put " secrets/mangos/recovery-keys/${machine_id} /${partlabel} " \
366+ if [ -n " ${ recovery_key} " ]; then
367+ if VAULT_TOKEN=" ${vault_token} " vault kv put " secrets/mangos/recovery-keys/${machine_id} /${partlabel} " \
359368 key=" ${recovery_key} " hostname=" ${HOSTNAME} " device=" ${device} " created=" $( date -u +%Y-%m-%dT%H:%M:%SZ) "
360- if [ $? -eq 0 ] ; then
369+ then
361370 greenln Success
371+ touch " ${marker_file} "
362372 else
363373 red " Failed to store in Vault"
364- echo
365374 fi
366375 else
367- red " Failed to enroll or extract recovery key"
368- echo
376+ red " Failed to extract recovery key. cryptenroll output: "
377+ echo " ${output} "
369378 fi
370379 done
371380
372- if [ $found_any -eq 0 ]; then
373- echo " > All recovery keys already enrolled"
381+ if [ ${ found_any} -eq 0 ]; then
382+ echo " > All recovery keys already enrolled"
374383 else
375- echo " > Recovery keys enrolled and stored in Vault"
384+ echo " > Recovery keys enrolled and stored in Vault"
376385 fi
377386}
378387
388+ write_machine_id_metadata () {
389+ step " Getting mount accessor for node-cert"
390+ node_auth_accessor=" $( vault read -field=accessor sys/auth/node-cert) "
391+
392+ step " Looking up entity name for this node"
393+ entity_name=" $( vault write -field=name identity/lookup/entity alias_name=${HOSTNAME} .mangos alias_mount_accessor=${node_auth_accessor} ) "
394+
395+ step " Setting machine-id as entity metadata"
396+ machine_id=" $( cat /etc/machine-id) "
397+
398+ # Read current metadata, merge with new machine_id, and write back
399+ current_metadata=" $( vault read -format=json identity/entity/name/${entity_name} | jq -r ' .data.metadata // {}' ) "
400+ new_metadata=" $( echo " ${current_metadata} " | jq --arg mid " ${machine_id} " ' . + {machine_id: $mid}' ) "
401+
402+ # Convert JSON to key=value arguments for Vault CLI
403+ metadata_args=()
404+ while IFS=' =' read -r k v; do
405+ metadata_args+=(" metadata=${k} =${v} " )
406+ done < <( echo " ${new_metadata} " | jq -r ' to_entries|map("\(.key)=\(.value|tostring)")|.[]' )
407+
408+ vault write identity/entity/name/" ${entity_name} " " ${metadata_args[@]} "
409+ greenln Success
410+ }
411+
379412do_enroll () {
380413 declare -A groups
381414
@@ -481,18 +514,7 @@ do_enroll() {
481514 NODE_VAULT_TOKEN=$( vault login -method=cert -path=node-cert -client-cert=/var/lib/mangos/mangos.crt -client-key=<( systemd-creds decrypt ${confext_dir} /etc/credstore.encrypted/mangos.key) -token-only)
482515 greenln Success
483516
484- step " Getting mount accessor for node-cert"
485- node_auth_accessor=$( vault read -field=accessor sys/auth/node-cert)
486- echo $node_auth_accessor
487-
488- step " Looking up entity name for this node"
489- entity_name=$( vault write -field=name identity/lookup/entity alias_name=${HOSTNAME} .mangos alias_mount_accessor=${node_auth_accessor} )
490- echo $entity_name
491-
492- step " Setting machine-id as entity metadata"
493- machine_id=$( cat /etc/machine-id)
494- vault write identity/entity/name/${entity_name} metadata=machine_id=" ${machine_id} "
495- greenln Success
517+ do_step " Writing machine ID metadata to Vault" write_machine_id_metadata
496518
497519 for group in ${! groups[@]}
498520 do
0 commit comments