<commit_before>#!/bin/bash
# set -x

# Script para alterar o nome da máquina: hostname
#  1) Durante instalação: /script/hostname.sh --init
#  2) Alteração interativa, pergunta: /script/hostname.sh
#  3) Modo batch: /script/hostname.sh novo.hostname
# O nome pode ser tanto simples(local) quanto FQDN, isso será tratado pelo sistema
#   a parte antes do primeiro "." é o hostname local, o resto é o domínio, o conjunto todo é o FQDN.
#   Isso não tem nada a ver com o que algum DNS possa estar apontando para a máquina,
#   Só o hostname local é obrigatório, no prompt sempre é só a primeira parte que aparece.
# SEMPRE é atualizada a entrada no /etc/hosts com o IP do eth0 e
# OBS: varia muito conforme o tipo de distro Ubuntu ou CentOS...

# O script básico veio daqui: https://www.centosblog.com/script-update-centos-linux-servers-hostname/
# Site: http://webcache.googleusercontent.com/search?q=cache:CcanLD8maQEJ:serverfault.com/questions/331936/setting-the-hostname-fqdn-or-short-name+&cd=5&hl=pt-BR&ct=clnk&gl=br
# Site: https://github.com/DigitalOcean-User-Projects/Articles-and-Tutorials/blob/master/set_hostname_fqdn_on_ubuntu_centos.md

#-----------------------------------------------------------------------
# Função para extrair IP da saída do ifconfig, deve funcionar sempre (pt, en, arm)
# uso: IP=$(ifconfig eth0 | GetIpFromIfconfig)
function GetIpFromIfconfig(){
  # sed -n '/.*inet /s/ *\(inet *\)\([A-Za-z\.: ]*\)\([\.0-9]*\).*/\3/p'
  sed -n '/.*inet /s/ *inet \+[A-Za-z\.: ]*\([\.0-9]*\).*/\1/p'
}

# Arquivo de Informação gerado
INFO_FILE=/script/info/hostname.var

# Lê Nome e versão da DISTRO
. /script/info/distro.var

# Processa a linha de comando
if [ "$1" == "--first" ]; then
  # Chamado pelo Script de instalação inicial
  FIRST="Y"
else
  FIRST="N"
  # o novo HOSTNAME pode ser fornecido pela linha de comando:
  #   operação automática, sem perguntas
  NEW_HOSTNAME="$1"
fi

# Lê o HOSTNAME atual
OLD_HOSTNAME="$( hostname )"

if [ -z "$NEW_HOSTNAME" ]; then
  if [ "$FIRST" == "Y" ]; then
    MSG="\nQual o NOME da máquina (hostname)?\n"
    MSG+="\n(deixe em branco para \"$OLD_HOSTNAME\""
    if [ "$NEW_HOSTNAME" == "localhost.localdomain" ]; then
      MSG+="- não recomendado)"
    else
      MSG+=")"
    fi
  else
    MSG="\nO hostname atual é: \"$OLD_HOSTNAME\"\n"
    MSG+="Qual o novo hostname?\n"
    MSG+="\n(deixe em branco para não alterar, mas corrige o /etc/hosts)"
  fi
  # uso do whiptail: http://en.wikibooks.org/wiki/Bash_Shell_Scripting/Whiptail
  NEW_HOSTNAME=$(whiptail --title "Configuração NFAS" --inputbox "$MSG" 11 74  3>&1 1>&2 2>&3)
  if [ $? -ne 0 ]; then
    echo "Operação cancelada!"
    exit 1
  fi
fi

# se está em brando, usa o que já existe
if [ -z "$NEW_HOSTNAME" ]; then
  NEW_HOSTNAME="$OLD_HOSTNAME"
fi

if [ "$NEW_HOSTNAME" == "$OLD_HOSTNAME" ]; then
  echo "Hostname continua sendo \"$OLD_HOSTNAME\", nada a ser feito..."
