1
1
mirror of https://github.com/nboughton/dotfiles synced 2024-11-22 14:51:56 +01:00

rewrote aur package check for my maintained npm pgs

This commit is contained in:
Nick Boughton 2020-12-10 23:30:28 +00:00
parent 0188f79629
commit 3c5e384952
11 changed files with 261 additions and 179 deletions

@ -8,10 +8,10 @@
"margin-left": 5,
"modules-left": [
"sway/workspaces",
"idle_inhibitor",
"sway/mode",
],
"modules-center": [
"clock"
],
"modules-right": [
"cpu",
@ -22,14 +22,14 @@
"disk#1",
"disk#2",
"custom/separator",
"pulseaudio",
"custom/separator",
"backlight",
"custom/separator",
"battery",
"custom/separator",
"pulseaudio",
"custom/pacman",
"custom/aurcheck",
"clock"
"custom/auroch",
"tray"
],
"sway/workspaces": {
"disable-scroll": true,
@ -48,6 +48,10 @@
"sway/mode": {
"format": "{}"
},
"tray": {
"icon-size": 12,
"spacing": 10
},
"backlight": {
"format": "{icon} {percent}%",
"format-icons": ["", ""],
@ -88,13 +92,6 @@
"interval": 1,
"format": " {usage:2}%"
},
"idle_inhibitor": {
"format": "{icon}",
"format-icons": {
"activated": "",
"deactivated": ""
}
},
"battery": {
"states": {
"good": 95,
@ -126,15 +123,14 @@
"interval": 5,
"exec": "cat ~/tmp/updates.json",
"exec-if": "exit 0",
"on-click": "alacritty --class aptus-upgrade -e ~/.config/waybar/modules/updates/update-system.sh; systemctl --user start updates.service; pkill -RTMIN+8 waybar",
"signal": 8,
"on-click": "alacritty --class aptus-upgrade -e ~/.config/waybar/modules/updates/update-system.sh; systemctl --user start updates.service",
"tooltip": true
},
"custom/aurcheck": {
"custom/auroch": {
"format": " {}",
"return-type": "json",
"exec": "cat ~/tmp/aur-vcheck.json",
"on-click": "systemctl --user start vcheck.service",
"exec": "cat ~/tmp/auroch.json",
"on-click": "systemctl --user start auroch.service",
"interval": 5,
"tooltip": true
},
@ -156,7 +152,7 @@
"margin-bottom": 5,
"modules-left": ["custom/weather", "wlr/taskbar"],
"modules-center": [],
"modules-right": ["tray", "custom/spotify"],
"modules-right": ["idle_inhibitor", "custom/spotify"],
"wlr/taskbar": {
"all-outputs": false,
"format": "{icon} {title:.15}...",
@ -166,15 +162,18 @@
"on-middle-click": "close",
"on-right-click": "minimize"
},
"tray": {
"icon-size": 12,
"spacing": 10
},
"custom/weather": {
"format": "{:.20}",
"exec": "~/.config/waybar/modules/weather.sh",
"interval": 3600
},
"idle_inhibitor": {
"format": "{icon}",
"format-icons": {
"activated": "",
"deactivated": ""
}
},
"custom/spotify": {
"interval": 1,
"return-type": "json",

@ -1,85 +0,0 @@
package main
import (
"encoding/json"
"fmt"
"log"
"os"
"os/exec"
"strings"
"github.com/nboughton/dotfiles/waybar/modules/gobar"
regex "github.com/nboughton/go-utils/regex/common"
)
type config struct {
Versions []string `json:"versions,omitempty"`
}
var outfile = fmt.Sprintf("%s/tmp/aur-vcheck.json", os.Getenv(("HOME")))
func main() {
confPath := "config.json"
// Check for config path
if len(os.Args) > 1 {
confPath = os.Args[1]
}
// Read config
log.Println("Reading config")
f, err := os.Open(confPath)
if err != nil {
log.Fatalf("cannot open config: %s", err)
}
c := config{}
if err := json.NewDecoder(f).Decode(&c); err != nil {
log.Fatalf("failed to decode config: %s", err)
}
f.Close()
// Check Versions
log.Println("Checking versions")
out := []string{}
for _, appVer := range c.Versions {
app := fmt.Sprintf("@%s", strings.Split(appVer, "@")[1])
o, err := exec.Command("npm", "info", app).CombinedOutput()
if err != nil {
log.Fatalf("npm exec failed: %s", err)
}
v := regex.ANSI.ReplaceAllString(strings.Fields(strings.Split(string(o), "\n")[1])[0], "")
if appVer != v {
out = append(out, fmt.Sprintf("%s -> %s", appVer, v))
}
}
n := len(out)
m := gobar.Module{
Name: "AUR VERSION CHECK",
Summary: "AUR NPM Packages Out Of Date",
JSON: gobar.JSONOutput{
Text: fmt.Sprintf("%d", n),
Alt: fmt.Sprintf("%d", n),
Tooltip: strings.Join(out, "\n"),
Class: "no-updates",
Percentage: n,
},
}
if n > 0 {
log.Println("Sending DBUS notification")
m.JSON.Class = "updates"
m.Notify(m.JSON.Tooltip, 10000)
}
// Write output for waybar module
log.Println("Writing JSON output")
f, err = os.Create(outfile)
if err != nil {
log.Println(err)
return
}
defer f.Close()
m.JSON.Write(f)
}

@ -1,8 +0,0 @@
{
"versions": [
"@vue/cli@4.5.9",
"@vue/cli-service-global@4.5.9",
"@quasar/cli@1.1.2",
"@quasar/icongenie@2.3.3"
]
}

@ -1,8 +0,0 @@
module github.com/nboughton/dotfiles/waybar/modules/aur-vcheck
go 1.15
require (
github.com/nboughton/dotfiles/waybar/modules/gobar v0.0.0-20201209215918-92c9d95cf046
github.com/nboughton/go-utils v0.0.0-20200108161841-5007e997f484
)

@ -1,9 +0,0 @@
[Unit]
Description=Check for new upstream AUR versions of maintained NPM packages
[Service]
Type=oneshot
WorkingDirectory=%h/.config/waybar/modules/aur-vcheck
Environment=DISPLAY=:0.0
Environment=XAUTHORITY=%h/.Xauthority
ExecStart=go run %h/.config/waybar/modules/aur-vcheck/aur-vcheck.go %h/.config/waybar/modules/aur-vcheck/config.json

@ -0,0 +1,168 @@
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"regexp"
"sort"
"strings"
"github.com/mikkeloscar/aur"
"github.com/nboughton/dotfiles/waybar/modules/gobar"
)
const (
npm = "npm"
github = "github"
errClass = "error"
npmRegistry = "https://registry.npmjs.org/"
)
var outfile = fmt.Sprintf("%s/tmp/auroch.json", os.Getenv("HOME"))
// Define relevant package data
type pkg struct {
AurName string `json:"aur_name,omitempty"` // Name on the AUR (i.e vue-cli)
AurVer string `json:"aur_ver,omitempty"`
UpstreamName string `json:"upstream_name,omitempty"` // Name on the upstream source (i.e @vue/cli)
UpstreamType string `json:"upstream_type,omitempty"` // Upstream type: npm|github
UpstreamVer string `json:"upstream_ver,omitempty"`
}
// Just the bit of NPM registry info that I care about
type npmInfo struct {
Versions map[string]interface{} `json:"versions,omitempty"`
}
// Retrieve the version of the current AUR package
func (p *pkg) getAurVer() error {
// Request pkg info
res, err := aur.Info([]string{p.AurName})
if err != nil {
return err
}
// Copy it to pkg struct
p.AurVer = res[0].Version
// Strip revision
p.AurVer = regexp.MustCompile(`-\d$`).ReplaceAllString(p.AurVer, "")
return nil
}
func (p *pkg) getNpmVer() error {
// Request and decode the versions list
n := npmInfo{}
resp, err := http.Get(fmt.Sprintf("%s/%s", npmRegistry, p.UpstreamName))
if err != nil {
return err
}
defer resp.Body.Close()
if err = json.NewDecoder(resp.Body).Decode(&n); err != nil {
return err
}
// Copy the keys into an array and sort it, last item should be most recent
v := []string{}
for key := range n.Versions {
v = append(v, key)
}
sort.Strings(v)
p.UpstreamVer = v[len(v)-1]
return nil
}
func main() {
packages := []*pkg{
{
AurName: "vue-cli",
UpstreamName: "@vue/cli",
UpstreamType: npm,
},
{
AurName: "vue-cli-service-global",
UpstreamName: "@vue/cli-service-global",
UpstreamType: npm,
},
{
AurName: "quasar-cli",
UpstreamName: "@quasar/cli",
UpstreamType: npm,
},
{
AurName: "quasar-icongenie",
UpstreamName: "@quasar/icongenie",
UpstreamType: npm,
},
}
var (
out []string
class string
err error
)
class = "no-updates"
for _, p := range packages {
log.Printf("Checking package: %s\n", p.AurName)
if err = p.getAurVer(); err != nil {
class = errClass
break
}
// I'll add a switch or if block here to retrieve ver data from non-npm sources when I have some to care about
if err = p.getNpmVer(); err != nil {
class = errClass
break
}
log.Printf("%s %s -> %s\n", p.AurName, p.AurVer, p.UpstreamVer)
if p.AurVer != p.UpstreamVer {
out = append(out, fmt.Sprintf("%s %s -> %s", p.AurName, p.AurVer, p.UpstreamVer))
}
}
n := len(out)
txt := fmt.Sprintf("%d", n)
if class == errClass {
txt = "!"
}
if n > 0 {
class = "updates"
}
m := gobar.Module{
Name: "AUROCH",
Summary: "Outdated AUR Packages",
JSON: gobar.JSONOutput{
Text: txt,
Alt: txt,
Class: class,
Tooltip: strings.Join(out, "\n"),
Percentage: n,
},
}
if n > 0 {
log.Println("Sending DBUS Notification")
m.Notify(m.JSON.Tooltip, 10000)
}
log.Println("Writing JSON data")
f, err := os.Create(outfile)
if err != nil {
log.Fatalf("could not open %s for writing", outfile)
}
defer f.Close()
m.JSON.Write(f)
}

@ -0,0 +1,7 @@
[Unit]
Description=Check for new upstream AUR versions of maintained NPM packages
[Service]
Type=oneshot
WorkingDirectory=%h/.config/waybar/modules/auroch
ExecStart=go run %h/.config/waybar/modules/auroch/auroch.go

@ -0,0 +1,8 @@
module github.com/nboughton/dotfiles/waybar/modules/auroch
go 1.15
require (
github.com/mikkeloscar/aur v0.0.0-20200113170522-1cb4e2949656
github.com/nboughton/dotfiles/waybar/modules/gobar v0.0.0-20201210092537-0188f79629ba
)

@ -2,7 +2,7 @@ github.com/esiqveland/notify v0.9.1 h1:hX6ZD3FCQJXI46AzUM/iWekcMfnZ9TPE4uIu9Hrn1
github.com/esiqveland/notify v0.9.1/go.mod h1:63UbVSaeJwF0LVJARHFuPgUAoM7o1BEvCZyknsuonBc=
github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME=
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/nboughton/dotfiles/waybar/modules/gobar v0.0.0-20201209215918-92c9d95cf046 h1:dRU4VhJuR2nyC8lWNwuFgWPxDEueb6pKENNZzUpur8c=
github.com/nboughton/dotfiles/waybar/modules/gobar v0.0.0-20201209215918-92c9d95cf046/go.mod h1:9MC4JW6muedO0QtIPqhZLM01B7ZjUGD6mDjdePRA1M0=
github.com/nboughton/go-utils v0.0.0-20200108161841-5007e997f484 h1:mqED7SC5umrSOUC4eUleOuHUsrwvbVl/DQy+jVHFlvo=
github.com/nboughton/go-utils v0.0.0-20200108161841-5007e997f484/go.mod h1:iSex0rTt7j+NRoVAEwO0ADC0jkx53W/3OsbYgNMxSWU=
github.com/mikkeloscar/aur v0.0.0-20200113170522-1cb4e2949656 h1:j679+jxcDkCFblYk+I+G71HQTFxM3PacYbVCiYmhRhU=
github.com/mikkeloscar/aur v0.0.0-20200113170522-1cb4e2949656/go.mod h1:nYOKcK8tIj69ZZ8uDOWoiT+L25NvlOQaraDqTec/idA=
github.com/nboughton/dotfiles/waybar/modules/gobar v0.0.0-20201210092537-0188f79629ba h1:UPeWYDsV9XBH0ItUpSNF9RZu5KuCe7u2ZsG50feC8lc=
github.com/nboughton/dotfiles/waybar/modules/gobar v0.0.0-20201210092537-0188f79629ba/go.mod h1:9MC4JW6muedO0QtIPqhZLM01B7ZjUGD6mDjdePRA1M0=

@ -13,6 +13,7 @@ window#waybar {
font-family: "Symbols Nerd Font";
}
/* Base styling for modules */
#workspaces,
#mode,
#window,
@ -26,7 +27,7 @@ window#waybar {
#backlight,
#disk,
#custom-pacman,
#custom-aurcheck,
#custom-auroch,
#custom-swap,
#custom-spotify,
#custom-separator,
@ -37,6 +38,7 @@ window#waybar {
border-radius: 0px;
}
/* Separator */
#custom-separator {
color: #d8dee9;
background: none;
@ -44,10 +46,37 @@ window#waybar {
opacity: 0.3;
}
#mode {
background: rgba(191, 97, 106, 0.6);
/* TOP BAR (left)*/
#workspaces {
padding: 0px;
}
#workspaces button {
padding: 0px 5px 0px 5px;
border-radius: 0px;
}
#workspaces button#sway-workspace-1 {
border-top-left-radius: 7px;
border-bottom-left-radius: 7px;
}
#workspaces button.focused {
background: rgba(94,129,172, 0.7);
}
#idle_inhibitor {
margin: 0px;
}
#idle_inhibitor.activated {
background: rgba(163, 190, 140, 0.6);
}
#idle_inhibitor.deactivated {
background: rgba(208, 135, 112, 0.6);
}
#mode {
background: rgba(191, 97, 106, 0.7);
}
/* TOP BAR (right) */
#disk.1,
#memory {
padding-right: 3px;
@ -57,42 +86,27 @@ window#waybar {
padding-left: 3px;
}
#clock,
#custom-spotify {
background: rgba(94,129,172, 0.6);
#custom-pacman.no-updates,
#custom-auroch.no-updates {
background: rgba(163, 190, 140, 0.7);
}
#custom-pacman.updates,
#custom-auroch.updates {
background: rgba(180, 142, 173, 0.7);
}
#custom-pacman.error {
background: rgba(191, 97, 106, 0.7);
}
#tray {
background: rgba(94,129,172, 0.7);
border-top-right-radius: 7px;
border-bottom-right-radius: 7px;
}
#custom-pacman.no-updates,
#custom-aurcheck.no-updates {
background: rgba(163, 190, 140, 0.6);
}
#custom-pacman.updates,
#custom-aurcheck.updates {
background: rgba(180, 142, 173, 0.6);
}
#custom-pacman.error {
background: rgba(191, 97, 106, 0.6);
}
/* BOTTOM BAR (left to right)*/
#custom-weather {
background: rgba(94,129,172, 0.6);
border-top-left-radius: 7px;
border-bottom-left-radius: 7px;
}
#workspaces {
padding: 0px;
}
#workspaces button {
padding: 0px 5px 0px 5px;
border-radius: 0px;
}
#workspaces button.focused {
background: rgba(94,129,172, 0.6);
}
#workspaces button#sway-workspace-1 {
background: rgba(94,129,172, 0.7);
border-top-left-radius: 7px;
border-bottom-left-radius: 7px;
}
@ -108,15 +122,11 @@ window#waybar {
text-shadow: 1px 1px 1px #2e3440;
}
#taskbar button.active {
background: rgba(180, 142, 173, 0.6);
background: rgba(180, 142, 173, 0.7);
}
#idle_inhibitor {
margin: 0px;
}
#idle_inhibitor.activated {
background: rgba(163, 190, 140, 0.6);
}
#idle_inhibitor.deactivated {
background: rgba(208, 135, 112, 0.6);
#custom-spotify {
background: rgba(94,129,172, 0.7);
border-top-right-radius: 7px;
border-bottom-right-radius: 7px;
}