#!/bin/bash

# NEW ADMX!

admxw10="https://download.microsoft.com/download/2/E/3/2E3A1E42-8F50-4396-9E7E-76209EA4F429/Windows10-ADMX.msi"
admxw11="https://download.microsoft.com/download/8/d/d/8ddd685d-7d55-42e2-9555-6ab365050734/Administrative%20Templates%20(.admx)%20for%20Windows%2011%20September%202022%20Update.msi"

# ============================================================================ #

export NEEDRESTART_MODE=a
export DEBIAN_FRONTEND=noninteractive

export bktitle="Active Directory & Domain Controller"
export ttitle=" v7.0 - 05.06.2025"

export PathFolder0

function main_menu {
  if ! var4=$(dialog --title "$ttitle" --backtitle "$bktitle" --menu " " 0 0 0 \
  A 'Ferramentas de Usuarios' \
  B 'Ferramentas de Grupos' \
  C 'Ferramentas de Computadores' \
  D 'Gestao de Pastas Compartilhadas' \
  E 'Unidades Organizacionais' \
  F 'Silos de Autenticacao' \
  G 'Informacoes do Dominio' \
  H 'Configuracoes do Dominio' \
  I 'Configurar WebUI' \
  X 'Sair' 2>&1 > /dev/tty ); then
    exit
  fi

  case "$var4" in
  A) user_tools ; main_menu ;;
  B) group_tools ; main_menu ;;
  C) pc_tools ; main_menu ;;
  D) shared_folders ; main_menu ;;
  E) ou_tools ; main_menu ;;
  F) checksilos0 ; main_menu ;;
  G) info_domain ; main_menu ;;
  H) s_settings_menu ; main_menu ;;
  I) clear ; auth-toggle.sh ; main_menu ;;
  X) exit ;;
  esac
}

function user_tools {
  if ! var41=$(dialog --title "$ttitle" --backtitle "Ferramentas de Usuarios" --menu " " 0 0 0 \
  A 'Procurar usuario' \
  B 'Verificar um usuario' \
  C 'Criar usuario' \
  D 'Exibir todos os usuarios' \
  E 'Bloquear usuario' \
  F 'Desbloquear usuario' \
  G 'Adicionar usuario a um grupo' \
  H 'Exibir grupos de usuario' \
  I 'Remover usuario de um grupo' \
  J 'Copiar os grupos de um usuario' \
  K 'Promote usuario a admin' \
  L 'Demote usuario de admin' \
  M 'Alterar a senha de um usuario' \
  N 'Verificar a senha de um usuario' \
  O 'A senha do usuario deve expirar?' \
  P 'Quando a senha usuario vai expirar?' \
  Q 'Forcar a troca de senha imediata!' \
  R 'Mover usuario para OU' \
  S 'Cuidado: Excluir um usuario' \
  T 'CUIDADO: Remocao de Usuario do Banco' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi

  case "$var41" in
  A) search_user ; user_tools ;;
  B) check_user ; user_tools ;;
  C) create_user ; user_tools ;;
  D) show_users ; user_tools ;;
  E) blk_user ; user_tools ;;
  F) ublk_user ; user_tools ;;
  G) add_user_group ; user_tools ;;
  H) show_group_user ; user_tools ;;
  I) rm_user_group ; user_tools ;;
  J) copy_group ; user_tools ;;
  K) promote_user ; user_tools ;;
  L) demote_user ; user_tools ;;
  M) change_pass ; user_tools ;;
  N) test_pass ; user_tools ;;
  O) expiracy_usr_pass ; user_tools ;;
  P) expiracy_days ; user_tools ;;
  Q) expiracy_now ; user_tools ;;
  R) mv_user_ou ; user_tools ;;
  S) rm_user ; user_tools ;;
  T) rm_user_db ; user_tools ;;
  X) echo "." >/dev/null ;;
  esac
}

function group_tools {
  if ! var41=$(dialog --title "$ttitle" --backtitle "Ferramentas de Grupos" --menu " " 0 0 0 \
  A 'Procurar grupo' \
  B 'Verificar um Grupo' \
  C 'Criar grupo' \
  D 'Exibir todos os grupos' \
  E 'Exibir membros de um grupo' \
  F 'Copiar os membros de um grupo' \
  G 'Adicionar grupo 1 a um grupo 2' \
  H 'Remover grupo 1 de um grupo 2' \
  I 'Mover grupo para OU' \
  J 'Cuidado: Excluir um grupo' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi

  case "$var41" in
  A) search_group ; group_tools ;;
  B) check_group ; group_tools ;;
  C) create_group ; group_tools ;;
  D) show_groups ; group_tools ;;
  E) show_user_group ; group_tools ;;
  F) copy_user ; group_tools ;;
  G) add_group_group ; group_tools ;;
  H) rm_group_group ; group_tools ;;
  I) mv_group_ou ; group_tools ;;
  J) rm_group ; group_tools ;;
  X) echo "." > /dev/null ;;
  esac
}

function pc_tools {
  if ! var41=$(dialog --title "$ttitle" --backtitle "Ferramentas de Computadores" --menu " " 0 0 0 \
  A 'Procurar computador' \
  B 'Verificar um computador' \
  C 'Exibir todos os computadores' \
  D 'Criar/Adicionar um computador' \
  E 'Mover computador para OU' \
  F 'Cuidado: Excluir um computador' \
  X '<' 2>&1 > /dev/tty );then
    return
  fi

  case "$var41" in
  A) search_pc ; pc_tools ;;
  B) check_pc ; pc_tools ;;
  C) show_pcs ; pc_tools ;;
  D) create_pc ; pc_tools ;;
  E) mv_pc_ou ; pc_tools ;;
  F) rm_pc ; pc_tools ;;
  X) echo "." > /dev/null ;;
  esac
}

function info_domain {
  if ! var4=$(dialog --title "$ttitle" --backtitle "Manutencao Geral do Dominio" --menu " " 0 0 0 \
  A 'Detalhes deste Dominio' \
  B 'Status das Sessoes ativas' \
  C 'Status dos Compartilhamentos' \
  D 'Processos do SAMBA-AD-DC' \
  E 'Ajuda!' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi

  case "$var4" in
  A) domain_details ; info_domain ;;
  B) active_sessions ; info_domain ;;
  C) active_shares ; info_domain ;;
  D) smb_process ; info_domain ;;
  E) faq_help ; read -r -p "Pressione Enter para continuar!" ; info_domain ;;
  X) return ;;
  esac
}

#####################################
# O menu de manutenção começa aqui! #
#####################################

function s_settings_menu {
if ! var4=$(dialog --title "$ttitle" --backtitle "Manutencao do Dominio" --menu " " 0 0 0 \
  A 'Permissoes Comuns' \
  B 'Regras de Senhas' \
  C 'Cuidado: ACLs' \
  D 'Instalar ADMX Templates extras W 10' \
  E 'Instalar ADMX Templates extras W 11' \
  F 'Remover ADMX Templates extras' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi

  case "$var4" in
  A) set_common_perm ; s_settings_menu ;;
  B) change_password0 ; s_settings_menu ;;
  C) change_acls0 ; s_settings_menu ;;
  D) clear ; force_msi_w10 ; s_settings_menu ;;
  E) clear ; force_msi_w11 ; s_settings_menu ;;
  F) clear ; rm -R /var/lib/samba/sysvol/"$DOMAIN"/Policies/PolicyDefinitions ; read -r -p "ADMX Templates removidas. Pressione Enter para continuar!" ; s_settings_menu ;;
  X) return ;;
  esac
}

