惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
H
Help Net Security
雷峰网
雷峰网
V
Visual Studio Blog
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
Hugging Face - Blog
Hugging Face - Blog
爱范儿
爱范儿
IT之家
IT之家
Engineering at Meta
Engineering at Meta
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
月光博客
月光博客
A
About on SuperTechFans
B
Blog RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale

Dosk 技术站

华为荣耀电视盒子刷 Armbian - Dosk 技术站 记录一个没意义的 usb wifi 驱动编译 - Dosk 技术站 我的 2024 - Dosk 技术站 unRAID 7.0.0-beta.1 - Dosk 技术站 关于 unraider 的开心版 - Dosk 技术站 unRAID 6.12.7-rc2 进展 - Dosk 技术站 每年问自己 40 个问题 - Dosk 技术站 Kubernetes 集群导航页 - Dosk 技术站 2023 年度总结 - Dosk 技术站 N100 万兆软路由最终形态 - Dosk 技术站 N100 软路由改造下散热 - Dosk 技术站 N100 万兆软路由测测速 - Dosk 技术站 整活新玩具,半 DIY 一个万兆软路由 - Dosk 技术站 玩玩 WebAuthn:RP2040 One - Dosk 技术站 关于最近以及后续要做什么 - Dosk 技术站 unRAID 6.12.0-rc7/6.12.0-rc6.13 - Dosk 技术站 unRAID 6.12.0-beta18 试用 - Dosk 技术站 unRAID 6.11.4 如何继续开心 - Dosk 技术站 cert-manager 基于 acme.sh 的 webhook - Dosk 技术站 unRAID 虚拟机运行 unRAID 简单步骤 - Dosk 技术站 解决 Chrome 原生谷歌翻译功能的一个思路:3/3 - Dosk 技术站 解决 Chrome 原生谷歌翻译功能的一个思路:1/3 - Dosk 技术站 继续,unraid 6.11 happy 的方法 - Dosk 技术站 适用于 k8s 的 frpc ingress 实现 - Dosk 技术站 实现了一个简单的通配 DNS 服务 - Dosk 技术站 代码更新,happy unraid 懒人版 - Dosk 技术站 复盘一次群晖的 btrfs + docker:dind 引发的灾难 - Dosk 技术站 unraid 官方版不修改不用 keymaker 可持续 happy 的方法 - Dosk 技术站 unraid 实现完美硬盘启动 - Dosk 技术站 rpi3b+ 跑 pi-kvm 项目记录 - Dosk 技术站
unraid 命令行包管理器 - Dosk 技术站
2022-09-26 · via Dosk 技术站
#!/bin/bash

REPO_VERS="slackware64"
REPO_NAME=(
  "slackware"
  "conraid"
)
declare -A REPO_URLS=(
  ["slackware"]="https://mirrors.slackware.com/slackware/slackware64-current"
  ["conraid"]="https://slack.conraid.net/repository/slackware64-current"
)

opt="$1"
shift
pkgs_list="$@"
mkdir -p /boot/extra

log() {
  eol=${4:-"\n"}
  echo -n -e "$1\033[0;35m[$2]\033[0m $3$eol" 1>&2
}

usage() {
  cat << EOF
Usage:
  spkg [OPERATION] [PACKAGE_NAME...]
    OPERATION: update/upgrade/search/install/remove/list/help
EOF
}

remove_last_column() {
  awk -F- 'OFS="-"{$NF="";print}' | sed 's/-$//g' | xargs
}

get_pkg_name() {
  remove_last_column | remove_last_column | remove_last_column
}

get_pkg_vers() {
  remove_last_column | remove_last_column | awk -F- '{print $NF}'
}

get_pkg_arch() {
  remove_last_column | awk -F- '{print $NF}'
}

ensure_update() {
  cached="yes"
  for repo in "${REPO_NAME[@]}";
  do
    if ! [ -f /tmp/spkg.d/${repo}.list ];
    then
      cached="no"
    fi
  done
  if [ "$cached" != "yes" ];
  then
    log '' '*' 'No repo cache in local, need run update first !'
    exit -2
  fi
}

case $opt in
  update)
    log '' $(tr 'a-z' 'A-Z' <<< $opt) "Update repo ..."
    rm -rvf /tmp/spkg.d >/dev/null 2>&1
    mkdir -p /tmp/spkg.d
    for repo in "${REPO_NAME[@]}";
    do
      repo_pkgs_url="${REPO_URLS[$repo]}/PACKAGES.TXT"
      log '' '<=>' "Update repo($repo) url($repo_pkgs_url) ..."
      curl -fSL --progress-bar "$repo_pkgs_url" -o /tmp/spkg.d/$repo.list
    done
    log '' '***' 'Done !'
    ;;
  search)
    ensure_update
    log '' $(tr 'a-z' 'A-Z' <<< $opt) "Search repo for: $pkgs_list ..."
    printf "%-32s %-20s %-20s\n" "PACKAGE" "VERSION" "ARCHITECTURE"
    for pkg in $pkgs_list;
    do
      files="$(cat /tmp/spkg.d/*.list | grep -ni "PACKAGE NAME:  *${pkg}*" | awk '{print $3}')"
      if [ "$files" != "" ];
      then
        for file in $files;
        do
          name="$(get_pkg_name <<< "${file}")"
          vers="$(get_pkg_vers <<< "${file}")"
          arch="$(get_pkg_arch <<< "${file}")"
          if [ "$name" != "" ];
          then
            printf "%-32s %-20s %-20s\n" "$name" "$vers" "$arch"
          fi
        done
      fi
    done
    ;;
  install|upgrade)
    ensure_update
    opt_txt="$(tr 'a-z' 'A-Z' <<< ${opt:0:1})${opt:1}"
    log '' $(tr 'a-z' 'A-Z' <<< $opt) "${opt_txt} packages: ${pkgs_list} ..."
    for pkg in $pkgs_list;
    do
      grep_command="grep -niH 'PACKAGE NAME:  ${pkg}'"
      for repo in "${REPO_NAME[@]}";
      do
        grep_command="$grep_command /tmp/spkg.d/${repo}.list"
      done
      info=""
      lines="$(eval "$grep_command" | sed 's/PACKAGE NAME:  //g')"
      for line in $lines;
      do
        maybe_file="$(awk -F: '{print $3}' <<< "${line}")"
        maybe_name="$(get_pkg_name <<< $maybe_file)"
        if [ "$maybe_name" = "$pkg" ];
        then
          info="$line"
        fi
      done
      if [ "$info" = "" ];
      then
        log '' '***' "Package not found: $pkg ..."
        continue
      fi
      repo=$(basename $(awk -F: '{print $1}' <<< "$info") .list)
      line="$(awk -F: '{print $2}' <<< "${info}")"
      file="$(awk -F: '{print $3}' <<< "${info}")"
      location_all="$(tail +${line} /tmp/spkg.d/${repo}.list | grep "PACKAGE LOCATION")"
      location="$(head -n1 <<< "${location_all}" | awk '{print $3}')"
      file_url="${REPO_URLS[$repo]}/$location/$file"
      file_url="${file_url/\.\//}"
      log '' '<=>' "Download pkg($file) in repo($repo) with url($file_url) ..."
      curl -fSL --progress-bar "$file_url" -o /boot/extra/${file}
      log '' '<=>' "${opt_txt} pkg($file) in repo($repo) with url($file_url) ..."
      eval "${opt}pkg /boot/extra/${file}"
      log '' '***' "Package $file installed !"
    done
    ;;
  remove)
    ensure_update
    log '' $(tr 'a-z' 'A-Z' <<< $opt) "Remove packages: ${pkgs_list} ..."
    for pkg in $pkgs_list;
    do
      file=""
      files="$(ls /var/log/packages/${pkg}* 2>/dev/null | xargs basename 2>/dev/null)"
      for maybe_file in $files;
      do
        maybe_name="$(get_pkg_name <<< $maybe_file)"
        if [ "$maybe_name" = "$pkg" ];
        then
          file="$maybe_file"
        fi
      done
      if [ "$file" = "" ];
      then
        log '' '***' "Package not install: $pkg ..."
        continue
      fi
      removepkg $file
      for file in $(find /boot/extra -type f -name "$file*");
      do
        rm $file
      done
    done
    ;;
  list)
    ensure_update
    log '' $(tr 'a-z' 'A-Z' <<< $opt) "List packages: ${pkgs_list} ..."
    printf "%-32s %-20s %-20s\n" "PACKAGE" "VERSION" "ARCHITECTURE"
    pkgs="$(sed 's/ /\\|/g' <<< "${pkgs_list}")"
    files="$(ls /var/log/packages/ | grep "$pkgs")"
    if [ "$files" != "" ];
    then
      for file in $files;
      do
        name="$(get_pkg_name <<< "${file}")"
        vers="$(get_pkg_vers <<< "${file}")"
        arch="$(get_pkg_arch <<< "${file}")"
        if [ "$name" != "" ];
        then
          printf "%-32s %-20s %-20s\n" "$name" "$vers" "$arch"
        fi
      done
    fi
    ;;
  *)
    log '' '*' 'No such operation !'
    usage
    exit -1
    ;;
esac

exit 0