Playbooks to a new Lilik
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

44 lines
1.3 KiB

#!/bin/bash
## Detect the first available continuous allocation of subuids/subgids
## of a given size.
##
## Returns output in idmap format:
## <starting_sub[ug]id> <allocation_length>
## Author: Lorenzo Zolfanelli <zolfa@lilik.it>
required_length=65536
function find_interval {
if [ ! -f "$1" ]; then
echo "100000 ${required_length}"
return 0
fi
min_id_list=(100000 $(sed -n -e 's/^[^:]\+:\([0-9]\+\):\([0-9]\+\)/\1/p' $1))
inc_id_list=(0 $(sed -n -e 's/^[^:]\+:\([0-9]\+\):\([0-9]\+\)/\2/p' $1))
rows=$(( ${#min_id_list[*]} - 1 ))
if [ $rows -lt 1 ]; then
echo "100000 ${required_length}"
return 0
fi
for i in $(seq 0 $rows); do
c_start=$(( ${min_id_list[i]} + ${inc_id_list[i]} ))
c_end=$(( ${c_start} + ${required_length} - 1 ))
overlap=0
for j in $(seq 0 $rows); do
j_start=${min_id_list[j]}
j_end=$(( ${min_id_list[j]} + ${inc_id_list[j]} - 1 ))
if ([ "${c_start}" -ge "${j_start}" ] && [ "${c_start}" -le "${j_end}" ]) || ([ "${c_end}" -ge "${j_start}" ] && [ "${c_end}" -le "${j_end}" ]); then
overlap=1
break
fi
done
if [ "${overlap}" -eq "0" ]; then
echo "${c_start} ${required_length}"
return 0
fi
done
}
find_interval /etc/subuid
find_interval /etc/subgid