function set_common_perm {
  if ! var4=$(dialog --title "$ttitle" --backtitle "Modificando permissoes" --menu " " 0 0 0 \
  A 'SysVol check status' \
  B 'SysVol reset permissions' \
  C 'samba-ad-dc db check: general' \
  D 'samba-ad-dc db check: well-known-acls' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi

  case "$var4" in
  A) clear ; samba-tool ntacl sysvolcheck -U administrator ; read -r -p "Pressione Enter para continuar!" ; set_common_perm ;;
  B) clear ; samba-tool ntacl sysvolreset -U Administrator ; read -r -p "Pressione Enter para continuar!" ; set_common_perm ;;
  C) clear ; samba-tool dbcheck --cross-ncs --fix --yes ; read -r -p "Pressione Enter para continuar!" ; set_common_perm ;;
  D) clear ; samba-tool dbcheck --cross-ncs --reset-well-known-acls --fix --yes ; read -r -p "Pressione Enter para continuar!" ; set_common_perm ;;
  X) return ;;
  esac
}

function change_password0 {
  if ! var4=$(dialog --title "$ttitle" --backtitle "Regras de senhas para todo o Dominio" --menu " " 0 0 0 \
  A 'Mostrar Status das Regras de Senhas' \
  B 'Ativar complexidade das senhas' \
  C 'Desativar complexidade das senhas' \
  D 'Tamanho do historico das senhas' \
  E 'Tamanho minimo das senhas' \
  F 'Validade minima das senhas' \
  G 'Validade maxima das senhas' \
  H 'Tentativas de login antes de bloquear' \
  I 'Duracao do bloqueio de contas se errar' \
  J 'Duracao da liberacao da conta apos bloqueio' \
  X '<' 2>&1 > /dev/tty ); then
   return
 fi

  case "$var4" in
  A) show_pass_policy ; change_password0 ;;
  B) set_complex ; change_password0 ;;
  C) unset_complex ; change_password0 ;;
  D) pass_history ; change_password0 ;;
  E) pass_min_length ; change_password0 ;;
  F) pass_min_age ; change_password0 ;;
  G) pass_max_age ; change_password0 ;;
  H) try_login ; change_password0 ;;
  I) failblock_login ; change_password0 ;;
  J) releaseblock_login ; change_password0 ;;
  X) return ;;
  esac
}

function show_pass_policy {
  dialog --cr-wrap --title "Informaces da Politica de Senhas" --backtitle "$bktitle" --msgbox  "$(samba-tool domain passwordsettings show)" 0 0
}

function set_complex {
  if daystoexpire=$(dialog --title "$ttitle" --backtitle "$bktitle" --yesno "Ativar a complexidade de senhas? \n\n
Valor padrao: ATIVO" 9 35 2>&1 > /dev/tty); then
  clear
  samba-tool domain passwordsettings set --complexity=on; sleep 0.5
  samba-tool domain passwordsettings set --history-length=24; sleep 0.5
  samba-tool domain passwordsettings set --min-pwd-age=1; sleep 0.5
  samba-tool domain passwordsettings set --max-pwd-age=90; sleep 0.5
  samba-tool domain passwordsettings set --min-pwd-length=7; sleep 0.5
  dialog --cr-wrap --title "A complexidade de senhas foi reativada!" --backtitle "Complexidade restaurada aos valores padrao." --msgbox  "$(samba-tool domain passwordsettings show)" 0 0
  fi
}

function unset_complex {
  if daystoexpire=$(dialog --title "$ttitle" --backtitle "$bktitle" --yesno "Desativar a complexidade de senhas? \n\n
Valor padrao: ATIVO" 9 35 2>&1 > /dev/tty); then
  clear
  samba-tool domain passwordsettings set --complexity=off; sleep 0.5
  samba-tool domain passwordsettings set --history-length=0; sleep 0.5
  samba-tool domain passwordsettings set --min-pwd-age=0; sleep 0.5
  samba-tool domain passwordsettings set --max-pwd-age=0; sleep 0.5
  samba-tool domain passwordsettings set --min-pwd-length=0; sleep 0.5
  dialog --cr-wrap --title "A complexidade de senhas foi removida do servidor!" --backtitle "Complexidade totalmente removida." --msgbox  "$(samba-tool domain passwordsettings show)" 0 0
fi

}

function pass_history {
  if ! pass_history0=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Trocar senha quantas vezes ate permitir repetir? \n\n
Valor padrao: 24" 11 35 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$pass_history0" ]; then
    dialog002
  else
    clear
    samba-tool domain passwordsettings set --history-length="$pass_history0"
    dialog --title "Confirmacao" --msgbox "A senha devera ser trocada $pass_history0 vezes antes de poder repeti-la!" 8 40
  fi
}

function pass_min_length {
  if ! pass_min0=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Tamanho minimo de caracteres das senhas. \n\n
Valor padrao: 7" 11 35 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$pass_min0" ]; then
    dialog002
  else
    clear
    samba-tool domain passwordsettings set --min-pwd-length="$pass_min0"
    dialog --title "Confirmacao" --msgbox "Agora as senhas deverao conter no minimo $pass_min0 caracter(es)!" 8 40
  fi

}

function pass_min_age {
  if ! daystoexpire1=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Evitar a troca de senha seguidas vezes. \n\n
Valor padrao: 1 dia \n\n
Valor 0: Troque quando quiser" 14 35 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$daystoexpire1" ]; then
    dialog002
  else
    clear
    samba-tool domain passwordsettings set --min-pwd-age="$daystoexpire1"
    dialog --title "Confirmacao" --msgbox "Todos os usuarios so podem trocar a senha novamente apos $daystoexpire1 dias!" 8 40
  fi
}

function pass_max_age {
  if ! daystoexpire2=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Defina a validade das senhas em dias. \n\n
Valor padrao: 90 dias \n\n
Valor 0: Sem validade." 14 35 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$daystoexpire2" ]; then
    dialog002
  else
    clear
    samba-tool domain passwordsettings set --max-pwd-age="$daystoexpire2"
    dialog --title "Confirmacao" --msgbox "Todos os usuarios devem trocar a senha em $daystoexpire2 dias!" 8 40
  fi
}

function try_login {
  if ! blocklogin0=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Quantas tentativas de login antes de bloquear o usuario? \n\n
Valor padrao: 0" 11 35 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$blocklogin0" ]; then
    dialog002
  else
    clear
    samba-tool domain passwordsettings set --account-lockout-threshold="$blocklogin0"
    dialog --title "Confirmacao" --msgbox "O usuario sera bloqueado se errar a senha $blocklogin0 vezes!" 8 40
  fi
}

function failblock_login {
  if ! failblock0=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Por quanto tempo manter o usuario bloqueado apos errar a senha? \n\n
Valor padrao: 30 minutos \n\n
Valor 0: Sem tempo limite." 14 35 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$failblock0" ]; then
    dialog002
  else
    clear
    samba-tool domain passwordsettings set --account-lockout-duration="$failblock0"
    dialog --title "Confirmacao" --msgbox "O usuario bloqueado por errar a senha ficara bloqueado por $failblock0 minutos!" 8 40
  fi
}

function releaseblock_login {
  if ! releaseblk0=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Apos quanto tempo liberar usuarios bloqueados apos errarem a senha? \n\n
Valor padrao: 30 minutos \n\n
Valor 0: Sem tempo limite." 14 35 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$releaseblk0" ]; then
    dialog002
  else
    clear
    samba-tool domain passwordsettings set --reset-account-lockout-after="$releaseblk0"
    dialog --title "Confirmacao" --msgbox "O usuario bloqueado por errar a senha podera logar novamente apos $failblock0 minutos!" 8 40
  fi
}

function change_acls0 {
  if ! var4=$(dialog --title "CUIDADO!" --backtitle "ATENÇÃO" --menu "Prefira rodar este comando nas maquinas locais: \nicacls C:\\caminho\\do\\usuario /reset /t /c" 0 0 0 \
  A 'Verificar ACL padrao (Administrator!)' \
  B 'Coletar ACLs de arquivo ou pasta' \
  C 'PERIGO! Definir uma ACL a um arquivo ou pasta' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi

  case "$var4" in
  A) clear ; samba-tool gpo aclcheck -U Administrator ; read -r -p "Pressione Enter para continuar!" ; change_acls0 ;;
  B) getacls0 ; change_acls0 ;;
  C) setacls0 ; change_acls0 ;;
  X) return ;;
  esac
}

