From cb61a037fe5031b4f6bdfd0172b75698d70bc84c Mon Sep 17 00:00:00 2001 From: arnef Date: Thu, 17 Jun 2021 08:18:45 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=89=20ssh=20proxy=20systray?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Makefile | 39 ++++++++++++++++++++++++++++ README.md | 2 ++ go.mod | 5 ++++ go.sum | 24 +++++++++++++++++ icon/shield-off.png | Bin 0 -> 2196 bytes icon/shield-off.svg | 1 + icon/shield.png | Bin 0 -> 2172 bytes icon/shield.svg | 1 + main.go | 61 ++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 134 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 go.mod create mode 100644 go.sum create mode 100644 icon/shield-off.png create mode 100644 icon/shield-off.svg create mode 100644 icon/shield.png create mode 100644 icon/shield.svg create mode 100644 main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7773828 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +dist/ \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..59df5f3 --- /dev/null +++ b/Makefile @@ -0,0 +1,39 @@ +define INFO_PLIST + + + + + LSUIElement + 1 + CFBundleExecutable + sshproxytray + + +endef +export INFO_PLIST + +ifeq ($(OS),Windows_NT) + OS = win +else + UNAME := $(shell uname -s) + ifeq ($(UNAME),Darwin) + OS = mac + else ifeq ($(UNAME),Linux) + OS = linux + else + $(error OS not supported by this Makefile) + endif +endif + + +build: build-$(OS) + +install: install-$(OS) + +build-mac: + mkdir -p dist/SshProxyTray.app/Contents/{MacOS,Resources} + echo $$INFO_PLIST > dist/SshProxyTray.app/Contents/Info.plist + go build -o dist/SshProxyTray.app/Contents/MacOS/sshproxytray main.go + +install-mac: + cp -r dist/SshProxyTray.app /Applications \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..cfccb1c --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# SSH Proxy Tray + diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..08a701b --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module git.arnef.de/arnef/sshproxytray + +go 1.16 + +require github.com/getlantern/systray v1.1.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..f37ccf3 --- /dev/null +++ b/go.sum @@ -0,0 +1,24 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 h1:NRUJuo3v3WGC/g5YiyF790gut6oQr5f3FBI88Wv0dx4= +github.com/getlantern/context v0.0.0-20190109183933-c447772a6520/go.mod h1:L+mq6/vvYHKjCX2oez0CgEAJmbq1fbb/oNJIWQkBybY= +github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7 h1:6uJ+sZ/e03gkbqZ0kUG6mfKoqDb4XMAzMIwlajq19So= +github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A= +github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7 h1:guBYzEaLz0Vfc/jv0czrr2z7qyzTOGC9hiQ0VC+hKjk= +github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7/go.mod h1:zx/1xUUeYPy3Pcmet8OSXLbF47l+3y6hIPpyLWoR9oc= +github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7 h1:micT5vkcr9tOVk1FiH8SWKID8ultN44Z+yzd2y/Vyb0= +github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7/go.mod h1:dD3CgOrwlzca8ed61CsZouQS5h5jIzkK9ZWrTcf0s+o= +github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 h1:XYzSdCbkzOC0FDNrgJqGRo8PCMFOBFL9py72DRs7bmc= +github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA= +github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f h1:wrYrQttPS8FHIRSlsrcuKazukx/xqO/PpLZzZXsF+EA= +github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA= +github.com/getlantern/systray v1.1.0 h1:U0wCEqseLi2ok1fE6b88gJklzriavPJixZysZPkZd/Y= +github.com/getlantern/systray v1.1.0/go.mod h1:AecygODWIsBquJCJFop8MEQcJbWFfw/1yWbVabNgpCM= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= +github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 h1:YTzHMGlqJu67/uEo1lBv0n3wBXhXNeUbB1XfN2vmTm0= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/icon/shield-off.png b/icon/shield-off.png new file mode 100644 index 0000000000000000000000000000000000000000..08701468ac4d7c874ced89b37319ed56b6c38497 GIT binary patch literal 2196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVux!c-n*TA>HIW;5GqpB!1xXLdi zxhgx^GDXSWj?1RP3TQxXYDuC(MQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}6yY17;GAES zs$i;Ts%M~N$E9FXl#*r@k>g7FXt#Bv$C=6)S^`fSBQuTAW;zSx}OhpQivaGchT@w8U0P2`H}sH9WN<6JdH@ zG1U9OfY1lY=o{)8=p!pH$xOqc93+FGydWdLB)>Q#zX0w56f5A;7#e}Whh0lWVgWYA zzP|XC=jNh#qqxMi3>Xm5Kt*vA%!1;O%7Rq=pw#00(xT*4*Rs^S5@m2mfWpNpAhRMh zC&DE&H#M&q7`nDf#ztt8kvJrs^K8atFDJ2Aw zsd?$>5+Il5l!Br*G%pkA7l{2}JrM{wTP1TNV4?y=I9MtYs}wvQtiZ1G%})V3&KRr< zA?4}p98i>>mYD;TD-LpZQt)(jHZ!y|Gt)KFgLniOX;whJnQ4_Si6uZ)Mg~TPx&~&t zhGrp#W>&_gRwky}21Zr}5chyp1M@;kVo4$)^`I23U<1_Q>ucqaSzMA|R0$S>B=g|Z zLI@AS&B+9(Zv_Q#EL$Zeg96D`sh}u7r8GG;1?(-LaS++!{Irtt#G+KkbYKMADmkX5 zWdehddpS$2KVzouJkYnvBnG-Zfy z(aQ=hvJPif{=}1h&V2vO;u)6A*9yEmUz;{hIG3_@!u{7XX2%!Yn7?vyuh_1Q?jo_W z{A|o2Tl=kb()JY2+`4N1@9R?2lXo#qt9oeYdUeyG$%h)ZuF3ket)P8Uj}G^IE^E`B z3qGt}>3;f8QqiI_@oL!*C-ASyJ=AwZzwcj?>dK|9PoI8S7Hs+Sx!p7GSxGZ*N_N^l ziha@Y;qlRfBEmmD7#vw~MlNQDsPwd`5FR$@hr?lBiu2)n@<>Vs~Q}wIKLXQ_6 zPg!ze_TT@v!)@)}=!NHha(X*CanIMrTJA2^!#`|HdL9Yhkb9^Ud@|m)VPg43Zqc>n z@=@jw-fUXrTK=F$*h>CNhnS|PSz)#f-+J{6HvDg|U)T`w?&f*BT{j`w%wP%|Nd+9{_~vYFKgzDrCm6h^15Eb$L>N%lCSjR9TLan zwyb9IiCX2vk#jimO!PYQ8ON?^2?QTjFlc;lDV+XQ+P{z`x!3VQiOBCpb_q9yNYS6{Ufw7tKIdE%NEz3GQPUr?U)AaVzjGvlm= z6}$oBiv%021bP`mT32vg&^#&0$uu{RLCpExX2r^r0u^#aV!;g0oQm`n%{iIoJJsm1 zKFCYiu~?7g*a!6^@0K#ibe~zrr|Z$YqnBU8-!Qtj|KN++NBGjG*iK9;(=)1S-1=XH z>GcOIqgM;w91mqHT&s1Y%-j0e>CVzzo6IcLvWM9zCTo{$=bjutY5gey_Al0V8{Z|@ z`rVVd)A_0HVOp?&yRpFg4c1-ng}283TAp6tVY \ No newline at end of file diff --git a/icon/shield.png b/icon/shield.png new file mode 100644 index 0000000000000000000000000000000000000000..5894e5ef59ee63e1d621579abcbd0db4b9d83e48 GIT binary patch literal 2172 zcmah~X;c$e6b{BB0j&yQ5sD1sf*YA6NH`f26bOZgp~zCe1q{g~43JDRGmt>R1+bPD z5o@a=_JA980T(p5S5Xi=dQ`09f(yoDu}5r?)}vNw`;s8;?T?wsd*65OyZ5{IzLdm7 zM+|fHbYw6X!=#atSn!1`kAppUQ+auRG8lvF@%SV z(Q?SB$8-XD!h0YYiNwOFyj36;6kQ2z^!oiM^h*YZ3SjngT#$Y9e z(`j0VB8b6Y;1~ip1gS=NLZJ}h@)17YA29r>TrDj(`fI5%78f=j5{y!ixQ@mNEoAX2 zPb0EvF$@D7>UWMA@mJopRDb$F2*iRQJPsFmolfJb56~^hJ9J$-K@(Iup&LlxjUxu& zcMO4i?>8~Zb?+m~WdBXqXx>PJqQi555dEUQ5!1^9sQ6qRhQwkNkxeSF@ElA_kFhFY z(FKjcjaXKa1lM3%3aBfF1Nd)&$sYj2h%ADP15JgAVV>2-q8uvK$kkXPuB6ike7)MA zg=y7q1D43LvMr@e(BdE$+xb?Tq*s_24&sBRvJ~73CBGLMr~_(^PDUs}Z~<1USCBL; zEQTahcox8@*oaU_8XhL#2?YXwKF5{_C>jcEaaFEFP6HO7%jfxX1^zriJWqfIOhx&^ z$y`3lwZ&s)gIQ3@Y5D*0EgcPsfQ3wkM&cArkh#_^TbsvWdfUpj%)+hx4MEl_qjH5s zBr&Wb31zkdQ(Dsk?rbPUsAz+n#6r}dz+yN=rNV)nxeyo~T&=}Oh{q9fY*Gx^7}7D| z@59+4{jnjInR^+W2ze)bk(Kb;kODi~9vFUbiy#Bn2v`hUM3@%bJ|wti@}4ZNU@+{K z;Gi(?6okQ;urhn)nW)eZ_Oj_FeqNaWoPE2ue(s4uCRXf;K`dTTir3L+4wpDjCi!ZL z8bU)Z)m+*5cj0yWx}xd{h3W45I2m!|v_$5Z-l6JqLB}enwL)gQZl?4>U{U!wrK$Y( zgSC~Zx~o;&HZ6BMv?qc+-+Q<{Gv2gf+7#6heT8Xz)$=Q!YZQkDt z+|_yPX)`;}@3O-A?#347=GMx-e>xJy!QGrhqBr#6D*2JeOA4I6{^;aW(bQ7&$g898 zz;UNj#fw)O+MHbL3_f#$I=kyPh8sHbT~MD(U%5?`3iO$xk9YZ95DkBL<-+cy->#hx zZh0~yWzDWbg*V0b*Zffzb=%uc-86Lk<{9Asf~AX0rWgz-7t3SEShwB-ROqf$5)z-Z z^kMs+4EAh~=10?59?lM9Cyh=(KnWCq>MT3b=t1p5r#d*f)=i}SaZJ}>a?CNY_$HPpeyw|IyC z*JOt~^H*cn9owBmW%!h*hi`2v+S9Osd7v=y>I6IYOeS@pv_Q6D)H$>7Pv6a0Xl8Mm zyCyFDzI$#Xb5_%_I_LcQmXRmD=ADcz(GI@ys9{---KvB^wQj{#x*;tY>pS%~n#slo znXdYjo5mx3360}Y`r0;CR<^Ua9qf5#VaMbdsdLL~OzsPiaf3m>Pd;9br0)aiqH1JtwG+$+uZn{uzb6BxpZdtK2tf_X&?7+kVLjEA|*p@PN3-Bd-tqGsQ-e&(*N`RZyUqjz0P%*|AtM^wq_KF{kF zlKsVDrp}VKiM8WY-W_Li1nSe#^^1o2c{RHH{7pmj$rapr^@PWYRRzcN@`#?M{Ou#m zW1{_TSCwQ=%-`;693))PJh;B>i$}?ywY%$gCK#R5*vR9Z?jC)9J!2(bdNq{&zC&M^ sGemQP)N_l=Q#k?2tLvsdzJB>HroL>1&qZ}U1bToW4Ud-W3|&z8FFa}`FaQ7m literal 0 HcmV?d00001 diff --git a/icon/shield.svg b/icon/shield.svg new file mode 100644 index 0000000..c7c4841 --- /dev/null +++ b/icon/shield.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/main.go b/main.go new file mode 100644 index 0000000..db3d83c --- /dev/null +++ b/main.go @@ -0,0 +1,61 @@ +package main + +import ( + "os" + "os/exec" + + _ "embed" + + "github.com/getlantern/systray" +) + +//go:embed icon/shield.png +var activeIcon []byte + +//go:embed icon/shield-off.png +var inactiveIcon []byte + +func main() { + systray.Run(onReady, onExit) +} + +func onReady() { + systray.SetIcon(inactiveIcon) + connect := systray.AddMenuItem("Connect", "") + quit := systray.AddMenuItem("Quit", "") + + var cmd *exec.Cmd + + for { + select { + case <-quit.ClickedCh: + if cmd != nil { + cmd.Process.Kill() + } + systray.Quit() + case <-connect.ClickedCh: + if cmd == nil { + cmd = exec.Command("ssh", "-N", "proxytray") + systray.SetIcon(activeIcon) + connect.SetTitle("Disconnect") + cmd.Stderr = os.Stdout + cmd.Stdout = os.Stdout + cmd.Stdin = os.Stdin + cmd.Start() + go func() { + cmd.Wait() + systray.SetIcon(inactiveIcon) + connect.SetTitle("Connect") + cmd = nil + }() + } else { + cmd.Process.Kill() + } + } + } + +} + +func onExit() { + +}