Instala os modulos de bateria dos notebook da Acer

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

[ Hits: 1.898 ]

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

VPN automática entre sites

Script de instalação do Qmail

Monitorando processo do Squid em diferentes redes

Linkswitch

Medindo a velocidade de conexão


  

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