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

推荐订阅源

Google DeepMind News
Google DeepMind News
Jina AI
Jina AI
IT之家
IT之家
J
Java Code Geeks
博客园_首页
Stack Overflow Blog
Stack Overflow Blog
量子位
I
InfoQ
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
V
V2EX
博客园 - Franky
U
Unit 42
S
SegmentFault 最新的问题
美团技术团队
The Register - Security
The Register - Security
Last Week in AI
Last Week in AI
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
博客园 - 叶小钗
M
MIT News - Artificial intelligence
博客园 - 聂微东
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Troy Hunt's Blog
B
Blog
P
Palo Alto Networks Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy International News Feed
K
Kaspersky official blog
The GitHub Blog
The GitHub Blog
C
Cisco Blogs
Microsoft Azure Blog
Microsoft Azure Blog
F
Fortinet All Blogs
S
Schneier on Security
C
CERT Recently Published Vulnerability Notes
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Engineering at Meta
Engineering at Meta
TaoSecurity Blog
TaoSecurity Blog
小众软件
小众软件
T
Threatpost
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Martin Fowler
Martin Fowler
AWS News Blog
AWS News Blog
V
Visual Studio Blog
Simon Willison's Weblog
Simon Willison's Weblog
H
Heimdal Security Blog

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 技术站 记录一下 docker 里跑 dsm 迅雷套件的过程 - Dosk 技术站 docker 更新,整理 build - Dosk 技术站 记录下 openwrt 改交换机的步骤,以及注意事项 - Dosk 技术站 docker 里跑 openwrt 遇到的奇奇怪怪问题修复 - Dosk 技术站 OpenWrt 添加一个 socat 的 luci web 界面 - Dosk 技术站 Cloudflare DDNS 脚本,适配 OpenWrt,自带的不好用 - Dosk 技术站 在 NAS 里优雅的使用迅雷 - Dosk 技术站 记录一次 rpi4b 使用 openwrt docker 接管网络 - Dosk 技术站 悲伤是一件很耗费精力的事情 - Dosk 技术站 Tablet 板绘 - 梅花 - Dosk 技术站 Chromium 代码下并发 Callback 的骚操作 - Dosk 技术站 Tablet 板绘 - 月光 - Dosk 技术站 测试测试 Forestry - 一个 Jekyll CMS - Dosk 技术站 如何从 Chromium “偷” UI - Dosk 技术站 Cocoa 如何创建置于全屏之上的 NSWindow - Dosk 技术站 修改 Prose 支持中文标题 - Dosk 技术站 macOS & Windows 实现系统/进程/线程的 CPU 统计 - Dosk 技术站 STL 内 std::{bind/tuple/function} 简单实现 - Dosk 技术站 Cocoa 修改 TitleBar 样式 - 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