#############################
# Menu de Compartilhamentos #
#############################

function shared_folders {
  if ! var0=$(dialog --title "$ttitle" --backtitle "Gestao de Pastas Compartilhadas" --menu " " 0 0 0 \
  A 'Mostrar pastas compartilhadas' \
  B 'Criar nova pasta compartilhada' \
  C 'Compartilhamento estruturado' \
  D 'Excluir compartilhamento' \
  E 'Revalidar configuracoes' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi

  case "$var0" in
  A) show_shared ; shared_folders ;;
  B) create_shared ; shared_folders ;;
  C) create_sync ; shared_folders ;;
  D) remove_shared ; shared_folders ;;
  E) revalid_shared ; shared_folders ;;
  X) return ;;
  esac
}

function ou_tools {
  if ! var12=$(dialog --title "$ttitle" --backtitle "Unidades Organizacionais" --menu " " 0 0 0 \
  A 'Listar todas as OUs' \
  B 'Criar uma OU' \
  C 'Listar objetos de OU' \
  D 'Excluir uma OU' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi

  case "$var12" in
  A) show_ous ; ou_tools ;;
  B) create_ou ; ou_tools ;;
  C) list_obj_ou ; ou_tools ;;
  D) rm_ou ; ou_tools ;;
  X) return ;;
  esac
}

function checksilos0 {
  test01=$(samba-tool domain level show | grep -q 2012 && echo yes || echo no)
  test02=$(samba-tool domain level show | grep -q 2016 && echo yes || echo no)

  if [ "$test01" = "yes" ] || [ "$test02" = "yes" ]; then
    menusilo
  else
    dialog --title "Tentando acessar Silos" --backtitle "Informacao" --msgbox "Nivel funcional muito baixo! \nSAMBA Incompativel." 7 40
  fi
}

function menusilo {
  if ! var12=$(dialog --title "$ttitle" --backtitle "Silos de Autenticacao" --menu " " 0 0 0 \
  A 'Procurar/verificar um silo' \
  B 'Listar todos os silos' \
  C 'Criar um silo' \
  D 'Listar usuarios de um silo' \
  E 'Adicionar um usuario a um silo' \
  F 'Remover um usuario de um silo' \
  G 'Excluir um silo' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi

  case "$var12" in
  A) check_silo ; menusilo ;;
  B) show_silos ; menusilo ;;
  C) create_silos ; menusilo ;;
  D) list_usr_silo ; menusilo ;;
  E) add_usr_silo ; menusilo ;;
  F) rm_usr_silo ; menusilo ;;
  G) rm_silo ; menusilo ;;
  X) return ;;
  esac
}

function check_silo {
  if ! validsilo=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do Silo" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validsilo" ]; then
    dialog002
  else
    repeated=$(samba-tool domain auth silo list | grep -x "$validsilo")
    if [ "$repeated" = "$validsilo" ]; then
      dialog --title "Informacao" --msgbox "O silo $validsilo existe!" 8 40
      clear
      dialog001
      silodata=$(samba-tool domain auth silo view --name "$validsilo")
      echo "$silodata" | less
    else
      dialog --title "ERROR" --msgbox "Silo invalido!" 7 25
    fi
  fi
}

function show_silos {
  dialog001
  silolist=$(samba-tool domain auth silo list)
  echo "$silolist" | less
}

function create_silos {
  if ! validsilo=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do silo" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validsilo" ]; then
    dialog002
  else
    repeated=$(samba-tool domain auth silo list | grep -x "$validsilo")
    if [ "$repeated" = "$validsilo" ]; then
      dialog --title "ERROR" --msgbox "Silo $validsilo ja existe!" 7 25
    else
      samba-tool domain auth silo create --name "$validsilo"
      dialog --title "Informacao" --msgbox "Silo $validsilo criado com sucesso!" 7 25
    fi
  fi
}

function list_usr_silo {
  if ! validsilo=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do silo" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validsilo" ]; then
    dialog002
  else
    repeated=$(samba-tool domain auth silo list | grep -x "$validsilo")
    if [ "$repeated" = "$validsilo" ]; then
      dialog001
      silomembers=$(samba-tool domain auth silo member list --name "$validsilo")
      echo "$silomembers" | less
    else
      dialog --title "ERRO" --msgbox "Silo invalido!" 8 40
    fi
  fi
}

