Update dependencies, add icons, tunnel editor, buttons to add, delete and zip tunnels.

pull/4/head v0.2
UnnoTed 3 years ago
parent c2990d0c93
commit 89b8eb8d09
  1. BIN
      Icon/add_tunnel.ico
  2. BIN
      Icon/add_tunnel.png
  3. BIN
      Icon/connected.ico
  4. BIN
      Icon/connected.png
  5. BIN
      Icon/delete.ico
  6. BIN
      Icon/delete.png
  7. BIN
      Icon/not_connected.png
  8. BIN
      Icon/wg_connected.png
  9. BIN
      Icon/wireguard.png
  10. BIN
      Icon/wireguard_off.png
  11. BIN
      Icon/zip.ico
  12. BIN
      Icon/zip.png
  13. 38
      README.md
  14. 11
      deb/DEBIAN/changelog
  15. 2
      deb/DEBIAN/control
  16. 2
      deb/usr/share/applications/wireguird.desktop
  17. 24
      go.mod
  18. 82
      go.sum
  19. 3
      gui/get/generator/generator.go
  20. 42
      gui/get/gtk.go
  21. 56
      gui/gui.go
  22. 749
      gui/tunnels.go
  23. 1
      install.sh
  24. 10
      main.go
  25. 1
      package.sh
  26. BIN
      preview.jpg
  27. BIN
      preview.png
  28. 4529
      static/ab0x.go
  29. 534
      wireguird.glade

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 986 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 794 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 935 B