else
  echo "Alterando hostname de \"$OLD_HOSTNAME\" para \"$NEW_HOSTNAME\""
  # Alterando temporáriamente
  hostname "$NEW_HOSTNAME" &>2 >/dev/null
  if [ $? -ne 0 ]; then
    echo -e "\nERRO: novo hostname é inválido, operação Cancelada!\n"
    exit 2
  fi
  # altera os arquivos releventes para ficar permanente
  if [ "$DISTRO_NAME_VERS" == "CentOS 6" ]; then
    # Só para CentOS: tem que alterar na configuração de Rede
    sed -i "s/HOSTNAME=.*/HOSTNAME=$NEW_HOSTNAME/g" /etc/sysconfig/network
    # ?? precisa reinicar a rede para ter efeito
    # ?? service network restart
  fi
  # Guarda Hostname fornecido
  echo "HOSTNAME_INFO=\"$NEW_HOSTNAME\""  2>/dev/null >  $INFO_FILE
fi

# Altera o arquivo /ETC/HOSTS para ter:
#   <ip> <fullhostname> <localhostname>
NOME_LOCAL=$(hostname -s 2> /dev/null)
NOME_FULL=$(hostname)
[ "$NOME_LOCAL" == "$NOME_FULL" ] && NOME_FULL="" # elimina fqdn se não existe
MY_IP=$(ifconfig eth0 |GetIpFromIfconfig)
if [ -n "$MY_IP" ]; then
  HOSTS_MY_IP=$(cat /etc/hosts | grep "$MY_IP")
  if [ "$NOME_LOCAL" != "localhost" ]; then<commit_msg>hostname.sh: verifica novo hostname com uma ER e pergunta novamente<commit_after>#!/bin/bash
# set -x

# Script para alterar o nome da máquina: hostname
#  1) Durante instalação: /script/hostname.sh --init
#  2) Alteração interativa, pergunta: /script/hostname.sh
#  3) Modo batch: /script/hostname.sh novo.hostname
# O nome pode ser tanto simples(local) quanto FQDN, isso será tratado pelo sistema
#   a parte antes do primeiro "." é o hostname local, o resto é o domínio, o conjunto todo é o FQDN.
#   Isso não tem nada a ver com o que algum DNS possa estar apontando para a máquina,
#   Só o hostname local é obrigatório, no prompt sempre é só a primeira parte que aparece.
# SEMPRE é atualizada a entrada no /etc/hosts com o IP do eth0 e
# OBS: varia muito conforme o tipo de distro Ubuntu ou CentOS...

# O script básico veio daqui: https://www.centosblog.com/script-update-centos-linux-servers-hostname/
# Site: http://webcache.googleusercontent.com/search?q=cache:CcanLD8maQEJ:serverfault.com/questions/331936/setting-the-hostname-fqdn-or-short-name+&cd=5&hl=pt-BR&ct=clnk&gl=br
# Site: https://github.com/DigitalOcean-User-Projects/Articles-and-Tutorials/blob/master/set_hostname_fqdn_on_ubuntu_centos.md

#-----------------------------------------------------------------------
# Função para extrair IP da saída do ifconfig, deve funcionar sempre (pt, en, arm)
# uso: IP=$(ifconfig eth0 | GetIpFromIfconfig)
function GetIpFromIfconfig(){
  # sed -n '/.*inet /s/ *\(inet *\)\([A-Za-z\.: ]*\)\([\.0-9]*\).*/\3/p'
  sed -n '/.*inet /s/ *inet \+[A-Za-z\.: ]*\([\.0-9]*\).*/\1/p'
}