function add_usr_silo {
  validusr=$(dialog --title "$ttitle" --backtitle "Promover Usuario a um Silo" --inputbox "Insira o nome de Usuario" 0 0 2>&1 > /dev/tty)
  validsilo=$(dialog --title "$ttitle" --backtitle "Promover Usuario a um Silo" --inputbox "Insira o nome do Silo" 0 0 2>&1 > /dev/tty)

  if [ -z "$validusr" ] || [ -z "$validsilo" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      repeated2=$(samba-tool domain auth silo list | grep -x "$validsilo")
      if [ "$repeated2" = "$validsilo" ]; then
        samba-tool domain auth silo member add --name "$validsilo" --member "$validusr"
        dialog --title "Informacao" --msgbox "O usuario $validusr foi promovido ao silo $validsilo!" 8 40
      else
        dialog --title "ERROR" --msgbox "Silo invalido!" 7 25
      fi
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function rm_usr_silo {
  validusr=$(dialog --title "$ttitle" --backtitle "Remover Usuario a um Silo" --inputbox "Insira o nome de Usuario" 0 0 2>&1 > /dev/tty)
  validsilo=$(dialog --title "$ttitle" --backtitle "Remover Usuario a um Silo" --inputbox "Insira o nome do Silo" 0 0 2>&1 > /dev/tty)

  if [ -z "$validusr" ] || [ -z "$validsilo" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      repeated2=$(samba-tool domain auth silo list | grep -x "$validsilo")
      if [ "$repeated2" = "$validsilo" ]; then
        samba-tool domain auth silo member remove --name "$validsilo" --member "$validusr"
        dialog --title "Informacao" --msgbox "O usuario $validusr foi removido do silo $validsilo!" 8 40
      else
        dialog --title "ERROR" --msgbox "Silo invalido!" 7 25
      fi
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function rm_silo {
  if ! validsilo=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do silo" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validsilo" ]; then
    dialog002
  else
    repeated=$(samba-tool domain auth silo list | grep -x "$validsilo")
    if [ "$repeated" = "$validsilo" ]; then
      if dialog --title 'Confirmacao' --backtitle 'Exclusao de Silo' --yesno 'Deseja excluir este silo?' 0 0; then
        samba-tool domain auth silo delete --name "$validsilo"
        dialog --title "Informacao" --msgbox "Silo $validsilo excluido com sucesso!" 7 25
      fi
    else
      dialog --title "ERROR" --msgbox "Silo invalido!" 7 25
    fi
  fi
}

function getacls0 {
  if ! VALUE0=$(dialog --stdout --backtitle "Use as setas para navegar nos diretorios abaixo, use ESPACO 2x para confirmar uma pasta!" --title "Get ACL" --dselect "/mnt" 15 40); then
    return
  fi

  Pathtemp0=$(echo "$VALUE0" | sed -n 1p)

  acl00=$(samba-tool ntacl get --as-sddl "$Pathtemp0")
  echo "$acl00" | tee /tmp/acl01 >/dev/null
  echo "$Pathtemp0" | tee /tmp/pathtemp00 >/dev/null

  dialog --title "Confirmacao" --backtitle "Informacao" --msgbox "As seguintes ACLs da pasta \n$Pathtemp0\nforam coletadas: \n\n$acl00" 14 70
}

function setacls0 {
  acl00="$(cat /tmp/acl01)"
  pathtempacl0="$(cat /tmp/pathtemp00)"

  dialog --title "Confirmacao" --backtitle "Informacao" --msgbox "As seguintes ACLs coletadas da pasta previamente definida\n$pathtempacl0\nserao utilizadas: \n\n$acl00" 12 70

  checkpathfolder

  if ! VALUE00=$(dialog --stdout --backtitle "Use as setas para navegar nos diretorios abaixo, use ESPACO 2x para confirmar uma pasta!" --title "Set Folder" --dselect "$PathFolder0" 15 40); then
    return
  fi

  PathFolder0new=$(echo "$VALUE00" | sed -n 1p)

  samba-tool ntacl set "$acl00" "$PathFolder0new"
  echo "$PathFolder0new"| tee /tmp/path01 >/dev/null

  dialog --title "Confirmacao" --backtitle "Informacao" --msgbox "A pasta \n$PathFolder0new\nrecebeu as seguintes ACLs: \n\n$acl00\n\nficando com as mesmas permissoes da pasta \n$pathtempacl0!" 16 70

  changemoreacls
}

function changemoreacls {
  if dialog --title 'Confirmacao' --backtitle 'Informacao' --yesno 'Deseja trocar a ACL de outra pasta?' 0 0; then
    acl00="$(cat /tmp/acl01)"
    PathFolder0="$(cat /tmp/path01)"
    pathtempacl0="$(cat /tmp/pathtemp00)"
  fi

  if VALUE00=$(dialog --stdout --backtitle "Use as setas para navegar nos diretorios abaixo, use ESPACO 2x para confirmar uma pasta!" --title "Set Folder" --dselect "$PathFolder0" 15 40); then
    PathFolder0new=$(echo "$VALUE00" | sed -n 1p)
    echo "$PathFolder0new"| tee /tmp/path01 >/dev/null
    samba-tool ntacl set "$acl00" "$PathFolder0new"
    dialog --title "Confirmacao" --backtitle "Informacao" --msgbox "A pasta \n$PathFolder0new\nrecebeu as seguintes ACLs: \n\n$acl00\n\nficando com as mesmas permissoes da pasta \n$pathtempacl0!" 16 70
    changemoreacls
  fi
}

function checkpathfolder {
  PathFolder0="$(cat /tmp/path01)"
  if [ "$PathFolder0" = "" ]; then
    PathFolder0="/mnt"
  fi
}

function force_msi_w10 {
  if dpkg --list | grep msitools; then
    if dialog --title 'Confirmacao' --backtitle 'PODEM OCORRER IMPREVISTOS COM AS REGRAS DE GPO PREVIAMENTE DEFINIDAS!' --yesno 'Deseja mesmo trocar toda a estrutura ADMX para W10?' 0 0; then
      curl -sSL --connect-timeout 5 --max-time 0 --retry 3 --retry-delay 2 "$admxw10" | tee w10admx.msi > /dev/null && mkdir /msifiles && msiextract -C /msifiles/ w10admx.msi
      rm -R /var/lib/samba/sysvol/"$DOMAIN"/Policies/PolicyDefinitions
      samba-tool gpo admxload -U Administrator --admx-dir="/msifiles/PolicyDefinitions/"
      echo ""; read -r -p "As regras do Windows 10 foram carregadas. Ignore as mensagens de erro acima. Pressione Enter para continuar!"
    fi
  else
    clear; echo "Pacote MSITOOLS nao encontrado!"; sleep 3
  fi
}

function force_msi_w11 {
  if dpkg --list | grep msitools; then
    if dialog --title 'Confirmacao' --backtitle 'PODEM OCORRER IMPREVISTOS COM AS REGRAS DE GPO PREVIAMENTE DEFINIDAS!' --yesno 'Deseja mesmo trocar toda a estrutura ADMX para W11?' 0 0; then
      curl -sSL --connect-timeout 5 --max-time 0 --retry 3 --retry-delay 2 "$admxw11" | tee w11admx.msi > /dev/null && mkdir /msifiles && msiextract -C /msifiles/ w11admx.msi
      rm -R /var/lib/samba/sysvol/"$DOMAIN"/Policies/PolicyDefinitions
      mv /msifiles/Program\ Files/Microsoft\ Group\ Policy/Windows\ 11\ September\ 2022\ Update\ \(22H2\)/PolicyDefinitions/ /msifiles/PolicyDefinitions/
      samba-tool gpo admxload -U Administrator --admx-dir="/msifiles/PolicyDefinitions/"
      echo ""; read -r -p "As regras do Windows 11 foram carregadas. Ignore as mensagens de erro acima. Pressione Enter para continuar!"
    fi
  else
    clear
    echo "Pacote MSITOOLS nao encontrado!"
    sleep 3
  fi
}

function active_shares {
  dialog001
  active_sh=$(net status shares)
  echo "$active_sh" | less
}

function active_sessions {
  dialog001
  active_se=$(net status sessions)
  echo "$active_se" | less
}

function show_ous {
  dialog001
  oulst=$(samba-tool ou list)
  echo "$oulst" | less
}

function create_ou {
  if ! validou=$(dialog --title "$ttitle" --backtitle "Criando uma OU" --inputbox "Insira o nome da OU" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validou" ]; then
    dialog002
  else
    repeated=$(samba-tool ou list | grep -x OU="$validou")
    if [ "$repeated" = "OU=$validou" ]; then
      dialog --title "Informacao" --msgbox "A OU=$validou ja existe!" 8 40
    else
      samba-tool ou create OU="$validou"
      dialog --title "Informacao" --msgbox "OU=$validou criada com sucesso!" 7 25
    fi
  fi
}

function mv_user_ou {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "Mover Usuario para OU" --inputbox "Insira o nome de Usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if ! validou=$(dialog --title "$ttitle" --backtitle "Mover Usuario para OU" --inputbox "Insira o nome da OU" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ] || [ -z "$validou" ]; then
      dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      repeated2=$(samba-tool ou list | grep -x OU="$validou")
      if [ "$repeated2" = "OU=$validou" ]; then
        samba-tool user move "$validusr" OU="$validou"
        dialog --title "Informacao" --msgbox "O usuario $validusr foi movido para a OU=$validou!" 8 40
      else
        dialog --title "ERROR" --msgbox "OU invalida!" 7 25
      fi
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function mv_group_ou {
  if ! validgrp=$(dialog --title "$ttitle" --backtitle "Mover Grupo para OU" --inputbox "Insira o nome do Grupo" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if ! validou=$(dialog --title "$ttitle" --backtitle "Mover Grupo para OU" --inputbox "Insira o nome da OU" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validgrp" ] || [ -z "$validou" ]; then
    dialog002
  else
    repeated=$(samba-tool group list | grep -x "$validgrp")
    if [ "$repeated" = "$validgrp" ]; then
      repeated2=$(samba-tool ou list | grep -x OU="$validou")
      if [ "$repeated2" = "OU=$validou" ]; then
        samba-tool group move "$validgrp" OU="$validou"
        dialog --title "Informacao" --msgbox "O grupo $validgrp foi movido para a OU=$validou!" 8 40
      else
        dialog --title "ERROR" --msgbox "OU invalida!" 7 25
      fi
    else
      dialog --title "ERROR" --msgbox "Grupo invalido!" 7 25
    fi
  fi
}

function rm_ou {
  if ! validou=$(dialog --title "$ttitle" --backtitle "Excluindo uma OU" --inputbox "Insira o nome da OU:" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validou" ]; then
    dialog002
  else
    repeated=$(samba-tool ou list | grep -x OU="$validou")
    if [ "$repeated" = "OU=$validou" ]; then
      if dialog --title 'Confirmacao' --backtitle 'Exclusao de OU' --yesno 'Deseja excluir esta OU?' 0 0; then
        samba-tool ou delete OU="$validou"
        repeated2=$(samba-tool ou list | grep -x OU="$validou")
        if [ "$repeated2" = "OU=$validou" ]; then
          dialog --title "Informacao" --msgbox "A OU=$validou possui Objetos e nao foi removida!" 8 40
        else
          dialog --title "Informacao" --msgbox "A OU=$validou foi removida com sucesso!" 7 25
        fi
      fi
    else
      dialog --title "Informacao" --msgbox "A OU=$validou nao foi encontrada!" 8 40
    fi
  fi
}

function list_obj_ou {
  if ! validou=$(dialog --title "$ttitle" --backtitle "Objetos de uma OU" --inputbox "Insira o nome da OU" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validou" ]; then
    dialog002
  else
    repeated=$(samba-tool ou list | grep -x OU="$validou")
    if [ "$repeated" = "OU=$validou" ]; then
      dialog001
      oubjects=$(samba-tool ou listobjects OU="$validou")
      echo "$oubjects" | less
    else
      dialog --title "Informacao" --msgbox "OU=$validou invalida!" 7 25
    fi
  fi
}

function show_users {
  dialog001
  usrlst=$(samba-tool user list)
  echo "$usrlst" | less
}

function show_groups {
  dialog001
  grplist=$(samba-tool group list)
  echo "$grplist" | less
}

function create_user {
  VALUE1="joao_naves"
  VALUE2="Joao Naves"
  VALUE3="A12345d"

  if ! VALUE0=$(dialog --ok-label "Criar"  --backtitle "$bktitle" --title "Adicionar Usuario" --form "Preencha todos os campos! \nAtento na complexidade da senha!" 0 0 0 \
"Usuario: " 1 1 "$VALUE1" 1 10 34 0 \
"Exibicao:" 2 1 "$VALUE2" 2 10 34 0 \
"Senha:" 3 1 "$VALUE3" 3 10 34 0 \
3>&1 1>&2 2>&3 3>&- > /dev/tty); then
    return
  fi

  validusr1=$(echo "$VALUE0" | sed -n 1p)
  validsur1=$(echo "$VALUE0" | sed -n 2p)
  validpss1=$(echo "$VALUE0" | sed -n 3p)

  if [ -z "$validpss1" ] || [ -z "$validusr1" ] || [ -z "$validsur1" ]; then
    dialog --title "ERRO" --msgbox "Nao deixe nenhum campo vazio!" 8 40
  else
    repeated=$(samba-tool user list | grep -x "$validusr1")
    repeated2=$(samba-tool group list | grep -x "$validusr1")
    if [ "$repeated" = "$validusr1" ] || [ "$repeated2" = "$validusr1" ]; then
      dialog --title "Informacao" --msgbox "Conflito detectado! \n\nO usuario $validusr1 ja existe!" 8 40
    else
      if dialog --title 'Politica de Senha' --backtitle 'Configuracao de Senha' --yesno "$validusr1 deve trocar essa senha ao logar?" 0 0; then
        samba-tool user create --must-change-at-next-login "$validusr1" "$validpss1" --surname="$validsur1"
        check_user_creation
      else
        samba-tool user create "$validusr1" "$validpss1" --surname="$validsur1"
        check_user_creation
      fi
    fi
  fi
}

function check_user_creation {
  if ! checkusr00=$(samba-tool user list | grep -x "$validusr1"); then
    return
  fi

  if [ "$checkusr00" = "$validusr1" ]; then
    dialog --title "Informacao" --msgbox "\nUsuario $validusr1 criado e configurado com sucesso!" 8 40
  else
    dialog --title "ERRO" --msgbox "O usuario NAO foi criado porque: \n\nJa existe $validusr1 e/ou $validsur1. \n\n OU \n\nNao atendeu os requisitos minimos de senha: \n\n-Minimo 7 caracteres. \n-Contenha Letras e Numeros \n-Pelo menos 1 (uma) letra MAIUSCULA." 17 60
  fi
}

function change_pass {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      validpss=$(dialog --title "$ttitle" --backtitle "Trocar a senha de usuario do Dominio" --insecure --passwordbox 'Crie uma nova senha para o usuario' 0 0 2>&1 > /dev/tty )
      if [ -z "$validpss" ]; then
        dialog002
      else
        samba-tool user setpassword "$validusr" --newpassword="$validpss"
        dialog --title "Informacao" --msgbox "Senha de $validusr trocada com sucesso!" 8 40
      fi
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function blk_user {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      samba-tool user disable "$validusr"
      dialog --title "Informacao" --msgbox "Usuario $validusr bloqueado com sucesso!" 7 25
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function ublk_user {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      samba-tool user enable "$validusr"
      dialog --title "Informacao" --msgbox "Usuario $validusr desbloqueado com sucesso!" 7 25
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function rm_user {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      if dialog --title 'Confirmacao' --backtitle 'Exclusao de Usuario' --yesno 'Deseja excluir este usuario?' 0 0; then
        samba-tool user delete "$validusr"
        dialog --title "Informacao" --msgbox "Usuario $validusr excluido com sucesso!" 7 25
      else
        echo "a" > /dev/null
      fi
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function rm_user_db {
  if ! cnname=$(dialog --title "$ttitle" --backtitle "Excluir Usuario" --inputbox "Digite parte ou o nome completo do usuario (CN):" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$cnname" ]; then
    dialog --title "Erro" --msgbox "Nenhum nome foi inserido." 6 40
    return
  fi

  # Busca todos os DNs que correspondem ao CN parcial
  mapfile -t dns < <(ldbsearch -H /var/lib/samba/private/sam.ldb "(cn=*$cnname*)" dn | grep "^dn:" | cut -d' ' -f2-)

  count=${#dns[@]}

  if [ "$count" -eq 0 ]; then
    dialog --title "Nao encontrado" --msgbox "Nenhum usuario com '$cnname' foi localizado." 6 50
    return
  fi

  if [ "$count" -eq 1 ]; then
    selected_dn="${dns[0]}"
  else
    # Monta lista segura para dialog --menu
    temp_list=""
    for i in "${!dns[@]}"; do
      label="Usuario_$((i+1))"
      dn_escaped=$(echo "${dns[$i]}" | sed 's/"/\\"/g')
      temp_list+=" \"$label\" \"$dn_escaped\""
    done

    # Executa menu de seleção
    selected_label=$(eval dialog --title \"Multiplos encontrados\" --menu \"Selecione o usuario para excluir:\" 0 0 0 $temp_list 2>&1 > /dev/tty)

    if [ -z "$selected_label" ]; then
      dialog --msgbox "Operacao cancelada." 6 40
      return
    fi

    # Recupera o DN real com base no label
    index=$(( ${selected_label#Usuario_} - 1 ))
    selected_dn="${dns[$index]}"
  fi

  # Confirma exclusao
  dialog --yesno "Deseja realmente excluir:\n\n$selected_dn ?" 10 60
  if [ $? -eq 0 ]; then
    ldbdel -H /var/lib/samba/private/sam.ldb "$selected_dn"
    dialog --title "Sucesso" --msgbox "O usuario foi removido com sucesso!" 6 50
  else
    dialog --title "Cancelado" --msgbox "Remocao cancelada." 6 40
  fi
}

function create_group {
  if ! validgrp=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do Grupo" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validgrp" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validgrp")
    repeated2=$(samba-tool group list | grep -x "$validgrp")
    if [ "$repeated" = "$validgrp" ] || [ "$repeated2" = "$validgrp" ]; then
      dialog --title "Informacao" --msgbox "Conflito detectado! O grupo $validgrp nao sera criado!" 8 40
    else
      samba-tool group create "$validgrp"
      dialog --title "Informacao" --msgbox "Grupo $validgrp criado com sucesso!" 7 25
    fi
  fi
}

function add_user_group {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "Adicionar Usuario a um Grupo" --inputbox "Insira o nome de Usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if ! validgrp=$(dialog --title "$ttitle" --backtitle "Adicionar Usuario a um Grupo" --inputbox "Insira o nome do Grupo" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ] || [ -z "$validgrp" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      repeated2=$(samba-tool group list | grep -x "$validgrp")
      if [ "$repeated2" = "$validgrp" ]; then
        samba-tool group addmembers "$validgrp" "$validusr"
        dialog --title "Informacao" --msgbox "O usuario $validusr foi adicionado ao grupo $validgrp!" 8 40
      else
        dialog --title "ERROR" --msgbox "Grupo invalido!" 7 25
      fi
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function add_group_group {
  if ! validgrp1=$(dialog --title "$ttitle" --backtitle "Adicionar Grupo 1 a um Grupo 2" --inputbox "Insira o nome do Grupo 1" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if ! validgrp2=$(dialog --title "$ttitle" --backtitle "Adicionar Grupo 1 a um Grupo 2" --inputbox "Insira o nome do Grupo 2" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validgrp1" ] || [ -z "$validgrp2" ]; then
      dialog002
  else
    repeated=$(samba-tool group list | grep -x "$validgrp1")
    repeated2=$(samba-tool group list | grep -x "$validgrp2")
    if [ "$repeated" = "$validgrp1" ] && [ "$repeated2" = "$validgrp2" ]; then
      samba-tool group addmembers "$validgrp2" "$validgrp1"
      dialog --title "Informacao" --msgbox "O grupo $validgrp1 foi adicionado ao grupo $validgrp2!" 8 40
    else
      dialog --title "ERROR" --msgbox "Grupo invalido!" 7 25
    fi
  fi
}

function rm_group_group {
  if ! validgrp1=$(dialog --title "$ttitle" --backtitle "Remover Grupo 1 de um Grupo 2" --inputbox "Insira o nome do Grupo 1" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if ! validgrp2=$(dialog --title "$ttitle" --backtitle "Remover Grupo 1 de um Grupo 2" --inputbox "Insira o nome do Grupo 2" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validgrp1" ] || [ -z "$validgrp2" ]; then
    dialog002
  else
    repeated=$(samba-tool group list | grep -x "$validgrp1")
    repeated2=$(samba-tool group list | grep -x "$validgrp2")
    if [ "$repeated" = "$validgrp1" ] && [ "$repeated2" = "$validgrp2" ]; then
      samba-tool group removemembers "$validgrp2" "$validgrp1"
      dialog --title "Informacao" --msgbox "O grupo $validgrp1 foi removido do grupo $validgrp2!" 8 40
    else
      dialog --title "ERROR" --msgbox "Grupo invalido!" 7 25
    fi
  fi
}

function show_user_group {
  if ! validgrp=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do Grupo" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validgrp" ]; then
    dialog002
  else
    repeated=$(samba-tool group list | grep -x "$validgrp")
    if [ "$repeated" = "$validgrp" ]; then
      dialog001
      usrgrps=$(samba-tool group listmembers "$validgrp")
      echo "$usrgrps" | less
    else
      dialog --title "ERROR" --msgbox "Grupo invalido!" 7 25
    fi
  fi
}

# Copiar os grupos de um usuario
function copy_group {
  if ! validusr1=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do Usuario IN" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if ! validusr2=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do Usuario OUT" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr1" ] || [ -z "$validusr2" ]; then
    dialog002
  else
    repeated1=$(samba-tool user list | grep -x "$validusr1")
    repeated2=$(samba-tool user list | grep -x "$validusr2")
    if [ "$repeated1" = "$validusr1" ] && [ "$repeated2" = "$validusr2" ]; then
      grpsusr=$(samba-tool user getgroups "$validusr1")
      IFS=$'\n' read -d '' -r -a groups <<< "$(echo "$grpsusr" | awk -v RS='\"' 'NR % 2 == 0 {print "\"" $0 "\""} NR % 2 == 1 {print $0}')"
      for groupa in "${groups[@]}"; do
        clear
        echo ""
        echo "Adicionando ao grupo $groupa o usuario $validusr2"
        echo ""
        samba-tool group addmembers "$groupa" "$validusr2"
        sleep 1
        clear
      done
    else
      dialog --title "ERROR" --msgbox "Usuario(s) invalido(s)!" 7 25
    fi
  fi
}

# Copiar os membros de um grupo
function copy_user {
  if ! validgrp1=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do Grupo IN" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if ! validgrp2=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do Grupo OUT" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validgrp1" ] || [ -z "$validgrp2" ]; then
    dialog002
  else
    repeated1=$(samba-tool group list | grep -x "$validgrp1")
    repeated2=$(samba-tool group list | grep -x "$validgrp2")
    if [ "$repeated1" = "$validgrp1" ] && [ "$repeated2" = "$validgrp2" ]; then
      usrgrps=$(samba-tool group listmembers "$validgrp1")
      IFS=$'\n' read -d '' -r -a userss <<< "$(echo "$usrgrps" | awk -v RS='\"' 'NR % 2 == 0 {print "\"" $0 "\""} NR % 2 == 1 {print $0}')"
      for userss1 in "${userss[@]}"; do
        clear
        echo ""
        echo "Adicionando o membro $userss1 ao grupo $validgrp2"
        echo ""
        samba-tool group addmembers "$validgrp2" "$userss1"
        sleep 1
        clear
      done
    else
      dialog --title "ERROR" --msgbox "Grupo(s) invalido(s)!" 7 25
    fi
  fi
}

function rm_user_group {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do Usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if ! validgrp=$(dialog --title "$ttitle" --backtitle "Remover Usuario de um Grupo" --inputbox "Insira o nome do Grupo" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ] || [ -z "$validgrp" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      repeated2=$(samba-tool group list | grep -x "$validgrp")
      if [ "$repeated2" = "$validgrp" ]; then
        samba-tool group removemembers "$validgrp" "$validusr"
        dialog --title "Informacao" --msgbox "O usuario $validusr foi removido do grupo $validgrp!" 8 40
      else
        dialog --title "ERROR" --msgbox "Grupo invalido!" 7 25
      fi
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function rm_group {
  if ! validgrp=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do grupo" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validgrp" ]; then
    dialog002
  else
    repeated=$(samba-tool group list | grep -x "$validgrp")
    if [ "$repeated" = "$validgrp" ]; then
      if dialog --title 'Confirmacao' --backtitle 'Exclusao de Grupo' --yesno "Deseja excluir o grupo $validgrp?" 0 0; then
        samba-tool group delete "$validgrp"
        dialog --title "Informacao" --msgbox "Grupo $validgrp excluido com sucesso!" 7 25
      fi
    else
      dialog --title "ERROR" --msgbox "Grupo invalido!" 7 25
    fi
  fi
}

function expiracy_usr_pass {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      if dialog --title 'Politica de Senha' --backtitle 'Configuracao de Senha' --yesno "A senha de $validusr nao deve mais expirar?" 0 0; then
        samba-tool user setexpiry "$validusr" --noexpiry
        dialog --title "Informacao" --msgbox "A senha de $validusr nao expira!" 8 40
      fi
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function expiracy_now {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      if dialog --title 'Politica de Senha' --backtitle 'Configuracao de Senha' --yesno "O usuario $validusr deve trocar a senha imediatamente?" 0 0; then
        samba-tool user setexpiry "$validusr" --days=90
        samba-tool user setpassword "$validusr" --must-change-at-next-login
        #net sam set pwdmustchangenow "$validusr" yes
        dialog --title "Informacao" --msgbox "O usuario deve trocar a senha imediatamente!" 8 40
      fi
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function expiracy_days {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      daystoexpire=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Defina quando a senha vai expirar, em dias" 0 0 2>&1 > /dev/tty)
      if [ -z "$daystoexpire" ]; then
        dialog002
      else
        samba-tool user setexpiry "$validusr" --days="$daystoexpire"
        dialog --title "Confirmacao" --msgbox "O usuario $validusr devera trocar a senha em $daystoexpire dias!" 8 40
      fi
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function show_group_user {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      dialog001
      grpsusr=$(samba-tool user getgroups "$validusr")
      echo "$grpsusr" | less
    else
      dialog --title "ERRO" --msgbox "Usuario invalido!" 8 40
    fi
  fi
}

function search_user {
  if ! validusr1=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario. \n
  Exemplos: joao, ou Admin" 9 40 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr1" ]; then
    dialog002
  else
    usrdata=$(samba-tool user list | grep "$validusr1")
    clear
    dialog001
    echo "$usrdata" | less
  fi
}

function search_group {
  if ! validgrp1=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do grupo" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validgrp1" ]; then
    dialog002
  else
    grpdata=$(samba-tool group list | grep "$validgrp1")
    clear
    dialog001
    echo "$grpdata" | less
  fi
}

function search_pc {
  if ! validpc1=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do computador. \n
  Exemplo: PC001 sem o $" 9 40 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validpc1" ]; then
    dialog002
  else
    pcdata=$(samba-tool computer list | grep "$validpc"\\$)
    clear
    dialog001
    echo "$pcdata" | less
  fi
}

function check_user {
  if ! validusr1=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario. \n
  Exemplo: joao_naves" 9 40 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr1" ]; then
    dialog002
  else
    repeated2=$(samba-tool user list | grep "$validusr1")
    if [ "$repeated2" = "$validusr1" ]; then
      dialog --title "Informacao" --msgbox "O usuario $validusr1 esta cadastrado!" 8 40
      clear
      dialog001
      usrdata=$(samba-tool user show "$validusr1")
      echo "$usrdata" | less
    else
      dialog --title "Informacao" --msgbox "O usuario $validusr1 nao foi encontrado neste servidor." 8 40
    fi
  fi
}

function check_group {
  if ! validgrp1=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de grupo" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validgrp1" ]; then
    dialog002
  else
    repeated3=$(samba-tool group list | grep "$validgrp1")
    if [ "$repeated3" = "$validgrp1" ]; then
      dialog --title "Informacao" --msgbox "O grupo $validgrp1 esta cadastrado!" 8 40
      clear
      dialog001
      grpdata=$(samba-tool group show "$validgrp1")
      echo "$grpdata" | less
    else
      dialog --title "Informacao" --msgbox "O grupo $validgrp1 nao foi encontrado neste servidor." 8 40
    fi
  fi
}

function domain_details {
smbv=$(samba --version)
domainv=$(samba-tool domain level show)
dialog --cr-wrap --title "Informaces encontradas" --backtitle "$bktitle" --msgbox "
Nome da Maquina: $HOSTNAME \n \n
Versao do SAMBA: $smbv \n \n
$domainv \n \n
" 0 0
}

function smb_process {
  dialog --cr-wrap --title "Informaces encontradas" --backtitle "$bktitle" --msgbox  "$(samba-tool processes)" 0 0
}

function promote_user {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      clear
      samba-tool group addmembers "Domain Admins" "$validusr"
      sleep 1
      samba-tool group addmembers "Schema Admins" "$validusr"
      sleep 1
      samba-tool group addmembers "Enterprise Admins" "$validusr"
      sleep 1
      samba-tool group addmembers "Group Policy Creator Owners" "$validusr"
      sleep 1
      samba-tool group addmembers "Administrators" "$validusr"
      sleep 1
      dialog --title "Informacao" --msgbox "Usuario $validusr se tornou administrador!" 8 40
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function demote_user {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      clear
      samba-tool group removemembers "Domain Admins" "$validusr"
      sleep 1
      samba-tool group removemembers "Schema Admins" "$validusr"
      sleep 1
      samba-tool group removemembers "Enterprise Admins" "$validusr"
      sleep 1
      samba-tool group removemembers "Group Policy Creator Owners" "$validusr"
      sleep 1
      samba-tool group removemembers "Administrators" "$validusr"
      sleep 1
      dialog --title "Informacao" --msgbox "Usuario $validusr deixou de ser administrador!" 8 40
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function test_pass {
  if ! validusr=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome de usuario" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validusr" ]; then
    dialog002
  else
    repeated=$(samba-tool user list | grep -x "$validusr")
    if [ "$repeated" = "$validusr" ]; then
      clear
      kinit "$validusr"
      echo ""
      read -r -p "Pressione Enter para continuar!"
    else
      dialog --title "ERROR" --msgbox "Usuario invalido!" 7 25
    fi
  fi
}

function mv_pc_ou {
  if ! validpc=$(dialog --title "$ttitle" --backtitle "Mover Computador para OU" --inputbox "Insira o nome do Computador" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if ! validou=$(dialog --title "$ttitle" --backtitle "Mover Computador para OU" --inputbox "Insira o nome da OU" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validpc" ] || [ -z "$validou" ]; then
    dialog002
  else
    repeated=$(samba-tool computer list | grep -x "$validpc"\\$)
    if [ "$repeated" = "$validpc"\$ ]; then
    repeated2=$(samba-tool ou list | grep -x OU="$validou")
      if [ "$repeated2" = "OU=$validou" ]; then
        samba-tool computer move "$validpc" OU="$validou"
        dialog --title "Informacao" --msgbox "O Computador $validpc\$ foi movido para a OU=$validou!" 8 40
      else
        dialog --title "ERROR" --msgbox "OU invalida!" 7 25
      fi
    else
      dialog --title "ERROR" --msgbox "Computador invalido!" 7 25
    fi
  fi
}

function show_pcs {
  dialog001
  cmplist=$(samba-tool computer list)
  echo "$cmplist" | less
}

function create_pc {
  if ! validpc=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do Computador (sem o $)" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validpc" ]; then
    dialog002
  else
    repeated=$(samba-tool computer list | grep -x "$validpc"\\$)
    if [ "$repeated" = "$validpc"\$ ]; then
      dialog --title "ERROR" --msgbox "Computador ja existe!" 7 25
    else
      samba-tool computer create "$validpc"
      dialog --title "Informacao" --msgbox "Computador $validpc\$ criado com sucesso!" 7 25
    fi
  fi
}

function rm_pc {
  if ! validpc=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do Computador (sem o $)" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validpc" ]; then
    dialog002
  else
    repeated=$(samba-tool computer list | grep -x "$validpc"\\$)
    if [ "$repeated" = "$validpc"\$ ]; then
      if dialog --title 'Confirmacao' --backtitle 'Exclusao de Computador' --yesno 'Deseja excluir este computador?' 0 0; then
        samba-tool computer delete "$validpc"\$
        dialog --title "Informacao" --msgbox "Computador $validpc\$ excluido com sucesso!" 7 25
      fi
    else
      dialog --title "ERROR" --msgbox "Computador invalido!" 7 25
    fi
  fi
}

function check_pc {
  if ! validpc=$(dialog --title "$ttitle" --backtitle "$bktitle" --inputbox "Insira o nome do Computador (sem o $)" 0 0 2>&1 > /dev/tty); then
    return
  fi

  if [ -z "$validpc" ]; then
    dialog002
  else
    repeated=$(samba-tool computer list | grep -x "$validpc"\\$)
    if [ "$repeated" = "$validpc"\$ ]; then
      dialog --title "Informacao" --msgbox "O computador $validpc\$ esta cadastrado!" 8 40
      clear
      dialog001
      pccdata=$(samba-tool computer show "$validpc"\$)
      echo "$pccdata" | less
    else
      dialog --title "ERROR" --msgbox "Computador invalido!" 7 25
    fi
  fi
}

function show_shared {
  setfolder="/etc/samba/external/smb.conf.d/"

  [ -d "$setfolder" ] && {
  files=()
  while IFS= read -r -d $'\0' file; do
    files+=("$file" "")
  done < <(find "$setfolder" -type f -name "*.conf" -print0)
    [ ${#files[@]} -eq 0 ] && {
      clear
      echo "Nenhuma configuracao encontrada em $setfolder"
      sleep 1
    } || {
      if ! file=$(dialog --stdout --title "Escolha um compartilhamento para visualizar" --cancel-label "Voltar" --menu "Somente leitura. \nPara remover,
utilize o menu Excluir Compartilhamento!" 0 0 0 "${files[@]}"); then
        return
      fi
      clear
      cat "$file"
      echo ""
      read -r -p "Pressione ENTER quando terminar de visualizar a configuracao!"
      show_shared
    } || {
      clear
      dialog --title "ERRO" --msgbox "Nenhum compartilhamento encontrado!" 5 40
    }
  }
}

# SHARED #

function create_shared {
VALUE1="nome_do_compartilhamento"
VALUE3="@grupo, usuario"
VALUE4="yes"
VALUE5="yes"

  VALUE0=$(dialog --help-button --help-label 'Dica' --ok-label "Criar" --title "Compartilhamento Comum" --form "Separe os grupos e/ou usuarios com virgula. \n
Se a pasta nao existe ela sera criada. \n
Use a Dica para achar a pasta!" 0 0 0 \
"Shr Name:" 1 1 "$VALUE1" 1 10 34 0 \
"     /mnt" 2 1 "$VALUE2" 2 10 34 0 \
"Grp Name:" 3 1 "$VALUE3" 3 10 34 0 \
"Writable:" 4 1 "$VALUE4" 4 10 34 0 \
"Browser.:" 5 1 "$VALUE5" 5 10 34 0 \
3>&1 1>&2 2>&3 3>&- > /dev/tty)

case $? in
   0) echo "." > /dev/null ;;
   1) return ;;
   2) dica0 ; return ;;
esac

  var1=$(echo "$VALUE0" | sed -n 1p)
  var2=$(echo "$VALUE0" | sed -n 2p)
  var3=$(echo "$VALUE0" | sed -n 3p)
  var4=$(echo "$VALUE0" | sed -n 4p)
  var5=$(echo "$VALUE0" | sed -n 5p)

  if [ -f /etc/samba/external/smb.conf.d/"$var1".conf ]; then
    dialog --title "ERRO" --msgbox "ERRO: Um compartilhamento com este nome ja existe na rede! Ignorando." 7 40
  else
    if [[ $var1 = *" "* ]] || [[ $var2 = *" "* ]] || [[ $var1 = "" ]]; then
      dialog --title "ERRO" --msgbox "ERRO: Nao crie compartilhamentos com espacos nos nomes ou nomes vazios! Ignorando." 7 40
    else
      mkdir -p /mnt"$var2"
      tee /etc/samba/external/smb.conf.d/"$var1".conf << EOF
[$var1]
path = /mnt$var2
valid users = $var3
admin users = $var3
writable = $var4
browsable = $var5
guest ok = no
create mask = 0777
force create mode = 0777
directory mask = 0777
force directory mode = 0777
EOF

      # Apply 777 but without -R flag!
      chmod 777 /mnt"$var2"

      revalid_shared
    fi
  fi
}

# SYNC #

function create_sync {
VALUE1="nome_do_compartilhamento"
VALUE3="@Sync, @Desativar_Sync"
VALUE4="no"

  VALUE0=$(dialog --help-button --help-label 'Dica' --ok-label "Criar" --title "Compartilhamento para Sync Center" --form "Separe os grupos e/ou usuarios com virgula. \n
Se a pasta nao existir ela sera criada e ficara oculta. \n
A permissao da pasta sera do dono da mesma! \n
Use a Dica para achar a pasta!" 0 0 0 \
"Shr Name:" 1 1 "$VALUE1" 1 10 34 0 \
"     /mnt" 2 1 "$VALUE2" 2 10 34 0 \
"Grp Name:" 3 1 "$VALUE3" 3 10 34 0 \
"Browser.:" 4 1 "$VALUE4" 4 10 34 0 \
3>&1 1>&2 2>&3 3>&- > /dev/tty)

case $? in
   0) echo "." > /dev/null ;;
   1) return ;;
   2) dica0 ; create_sync ;;
esac

  var1=$(echo "$VALUE0" | sed -n 1p)
  var2=$(echo "$VALUE0" | sed -n 2p)
  var3=$(echo "$VALUE0" | sed -n 3p)
  var4=$(echo "$VALUE0" | sed -n 4p)

  if [ -f /etc/samba/external/smb.conf.d/"$var1".conf ]; then
    dialog --title "ERRO" --msgbox "ERRO: Um compartilhamento com este nome ja existe na rede! Ignorando." 7 40
  else
    if [[ $var1 = *" "* ]] || [[ $var2 = *" "* ]] || [[ $var1 = "" ]]; then
      dialog --title "ERRO" --msgbox "ERRO: Nao crie compartilhamentos com espacos nos nomes ou nomes vazios! Ignorando." 7 40
    else
      mkdir -p /mnt"$var2"
      tee /etc/samba/external/smb.conf.d/"$var1".conf << EOF
[$var1]
path = /mnt$var2
valid users = $var3
browsable = $var4
writable = yes
guest ok = no
create mask = 0700
force create mode = 0700
directory mask = 0700
force directory mode = 0700
EOF

      # Apply 777 but without -R flag!
      chmod 777 /mnt"$var2"

      revalid_shared
    fi
  fi
}

function remove_shared {
VALUE1="nome_do_compartilhamento"

VALUE0=$(dialog --ok-label "Ok" --title "Remover Compartilhamento" --form "Nome do Compartilhamento a ser removido. \n
Seus dados nao sao apagados, apenas o compartilhamento sera removido!" 0 0 0 \
"ShrName:" 1 1 "$VALUE1" 1 11 30 0 \
3>&1 1>&2 2>&3 3>&- > /dev/tty)

    case $? in
      0) echo "." > /dev/null ;;
      1) echo "." > /dev/null ;;
    esac

  varaqui=$(echo "$VALUE0" | sed -n 1p)

  [ -f "/etc/samba/external/smb.conf.d/$varaqui.conf" ] || {
    dialog --title "ERRO" --msgbox "O compartilhamento nao existe!" 8 40
    return
  } && {
    if dialog --title 'Confirmacao' --backtitle 'Remover Compartilhamento' --yesno 'Deseja excluir este compartilhamento?' 0 0; then
      rm /etc/samba/external/smb.conf.d/"$varaqui".conf
      revalid_shared
      dialog --title "Confirmacao" --msgbox "Compartilhamento removido!" 5 40
    fi
  }
}

function revalid_shared {
  find /etc/samba/external/smb.conf.d/ -type f -print | sed -e 's/^/include = /' > /etc/samba/external/includes.conf
  smbcontrol all reload-config
}

#####################
# COMMON TEXT BOXES #
#####################

function dica0 {
  VALUE2=$(dialog --stdout --backtitle "Use as setas para navegar nos diretorios abaixo, use ESPACO 2x para confirmar uma pasta!" --title "Escolha a pasta alvo!" --dselect "/mnt" 15 40 | tail -c +5)
}

function dialog001 {
  dialog --title "VISUALIZANDO DADOS" --backtitle "$bktitle" --msgbox "Pressione OK abaixo para visualizar os resultados! \n\nNavegue com as setas para cima e para baixo. \n\nPara sair pressione 'q' !" 12 40
}

function dialog002 {
  dialog --title "ERRO" --msgbox "O(s) campo(s) exigidos nao pode(m) ficar em branco. \nPreencha-o(s) adequadamente!" 7 40
}

function faq_help {
clear
echo " "
echo "CUIDADO:"
echo "Se usar uma versao modificada do Windows, tipo o ReviCC ou W10Lite, tem uma grande chance de causar problemas/imprevistos!"
echo " "
echo "PROBLEMA: Nao consigo adicionar usuarios ou grupos ao Filtro de Seguranca!"
echo "SOLUCAO: Sair do Dominio e reingressar a maquina, pois esta perdeu a relacao de confianca com o AD. (ou aguarde umas boas horas o AD reverberar!)"
echo " "
echo "PROBLEMA: Permissoes ACLs incorretas para determinada pasta na rede; ou o compartilhamento foi feito com admin_users=yes; ou ainda nao quer funcionar SYNC CENTER."
echo "SOLUCAO: Crie uma nova pasta compartilhada estruturada temporaria com outro nome, crie pastas la dentro baseado em cada usuario; e copie as FACLs entre elas."
echo "Via SSH nao se esqueca de que a pasta /mnt/pasta_compartilhada sempre 777 e subpastas 0700."
echo ""
}

###############
# START HERE! #
###############

# Start all!
main_menu

# If any error...
exit 1

# COMMENTS if needed:
# EDITOR=nano ldbedit -H /var/lib/samba/private/sam.ldb --cross-ncs "(objectClass=nTDSDSA)" msDS-Behavior-Version
