Instala os modulos de bateria dos notebook da Acer

Publicado por aguamole (última atualização em 08/07/2024)

[ Hits: 865 ]

Download driver_acer-wmi-battery_install.tar.gz




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.

  



Esconder código-fonte

#!/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.9.1
# 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
#
# Versão: 1.7
#    * Bug do diretório temporário corrigido
#
# Versão: 1.8
#    * Bug da função F_barra ao determinar se o diretório temporário começa com "barra" corrigido
#    * Criado nova função F_instalacao
#    * Criado nova função F_exibir_ajuda
#    * Agora o programa suporta os parâmetros --help, --install
#    * Opção de instalar o programa no systemd para iniciar junto com o sistema, tornando o programa completamente automático
#
# Versão: 1.9
#    * Adicionado a função F_tamanho_log para verificar o tamanho em bytes do arquivo de LOG_DA_EXECUCAO
#    * Adicionado a variável COMPRESSAO_LOG, 1(um) habilita a compressão do arquivo de registro de log
#    * Adicionado um recurso de compressão do LOG_DA_EXECUCAO caso seja habilitado
#
# Versão: 1.9.1
#    * Adicionado nova função para adicionar o recurso de desinstalação
#    * Parâmetro --uninstall adicionado para desinstalar o programa
#    * Agora o programa consegue se desinstalar caso o nome do arquivo do programa seja driver_acer-wmi-battery_install.sh
# durante a instalação, o programa não suporta desinstalação com o nome do programa personalizado.
#________________________________________________

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_NUCLEO="$(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
COMPRESSAO_LOG="1"   # Valor 1(um) para habilita a compressão do arquivo LOG_DA_EXECUCAO

### 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
        return "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}" | while IFS= read -r line
    do
        echo "${line:0:1}"
    done
}
# Função para instalar "driver_acer-wmi-battery_install.sh" no systemd
F_instalacao() {

local caminho
local programa

# Variaveis que determina a localização do programa "driver_acer-wmi-battery_install.sh"
caminho="$(cd "$(dirname "${0}")" && pwd)"
programa="$(basename "${0}")"

# Verifica se o programa "driver_acer-wmi-battery_install.sh" foi encontrado
if [[ -f "${caminho}/${programa}" ]]
then
    if [[ ! -e "/sbin/${programa}" ]]
    then
        cp "${caminho}/${programa}" "/sbin/"   # Faz a copia do programa para "/sbin/"
        chmod +x "/sbin/${programa}"

        # Configura o systemd
        echo "[Unit]
Description=Serviço de inicialização da compilação do driver da bateria.

[Service]
Type=simple
User=root
ExecStart="/sbin/${programa}"

[Install]
WantedBy=multi-user.target" >"/etc/systemd/system/acer_wmi_battery.service"

        chmod +x "/etc/systemd/system/acer_wmi_battery.service"
        systemctl enable acer_wmi_battery.service
        systemctl start acer_wmi_battery.service
        return "0"
    else
        echo "Já existe /sbin/${programa} e não deveria existir. Saindo ..."
        return "5"
    fi

else
    echo -e "O executavel do programa ${programa} não foi encontrado, \
execute o programa ${programa} passando o caminho completo. Saindo..."
    return "4"
fi
}
F_exibir_ajuda() {

echo "Este programa tem a utilidade de instalar o driver da bateria dos notebook Acer.
Execute por sua conta e risco!

Opções disponíveis:
--help: Exibe esta mensagem de ajuda.
--install: Instala o programa no sistema.

Caso não seja definido algum parâmetro o programa vai executar sem instalar."
}
# Detecta o tamanho do LOG_DA_EXECUCAO e caso seja maior que 64KB ele será comprimido
F_tamanho_log() {
    du -b "${LOG_DA_EXECUCAO}" | grep -oE '[0-9]+' | head -n 1
}
# Esta função desinstala o programa do systemd
F_desinstalar() {

    local driver_remove
    local servico
    local programa

    driver_remove="/sbin/driver_acer-wmi-battery_install.sh"
    servico="/etc/systemd/system/acer_wmi_battery.service"
    programa="$(basename "${0}")"
    disintalar_driver="/sbin/${programa}"

    systemctl stop acer_wmi_battery.service
    systemctl disable acer_wmi_battery.service

    if [[ -f "${driver_remove}" && -f "${servico}" ]]
    then
        rm "${driver_remove}"
        rm "${servico}"
        return "0"
    else
        if [[ -f "${disintalar_driver}" && -f "${servico}" ]]
        then
            rm "${disintalar_driver}"
            rm "${servico}"
            return "0"
        else
            echo "O arquivo driver_acer-wmi-battery_install.sh e ou /etc/systemd/system/acer_wmi_battery.service foi renomeado ou deletado..."
            echo "Esse erro não é fatal..."
            return "7"
        fi
    fi
}
#________________________________________________

# 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ê não é root, execute como root!"
    exit 2
fi

# Caso todas as condições seja verdadeiro, será comprimido o LOG_DA_EXECUCAO
if [[ "${COMPRESSAO_LOG}" == "1" && -f "${LOG_DA_EXECUCAO}" && "$(F_tamanho_log)" -ge "64000" ]]
then
    gzip -9 "${LOG_DA_EXECUCAO}"
fi

case "${1}" in
    --help)
        F_exibir_ajuda   # Aqui é onde sera invocada a função de ajuda
        ;;
    --install)
        F_instalacao   # Inicia a instalação se requisitada
        FUNCAO_INSTALACAO="${?}"
        [[ "${FUNCAO_INSTALACAO}" != "0" ]] && echo "Falha na instalação! Saindo..." &&
        exit "${FUNCAO_INSTALACAO}"
        ;;
    --uninstall)
        F_desinstalar
        FUNCAO_DESINTALACAO="${?}"
        [[ "${FUNCAO_DESINTALACAO}" != "0" ]] && echo "Saindo..." &&
        exit "${FUNCAO_DESINTALACAO}"
        ;;
    *)
        if [[ -n "${1}" ]]   # Verifica se o primeiro parâmetro não é vazio e se verdadeiro imprime
        then
            echo "Opção inválida. Use --help para obter ajuda."
            exit "6"
        fi
        ;;
esac

# Verifica se o kernel Linux atual contem a compilação "acer-wmi-battery.ko" em /lib/modules/$(uname -r)
[[ -f "/lib/modules/$(uname -r)/acer-wmi-battery.ko" ]] && exit "0"

# 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_NUCLEO}"   # Inicia a compilação usando o numero de núcleos definido em CPU_NUCLEO

# 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

Scripts recomendados

xt_geoip_build

Bloquear o DHCP de dispositivos móveis

Projeto Wine's Faces

Script para atualizar o sistema

Script para rodar software Mr Bayes em paralelo


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts