#!/bin/bash
# ------------------------------------------------------------------
# AUTHOR: [LucidLink Support]
# NAME: ACLs_backup_restore.sh
# VERSION: 1.0.2
# DESCRIPTION: Backup and restore users, groups, group assignments, 
# permissions (and shares) depending on Filespace format into various
# individual command-line argument scripts. Will generate new users 
# random passwords within 'users_passwords.txt' output file.
#
# THE SCRIPT IS PROVIDED “AS IS” AND “AS AVAILABLE” AND IS WITHOUT
# WARRANTY OF ANY KIND. PLEASE REVIEW ALL TERMS AND CONDITIONS.
# https://www.lucidlink.com/legal-documents
# ------------------------------------------------------------------

IFS=";"
USAGE="Usage: ./ACLs_backup_restore.sh <fs1rootpwd>
Request failed with: Bad Request
Empty required parameter 'password' is not allowed!"

HEADER_TOP="#!/bin/bash
# ------------------------------------------------------------------
# AUTHOR: [LucidLink Support]"

HEADER_BOTTOM="# DESCRIPTION: Automatically generated restore script.
#
# THE SCRIPT IS PROVIDED “AS IS” AND “AS AVAILABLE” AND IS WITHOUT
# WARRANTY OF ANY KIND. PLEASE REVIEW ALL TERMS AND CONDITIONS.
# https://www.lucidlink.com/legal-documents
# ------------------------------------------------------------------"

# --- Ensure password ---
if [ $# == 0 ] ; then
echo "$USAGE"
exit 1;
fi

# --- Identify Filespace format --- 
PERMISSIONVER="2.2"
FSFORMAT="$(lucid2 status | grep "Filespace format:" | cut -f 2 -d \: | sed "s/ //g")"
if [ $(echo "$PERMISSIONVER > $FSFORMAT"|bc -l) -eq 1 ];
then COMMAND="share"; COLUMN="FSPATH;USERGROUP;TYPE;SHAREDAS;PERMISSIONS"; OPTION="--permissions";
else COMMAND="permission"; COLUMN="FSPATH;USERGROUP;TYPE;PERMISSIONS"; OPTION="--access"
fi

# --- Check if previous temporary files exist ---
FILES="lucid_users.txt;lucid_users_role.txt;lucid_user_permissions.txt;lucid_groups_users.txt;users_passwords.txt;lucid_*.sh"
for F in $FILES
do
if [ -f "$F" ]; then
echo -e "\e[31mError: $F exists. Please clean up any existing files.\e[0m"
exit
fi
done

# --- List users and generate a restore script with password file ---
lucid2 user --password ''$1'' | grep -v 'lucid\\root' | grep -v 'azure\\' | grep -v 'okta\\' | cut -d ' ' -f 1 | tail -n +3 | head -n -1 > lucid_users.txt
echo "$HEADER_TOP" > lucid_user_create.sh
echo "# NAME: lucid_user_create.sh" >> lucid_user_create.sh
echo "$HEADER_BOTTOM" >> lucid_user_create.sh
chmod +x lucid_user_create.sh
while read -r user; do
if [[ $user == *"sso\\"* ]]; then
usrcreate=("lucid2 user --create '$user' --password '$1'")
else
PASSWD=$(LC_ALL=C tr -dc 'A-Z' </dev/urandom|head -c 2)$(LC_ALL=C tr -dc 'a-z' </dev/urandom|head -c 2)$(LC_ALL=C tr -dc '1-9' </dev/urandom|head -c 4)
usrcreate=("lucid2 user --create '$user' --user-password $PASSWD --user-force-pwd-change --password '$1'")
fi
echo "$usrcreate" >> lucid_user_create.sh
done < lucid_users.txt
cat lucid_user_create.sh | tail -n +11 | grep -v 'sso\\' | sed 's/^.*create/User:/;s/\--user-password*/Password:/;s/\--user-force.*//g' | column -t >> users_passwords.txt

# --- List user Admin role assigments and generate a restore script ---
lucid2 user --password ''$1'' | awk '{print $1,$NF}' | sed 's/user//g;s/ Administrator/;admin/g' | grep -v 'lucid\\root' | grep ';admin' > lucid_users_role.txt
echo "$HEADER_TOP" > lucid_user_roles_assign.sh
echo "# NAME: lucid_user_roles_assign.sh" >> lucid_user_roles_assign.sh
echo "$HEADER_BOTTOM" >> lucid_user_roles_assign.sh
chmod +x lucid_user_roles_assign.sh
while read -r user role; do
usrcreate=("lucid2 user --set '$user' --add-role $role --password '$1'")
echo "$usrcreate" >> lucid_user_roles_assign.sh
done < lucid_users_role.txt

# --- List groups and generate a restore script ---
lucid2 group --password ''$1'' | cut -d ' ' -f 1 | tail -n +3 | head -n -1 > lucid_groups.txt
echo "$HEADER_TOP" > lucid_group_create.sh
echo "# NAME: lucid_user_create.sh" >> lucid_group_create.sh
echo "$HEADER_BOTTOM" >> lucid_group_create.sh
chmod +x lucid_group_create.sh
while read -r group; do
groupcreate=("lucid2 group --create '$group' --password '$1'")
echo "$groupcreate" >> lucid_group_create.sh
done < lucid_groups.txt

# --- List permission (and share) assignments and generate a restore script ---
lucid2 $COMMAND --configured --password ''$1'' | tail -n +3 | head -n -1 | sed -e 's/ \{2,\}/;/g;s/\[user\]/;user/g;s/\[group\]/;group/g;s/ ;/;/g;s/read, write/read,write/g' > lucid_permissions.txt
echo "$HEADER_TOP" > lucid_permissions_assign.sh
echo "# NAME: lucid_user_create.sh" >> lucid_permissions_assign.sh
echo "$HEADER_BOTTOM" >> lucid_permissions_assign.sh
chmod +x lucid_permissions_assign.sh
while read -r $COLUMN; do
shareassign=("lucid2 $COMMAND --set '$FSPATH' --$TYPE '$USERGROUP' $OPTION $PERMISSIONS --password '$1'")
echo "$shareassign" >> lucid_permissions_assign.sh
done < lucid_permissions.txt

# --- List users and their groups and generate a restore script ---
IFS=" "
lucid2 group --password ''$1'' | column -t | awk '{gsub(/,/,ORS $1 OFS)} 1' | tail -n +2 | awk '{print $1,$2}' | grep -v '^[^[:blank:]]*$' | awk 'NF==2' > lucid_groups_users.txt
echo "$HEADER_TOP" > lucid_user_group_assign.sh
echo "# NAME: lucid_user_create.sh" >> lucid_user_group_assign.sh
echo "$HEADER_BOTTOM" >> lucid_user_group_assign.sh
chmod +x lucid_user_group_assign.sh
while read -r group user; do
if [ -z "$user" ]; 
then :
else
groupassign=("lucid2 user --set '$user' --add-group '$group' --password '$1'")
fi
echo "$groupassign" >> lucid_user_group_assign.sh
done < lucid_groups_users.txt

exit