首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用日志记录和版本检查升级Firefox量子

使用日志记录和版本检查升级Firefox量子
EN

Code Review用户
提问于 2019-07-29 18:01:15
回答 1查看 62关注 0票数 2

这是第一次发布的这里脚本的更新版本。

具体来说,我首先想将日志保存到"$HOME/.logs/ffupgrade.log"的日志文件中,但我不确定这是一个好做法还是应该登录到syslog。当登录到文件时,我会在开始时添加另一个变量logfile,并调整类似的函数(对于successwarning也是如此):

代码语言:javascript
复制
logfile="$HOME/.logs/ffupgrade.log"

error_exit() {
    msg="$1"
    echo -e "$(date) ${red}ERROR:${nocolor} ${msg}" 1>&2
    echo "$(date) ERROR: $msg" >> "$logfile"
    exit 1
}

我还想知道是否最好只使用sudo运行需要它的命令,还是在提示输入密码之后,以sudo的形式重新运行整个脚本:

代码语言:javascript
复制
if [[ "$EUID" != 0 ]]; then
    warning "Please run as root"
    sudo "$0" "$@"
fi

一如既往,任何其他评论也同样受到欢迎。

代码语言:javascript
复制
#!/bin/bash

# firefox_upgrade - program to upgrade firefox quantum

red="\033[1;31m"
yellow="\033[1;33m"
green="\033[1;32m"
nocolor="\033[0m"

error_exit() {
    msg="$1"
    echo -e "$(date) ${red}ERROR:${nocolor} ${msg}" 1>&2
    logger "ERROR: $msg"
    exit 1
}

warning() {
    msg="$1"
    echo -e "$(date) ${yellow}WARNING:${nocolor} ${msg}"
    logger "WARNING: $msg"
}

success() {
    msg="$1"
    echo -e "$(date) ${green}SUCCESS:${nocolor} ${msg}"
    logger "SUCCESS: $msg"
}

ffbin="/opt/firefox"
fflink="/usr/bin/firefox-quantum"

ffpath=
fffile=

# check if path argument was provided
if [ $# -ne 1 ]; then
    error_exit "usage: $0 firefox_quantum_path"
fi

echo "Checking for root access.."
if [[ "$EUID" = 0 ]]; then
    success "already root"
else
    sudo -k # make sure to ask for password on next sudo
    if sudo true; then
        success "correct password"
    else
        error_exit "wrong password"
    fi
fi

# parsing path and filename
ffpath="$1"
fffile="${ffpath##*/}"

# check if input is a valid file
if [ ! -f "$ffpath" ]; then
    error_exit "Invalid file! Aborting."
fi

# check the firefox version
ffpref="${fffile%.*}"
ffversion="${ffpref//[^0-9]/}"
ffinstalled_version="$($fflink --version | sed 's/[^0-9]*//g')"

vind=0
if [[ "$ffversion" < "$ffinstalled_version" ]]; then
    warning "The version to be installed is lower than the installed version"
    vind=1
elif [[ "$ffversion" = "$ffinstalled_version" ]]; then
    warning "The version to be installed is the same as the installed version"
    vind=1
fi

if [[ "$vind" = 1 ]]; then
    echo "Do you want to continue anyway?"
    select yn in "Yes" "No"; do
        case $yn in
            Yes ) : ;;
            No ) exit;;
        esac
    done
fi

# removing previous install, if existent
if [ -e "$ffbin" ]; then
    sudo rm -rf "$ffbin"
    #mv "$ffbin" "$ffbin.old"
    success "removed previous install"
else
    warning "$ffbin doesn't exist."
fi

# removing previous symlink, if existent
if [ -L "$fflink" ]; then
    sudo rm -f "$fflink"
    success "removed previous symlink"
else
    warning "$fflink doesn't exist."
fi

# copying the tar to /opt
if ! sudo rsync -ah --progress "$ffpath" "/opt/$fffile"; then
    error_exit "Couldn't copy the tarball. Aborting."
fi
success "tarball copied"

# unpacking the tar if successfully changed directory
if ! sudo tar -jxvf "/opt/$fffile" -C /opt; then
    error_exit "Could not extract file! Aborting."
fi
success "tarball was extracted"

# if unpack was successful, set permissions, create symlink, and remove tar
sudo chmod 755 "$ffbin"
success "permissions set"
sudo ln -s "$ffbin/firefox" "$fflink"
success "symlink created"
sudo rm "/opt/$fffile"
success "tarball removed from /opt"
success "Firefox was upgraded"
```#qcStackCode#
代码语言:javascript
复制
EN

回答 1

Code Review用户

回答已采纳

发布于 2019-07-29 20:49:02

To sudo或not to sudo

我还想知道是否最好只使用sudo运行需要它的命令,或者在提示密码为sudo之后,将整个脚本作为sudo重新运行: if [];然后警告“请以根用户身份运行”sudo "$0“"$@”fi

脚本可以在没有root权限的情况下完成它的工作吗?此脚本无法修改,因为它希望修改通常只能由root编辑的文件,如/opt/usr/bin。因此,脚本需要root权限。处理此问题的一个好方法是检查用户是否拥有root权限,如果情况并非如此,则退出,例如:

代码语言:javascript
复制
if [[ "$EUID" != 0 ]]; then
    warning "Please run as root"
    exit 1
fi

没有必要在脚本中包含获取根权限的复杂性。通过上面简单的检查,用户可以切换到root用户,或者用sudo重新运行脚本。脚本的其余部分可以承担root的特权(和责任)。

关于日志记录

首先,我想将日志保存到"$HOME/.logs/ffupgrade.log"的日志文件中,但我不确定这是一个好做法,还是应该登录到syslog

我不太清楚。但我可以推理。

这真的属于syslog吗?这个脚本升级了Firefox。让我们看看类似的东西,例如,当您使用Linux系统的标准包管理器升级软件时会发生什么。我刚刚在我手头的Debian系统中升级了一些东西,它没有在syslog中记录任何关于它的信息。无论升级是在显式用户操作上进行还是自动进行,都可能与此相关。我的结论是,当用户手动升级包时,添加到syslog中是不够值得注意的。

另一方面,如果您一直登录到~/.logs,会发生什么?它会在没有清理的情况下永远积累。默认情况下,您可能希望在系统中记录需要记录轮换策略的其他地方,或者记录如何在脚本中设置该策略。这可能是一个有效的论点,但我怀疑您的Firefox升级日志将积累到任何有意义的地方。所以..。我不会为轮换而烦恼。如果脚本只以root的形式运行,那么我将在比~/.logs更可见的地方登录,比方说/var/log

当登录到一个文件时,我会在开始时添加另一个变量logfile,并调整如下的函数(对于successwarning类似)

我会添加一个logger函数来封装这个逻辑,覆盖logger程序,然后您就不需要接触其他函数了。

对局部变量

使用local

对函数中的局部变量使用local可以避免在全局范围内设置值,这可能是一个严重错误的来源。

命令行中使用的

双引号变量

这里的$fflink应该用双引号括起来:

Ffinstalled_version=$($fflink--版本sed‘S/*//g’)

比较版本

我对比较版本有疑问。脚本删除所有非数字字符,然后按字典顺序比较值。你确定它能可靠地工作吗?最好在评论中包括一些示例版本,以帮助读者放心。

另外,为了删除非数字字符,我将使用tr -cd 0-9而不是sed 's/[^0-9]*//g'

验证出口代码

脚本做了一些事情,并告诉用户一些可能不是真的事情,例如:

sudo chmod 755 "$ffbin“成功权限设置为”sudo ln -s "$ffbin/firefox“$fflink”success“符号链接创建了”sudo rm "/opt/$fffile“成功"tarball”从/opt中移除“成功”火狐升级

即使这些命令失败,脚本也会打印成功消息,并愉快地继续执行。

使用更好的变量名

vind是什么?

使用详细模式更多的

我会将-v添加到所有支持它的有趣命令中,例如rmmv

1>&2替换为>&2

重定向的默认文件描述符是1,不需要显式地拼写它。

简单比复杂

[ $# != 1 ]可能比[ $# -ne 1 ]更自然,因此更容易理解。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/225152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档