@ -1,16 +1,34 @@
# wireguird
unfinished, can connect and disconnect... only shows configs from /etc/wireguard/ (1 peer only), requires sudo (wg-quick and /etc/wireguard access), system tray icon goes red when connected, black when disconnected.
##### a linux gtk gui client for [Wireguard](https://www.wireguard.com/)
todo:
________________
Features:
- optional vpn country flag icon in system tray
- log tab
- edit config
- add configs
- delete configs
- show errors
- System tray icon goes red when connected, black when disconnected.
- Looks the same and does almost the same things as the official Wireguard's Windows gui client.
- Lists tunnels from `/etc/wireguard`
- Controls Wireguard ~~*through*~~ `wg-quick`
## preview (video)
## Preview (video)
[![wireguird preview](https://raw.githubusercontent.com/UnnoTed/wireguird/master/preview.jpg)](https://streamable.com/dpthpr)
[![wireguird preview](https://raw.githubusercontent.com/UnnoTed/wireguird/master/preview.png)](https://streamable.com/dpthpr)
## Download
##### Ubuntu
tested on: `18.04 LTS`, `20.04 LTS` and `21.04`
[wireguird_amd64.deb (1.8mb)](https://github.com/UnnoTed/wireguird/releases/download/v0.2.0/wireguird_amd64.deb)
## Compile
dependencies: `wireguard-tools libgtk-3-dev libappindicator3-dev`
```sh
git clone https://github.com/UnnoTed/wireguird
./deps.sh
./package.sh
./install.sh
```

@ -1,5 +1,14 @@
wireguird (0.2) UNRELEASED; urgency=medium
* Add new icons to look the same as the Wireguard client for Windows.
* Add a button to Zip all tunnels into a single .zip file.
* Add a button to delete tunnels.
* Add a tunnel editor.
-- unknown <unknown@unknown> Sat, 14 Aug 2021 18:33:37 +0100
wireguird (0.1) UNRELEASED; urgency=medium
* Initial release. (Closes: #XXXXXX)
* Initial release.
-- unknown <unknown@unknown> Thu, 11 Feb 2021 01:36:25 +0100

@ -1,6 +1,6 @@
Package: wireguird
Source: wireguird
Version: 0.1
Version: 0.2
Section: utils
Priority: extra
Architecture: amd64

@ -1,6 +1,6 @@
[Desktop Entry]
Encoding=UTF-8
Version=0.1
Version=0.2
Type=Application
Terminal=false
Exec=/usr/local/bin/wireguird

@ -3,17 +3,33 @@ module github.com/UnnoTed/wireguird
go 1.14
require (
github.com/BurntSushi/toml v0.4.1 // indirect
github.com/UnnoTed/fileb0x v1.1.4 // indirect
github.com/UnnoTed/horizontal v0.0.0-20180525202436-56ab29a31d79
github.com/UnnoTed/horizontal v0.0.0-20210214010602-906c695f4c68
github.com/bmatcuk/doublestar v1.3.4 // indirect
github.com/dawidd6/go-appindicator v1.0.0
github.com/dustin/go-humanize v1.0.0
github.com/gotk3/gotk3 v0.4.0
github.com/fatih/color v1.12.0 // indirect
github.com/gotk3/gotk3 v0.6.1
github.com/karrick/godirwalk v1.16.1 // indirect
github.com/labstack/echo v3.3.10+incompatible // indirect
github.com/labstack/gommon v0.3.0 // indirect
github.com/mattn/go-isatty v0.0.13 // indirect
github.com/mattn/go-runewidth v0.0.13 // indirect
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
github.com/nsf/termbox-go v1.1.1 // indirect
github.com/nwidger/jsoncolor v0.3.0 // indirect
github.com/olekukonko/ts v0.0.0-20171002115256-78ecb04241c0 // indirect
github.com/rs/zerolog v1.18.0
github.com/rs/zerolog v1.23.0
github.com/smartystreets/goconvey v1.6.4 // indirect
github.com/ungerik/go-dry v0.0.0-20180411133923-654ae31114c8
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2
github.com/valyala/fasttemplate v1.2.1 // indirect
github.com/zenazn/goji v0.9.0 // indirect
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e // indirect
golang.org/x/text v0.3.7 // indirect
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20200515170644-ec7f26be9d9e
gopkg.in/ini.v1 v1.56.0
gopkg.in/yaml.v2 v2.4.0 // indirect
)

@ -1,12 +1,21 @@
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/TylerBrock/colorjson v0.0.0-20200706003622-8a50f05110d2/go.mod h1:VSw57q4QFiWDbRnjdX8Cb3Ow0SFncRw+bA/ofY6Q83w=
github.com/UnnoTed/fileb0x v1.1.4 h1:IUgFzgBipF/ujNx9wZgkrKOF3oltUuXMSoaejrBws+A=
github.com/UnnoTed/fileb0x v1.1.4/go.mod h1:X59xXT18tdNk/D6j+KZySratBsuKJauMtVuJ9cgOiZs=
github.com/UnnoTed/horizontal v0.0.0-20180525202436-56ab29a31d79 h1:nC6WzMZbu41H4tKPaQcGbP+0Bdtai+oiYRHiy7yX5WU=
github.com/UnnoTed/horizontal v0.0.0-20180525202436-56ab29a31d79/go.mod h1:jc86eOPvkJHSblcZxW6G5O2Pivw3qVd6seZZRHnnUyM=
github.com/UnnoTed/horizontal v0.0.0-20210214010602-906c695f4c68 h1:xigsVElpknkwhwFA4FsWGODGrMjdm5ozXYs6ZglGmeE=
github.com/UnnoTed/horizontal v0.0.0-20210214010602-906c695f4c68/go.mod h1:Koz/QDBmhRBtA2rV0mA74mjk504aChs7myY8W316YLg=
github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ=
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0=
github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dawidd6/go-appindicator v1.0.0 h1:Jds+9T6dd2SpZ4krJ6SaGdwlKzGTjuU9AypHWhTOXCY=
github.com/dawidd6/go-appindicator v1.0.0/go.mod h1:hOqBUkquzU53HlXUFjFXHAkzdyD45TmTZCQb3FqtEWg=
@ -15,8 +24,12 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc=
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc=
github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
@ -26,6 +39,10 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR
github.com/gotk3/gotk3 v0.4.0 h1:TIuhyQitGeRTxOQIV3AJlYtEWWJpC74JHwAIsxlH8MU=
github.com/gotk3/gotk3 v0.4.0/go.mod h1:Eew3QBwAOBTrfFFDmsDE5wZWbcagBL1NUslj1GhRveo=
github.com/gotk3/gotk3 v0.5.1 h1:zIZM2K4gmkGz1idEFVUPTQfAK/pnWoLKrlIjLOc4kzo=
github.com/gotk3/gotk3 v0.6.1 h1:GJ400a0ecEEWrzjBvzBzH+pB/esEMIGdB9zPSmBdoeo=
github.com/gotk3/gotk3 v0.6.1/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
github.com/gotk3/sourceview v0.0.0-20200523170151-58bbfa485ab5 h1:gli8o5zdjYDnCnSIgUZwS3TUnwWSax4V2gGxxe+k7ts=
github.com/gotk3/sourceview v0.0.0-20200523170151-58bbfa485ab5/go.mod h1:zHpY35dOWdQHFcttshX3aZxV7qRDlR9L6pEUxojcOg4=
github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw=
github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4 h1:nwOc1YaOrYJ37sEBrtWZrdqzK22hiJs3GpDmP3sR2Yw=
github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ=
@ -33,20 +50,36 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/karrick/godirwalk v1.7.8 h1:VfG72pyIxgtC7+3X9CMHI0AOl4LwyRAg98WAgsvffi8=
github.com/karrick/godirwalk v1.7.8/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34=
github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw=
github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=
github.com/labstack/echo v3.2.1+incompatible h1:J2M7YArHx4gi8p/3fDw8tX19SXhBCoRpviyAZSN3I88=
github.com/labstack/echo v3.2.1+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=
github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
github.com/labstack/gommon v0.2.7 h1:2qOPq/twXDrQ6ooBGrn3mrmVOC+biLlatwgIu8lbzRM=
github.com/labstack/gommon v0.2.7/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4=
github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0=
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA=
github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4=
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mdlayher/genetlink v1.0.0 h1:OoHN1OdyEIkScEmRgxLEe2M9U8ClMytqA5niynLtfj0=
github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc=
github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA=
@ -58,8 +91,12 @@ github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721/go.mod h1:Ickgr2WtCL
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d h1:x3S6kxmy49zXVVyhcnrFqxvNVCBPb2KZ9hV2RBdS840=
github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ=
github.com/nsf/termbox-go v1.1.1 h1:nksUPLCb73Q++DwbYUBEglYBRPZyoXJdrj5L+TkjyZY=
github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo=
github.com/nwidger/jsoncolor v0.3.0 h1:VdTH8Dc0SJoq4pJ8pRxxFZW0/5Ng5akbN4YToCBJDSU=
github.com/nwidger/jsoncolor v0.3.0/go.mod h1:Cs34umxLbJvgBMnVNVqhji9BhoT/N/KinHqZptQ7cf4=
github.com/olekukonko/ts v0.0.0-20171002115256-78ecb04241c0 h1:LiZB1h0GIcudcDci2bxbqI6DXV8bF8POAnArqvRrIyw=
@ -67,27 +104,45 @@ github.com/olekukonko/ts v0.0.0-20171002115256-78ecb04241c0/go.mod h1:F/7q8/HZz+
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/zerolog v1.18.0 h1:CbAm3kP2Tptby1i9sYy2MGRg0uxIN9cyDb59Ys7W8z8=
github.com/rs/zerolog v1.18.0/go.mod h1:9nvC1axdVrAHcu/s9taAVfBuIdTZLVQmKQyvrUjF5+I=
github.com/rs/zerolog v1.20.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo=
github.com/rs/zerolog v1.23.0 h1:UskrK+saS9P9Y789yNNulYKdARjPZuS35B8gJF2x60g=
github.com/rs/zerolog v1.23.0/go.mod h1:6c7hFfxPOy7TacJc4Fcdi24/J0NKYGzjG8FWRI916Qo=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/ungerik/go-dry v0.0.0-20180411133923-654ae31114c8 h1:p6JzR5AMj5LyCEovRh5MOxmyuuwOEtfcVDwKqsBn41I=
github.com/ungerik/go-dry v0.0.0-20180411133923-654ae31114c8/go.mod h1:+LeLocciSarKa1pxOY7gmBQ7dSk5nB1w1f3nvvLw0j0=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v0.0.0-20170224212429-dcecefd839c4 h1:gKMu1Bf6QINDnvyZuTaACm9ofY+PRh+5vFz4oxBZeF8=
github.com/valyala/fasttemplate v0.0.0-20170224212429-dcecefd839c4/go.mod h1:50wTf68f99/Zt14pr046Tgt3Lp2vLyFZKzbFXTOabXw=
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72 h1:+ELyKg6m8UBf0nPFSqD0mi7zUfwPyXo23HNjMnXPz7w=
golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180921000356-2f5d2388922f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@ -98,29 +153,53 @@ golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20181019160139-8e24a49d80f8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191003212358-c178f38b412c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.zx2c4.com/wireguard v0.0.20200121 h1:vcswa5Q6f+sylDfjqyrVNNrjsFUUbPsgAQTBCAg/Qf8=
golang.zx2c4.com/wireguard v0.0.20200121/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4=
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20200515170644-ec7f26be9d9e h1:fqDhK9OlzaaiFjnyaAfR9Q1RPKCK7OCTLlHGP9f74Nk=
@ -130,3 +209,6 @@ gopkg.in/ini.v1 v1.56.0 h1:DPMeDvGTM54DXbPkVIZsp19fp/I2K7zwA/itHYHKo8Y=
gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

@ -12,16 +12,19 @@ func main() {
list := []string{
"ApplicationWindow",
"ScrolledWindow",
"AboutDialog",
"ColorButton",
"MenuButton",
"HeaderBar",
"MenuItem",
"Notebook",
"TextView",
"Viewport",
"ListBox",
"Spinner",
"Button",
"Switch",
"Window",
"Entry",
"Label",
"Stack",

@ -36,6 +36,20 @@ func ScrolledWindow(name string) (*gtk.ScrolledWindow, error) {
return scrolledwindow1, nil
}
func AboutDialog(name string) (*gtk.AboutDialog, error) {
obj, err := Builder.GetObject(name)
if err != nil {
return nil, err
}
aboutdialog1, ok := obj.(*gtk.AboutDialog)
if !ok {
return nil, errors.New("cant get *gtk.AboutDialog: " + name)
}
return aboutdialog1, nil
}
func ColorButton(name string) (*gtk.ColorButton, error) {
obj, err := Builder.GetObject(name)
if err != nil {
@ -106,6 +120,20 @@ func Notebook(name string) (*gtk.Notebook, error) {
return notebook1, nil
}
func TextView(name string) (*gtk.TextView, error) {
obj, err := Builder.GetObject(name)
if err != nil {
return nil, err
}
textview1, ok := obj.(*gtk.TextView)
if !ok {
return nil, errors.New("cant get *gtk.TextView: " + name)
}
return textview1, nil
}
func Viewport(name string) (*gtk.Viewport, error) {
obj, err := Builder.GetObject(name)
if err != nil {
@ -176,6 +204,20 @@ func Switch(name string) (*gtk.Switch, error) {
return switch1, nil
}
func Window(name string) (*gtk.Window, error) {
obj, err := Builder.GetObject(name)
if err != nil {
return nil, err
}
window1, ok := obj.(*gtk.Window)
if !ok {
return nil, errors.New("cant get *gtk.Window: " + name)
}
return window1, nil
}
func Entry(name string) (*gtk.Entry, error) {
obj, err := Builder.GetObject(name)
if err != nil {

@ -9,13 +9,20 @@ import (
"golang.zx2c4.com/wireguard/wgctrl"
)
const (
Version = "0.2.0"
Repo = "https://github.com/UnnoTed/wireguird"
TunnelsPath = "/etc/wireguard/"
)
var (
application *gtk.Application
indicator *appindicator.Indicator
builder *gtk.Builder
window *gtk.ApplicationWindow
header *gtk.HeaderBar
wgc *wgctrl.Client
editorWindow *gtk.Window
application *gtk.Application
indicator *appindicator.Indicator
builder *gtk.Builder
window *gtk.ApplicationWindow
header *gtk.HeaderBar
wgc *wgctrl.Client
)
func Create(app *gtk.Application, b *gtk.Builder, w *gtk.ApplicationWindow, ind *appindicator.Indicator) error {
@ -47,7 +54,11 @@ func Create(app *gtk.Application, b *gtk.Builder, w *gtk.ApplicationWindow, ind
for _, d := range ds {
header.SetSubtitle("Connected to " + d.Name)
indicator.SetIcon("wireguard")
indicator.SetIcon("wg_connected")
}
if _, err := createEditor("", false); err != nil {
return err
}
t := &Tunnels{}
@ -64,13 +75,38 @@ func ShowError(win *gtk.ApplicationWindow, err error, info ...string) {
return
}
if _, err := glib.IdleAdd(func() {
glib.IdleAdd(func() {
wlog("ERROR", err.Error())
dlg := gtk.MessageDialogNew(win, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "%s", err.Error())
dlg.SetTitle("Error")
dlg.Run()
dlg.Destroy()
}); err != nil {
log.Error().Err(err).Msg("cant run idleadd")
})
}
func createEditor(name string, show bool) (*gtk.Window, error) {
if editorWindow == nil {
var err error
editorWindow, err = get.Window("editor_window")
if err != nil {
log.Error().Err(err).Msg("error getting main_window")
return nil, err
}
// prevents having to re-create the editor window
editorWindow.HideOnDelete()
}
if show {
ne, err := get.Entry("editor_name")
if err != nil {
return nil, err
}
ne.SetText(name)
editorWindow.SetTitle("Edit tunnel - " + name)
editorWindow.ShowAll()
}
return editorWindow, nil
}

@ -1,7 +1,15 @@
package gui
import (
"archive/zip"
"fmt"
"github.com/ungerik/go-dry"
"io"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"regexp"
"sort"
"strconv"
"strings"
@ -12,7 +20,6 @@ import (
"github.com/gotk3/gotk3/glib"
"github.com/gotk3/gotk3/gtk"
"github.com/rs/zerolog/log"
"github.com/ungerik/go-dry"
"gopkg.in/ini.v1"
)
@ -38,151 +45,54 @@ type Tunnels struct {
ButtonChangeState *gtk.Button
icons map[string]*gtk.Image
ticker *time.Ticker
lastSelected string
}
func (t *Tunnels) Create() error {
t.icons = map[string]*gtk.Image{}
t.ticker = time.NewTicker(1 * time.Second)
var configList []string
list, err := dry.ListDirFiles("/etc/wireguard/")
tl, err := get.ListBox("tunnel_list")
if err != nil {
// showError(err)
return err
}
for _, fileName := range list {
if !strings.HasSuffix(fileName, ".conf") {
continue
}
configList = append(configList, strings.TrimSuffix(fileName, ".conf"))
}
tl, err := get.ListBox("tunnel_list")
if err != nil {
if err := t.ScanTunnels(); err != nil {
return err
}
sort.Slice(configList, func(a, b int) bool {
return configList[a] < configList[b]
})
activeName := t.ActiveDeviceName()
lasti := len(configList) - 1
for i, name := range configList {
row, err := gtk.ListBoxRowNew()
// menu
{
mb, err := get.MenuButton("menu")
if err != nil {
return err
}
row.SetName(name)
row.SetMarginStart(8)
row.SetMarginEnd(8)
if i == 0 {
row.SetMarginTop(8)
} else if i == lasti {
row.SetMarginBottom(8)
}
// icon, err := gtk.ButtonNew()
// icon, err := gtk.ColorButtonNew()
// if err != nil {
// return err
// }
var img *gtk.Image
if activeName == name {
green, err := gtk.ImageNewFromFile("/opt/wireguird/Icon/dot-green.png")
if err != nil {
return err
}
img = green
} else {
gray, err := gtk.ImageNewFromFile("/opt/wireguird/Icon/dot-gray.png")
if err != nil {
return err
}
img = gray
}
t.icons[name] = img
// img, err := gtk.ImageNewFromFile("/opt/wireguird/Icon/dot-gray.png")
// if err != nil {
// return err
// }
// icon.SetImage(img)
// dg, err := static.ReadFile("icon/dot-gray.svg")
// if err != nil {
// return err
// }
// pbl, err := gdk.PixbufLoaderNew()
// if err != nil {
// return err
// }
// pb, err := pbl.WriteAndReturnPixbuf(dg)
// if err != nil {
// return err
// }
// img, err := gtk.ImageNewFromPixbuf(pb)
// if err != nil {
// return err
// }
// icon.Image
// icon.SetImage(img)
img.SetVAlign(gtk.ALIGN_CENTER)
img.SetHAlign(gtk.ALIGN_START)
img.SetSizeRequest(10, 10)
// icon.SetMarginBottom(0)
// icon.SetMarginTop(0)
img.SetVExpand(false)
img.SetHExpand(false)
// sctx, err := icon.GetStyleContext()
// if err != nil {
// return err
// }
// sctx.AddClass("circular")
// if name == activeName {
// sctx.AddClass("btn-green")
// // rgba := gdk.NewRGBA(102, 204, 153, 1)
// }
label, err := gtk.LabelNew(name)
menu, err := gtk.MenuNew()
if err != nil {
return err
}
label.SetHAlign(gtk.ALIGN_START)
// label.SetHExpand(true)
label.SetMarginStart(8)
label.SetMarginEnd(8)
label.SetMarginTop(8)
label.SetMarginBottom(8)
box, err := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 4)
mVersion, err := gtk.MenuItemNew()
if err != nil {
return err
}
box.Add(img)
box.Add(label)
mVersion.SetLabel("VERSION: v" + Version)
//mVersion.SetSensitive(false)
mVersion.Connect("activate", func() {
if err := exec.Command("xdg-open", Repo).Start(); err != nil {
ShowError(window, err, "open repo url error")
}
})
menu.Append(mVersion)
row.SetName(name)
row.Add(box)
row.ShowAll()
tl.Insert(row, -1)
menu.SetHAlign(gtk.ALIGN_CENTER)
menu.SetVAlign(gtk.ALIGN_CENTER)
menu.ShowAll()
mb.SetPopup(menu)
}
t.Interface.Status, err = get.Label("label_interface_status")
@ -247,9 +157,9 @@ func (t *Tunnels) Create() error {
return err
}
activeName = t.ActiveDeviceName()
activeName := t.ActiveDeviceName()
for _, d := range list {
gray, err := gtk.ImageNewFromFile("/opt/wireguird/Icon/dot-gray.png")
gray, err := gtk.ImageNewFromFile("/opt/wireguird/Icon/not_connected.png")
if err != nil {
return err
}
@ -294,7 +204,7 @@ func (t *Tunnels) Create() error {
header.SetSubtitle("Connected to " + name)
})
green, err := gtk.ImageNewFromFile("/opt/wireguird/Icon/dot-green.png")
green, err := gtk.ImageNewFromFile("/opt/wireguird/Icon/connected.png")
if err != nil {
return err
}
@ -302,7 +212,7 @@ func (t *Tunnels) Create() error {
glib.IdleAdd(func() {
t.icons[name].SetFromPixbuf(green.GetPixbuf())
t.UpdateRow(row)
indicator.SetIcon("wireguard")
indicator.SetIcon("wg_connected")
})
if err := wlog("INFO", "Connected to "+name); err != nil {
@ -326,6 +236,434 @@ func (t *Tunnels) Create() error {
t.UpdateRow(row)
})
// button: add tunnel
btnAddTunnel, err := get.Button("button_add_tunnel")
if err != nil {
return err
}
btnAddTunnel.Connect("clicked", func() {
err := func() error {
log.Print("btn add tunnel")
dialog, err := gtk.FileChooserNativeDialogNew("Wireguird - Choose a tunnel file (*.conf)", window, gtk.FILE_CHOOSER_ACTION_OPEN, "OK", "Cancel")
if err != nil {
return err
}
defer dialog.Destroy()
// filter *.conf files
filter, err := gtk.FileFilterNew()
if err != nil {
return err
}
filter.AddPattern("*.conf")
filter.SetName("*.conf")
dialog.AddFilter(filter)
res := dialog.Run()
if gtk.ResponseType(res) == gtk.RESPONSE_ACCEPT {
fname := dialog.GetFilename()
log.Print(fname)
data, err := ioutil.ReadFile(fname)
if err != nil {
return err
}
err = ioutil.WriteFile(filepath.Join(TunnelsPath, filepath.Base(fname)), data, 666)
if err != nil {
return err
}
if err := t.ScanTunnels(); err != nil {
return err
}
}
return nil
}()
if err != nil {
ShowError(window, err, "add tunnel error")
}
})
// button: delete tunnel
btnDelTunnel, err := get.Button("button_del_tunnel")
if err != nil {
return err
}
btnDelTunnel.Connect("clicked", func() {
err := func() error {
row := tl.GetSelectedRow()
name, err := row.GetName()
if err != nil {
return err
}
ext := ""
if !strings.HasSuffix(name, ".conf") {
ext = ".conf"
}
path := filepath.Join(TunnelsPath, name+ext)
d := gtk.MessageDialogNew(window, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, "Do you really want to delete "+name+"?")
defer d.Destroy()
res := d.Run()
if res == gtk.RESPONSE_YES {
if err := os.Remove(path); err != nil {
return err
}
if err := t.ScanTunnels(); err != nil {
return err
}
return nil
}
return nil
}()
if err != nil {
ShowError(window, err, "tunnel delete error")
}
})
// button: zip tunnels
btnZipTunnels, err := get.Button("button_zip_tunnel")
if err != nil {
return err
}
btnZipTunnels.Connect("clicked", func() {
err := func() error {
d, err := gtk.FileChooserDialogNewWith2Buttons("Wireguird - zip tunnels -> Save zip file", window, gtk.FILE_CHOOSER_ACTION_SAVE, "Cancel", gtk.RESPONSE_CANCEL, "Save", gtk.RESPONSE_ACCEPT)
if err != nil {
panic(err)
}
defer d.Destroy()
d.SetDoOverwriteConfirmation(true)
t := time.Now()
d.SetCurrentName(fmt.Sprint("wg_tunnels_", t.Day(), "_", t.Month(), "_", t.Year(), ".zip"))
res := d.Run()
if res == gtk.RESPONSE_ACCEPT {
dest := d.GetFilename()
base := strings.TrimSuffix(filepath.Base(dest), filepath.Ext(dest))
zf, err := os.Create(dest)
if err != nil {
return err
}
defer zf.Close()
archive := zip.NewWriter(zf)
defer archive.Close()
return filepath.Walk(TunnelsPath, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
header.Name = filepath.Join(base, strings.TrimPrefix(path, TunnelsPath))
if info.IsDir() {
header.Name += "/"
} else {
header.Method = zip.Deflate
header.SetMode(0777)
}
log.Debug().Interface("header", header).Interface("info", info).Msg("walk")
writer, err := archive.CreateHeader(header)
if err != nil {
return err
}
if info.IsDir() {
return nil
}
f, err := os.Open(path)
if err != nil {
return err
}
defer f.Close()
if _, err = io.Copy(writer, f); err != nil {
return err
}
return nil
})
}
return nil
}()
if err != nil {
ShowError(window, err, "tunnel delete error")
}
})
// stores a modified state for the editor
modified := false
editorWindow.Connect("hide", func() {
if err := t.ScanTunnels(); err != nil {
ShowError(window, err, "scan tunnel after closing editor window error")
}
modified = false
})
ne, err := get.Entry("editor_name")
if err != nil {
return err
}
ne.Connect("changed", func() {
modified = true
})
et, err := get.TextView("editor_text")
if err != nil {
return err
}
etb, err := et.GetBuffer()
if err != nil {
return err
}
etb.Connect("changed", func() {
modified = true
})
// button: edit tunnel
btnEditTunnel, err := get.Button("button_edit_tunnel")
if err != nil {
return err
}
btnEditTunnel.Connect("clicked", func() {
modified = false
err := func() error {
row := tl.GetSelectedRow()
if row == nil {
return nil
}
name, err := row.GetName()
if err != nil {
return err
}
ext := ""
if !strings.HasSuffix(name, ".conf") {
ext = ".conf"
}
path := filepath.Join(TunnelsPath, name+ext)
log.Print(path)
ew, err := createEditor(name, true)
if err != nil {
return err
}
et, err := get.TextView("editor_text")
if err != nil {
return err
}
data, err := ioutil.ReadFile(path)
if err != nil {
return err
}
// low budget GtkSourceView
propertyColor := "purple"
sectionColor := "green"
conf := string(data)
// gets public key to use in the PublicKey entry
re := regexp.MustCompile(`(?m)PublicKey[\s]+=[\s]+(.*)`)
m := re.FindStringSubmatch(conf)
if len(m) >= 2 {
epk, err := get.Entry("editor_publickey")
if err != nil {
return err
}
epk.SetText(m[1])
}
r := strings.NewReplacer(
"&", "&amp;",
"PrivateKey", "<span color=\""+propertyColor+"\">PrivateKey</span>",
"PublicKey", "<span color=\""+propertyColor+"\">PublicKey</span>",
"Address", "<span color=\""+propertyColor+"\">Address</span>",
"DNS", "<span color=\""+propertyColor+"\">DNS</span>",
"AllowedIPs", "<span color=\""+propertyColor+"\">AllowedIPs</span>",
"Endpoint", "<span color=\""+propertyColor+"\">Endpoint</span>",
"PostUp", "<span color=\""+propertyColor+"\">PostUp</span>",
"PreDown", "<span color=\""+propertyColor+"\">PreDown</span>",
"PreSharedKey", "<span color=\""+propertyColor+"\">PreSharedKey</span>",
"PersistentKeepalive", "<span color=\""+propertyColor+"\">PersistentKeepalive</span>",
"[Interface]", "<span color=\""+sectionColor+"\">[Interface]</span>",
"[Peer]", "<span color=\""+sectionColor+"\">[Peer]</span>",
)
conf = r.Replace(conf)
ttt, err := gtk.TextTagTableNew()
if err != nil {
return err
}
tb, err := gtk.TextBufferNew(ttt)
if err != nil {
return err
}
tb.InsertMarkup(tb.GetStartIter(), conf)
et.SetBuffer(tb)
ew.ShowAll()
return nil
}()
if err != nil {
ShowError(window, err, "edit tunnel error")
}
})
// button: editor's cancel
btnEditorCancel, err := get.Button("editor_button_cancel")
if err != nil {
return err
}
btnEditorCancel.Connect("clicked", func() {
if !modified {
editorWindow.Close()
return
}
err := func() error {
d := gtk.MessageDialogNew(editorWindow, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, "Do you want to cancel any modification done to the tunnel?")
defer d.Destroy()
res := d.Run()
if res == gtk.RESPONSE_YES {
modified = false
editorWindow.Close()
return nil
}
return nil
}()
if err != nil {
ShowError(window, err, "cancel tunnel error")
}
})
// button: editor's save
btnEditorSave, err := get.Button("editor_button_save")
if err != nil {
return err
}
btnEditorSave.Connect("clicked", func() {
err := func() error {
row := tl.GetSelectedRow()
if row == nil {
return nil
}
name, err := row.GetName()
if err != nil {
return err
}
// adds extension when empty
ext := ""
if !strings.HasSuffix(name, ".conf") {
ext = ".conf"
}
path := filepath.Join(TunnelsPath, name+ext)
// get the new tunnel name
nameEntry, err := get.Entry("editor_name")
if err != nil {
return err
}
newName, err := nameEntry.GetText()
if err != nil {
return err
}
newName = strings.TrimSpace(newName)
// rename the tunnel
if name != newName {
newPath := filepath.Join(TunnelsPath, newName+ext)
if err := os.Rename(path, newPath); err != nil {
return err
}
path = newPath
}
// get the tunnels' edited text through editor_text's buffer
etxt, err := get.TextView("editor_text")
if err != nil {
return err
}
b, err := etxt.GetBuffer()
if err != nil {
return err
}
data, err := b.GetText(b.GetStartIter(), b.GetEndIter(), false)
if err != nil {
return err
}
// write changes
if err := ioutil.WriteFile(path, []byte(data), 666); err != nil {
return err
}
modified = false
if err := t.ScanTunnels(); err != nil {
return err
}
editorWindow.Close()
return nil
}()
if err != nil {
ShowError(window, err, "save tunnel error")
}
})
go func() {
for {
<-t.ticker.C
@ -385,11 +723,12 @@ func (t *Tunnels) UpdateRow(row *gtk.ListBoxRow) {
return err
}
cfg, err := ini.Load("/etc/wireguard/" + id + ".conf")
cfg, err := ini.Load(TunnelsPath + id + ".conf")
if err != nil {
return err
}
t.lastSelected = id
t.UnknownLabels()
peersec := cfg.Section("Peer")
@ -446,6 +785,166 @@ func (t *Tunnels) UpdateRow(row *gtk.ListBoxRow) {
}
}
func (t *Tunnels) ScanTunnels() error {
var err error
var configList []string
list, err := dry.ListDirFiles(TunnelsPath)
if err != nil {
// showError(err)
return err
}
for _, fileName := range list {
if !strings.HasSuffix(fileName, ".conf") {
continue
}
configList = append(configList, strings.TrimSuffix(fileName, ".conf"))
}
tl, err := get.ListBox("tunnel_list")
if err != nil {
return err
}
for {
row := tl.GetRowAtIndex(0)
if row == nil {
break
}
row.Destroy()
}
sort.Slice(configList, func(a, b int) bool {
return configList[a] < configList[b]
})
activeName := t.ActiveDeviceName()
lasti := len(configList) - 1
for i, name := range configList {
row, err := gtk.ListBoxRowNew()
if err != nil {
return err
}
row.SetName(name)
row.SetMarginStart(8)
row.SetMarginEnd(8)
if i == 0 {
row.SetMarginTop(8)
} else if i == lasti {
row.SetMarginBottom(8)
}
// icon, err := gtk.ButtonNew()
// icon, err := gtk.ColorButtonNew()
// if err != nil {
// return err
// }
var img *gtk.Image
if activeName == name {
green, err := gtk.ImageNewFromFile("/opt/wireguird/Icon/connected.png")
if err != nil {
return err
}
img = green
} else {
gray, err := gtk.ImageNewFromFile("/opt/wireguird/Icon/not_connected.png")
if err != nil {
return err
}
img = gray
}
t.icons[name] = img
// img, err := gtk.ImageNewFromFile("/opt/wireguird/Icon/not_connected.png")
// if err != nil {
// return err
// }
// icon.SetImage(img)
// dg, err := static.ReadFile("icon/dot-gray.svg")
// if err != nil {
// return err
// }
// pbl, err := gdk.PixbufLoaderNew()
// if err != nil {
// return err
// }
// pb, err := pbl.WriteAndReturnPixbuf(dg)
// if err != nil {
// return err
// }
// img, err := gtk.ImageNewFromPixbuf(pb)
// if err != nil {
// return err
// }
// icon.Image
// icon.SetImage(img)
img.SetVAlign(gtk.ALIGN_CENTER)
img.SetHAlign(gtk.ALIGN_START)
img.SetSizeRequest(10, 10)
// icon.SetMarginBottom(0)
// icon.SetMarginTop(0)
img.SetVExpand(false)
img.SetHExpand(false)
// sctx, err := icon.GetStyleContext()
// if err != nil {
// return err
// }
// sctx.AddClass("circular")
// if name == activeName {
// sctx.AddClass("btn-green")
// // rgba := gdk.NewRGBA(102, 204, 153, 1)
// }
label, err := gtk.LabelNew(name)
if err != nil {
return err
}
label.SetHAlign(gtk.ALIGN_START)
// label.SetHExpand(true)
label.SetMarginStart(8)
label.SetMarginEnd(8)
label.SetMarginTop(8)
label.SetMarginBottom(8)
box, err := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 4)
if err != nil {
return err
}
box.Add(img)
box.Add(label)
row.SetName(name)
row.Add(box)
row.ShowAll()
tl.Insert(row, -1)
if name == t.lastSelected {
tl.SelectRow(row)
t.UpdateRow(row)
}
}
return nil
}
func (t *Tunnels) UnknownLabels() {
glib.IdleAdd(func() {
t.ButtonChangeState.SetLabel("unknown")

@ -0,0 +1 @@
sudo dpkg -i ./build/wireguird_amd64.deb

@ -54,13 +54,13 @@ func createTray(application *gtk.Application) (*appindicator.Indicator, error) {
}
indicator := appindicator.New(application.GetApplicationID(), "wireguard_off", appindicator.CategoryApplicationStatus)
indicator.SetIconThemePath("/opt/wireguird/Icon/32x32")
indicator.SetIconThemePath("/opt/wireguird/Icon")
indicator.SetTitle("Wireguird")
// indicator.SetLabel("Wireguird", "")
indicator.SetStatus(appindicator.StatusActive)
indicator.SetMenu(menu)
_, err = menuShow.Connect("activate", func() {
menuShow.Connect("activate", func() {
win.Show()
// createWindow(application)
})
@ -68,12 +68,9 @@ func createTray(application *gtk.Application) (*appindicator.Indicator, error) {
return nil, err
}
_, err = menuQuit.Connect("activate", func() {
menuQuit.Connect("activate", func() {
application.Quit()
})
if err != nil {
return nil, err
}
menu.Add(menuShow)
menu.Add(menuQuit)
@ -89,7 +86,6 @@ func createWindow(application *gtk.Application) error {
return err
}
// b, err := gtk.BuilderNewFromFile("./wireguird.glade")
b, err := gtk.BuilderNew()
b.AddFromString(string(data))
if err != nil {

@ -10,5 +10,6 @@ echo "wireguird: copying icons..."
cp -r ./Icon/ ./deb/opt/wireguird/
echo "wireguird: building debian package..."
mkdir ./build/
dpkg-deb --root-owner-group --build ./deb ./build/wireguird_amd64.deb
echo "wireguird: done"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

File diff suppressed because one or more lines are too long

@ -1,60 +1,245 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.1 -->
<!-- Generated with glade 3.22.2 -->
<interface>
<requires lib="gtk+" version="3.22"/>
<object class="GtkWindow" id="editor_window">
<property name="can_focus">False</property>
<property name="default_width">480</property>
<property name="default_height">340</property>
<child type="titlebar">
<placeholder/>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">8</property>
<property name="margin_right">8</property>
<property name="margin_top">8</property>
<property name="margin_bottom">8</property>
<property name="orientation">vertical</property>
<property name="spacing">4</property>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="row_spacing">6</property>
<property name="column_spacing">6</property>
<property name="row_homogeneous">True</property>
<child>
<object class="GtkEntry" id="editor_name">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Name:</property>
<property name="justify">right</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Public Key:</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="editor_publickey">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="editable">False</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTextView" id="editor_text">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="monospace">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="spacing">4</property>
<child>
<object class="GtkButton" id="editor_button_save">
<property name="label" translatable="yes">Save</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="editor_button_cancel">
<property name="label" translatable="yes">Cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkImage" id="icon_delete">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixbuf">/opt/wireguird/Icon/delete.png</property>
</object>
<object class="GtkImage" id="icon_tunnel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixbuf">/opt/wireguird/Icon/add_tunnel.png</property>
</object>
<object class="GtkImage" id="icon_zip">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixbuf">/opt/wireguird/Icon/zip.png</property>
</object>
<object class="GtkApplicationWindow" id="main_window">
<property name="width-request">650</property>
<property name="height-request">470</property>
<property name="can-focus">False</property>
<property name="window-position">center</property>
<property name="show-menubar">False</property>
<property name="width_request">650</property>
<property name="height_request">470</property>
<property name="can_focus">False</property>
<property name="window_position">center</property>
<property name="show_menubar">False</property>
<child type="titlebar">
<object class="GtkHeaderBar" id="main_header">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Wireguird</property>
<property name="subtitle" translatable="yes">Not connected</property>
<property name="show_close_button">True</property>
<child>
<object class="GtkStackSwitcher">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stack">main_stack</property>
</object>
</child>
<child>
<object class="GtkMenuButton" id="menu">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="focus_on_click">False</property>
<property name="receives_default">True</property>
<property name="use_popover">False</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkStack" id="main_stack">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">8</property>
<property name="margin-end">8</property>
<property name="margin-top">8</property>
<property name="margin-bottom">8</property>
<property name="can_focus">False</property>
<property name="margin_start">8</property>
<property name="margin_end">8</property>
<property name="margin_top">8</property>
<property name="margin_bottom">8</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="transition-type">slide-left-right</property>
<property name="transition_type">slide-left-right</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="spacing">8</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="hexpand">False</property>
<property name="vexpand">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkScrolledWindow">
<property name="width-request">200</property>
<property name="width_request">200</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="hscrollbar-policy">never</property>
<property name="shadow-type">in</property>
<property name="hscrollbar_policy">never</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkViewport">
<property name="width-request">200</property>
<property name="width_request">200</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<child>
<object class="GtkListBox" id="tunnel_list">
<property name="width-request">200</property>
<property name="width_request">200</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
</object>
@ -71,15 +256,16 @@
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-top">8</property>
<property name="can_focus">False</property>
<property name="margin_top">8</property>
<property name="spacing">8</property>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Add tunnel</property>
<object class="GtkButton" id="button_add_tunnel">
<property name="label" translatable="yes">Add Tunnel</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="image">icon_tunnel</property>
</object>
<packing>
<property name="expand">False</property>
@ -88,24 +274,23 @@
</packing>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">R</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<object class="GtkSeparator">
<property name="can_focus">False</property>
<property name="opacity">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Z</property>
<object class="GtkButton" id="button_del_tunnel">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Delete Tunnel</property>
<property name="image">icon_delete</property>
</object>
<packing>
<property name="expand">False</property>
@ -113,6 +298,20 @@
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_zip_tunnel">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Zip all tunnels</property>
<property name="image">icon_zip</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
@ -130,197 +329,178 @@
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="hscrollbar-policy">never</property>
<property name="hscrollbar_policy">never</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="spacing">4</property>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label-xalign">0</property>
<property name="shadow-type">out</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">out</property>
<child>
<object class="GtkAlignment">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">start</property>
<property name="top-padding">8</property>
<property name="bottom-padding">8</property>
<property name="left-padding">8</property>
<property name="right-padding">8</property>
<property name="top_padding">8</property>
<property name="bottom_padding">8</property>
<property name="left_padding">8</property>
<property name="right_padding">8</property>
<child>
<!-- n-columns=3 n-rows=6 -->
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="column-spacing">8</property>
<property name="can_focus">False</property>
<property name="column_spacing">8</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Status:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Public key:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Listen port:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Addresses:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">3</property>
<property name="left_attach">0</property>
<property name="top_attach">3</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">DNS servers:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">4</property>
<property name="left_attach">0</property>
<property name="top_attach">4</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_interface_status">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_interface_public_key">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_interface_listen_port">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">2</property>
<property name="left_attach">1</property>
<property name="top_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_interface_addresses">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">3</property>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_interface_dns_servers">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">4</property>
<property name="left_attach">1</property>
<property name="top_attach">4</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_change_state">
<property name="label" translatable="yes">Activate</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="halign">start</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">5</property>
<property name="left_attach">1</property>
<property name="top_attach">5</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
@ -328,7 +508,7 @@
<child type="label">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Interface:</property>
</object>
</child>
@ -342,167 +522,151 @@
<child>
<object class="GtkBox" id="box_peers">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label-xalign">0</property>
<property name="shadow-type">out</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">out</property>
<child>
<object class="GtkAlignment">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">start</property>
<property name="top-padding">8</property>
<property name="bottom-padding">8</property>
<property name="left-padding">8</property>
<property name="right-padding">8</property>
<property name="top_padding">8</property>
<property name="bottom_padding">8</property>
<property name="left_padding">8</property>
<property name="right_padding">8</property>
<child>
<!-- n-columns=3 n-rows=5 -->
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="column-spacing">8</property>
<property name="row-homogeneous">True</property>
<property name="can_focus">False</property>
<property name="column_spacing">8</property>
<property name="row_homogeneous">True</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Public key:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Allowed IPs:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Endpoint:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Latest handshake:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">3</property>
<property name="left_attach">0</property>
<property name="top_attach">3</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Transfer:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">4</property>
<property name="left_attach">0</property>
<property name="top_attach">4</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_peer_public_key">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_peer_allowed_ips">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_peer_endpoint">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">2</property>
<property name="left_attach">1</property>
<property name="top_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_peer_latest_handshake">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">3</property>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_peer_transfer">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">4</property>
<property name="left_attach">1</property>
<property name="top_attach">4</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
@ -510,7 +674,7 @@
<child type="label">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Peer</property>
</object>
</child>
@ -531,12 +695,12 @@
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
</object>
<packing>
@ -546,11 +710,11 @@
</packing>
</child>
<child>
<object class="GtkButton">
<object class="GtkButton" id="button_edit_tunnel">
<property name="label" translatable="yes">Edit</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="halign">start</property>
<property name="valign">start</property>
</object>
@ -587,20 +751,20 @@
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="shadow-type">in</property>
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="hscroll-policy">natural</property>
<property name="vscroll-policy">natural</property>
<property name="hscroll_policy">natural</property>
<property name="vscroll_policy">natural</property>
<child>
<object class="GtkListBox" id="wireguard_logs">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
</object>
@ -624,21 +788,5 @@
</child>
</object>
</child>
<child type="titlebar">
<object class="GtkHeaderBar" id="main_header">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="title" translatable="yes">Wireguird</property>
<property name="subtitle" translatable="yes">Not connected</property>
<property name="show-close-button">True</property>
<child>
<object class="GtkStackSwitcher">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="stack">main_stack</property>
</object>
</child>
</object>
</child>
</object>
</interface>

Loading…
Cancel
Save