Enviado em 05/05/2024 - 13:53h
#!/bin/bash
# Programa criado para automatizar procedimento de instalação de
# módulo de saúde de BATERIA de notebook Acer no Kernel Linux
# quando uma nova versão do kernel Linux for instalada.
# Implementação inicial por "raulgrangeiro" <https://www.vivaolinux.com.br/~raulgrangeiro>
# Testado no Ubuntu 23.10 pelo usuário "raulgrangeiro" <https://www.vivaolinux.com.br>
# Tópico para o qual o programa foi escrito:
# <https://www.vivaolinux.com.br/topico/Kernel-Linux/Como-adicionar-um-modulo-ao-kernel-para-iniciar-automaticamente?pagina=01>
# Versão: 1.6
# Licença: GPLv3 <https://www.gnu.org/licenses/gpl-3.0.html>
#________________________________________________
## Changelog:
#
# Versão: 1.0
# * Mudança de nomes de variáveis.
# * Remoção de código inútil.
# * Simplificação de código para detectar numero de núcleos.
# * Adicionado versionamento
# * Bloco NEWS para registrar mudanças no programa.
# * Adicionado licenciamento de acordo com as regras do site vivaolinux.
#
# Versão: 1.1
# * Agora a compilação vai acontecer independente do arquivo acer-wmi-battery.ko já existir.
# * Bloco NEWS foi substituído pelo bloco changelog.
#
# Versão: 1.2
# * Adicionado configuração de habilitar ou desabilitar a depuração(habilite antes de reportar)
#
# Versão: 1.3
# * Novas e primeiras funções criadas
# * Adicionado configuração que permite selecionar sistema operacional
# * Agora se configurar Ubuntu e Debian algumas dependências serão instaladas automaticamente
#
# Versão: 1.4
# * Bug ao baixar o código fonte corrigido
# * Agora além do log também vai aparecer a execução no terminal
#
# Versão: 1.5
# * Modificação do diretório padrão de compilação para não ser dependente da pasta do usuário, sem dar erro de compilação.
# * Remoção automática do diretório padrão de compilação após execução.
#
# Versão: 1.6
# * Adicionado condições para excluir BATERIA
# * Novas funções adicionadas
# * Mudança nos nomes de funções para começar o nome com F_*** para diferenciar de variáveis
# * Mudança no conteúdo de variáveis e nova variável de configuração para deletar o diretório BATERIA
#________________________________________________
set -e -u # Não editar esta parte do programa
#________________________________________________
## Configurações do programa "driver_acer-wmi-battery_install.sh"
## Para facilitar a configuração do usuário comum
## Essas configurações são opcionais você pode manter a configuração já definida
## Habilite a depuração caso for reportar um erro no programa
BATERIA="$(mktemp)" # Variável que determina onde será a compilação
CPU_CORES="$(nproc)" # Variável que define quantos núcleos será usado, detecta automaticamente
LOG_DA_EXECUCAO="/var/log/acer_linux_bateria.log" # Variável que define onde o log será gerado
DEPURACAO="0" # O valor 1(um) habilita a depuração e o valor 0(zero) desabilita
QUAL_E_O_GNU_LINUX="1" # Valor 0(zero) para Debian e Ubuntu e valor 1 para outros GNU/Linux
EXCLUIR_BATERIA="1" # O valor 1(um) determina que o diretório BATERIA deve ser excluído
### Fim da configuração
### A partir daqui para baixo não edite o programa
#________________________________________________
## Depuração
if [[ "${DEPURACAO}" == "1" ]]
then
set -x -e -u
fi
#________________________________________________
## Funções
# Detecta se a dependências build-essential esta instalada
F_testar_essential() {
dpkg --list | grep 'build-essential' | sed 's/ .*//;s/.* //'
}
# Detecta se a dependências linux-headers esta instalado
F_testar_headers() {
dpkg --list | grep "linux-headers-$(uname -r)" | sed 's/ .*//;s/.* //'
}
# Verifica se o GIT esta instalado
F_testar_git() {
if type git >/dev/null 2>&1
then
echo "0"
fi
}
# Filtrar se o diretório BATERIA no segundo delimitador contem "tmp"
F_delimitador() {
echo "${BATERIA}" | cut -d'/' -f2
}
# Filtrar se o conteúdo da variável BATERIA tem "/" como primeiro caractere
F_barra() {
echo "${BATERIA}" | sed 's/^\(.\).*/\1/p'
}
#________________________________________________
# Tudo executado a partir daqui vai ser gravado em LOG_DA_EXECUCAO
{
# Verifica se é superusuario e notifica, caso não seja aborta a execução
if [[ "$(id -u)" == "0" ]]
then
echo "Você é root!"
else
echo "Você não é root, execute como root!"
exit 2
fi
# Verifica se o diretório BATERIA não existe
if [[ ! -e "${BATERIA}" ]] # Verifica se o diretório BATERIA não existe
then
mkdir -p "${BATERIA}" # Se o diretório BATERIA não existir ele será criado
else
if [[ ! -d "${BATERIA}" ]] # Verifica se o BATERIA não é diretório
then
# Existe algum arquivo no diretório BATERIA e por isso é abortado
echo "${BATERIA} é um arquivo e deveria ser diretório, remova o arquivo e tente novamente, abortado!"
exit 3
else
# Se o arquivo acer_wmi_battery existir ele será deletado
if [[ -f "${BATERIA}/acer-wmi-battery.ko" ]]
then
rm "${BATERIA}/acer-wmi-battery.ko"
fi
fi
fi
cd "${BATERIA}" # Entra no diretório BATERIA
# Instalar as dependências de compilação segundo github do projeto "acer-wmi-battery" caso ainda não estejam instaladas
if [[ "${QUAL_E_O_GNU_LINUX}" == "0" ]]
then
if [[ "$(F_testar_essential)" != 'build-essential' || "$(F_testar_headers)" != "linux-headers-$(uname -r)" || "$(F_testar_git)" != "0" ]]
then
apt-get -y install build-essential linux-headers-"$(uname -r)" git
fi
fi
# Baixa o código fonte do driver no diretório BATERIA
if [[ "$(echo *)" == "*" ]]
then
git clone https://github.com/frederik-h/acer-wmi-battery.git
cp -r "${BATERIA}"/acer-wmi-battery/* "${BATERIA}/"
rm -d -r "${BATERIA}/acer-wmi-battery/"
fi
make -j"${CPU_CORES}" # Inicia a compilação usando o numero de núcleos definido em cpu_cores
# Faz uma copia do arquivo do modulo compilado para os módulos do kernel carregado
cp "${BATERIA}/acer-wmi-battery.ko" "/lib/modules/$(uname -r)"
depmod # Gerar arquivos modules.dep e map
modprobe acer_wmi_battery # Carrega o módulo do kernel
# Remove o arquivo acer-wmi-battery.ko caso ele seja um arquivo
[[ -f "${BATERIA}/acer-wmi-battery.ko" ]] && rm "${BATERIA}/acer-wmi-battery.ko" ||
echo "Falha ao remover acer-wmi-battery.ko, arquivo não existe ou é um diretório!"
# Se as 4 condições for verdadeiro remove o diretório de compilação completamente
if [[ "${EXCLUIR_BATERIA}" == "1" && -d "${BATERIA}" && "$(F_delimitador)" == "tmp" && "$(F_barra)" == "/" ]]
then
rm -r -d "${BATERIA}"
else
echo "O diretório ${BATERIA} não foi excluído, dever ser um diretório dentro de /tmp/ para que seja excluído!"
fi
} 2>&1 | tee -a "${LOG_DA_EXECUCAO}" # Usa o tee para gravar o log
++ id -u
+ [[ 0 == \0 ]]
+ echo 'Você é root!'
Você é root!
+ [[ ! -e /tmp/tmp.blH4OjGEAH ]]
+ [[ ! -d /tmp/tmp.blH4OjGEAH ]]
+ echo '/tmp/tmp.blH4OjGEAH é um arquivo e deveria ser diretório, remova o arquivo e tente novamente, abortado!'
/tmp/tmp.blH4OjGEAH é um arquivo e deveria ser diretório, remova o arquivo e tente novamente, abortado!
+ exit 3