Skip to content

Commit 1e9a4b2

Browse files
author
Cedric BAIL
committed
Add beta ssh support.
1 parent e89255c commit 1e9a4b2

File tree

5 files changed

+219
-8
lines changed

5 files changed

+219
-8
lines changed

go.mod

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.20
44

55
require (
66
fyne.io/fyne/v2 v2.3.3
7+
github.com/fyne-io/terminal v0.0.0-20230223114940-c76e408adbd3
78
github.com/fynelabs/fyneselfupdate v0.1.0
89
github.com/fynelabs/fynetailscale v0.1.1
910
github.com/fynelabs/selfupdate v0.2.0
@@ -17,6 +18,8 @@ require (
1718
require (
1819
filippo.io/edwards25519 v1.0.0-rc.1 // indirect
1920
fyne.io/systray v1.10.1-0.20230403195833-7dc3c09283d6 // indirect
21+
github.com/ActiveState/termtest/conpty v0.5.0 // indirect
22+
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
2023
github.com/Microsoft/go-winio v0.6.0 // indirect
2124
github.com/akutz/memconn v0.1.0 // indirect
2225
github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 // indirect
@@ -33,6 +36,7 @@ require (
3336
github.com/aws/aws-sdk-go-v2/service/sts v1.11.1 // indirect
3437
github.com/aws/smithy-go v1.13.5 // indirect
3538
github.com/coreos/go-iptables v0.6.0 // indirect
39+
github.com/creack/pty v1.1.17 // indirect
3640
github.com/davecgh/go-spew v1.1.1 // indirect
3741
github.com/fredbi/uri v0.1.0 // indirect
3842
github.com/fsnotify/fsnotify v1.5.4 // indirect

go.sum

+23
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,16 @@ filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmG
4141
filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns=
4242
filippo.io/mkcert v1.4.3 h1:axpnmtrZMM8u5Hf4N3UXxboGemMOV+Tn+e+pkHM6E3o=
4343
fyne.io/fyne/v2 v2.1.4/go.mod h1:p+E/Dh+wPW8JwR2DVcsZ9iXgR9ZKde80+Y+40Is54AQ=
44+
fyne.io/fyne/v2 v2.3.0/go.mod h1:odfJmbFnODiKn1MXdL44JR6CK+0v8lrmgdPlrUF6w0M=
4445
fyne.io/fyne/v2 v2.3.3-rc1.0.20230426084847-b79c5c79ddba h1:jVj6xV2rZfd7W8CGLHTeRZctrSe9agCncDzJGWcZGIU=
4546
fyne.io/fyne/v2 v2.3.3-rc1.0.20230426084847-b79c5c79ddba/go.mod h1:X68TywFCF64d70rjy79cQ6RqTflJV4RMRRVmGjoK9F8=
47+
fyne.io/systray v1.10.1-0.20221115204952-d16a6177e6f1/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE=
4648
fyne.io/systray v1.10.1-0.20230403195833-7dc3c09283d6 h1:lHt8dm97Uy9ggtnt9N6XOlsp76wXmRAh3SjReWm1e2Q=
4749
fyne.io/systray v1.10.1-0.20230403195833-7dc3c09283d6/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE=
50+
github.com/ActiveState/termtest/conpty v0.5.0 h1:JLUe6YDs4Jw4xNPCU+8VwTpniYOGeKzQg4SM2YHQNA8=
51+
github.com/ActiveState/termtest/conpty v0.5.0/go.mod h1:LO4208FLsxw6DcNZ1UtuGUMW+ga9PFtX4ntv8Ymg9og=
52+
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
53+
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
4854
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
4955
github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
5056
github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
@@ -92,6 +98,9 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.11.1/go.mod h1:UV2N5HaPfdbDpkgkz4sRz
9298
github.com/aws/smithy-go v1.9.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
9399
github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8=
94100
github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
101+
github.com/benoitkugler/pstokenizer v1.0.0/go.mod h1:l1G2Voirz0q/jj0TQfabNxVsa8HZXh/VMxFSRALWTiE=
102+
github.com/benoitkugler/textlayout v0.3.0/go.mod h1:o+1hFV+JSHBC9qNLIuwVoLedERU7sBPgEFcuSgfvi/w=
103+
github.com/benoitkugler/textlayout-testdata v0.1.1/go.mod h1:i/qZl09BbUOtd7Bu/W1CAubRwTWrEXWq6JwMkw8wYxo=
95104
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
96105
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
97106
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -112,7 +121,9 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma
112121
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
113122
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
114123
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
124+
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
115125
github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI=
126+
github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
116127
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
117128
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
118129
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -142,6 +153,8 @@ github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 h1:+31CdF/okdokeFN
142153
github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504/go.mod h1:gLRWYfYnMA9TONeppRSikMdXlHQ97xVsPojddUv3b/E=
143154
github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 h1:hnLq+55b7Zh7/2IRzWCpiTcAvjv/P8ERF+N7+xXbZhk=
144155
github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0=
156+
github.com/fyne-io/terminal v0.0.0-20230223114940-c76e408adbd3 h1:yVnI7pzJFW7SgiSE1FYXl+2Dk2SutKskSCsY+fEepqo=
157+
github.com/fyne-io/terminal v0.0.0-20230223114940-c76e408adbd3/go.mod h1:Ig1MvNwtLt+cjPtp+7srygEjH7diSCxyt3A3AfpVgxw=
145158
github.com/fynelabs/fyneselfupdate v0.1.0 h1:IAHSozfCu4AEtYd5NPvJ72fnchxSBBCGoqlID9YyhKw=
146159
github.com/fynelabs/fyneselfupdate v0.1.0/go.mod h1:GSgx/qDj7Zv0wHZDH9ki+l/kpWasJjdPS/x075GQSBs=
147160
github.com/fynelabs/fynetailscale v0.1.1 h1:EcWP6HYcFcuDkwBSYcmCyD6O4pZzl42srZy4/kdlCQQ=
@@ -179,6 +192,7 @@ github.com/go-routeros/routeros v0.0.0-20210123142807-2a44d57c6730 h1:EuqwWLv/LP
179192
github.com/go-routeros/routeros v0.0.0-20210123142807-2a44d57c6730/go.mod h1:em1mEqFKnoeQuQP9Sg7i26yaW8o05WwcNj7yLhrXxSQ=
180193
github.com/go-text/render v0.0.0-20230327192424-adef04305ec0 h1:1F5PnpZdOJnVRxfy378mjm2j6HYBA5suRLlqA+RndhA=
181194
github.com/go-text/render v0.0.0-20230327192424-adef04305ec0/go.mod h1:+qxdVKijbZKOO8XX9gt6gnHnu3qNU3APpPLiSQSgvXM=
195+
github.com/go-text/typesetting v0.0.0-20221212183139-1eb938670a1f/go.mod h1:/cmOXaoTiO+lbCwkTZBgCvevJpbFsZ5reXIpEJVh5MI=
182196
github.com/go-text/typesetting v0.0.0-20230326213217-3355bdaa7d70/go.mod h1:zvWM81wAVW6QfVDI6yxfbCuoLnobSYTuMsrXU/u11y8=
183197
github.com/go-text/typesetting v0.0.0-20230405155246-bf9c697c6e16 h1:DvHeDNqK8cxdZ7C6y88pt3uE7euZH7/LluzyfnUfH/Q=
184198
github.com/go-text/typesetting v0.0.0-20230405155246-bf9c697c6e16/go.mod h1:zvWM81wAVW6QfVDI6yxfbCuoLnobSYTuMsrXU/u11y8=
@@ -195,6 +209,7 @@ github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
195209
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
196210
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
197211
github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw=
212+
github.com/goki/freetype v0.0.0-20220119013949-7a161fd3728c/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw=
198213
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
199214
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
200215
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -393,6 +408,7 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
393408
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
394409
github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
395410
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
411+
github.com/nicksnyder/go-i18n/v2 v2.1.2/go.mod h1:d++QJC9ZVf7pa48qrsRWhMJ5pSHIPmS3OLqK1niyLxs=
396412
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
397413
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
398414
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
@@ -545,7 +561,10 @@ golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a h1:Jw5wfR+h9mnIYH
545561
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
546562
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
547563
golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
564+
golang.org/x/image v0.0.0-20210504121937-7319ad40d33e/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
565+
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
548566
golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
567+
golang.org/x/image v0.0.0-20220601225756-64ec528b34cd/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY=
549568
golang.org/x/image v0.3.0/go.mod h1:fXd9211C/0VTlYuAcOhW8dY/RtEJqODXOWBDpmYBf+A=
550569
golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI=
551570
golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4=
@@ -617,6 +636,7 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v
617636
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
618637
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
619638
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
639+
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
620640
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
621641
golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
622642
golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
@@ -682,6 +702,7 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w
682702
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
683703
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
684704
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
705+
golang.org/x/sys v0.0.0-20200428200454-593003d681fa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
685706
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
686707
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
687708
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -732,6 +753,7 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
732753
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
733754
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
734755
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
756+
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
735757
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
736758
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
737759
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
@@ -917,6 +939,7 @@ gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
917939
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
918940
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
919941
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
942+
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
920943
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
921944
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
922945
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

main.go

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import (
1616
type router struct {
1717
leaseBinding *MikrotikDataTable
1818

19+
ssh *remote
20+
1921
err error
2022

2123
host string

ssh.go

+154
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"image/color"
7+
"io"
8+
"net"
9+
10+
"fyne.io/fyne/v2"
11+
"fyne.io/fyne/v2/canvas"
12+
"fyne.io/fyne/v2/widget"
13+
"github.com/fyne-io/terminal"
14+
"golang.org/x/crypto/ssh"
15+
)
16+
17+
type remote struct {
18+
widget.BaseWidget
19+
20+
terminal *terminal.Terminal
21+
22+
session *ssh.Session
23+
24+
win fyne.Window
25+
26+
disconnected func()
27+
28+
err error
29+
}
30+
31+
var _ fyne.Widget = (*remote)(nil)
32+
var _ io.Closer = (*remote)(nil)
33+
34+
func (r *router) NewSSH(win fyne.Window, dial func(ctx context.Context, network, address string) (net.Conn, error)) (*remote, error) {
35+
config := ssh.ClientConfig{
36+
User: r.user,
37+
Auth: []ssh.AuthMethod{
38+
ssh.Password(r.password),
39+
},
40+
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
41+
}
42+
43+
conn, err := dial(context.Background(), "tcp", r.host+":22")
44+
if err != nil {
45+
return nil, err
46+
}
47+
c, chans, reqs, err := ssh.NewClientConn(conn, r.host+":22", &config)
48+
if err != nil {
49+
conn.Close()
50+
return nil, err
51+
}
52+
client := ssh.NewClient(c, chans, reqs)
53+
54+
session, err := client.NewSession()
55+
if err != nil {
56+
c.Close()
57+
return nil, err
58+
}
59+
60+
rssh := &remote{
61+
terminal: terminal.New(),
62+
session: session,
63+
win: win,
64+
}
65+
rssh.ExtendBaseWidget(rssh)
66+
67+
modes := ssh.TerminalModes{
68+
ssh.ECHO: 1, // disable echoing
69+
ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
70+
ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
71+
}
72+
73+
cellSize := guessCellSize()
74+
if err := session.RequestPty("xterm-256color", int(rssh.Size().Height/cellSize.Height), int(rssh.Size().Width/cellSize.Width), modes); err != nil {
75+
_ = session.Close()
76+
return nil, err
77+
}
78+
79+
in, _ := session.StdinPipe()
80+
out, _ := session.StdoutPipe()
81+
82+
go session.Run("")
83+
84+
go func() {
85+
rssh.err = rssh.terminal.RunWithConnection(in, out)
86+
87+
if rssh.disconnected != nil {
88+
rssh.disconnected()
89+
}
90+
}()
91+
92+
fmt.Println("new ssh", rssh)
93+
return rssh, nil
94+
}
95+
96+
func (r *remote) OnDisconnected(f func()) {
97+
r.disconnected = f
98+
}
99+
100+
func (r *remote) Tapped(_ *fyne.PointEvent) {
101+
r.win.Canvas().Focus(r.terminal)
102+
}
103+
104+
func (r *remote) Resize(s fyne.Size) {
105+
cellSize := guessCellSize()
106+
r.err = r.session.WindowChange(int(s.Height/cellSize.Height), int(s.Width/cellSize.Width))
107+
r.terminal.Resize(s)
108+
fmt.Println("resize", s)
109+
}
110+
111+
func (r *remote) Close() error {
112+
if r.session == nil {
113+
return nil
114+
}
115+
err := r.session.Close()
116+
r.session = nil
117+
return err
118+
}
119+
120+
func (r *remote) CreateRenderer() fyne.WidgetRenderer {
121+
return &remoteRenderer{r: r}
122+
}
123+
124+
type remoteRenderer struct {
125+
r *remote
126+
}
127+
128+
var _ fyne.WidgetRenderer = (*remoteRenderer)(nil)
129+
130+
func (r *remoteRenderer) Destroy() {
131+
}
132+
133+
func (r *remoteRenderer) Layout(s fyne.Size) {
134+
r.r.terminal.Resize(s)
135+
}
136+
137+
func (r *remoteRenderer) MinSize() fyne.Size {
138+
return r.r.terminal.MinSize()
139+
}
140+
141+
func (r *remoteRenderer) Objects() []fyne.CanvasObject {
142+
return []fyne.CanvasObject{r.r.terminal}
143+
}
144+
145+
func (r *remoteRenderer) Refresh() {
146+
r.r.terminal.Refresh()
147+
}
148+
149+
func guessCellSize() fyne.Size {
150+
cell := canvas.NewText("M", color.White)
151+
cell.TextStyle.Monospace = true
152+
153+
return cell.MinSize()
154+
}

ui.go

+36-8
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,36 @@ func (a *appData) createUI(lastHost string) {
2424
a.saveCurrentView()
2525
}
2626

27-
header := widget.NewLabel("Not Connected")
28-
header.Alignment = fyne.TextAlignCenter
27+
headerBoard := widget.NewLabel("Not Connected")
28+
headerBoard.Alignment = fyne.TextAlignCenter
29+
headerSSH := widget.NewButtonWithIcon("SSH", theme.ComputerIcon(), func() {
30+
if a.current == nil {
31+
return
32+
}
33+
34+
var err error
35+
if a.current.ssh == nil {
36+
a.current.ssh, err = a.current.NewSSH(a.win, a.dial)
37+
} else if a.current.err != nil {
38+
err = a.current.err
39+
a.current.err = nil
40+
a.current.ssh, _ = a.current.NewSSH(a.win, a.dial)
41+
}
42+
43+
fmt.Println("SSH", err)
44+
45+
var obj []fyne.CanvasObject
46+
47+
if err != nil {
48+
obj = append(obj, widget.NewLabel(fmt.Sprintf("Last error: %v", err)))
49+
}
50+
obj = append(obj, a.current.ssh)
51+
52+
content := container.New(&moreSpace{a.win}, container.NewStack(obj...))
53+
d := dialog.NewCustom("SSH", "Close", content, a.win)
54+
d.Show()
55+
})
56+
header := container.NewBorder(nil, nil, nil, headerSSH, headerBoard)
2957
footer := widget.NewLabel("")
3058
footer.Alignment = fyne.TextAlignCenter
3159

@@ -36,21 +64,21 @@ func (a *appData) createUI(lastHost string) {
3664

3765
footer.SetText(fmt.Sprintf("%v", err))
3866
if a.identity != nil {
39-
header.Bind(a.identity)
67+
headerBoard.Bind(a.identity)
4068
} else {
41-
header.Unbind()
42-
header.SetText("Not Connected")
69+
headerBoard.Unbind()
70+
headerBoard.SetText("Not Connected")
4371
}
4472
return
4573
}
4674

4775
if ssl {
48-
header.TextStyle = fyne.TextStyle{Bold: true}
76+
headerBoard.TextStyle = fyne.TextStyle{Bold: true}
4977
} else {
50-
header.TextStyle = fyne.TextStyle{}
78+
headerBoard.TextStyle = fyne.TextStyle{}
5179
}
5280

53-
header.Bind(identity)
81+
headerBoard.Bind(identity)
5482
footer.SetText("")
5583
}
5684

0 commit comments

Comments
 (0)