|
|
- #!/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
|