forked from ungleich-public/cdist
		
	Cleanup ssh authorized keys types
Optimize file creations, deletions and writes. Resolve #829.
This commit is contained in:
		
					parent
					
						
							
								17a9a86588
							
						
					
				
			
			
				commit
				
					
						e1c5263c37
					
				
			
		
					 1 changed files with 45 additions and 23 deletions
				
			
		| 
						 | 
				
			
			@ -24,9 +24,6 @@ state="$(cat "$__object/parameter/state" 2>/dev/null)"
 | 
			
		|||
file="$(cat "$__object/explorer/file")"
 | 
			
		||||
keys_file="$__object/explorer/keys"
 | 
			
		||||
 | 
			
		||||
temp_file="${file}.tmp"
 | 
			
		||||
work_file="${temp_file}.work"
 | 
			
		||||
 | 
			
		||||
_type_and_key() {
 | 
			
		||||
    echo "$1" | tr ' ' '\n' | awk '/^(ssh|ecdsa)-[^ ]+/ { printf $1" "; getline; printf $1 }'
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -50,8 +47,18 @@ _gen_key_entry() {
 | 
			
		|||
    printf '\n'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cat << DONE
 | 
			
		||||
cp -f "${file}" "${temp_file}"
 | 
			
		||||
new_keys=\$(mktemp ${file}.cdist.XXXXXXXXXX)
 | 
			
		||||
patterns=\$(mktemp ${file}.cdist.XXXXXXXXXX)
 | 
			
		||||
 | 
			
		||||
tmpfile=\$(mktemp ${file}.cdist.XXXXXXXXXX)
 | 
			
		||||
 | 
			
		||||
# preserve ownership and permissions of existing file
 | 
			
		||||
if [ -f "${file}" ]
 | 
			
		||||
then
 | 
			
		||||
   cp -p "${file}" "\${tmpfile}"
 | 
			
		||||
fi
 | 
			
		||||
DONE
 | 
			
		||||
 | 
			
		||||
while read -r key; do
 | 
			
		||||
| 
						 | 
				
			
			@ -67,7 +74,7 @@ while read -r key; do
 | 
			
		|||
 | 
			
		||||
    # remove conflicting entries
 | 
			
		||||
    cat << DONE
 | 
			
		||||
    grep -v "${type_and_key}\\([ \\n].*\\)*\$" "${temp_file}" > "${work_file}" || true
 | 
			
		||||
echo '${type_and_key}\\([ \\\\n].*\\)*\$' >> "\${patterns}"
 | 
			
		||||
DONE
 | 
			
		||||
 | 
			
		||||
    entry="$(_gen_key_entry "${key}")"
 | 
			
		||||
| 
						 | 
				
			
			@ -77,15 +84,13 @@ DONE
 | 
			
		|||
            # escape single quotes
 | 
			
		||||
            _line_sanitised=$(echo "${entry}" | sed -e "s/'/'\"'\"'/g")
 | 
			
		||||
            cat << DONE
 | 
			
		||||
            printf "%s\\n" "${_line_sanitised}" >> "${work_file}"
 | 
			
		||||
            mv -f "${work_file}" "${temp_file}"
 | 
			
		||||
printf "%s\\n" "${_line_sanitised}" >> "\${new_keys}"
 | 
			
		||||
DONE
 | 
			
		||||
            echo "added to ${file} (${entry})" >> "$__messages_out"
 | 
			
		||||
        ;;
 | 
			
		||||
        absent)
 | 
			
		||||
            cat << DONE
 | 
			
		||||
            grep -v "${entry}" "${work_file}" > "${temp_file}" || true
 | 
			
		||||
            rm -f "${work_file}"
 | 
			
		||||
echo "${entry}" >> "\${patterns}"
 | 
			
		||||
DONE
 | 
			
		||||
            echo "removed from ${file} (${entry})" >> "$__messages_out"
 | 
			
		||||
        ;;
 | 
			
		||||
| 
						 | 
				
			
			@ -94,8 +99,19 @@ done < "$__object/parameter/key"
 | 
			
		|||
 | 
			
		||||
set --
 | 
			
		||||
cat << DONE
 | 
			
		||||
set --
 | 
			
		||||
if [ -s "\${patterns}" ] && [ -f "${file}" ]
 | 
			
		||||
then
 | 
			
		||||
    grep -v -f "\${patterns}" "${file}" > "\${tmpfile}" || true
 | 
			
		||||
fi
 | 
			
		||||
if [ -s "\${new_keys}" ]
 | 
			
		||||
then
 | 
			
		||||
    cat "\${new_keys}" >> "\${tmpfile}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
rm -f "\${patterns}"
 | 
			
		||||
rm -f "\${new_keys}"
 | 
			
		||||
DONE
 | 
			
		||||
 | 
			
		||||
if [ -f "$__object/parameter/remove-unknown" ] && [ -s "${keys_file}" ]
 | 
			
		||||
then
 | 
			
		||||
    while read -r key
 | 
			
		||||
| 
						 | 
				
			
			@ -107,23 +123,29 @@ then
 | 
			
		|||
            continue
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        # build grep -e patterns
 | 
			
		||||
        set -- "\$@" "-e" "${key}"
 | 
			
		||||
        # build grep patterns
 | 
			
		||||
        cat << DONE
 | 
			
		||||
        set -- "\$@" "-e" "${key}"
 | 
			
		||||
echo "${key}" >> "\${patterns}"
 | 
			
		||||
DONE
 | 
			
		||||
    done < "${keys_file}"
 | 
			
		||||
 | 
			
		||||
    # if no pattern then nothing to remove
 | 
			
		||||
    if [ $# -gt 0 ]
 | 
			
		||||
    then
 | 
			
		||||
        cat << DONE
 | 
			
		||||
        grep -v -F -x "\$@" "${temp_file}" > "${work_file}" || true
 | 
			
		||||
        mv -f "${work_file}" "${temp_file}"
 | 
			
		||||
DONE
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
cat << DONE
 | 
			
		||||
mv -f "${temp_file}" "${file}"
 | 
			
		||||
if [ -s "\${patterns}" ] && [ -f "${file}" ]
 | 
			
		||||
then
 | 
			
		||||
    newfile=\$(mktemp ${file}.cdist.XXXXXXXXXX)
 | 
			
		||||
    # preserve ownership and permissions of existing file
 | 
			
		||||
    if [ -f "${file}" ]; then
 | 
			
		||||
       cp -p "${file}" "\${newfile}"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    grep -v -F -x -f "\${patterns}" "\${tmpfile}" > "\${newfile}" || true
 | 
			
		||||
    mv -f "\${newfile}" "${file}"
 | 
			
		||||
    rm -f "\${tmpfile}"
 | 
			
		||||
else
 | 
			
		||||
    mv -f "\${tmpfile}" "${file}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
rm -f "\${patterns}"
 | 
			
		||||
rm -f "\${new_keys}"
 | 
			
		||||
DONE
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue