mirror of
https://github.com/nboughton/dotfiles
synced 2024-11-22 23:51:57 +01:00
rewrote aur package check for my maintained npm pgs
This commit is contained in:
parent
0188f79629
commit
3c5e384952
@ -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
|
168
waybar/modules/auroch/auroch.go
Normal file
168
waybar/modules/auroch/auroch.go
Normal file
@ -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)
|
||||
}
|
7
waybar/modules/auroch/auroch.service
Normal file
7
waybar/modules/auroch/auroch.service
Normal file
@ -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
|
8
waybar/modules/auroch/go.mod
Normal file
8
waybar/modules/auroch/go.mod
Normal file
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user