function AskHostname(){
  if [ "$FIRST" == "Y" ]; then
    MSG="\nQual o NOME da máquina (hostname)?\n"
    MSG+="\n(deixe em branco para \"$OLD_HOSTNAME\""
    if [ "$NEW_HOSTNAME" == "localhost.localdomain" ]; then
      MSG+="- não recomendado)"
    else
      MSG+=")"
    fi
  else
    MSG="\nO hostname atual é: \"$OLD_HOSTNAME\"\n"
    MSG+="Qual o novo hostname?\n"
    MSG+="\n(deixe em branco para não alterar, mas corrigir o /etc/hosts)"
  fi
  if [ -n "$1" ]; then
	MSG+="\n$1"
  else
    MSG+="\n"
  fi
  # uso do whiptail: http://en.wikibooks.org/wiki/Bash_Shell_Scripting/Whiptail
  NEW_HOSTNAME=$(whiptail --title "Configuração NFAS" --inputbox "$MSG" 13 74  3>&1 1>&2 2>&3)
  if [ $? -ne 0 ]; then
    echo "Operação cancelada!"
    exit 1
  fi
  # Validação do nome
  # ajudou: http://www.linuxquestions.org/questions/programming-9/bash-regex-for-validating-computername-872683/
  LC_CTYPE="C"
  NEW_HOSTNAME=$(echo $NEW_HOSTNAME | grep -E '^[a-zA-Z][-a-zA-Z0-9_\.]+[-a-zA-Z0-9_]$')
  if [ "$NEW_HOSTNAME" != "" ] &&                         # testa se vazio, pode ter sido recusado pela ER...
     [ "$NEW_HOSTNAME" == "${NEW_HOSTNAME//-_/}" ] &&     # testa combinação inválida
     [ "$NEW_HOSTNAME" == "${NEW_HOSTNAME//_-/}" ] ; then
    echo "Hostname ok"
    return 0
  else
    echo "Error"
    return 1
  fi
}

# Arquivo de Informação gerado
INFO_FILE=/script/info/hostname.var

# Lê Nome e versão da DISTRO
. /script/info/distro.var

# Processa a linha de comando
if [ "$1" == "--first" ]; then
  # Chamado pelo Script de instalação inicial
  FIRST="Y"
else
  FIRST="N"
  # o novo HOSTNAME pode ser fornecido pela linha de comando:
  #   operação automática, sem perguntas
  NEW_HOSTNAME="$1"
fi

# Lê o HOSTNAME atual
OLD_HOSTNAME="$( hostname )"

if [ -z "$NEW_HOSTNAME" ]; then
  # Pergunta o hostname na tela
  AskHostname
  ERR=$?
  while [ $ERR -ne 0 ]; do
    AskHostname "Nome inválido, por favor tente novamente"
    ERR=$?
  done
fi

# se está em branco, usa o que já existe
if [ -z "$NEW_HOSTNAME" ]; then
  NEW_HOSTNAME="$OLD_HOSTNAME"
fi

if [ "$NEW_HOSTNAME" == "$OLD_HOSTNAME" ]; then
  echo "Hostname continua sendo \"$OLD_HOSTNAME\", nada a ser feito..."
else
  echo "Alterando hostname de \"$OLD_HOSTNAME\" para \"$NEW_HOSTNAME\""
  # Alterando temporáriamente
  hostname "$NEW_HOSTNAME" &>2 >/dev/null
  if [ $? -ne 0 ]; then
    echo -e "\nERRO: novo hostname é inválido, operação Cancelada!\n"
    exit 2
  fi
  # altera os arquivos relevantes para ficar permanente
  if [ "$DISTRO_NAME_VERS" == "CentOS 6" ]; then
    # Só para CentOS: tem que alterar na configuração de Rede
    sed -i "s/HOSTNAME=.*/HOSTNAME=$NEW_HOSTNAME/g" /etc/sysconfig/network
    # ?? precisa reinicar a rede para ter efeito
    # ?? service network restart
  fi
  # Guarda Hostname fornecido
  echo "HOSTNAME_INFO=\"$NEW_HOSTNAME\""  2>/dev/null >  $INFO_FILE
fi

# Altera o arquivo /ETC/HOSTS para ter:
#   <ip> <fullhostname> <localhostname>
NOME_LOCAL=$(hostname -s 2> /dev/null)
NOME_FULL=$(hostname)
[ "$NOME_LOCAL" == "$NOME_FULL" ] && NOME_FULL="" # elimina fqdn se não existe
MY_IP=$(ifconfig eth0 |GetIpFromIfconfig)
if [ -n "$MY_IP" ]; then
  HOSTS_MY_IP=$(cat /etc/hosts | grep "$MY_IP")
  if [ "$NOME_LOCAL" != "localhost" ]; then
{'fraction_non_alphanumeric': 0.16191123188405798, 'fraction_numerical': 0.010869565217391304, 'mean_word_length': 3.2445939452186447, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 25, 'https://': 4, 'lorem ipsum': 0, 'www.': 3, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7204611', 'n_tokens_mistral': 3471, 'n_tokens_neox': 3334, 'n_words': 936}