https://github.com/glurp/netvector
Remote display for simple graphic via SSH
https://github.com/glurp/netvector
gui ssh
Last synced: about 1 year ago
JSON representation
Remote display for simple graphic via SSH
- Host: GitHub
- URL: https://github.com/glurp/netvector
- Owner: glurp
- Created: 2017-08-31T13:14:04.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2017-09-20T15:36:03.000Z (almost 9 years ago)
- Last Synced: 2025-02-10T01:37:49.809Z (over 1 year ago)
- Topics: gui, ssh
- Language: Ruby
- Homepage:
- Size: 39.1 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Presentation
============
Sometime, a distant host has little environment
* with TCP/IP
* without any Xorg, graphics display, graphics libraries
For this cases, displaying some graphics (text/vector/raster) from distant host is not easy. Typical case are :
* embeded Linux with little memory : Omega2, Linkit Smart, Arduino Yun...
* router on OpenWrt
* Cloud Server without any remote display amin.
This tool offer a basic solution:
* a client, connect to host (ssh or tcp)
* if ssh, it run a distant program (shell script or others)
* this program print on STDOUT some lines of text which are vector graphics order
* client show the resulting graph one the (gtk) display.
Here a example of clock display (code in ```srv_clock.rb```) client show :

Pros/Cons
* (+) very light , serveur-side and client-side
* (-) very limited, http/canvas are more powerful
Usage
======
Usage:
```ruby
>ruby client.rb ip-host user pass|noport ssh|tcp|local command...
```
Examples :
```sh
ruby client.rb 192.168.0.1 root 1234 ssh ruby srv_clock.rb 22
ruby client.rb ab.net root 1234 ssh ruby -e "'$stdout.sync=true;loop {puts "CLEAR;POS,0,20///# {Time.now};END" ;sleep 3}'"
ruby client.rb ab.net root 8787 tcp -
```
For TCP usage, shell server can be run with ```netcat``` :
```shell
nc -kl 8787 -c ./srv.sh
```
(-l for listen TCP, port 8787, -k server keep online after client disconnection, -c command to run on connection, stdin/stdout piped on socket)
In Ruby, server TCP can use ```gserver``` gem, or minitcp :
```ruby
MServer.service(8787,"0.0.0.0",22) do |socket|
socket.on_timer(1000) do
socket.write "CLEAR;POS, 1/20 /// Free Disk=> #{`df -h | grep tmp | head -1`};END"
end
socket.wait_end
end
sleep
```
```local``` usage is for test : run a local command, piped his output.
Vector graphic Langage
=====
line is splited with ```/\s*[,/]\s*/```.
usage is to use ',' for all, except for x/y point or w/h size, in these case, use '/'.
so: ```DDDD/1,2,3``` is same as : ```DDDD,2, 1/3``` or ```DDDD, 2/1/3```
```
echo "CLEARBG" # start backgound vector list
echo "DIM, 100 / 200" # set dimensiion of client drawing area
.... # use pos/rect/pline/poly/ova
echo "ENDBG" # end of background list (no refresh!)
echo "CLEAR" # start vector list
echo "FONT,size,name,color" # attributes for text
echo "POS,x/y /// Date: $(date)" # text at x/y position (size nd color can(t be specified!)
echo "RECT,#00F, #F00, 0, x/y, w/h" # horizontal rectangle : (bgcolor fgcolor border-width) x y w h
echo "PLINE, #888, #888, 10, 0/50, 200/50, 200/60, 0/60" # poly-line: bgcolor fgcolor border-width x y x y...
eco "POLYG,#888, #888, 10, 0/50, 200/50, 200/60, 0/60" # plygone : bgcolor fgcolor border-width x y x y...
echo "OVAL, #888, #888, 10, 0/50, 200" # circle : bgcolor fgcolor border-width x-center y-center r
###### echo "END" # end of list , refresh
```
At 'END' commande, refresh do a redraw of backdround layout AND THEN foreground layout.
So backgound can be a heavy vectored (a svg export should be done...) , and forground show only varying vector.
Example : output of srv_clock.rb :
---
```
CLEARBG
RECT, #CCC, #CCC, 0 , 0 / 0 , 200 / 100
PLINE, #888, #888, 10, 0 / 70, 200 / 70, 200 / 80, 0 / 80
OVAL, #AAA, #FEE, 3, 150.0 / 50.0, 30.3
OVAL, #AAA, #AAA, 1, 150.0 / 50.0, 3
PLINE, #AAA, #AAA, 1, 152.82226850822664 / 23.14790882505662, 153.1358538980296 / 20.1643431389518
.... graduations drawing...
PLINE, #AAA, #AAA, 3, 150.0 / 26.0, 150.0 / 20.0
ENDBG
CLEAR
POS, 10 / 15 /// Date: 16:43:48
POS, 10 / 30 /// ls: 49
PLINE, #AAB, #AAB, 2, 150.0 / 50.0, 159.3377195495643 / 61.7391223527862
PLINE, #ABA, #ABA, 2, 150.0 / 50.0, 126.18924716845254 / 53.007997605543295
PLINE, #BAA, #BAA, 2, 150.0 / 50.0, 121.46830451114539 / 40.72949016875159
END
CLEAR
POS, 10 / 15 /// Date: 16:43:49
POS, 10 / 30 /// ls: 49
PLINE, #AAB, #AAB, 2, 150.0 / 50.0, 159.3377195495643 / 61.7391223527862
PLINE, #ABA, #ABA, 2, 150.0 / 50.0, 126.18403349074828 / 52.96643544177182
PLINE, #BAA, #BAA, 2, 150.0 / 50.0, 122.59363627072197 / 37.79790070772599
```
Examples of server programs
========
```shell
#!/bin/bash
echo "CLEAR"
echo "POS, 40 / 40 /// Hello ! "
echo "PLINE, #888, #888, 10, 0 / 50, 200 / 50"
echo "END"
sleep 3
while :; do
echo "CLEAR"
echo "RECT, #CCC, #CCC, 0, 0 / 0, 200 / 100"
echo "POS, 10 / 15 /// Date: $(date | awk ' {printf $4}')"
echo "POS, 10 / 30 /// ls: $(ls -1 | wc -l)"
echo "PLINE, #888, #888, 10, 0/50, 200/50, 200/60, 0/60"
echo "END"
sleep 1
done
```
TODO
====
* [x] Force size of client drawing area
* [x] 2 layers : one static, at startup, other dynamic
* [x] Text with style : font, size, color
* [ ] Raster image (?)
* [ ] scp integration : copy script to server before execution (?)
* [ ] test unit
* [ ] a gem (?)
License
=======
This project is licensed under the terms of the MIT license.
```client.rb``` is only a proof of concept. If the idea pleases someone, the language could be extended and client part writing in compiled lang (Crystal ? :)