├── 3dparts ├── 2020T-Slot.scad ├── GT2140sparse.scad ├── GT2140sparsecenter.stl ├── Getriebe.scad ├── RAMPS1_4.STL ├── cameramount.scad ├── cameramount.stl ├── equerre5.stl ├── gears.stl ├── piniongear.stl ├── poleadapter.stl ├── polemount.stl ├── pouliemountspacer.stl ├── pulleyroller.stl ├── ramps-wind-box.scad ├── ramps-wind-box.stl ├── rampsbox.scad ├── readme.txt ├── robotpoulie.scad ├── supportstepper.scad ├── supportstepper.stl ├── yawpouliemountflat.stl └── yawsupportflat2.stl ├── CMT.py ├── PID.py ├── README.md ├── arduino └── photobooth │ └── photobooth.ino ├── doc └── images │ ├── 2017-11-08-174942.jpg │ ├── 2017-11-08-175406.jpg │ ├── 2017-11-08-175601.jpg │ ├── 2017-11-08-175633.jpg │ ├── 2017-11-08-175816.jpg │ ├── 2017-11-08-175838.jpg │ ├── 2017-11-08-175858.jpg │ ├── 2017-11-08-175910.jpg │ ├── 2017-11-08-175922.jpg │ ├── 2017-11-08-182828.jpg │ ├── IMG_20171105_134613.jpg │ ├── linn-photobooth-logo.png │ └── readme.txt ├── docker ├── Dockerfile ├── gettingbluetoothtowork.txt ├── image │ ├── etc │ │ ├── nginx │ │ │ └── sites-enabled │ │ │ │ └── default │ │ └── supervisor │ │ │ └── conf.d │ │ │ └── supervisord.conf │ ├── root │ │ └── .gtkrc-2.0 │ ├── startup.sh │ └── usr │ │ ├── lib │ │ ├── noVNC │ │ │ ├── .gitlastcommit │ │ │ ├── .npmignore │ │ │ ├── .travis.yml │ │ │ ├── CONTRIBUTING.md │ │ │ ├── LICENSE.txt │ │ │ ├── README.md │ │ │ ├── app │ │ │ │ ├── images │ │ │ │ │ ├── alt.svg │ │ │ │ │ ├── clipboard.svg │ │ │ │ │ ├── connect.svg │ │ │ │ │ ├── ctrl.svg │ │ │ │ │ ├── ctrlaltdel.svg │ │ │ │ │ ├── disconnect.svg │ │ │ │ │ ├── drag.svg │ │ │ │ │ ├── error.svg │ │ │ │ │ ├── esc.svg │ │ │ │ │ ├── expander.svg │ │ │ │ │ ├── fullscreen.svg │ │ │ │ │ ├── handle.svg │ │ │ │ │ ├── handle_bg.svg │ │ │ │ │ ├── icons │ │ │ │ │ │ ├── Makefile │ │ │ │ │ │ ├── novnc-120x120.png │ │ │ │ │ │ ├── novnc-144x144.png │ │ │ │ │ │ ├── novnc-152x152.png │ │ │ │ │ │ ├── novnc-16x16.png │ │ │ │ │ │ ├── novnc-192x192.png │ │ │ │ │ │ ├── novnc-24x24.png │ │ │ │ │ │ ├── novnc-32x32.png │ │ │ │ │ │ ├── novnc-48x48.png │ │ │ │ │ │ ├── novnc-60x60.png │ │ │ │ │ │ ├── novnc-64x64.png │ │ │ │ │ │ ├── novnc-72x72.png │ │ │ │ │ │ ├── novnc-76x76.png │ │ │ │ │ │ ├── novnc-96x96.png │ │ │ │ │ │ ├── novnc-icon-sm.svg │ │ │ │ │ │ └── novnc-icon.svg │ │ │ │ │ ├── info.svg │ │ │ │ │ ├── keyboard.svg │ │ │ │ │ ├── mouse_left.svg │ │ │ │ │ ├── mouse_middle.svg │ │ │ │ │ ├── mouse_none.svg │ │ │ │ │ ├── mouse_right.svg │ │ │ │ │ ├── power.svg │ │ │ │ │ ├── settings.svg │ │ │ │ │ ├── tab.svg │ │ │ │ │ ├── toggleextrakeys.svg │ │ │ │ │ └── warning.svg │ │ │ │ ├── locale │ │ │ │ │ ├── de.js │ │ │ │ │ ├── el.js │ │ │ │ │ ├── nl.js │ │ │ │ │ └── sv.js │ │ │ │ ├── sounds │ │ │ │ │ ├── CREDITS │ │ │ │ │ ├── bell.mp3 │ │ │ │ │ └── bell.oga │ │ │ │ ├── styles │ │ │ │ │ ├── Orbitron700.ttf │ │ │ │ │ ├── Orbitron700.woff │ │ │ │ │ ├── auto.css │ │ │ │ │ └── base.css │ │ │ │ ├── ui.js │ │ │ │ └── webutil.js │ │ │ ├── core │ │ │ │ ├── base64.js │ │ │ │ ├── des.js │ │ │ │ ├── display.js │ │ │ │ ├── inflator.js │ │ │ │ ├── inflator.mod.js │ │ │ │ ├── input │ │ │ │ │ ├── devices.js │ │ │ │ │ ├── keysym.js │ │ │ │ │ ├── keysymdef.js │ │ │ │ │ ├── util.js │ │ │ │ │ └── xtscancodes.js │ │ │ │ ├── rfb.js │ │ │ │ ├── util.js │ │ │ │ └── websock.js │ │ │ ├── docs │ │ │ │ ├── LICENSE.Apache-2.0 │ │ │ │ ├── LICENSE.BSD-2-Clause │ │ │ │ ├── LICENSE.BSD-3-Clause │ │ │ │ ├── LICENSE.GPL-3 │ │ │ │ ├── LICENSE.LGPL-3 │ │ │ │ ├── LICENSE.MPL-2.0 │ │ │ │ ├── LICENSE.OFL-1.1 │ │ │ │ ├── LICENSE.pako │ │ │ │ ├── LICENSE.zlib │ │ │ │ ├── VERSION │ │ │ │ ├── flash_policy.txt │ │ │ │ ├── links │ │ │ │ ├── notes │ │ │ │ ├── release.txt │ │ │ │ ├── rfb_notes │ │ │ │ ├── rfbproto-3.3.pdf │ │ │ │ ├── rfbproto-3.7.pdf │ │ │ │ └── rfbproto-3.8.pdf │ │ │ ├── karma.conf.js │ │ │ ├── package.json │ │ │ ├── po │ │ │ │ ├── Makefile │ │ │ │ ├── de.po │ │ │ │ ├── el.po │ │ │ │ ├── nl.po │ │ │ │ ├── noVNC.pot │ │ │ │ ├── po2js │ │ │ │ ├── sv.po │ │ │ │ └── xgettext-html │ │ │ ├── tests │ │ │ │ ├── assertions.js │ │ │ │ ├── fake.websocket.js │ │ │ │ ├── input.html │ │ │ │ ├── playback.js │ │ │ │ ├── run_from_console.casper.js │ │ │ │ ├── run_from_console.js │ │ │ │ ├── run_from_console.zombie.js │ │ │ │ ├── test.base64.js │ │ │ │ ├── test.display.js │ │ │ │ ├── test.helper.js │ │ │ │ ├── test.keyboard.js │ │ │ │ ├── test.rfb.js │ │ │ │ ├── test.util.js │ │ │ │ ├── test.websock.js │ │ │ │ ├── vnc_perf.html │ │ │ │ └── vnc_playback.html │ │ │ ├── utils │ │ │ │ ├── README.md │ │ │ │ ├── b64-to-binary.pl │ │ │ │ ├── img2js.py │ │ │ │ ├── json2graph.py │ │ │ │ ├── launch.sh │ │ │ │ ├── make-module-transform.js │ │ │ │ ├── parse.js │ │ │ │ ├── u2x11 │ │ │ │ ├── use_require.js │ │ │ │ └── websockify │ │ │ │ │ ├── .travis.yml │ │ │ │ │ ├── CHANGES.txt │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── MANIFEST.in │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── README.md │ │ │ │ │ ├── Windows │ │ │ │ │ ├── Windows Service Readme.txt │ │ │ │ │ └── noVNC Websocket Service Project │ │ │ │ │ │ ├── Program.cs │ │ │ │ │ │ ├── ProjectInstaller.Designer.cs │ │ │ │ │ │ ├── ProjectInstaller.cs │ │ │ │ │ │ ├── ProjectInstaller.resx │ │ │ │ │ │ ├── Properties │ │ │ │ │ │ └── AssemblyInfo.cs │ │ │ │ │ │ ├── Service1.Designer.cs │ │ │ │ │ │ ├── Service1.cs │ │ │ │ │ │ ├── noVNC Websocket.csproj │ │ │ │ │ │ └── noVNC Websocket.sln │ │ │ │ │ ├── docs │ │ │ │ │ ├── LICENSE.GPL-3 │ │ │ │ │ ├── LICENSE.LGPL-3 │ │ │ │ │ ├── LICENSE.MPL-2.0 │ │ │ │ │ ├── TODO │ │ │ │ │ ├── flash_policy.txt │ │ │ │ │ ├── latency_results.txt │ │ │ │ │ ├── notes │ │ │ │ │ ├── release.txt │ │ │ │ │ └── websockify.1 │ │ │ │ │ ├── include │ │ │ │ │ ├── VT100.js │ │ │ │ │ ├── keysym.js │ │ │ │ │ ├── util.js │ │ │ │ │ ├── websock.js │ │ │ │ │ ├── webutil.js │ │ │ │ │ ├── wsirc.js │ │ │ │ │ └── wstelnet.js │ │ │ │ │ ├── other │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── README.md │ │ │ │ │ ├── js │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ └── websockify.js │ │ │ │ │ ├── launch.sh │ │ │ │ │ ├── project.clj │ │ │ │ │ ├── websocket.c │ │ │ │ │ ├── websocket.h │ │ │ │ │ ├── websocket.rb │ │ │ │ │ ├── websockify.c │ │ │ │ │ ├── websockify.clj │ │ │ │ │ ├── websockify.rb │ │ │ │ │ └── wswrap │ │ │ │ │ ├── rebind │ │ │ │ │ ├── rebind.c │ │ │ │ │ ├── run │ │ │ │ │ ├── setup.py │ │ │ │ │ ├── test-requirements.txt │ │ │ │ │ ├── tests │ │ │ │ │ ├── echo.html │ │ │ │ │ ├── echo.py │ │ │ │ │ ├── echo.rb │ │ │ │ │ ├── echo_client.py │ │ │ │ │ ├── latency.html │ │ │ │ │ ├── load.html │ │ │ │ │ ├── load.py │ │ │ │ │ ├── plain_echo.html │ │ │ │ │ ├── simple.html │ │ │ │ │ ├── test_auth_plugins.py │ │ │ │ │ ├── test_websocket.py │ │ │ │ │ ├── test_websocketproxy.py │ │ │ │ │ └── test_websockifyserver.py │ │ │ │ │ ├── tox.ini │ │ │ │ │ ├── websockify │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── auth_plugins.py │ │ │ │ │ ├── token_plugins.py │ │ │ │ │ ├── websocket.py │ │ │ │ │ ├── websocketproxy.py │ │ │ │ │ ├── websocketserver.py │ │ │ │ │ └── websockifyserver.py │ │ │ │ │ ├── wsirc.html │ │ │ │ │ └── wstelnet.html │ │ │ ├── vnc.html │ │ │ └── vnc_auto.html │ │ └── web │ │ │ ├── config │ │ │ └── __init__.py │ │ │ ├── lightop │ │ │ └── __init__.py │ │ │ ├── log │ │ │ ├── __init__.py │ │ │ └── config.py │ │ │ ├── requirements.txt │ │ │ ├── run.py │ │ │ └── static │ │ │ ├── 6df2b309.favicon.ico │ │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ └── glyphicons-halflings-regular.woff │ │ │ ├── index.html │ │ │ ├── robots.txt │ │ │ ├── scripts │ │ │ ├── 046bbd30.main.js │ │ │ ├── 2c80432f.plugins.js │ │ │ └── 9cd97fdd.vendor.js │ │ │ └── styles │ │ │ ├── 536b3e9f.main.css │ │ │ └── 57fdc80f.vendor.css │ │ └── share │ │ └── doro-lxde-wallpapers │ │ ├── bg1.jpg │ │ ├── bg2.jpg │ │ ├── bg3.jpg │ │ ├── bg4.jpg │ │ └── desktop-items-0.conf ├── readme.txt └── runcommand.txt ├── fast-neural-style ├── liststyles.sh ├── readme.txt └── train.sh ├── haarcascade_eye.xml ├── haarcascade_frontalface_default.xml ├── openpose └── examples │ ├── CMakeLists.txt │ ├── readme.txt │ └── zmq_pose_server │ ├── CMakeLists.txt │ └── multipleimages.cpp ├── persistent ├── art │ └── readme.txt ├── deleted │ └── readme.txt ├── extraframes │ └── readme.txt ├── photos │ └── readme.txt └── printedPhotos.txt ├── photobooth.py ├── pose.py ├── ps3.jpg ├── remoteart.sh ├── styles ├── Avatarjakeneytiri.jpg ├── Meisje_met_de_parel.jpg ├── Peasant-039-s-Head-Renaissance-Oil-Painting-LP03957.jpg ├── albrecht-durer.jpg ├── candy.jpg ├── composition_vii.jpg ├── feathers.jpg ├── la_muse.jpg ├── lisa_simpson.jpg ├── low-poly-character-dinges.jpg ├── low-poly-intro.jpg ├── marc-chagall-wallpaper.jpg ├── mickey.jpg ├── mondrian.jpg ├── monet1.jpg ├── mosaic.jpg ├── oneline-mona-lisa-joconde-vinci.jpg ├── picasso1.jpeg ├── pieter-bruegel-les-chasseurs-dans-la-neige.jpg ├── sketch.png ├── starry_night.jpg ├── starry_night_crop.jpg ├── the_scream.jpg ├── udnie.jpg ├── vermeer-milmaid.jpg ├── wave.jpg └── wave_crop.jpg ├── title.png └── util.py /3dparts/RAMPS1_4.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/3dparts/RAMPS1_4.STL -------------------------------------------------------------------------------- /3dparts/cameramount.scad: -------------------------------------------------------------------------------- 1 | 2 | e=3; 3 | 4 | module cameramount() 5 | { 6 | difference() 7 | { 8 | union() 9 | { 10 | translate([0,0,10+e/2]) 11 | cube([60,20,e],center=true); 12 | translate([0,0,-10-e/2]) 13 | cube([60,20,e],center=true); 14 | 15 | translate([10,0,0]) 16 | cube( [e,20,20],center=true); 17 | } 18 | union() 19 | { 20 | translate( [-24,0,0]) 21 | cylinder( r = 2.5,h=40,center =true,$fn=200); 22 | cylinder( r = 2.5,h=40,center =true,$fn=200); 23 | 24 | translate( [24,0,0]) 25 | cylinder( r = 3.0,h=40,center =true,$fn=200); 26 | } 27 | 28 | } 29 | 30 | } 31 | 32 | module polemount() 33 | { 34 | d=25; 35 | union() 36 | { 37 | difference() 38 | { 39 | union() 40 | { 41 | difference() 42 | { 43 | cylinder( r = d/2+e, h = 10, center=true,$fn=200); 44 | cylinder( r = d/2, h = 12, center=true,$fn=200); 45 | } 46 | 47 | translate([0,20,0]) 48 | cube([10,12,10],center=true); 49 | } 50 | union() 51 | { 52 | translate([0,20,0]) 53 | cube([4,18,12],center=true); 54 | translate([0,21,0]) 55 | rotate([0,90,0]) 56 | cylinder( r = 3,h=50,center=true,$fn=200); 57 | } 58 | } 59 | 60 | translate([0,-d/2-(20+e)/2,-10/2+e/2]) 61 | difference() 62 | { 63 | cube([40,20+e,e],center=true); 64 | union() 65 | { 66 | translate([15,-e/2,0]) 67 | cylinder(r=2.5,h=2*e,center=true,$fn=200); 68 | translate([-15,-e/2,0]) 69 | cylinder(r=2.5,h=2*e,center=true,$fn=200); 70 | } 71 | } 72 | 73 | 74 | } 75 | } 76 | 77 | polemount(); 78 | -------------------------------------------------------------------------------- /3dparts/rampsbox.scad: -------------------------------------------------------------------------------- 1 | 2 | import("RAMPS1_4.STL", convexity=3); 3 | 4 | translate([-5,-18,60]) 5 | cube( [100,65,35],center=true ); -------------------------------------------------------------------------------- /3dparts/readme.txt: -------------------------------------------------------------------------------- 1 | In this folder goes the 3d printed parts openscad files and stl. 2 | -------------------------------------------------------------------------------- /3dparts/supportstepper.scad: -------------------------------------------------------------------------------- 1 | module nemaPlate(wallThickness=3) 2 | { 3 | wallThickness = 3; 4 | motorWidth = 45; 5 | bolt = 4; 6 | bolt2 = 5; 7 | difference() 8 | { 9 | union() 10 | { 11 | cube( [wallThickness, motorWidth, motorWidth], center=true); 12 | 13 | } 14 | rotate( [0,90,0]) 15 | { 16 | translate([0, 0, -2]) 17 | { 18 | translate([15.5, 15.5, 0]) 19 | cylinder(r=bolt/2, h=wallThickness+5,$fn=200); 20 | translate([-15.5, 15.5, 0]) 21 | cylinder(r=bolt/2, h=wallThickness+5,$fn=200); 22 | translate([15.5, -15.5, 0]) 23 | cylinder(r=bolt/2, h=wallThickness+5,$fn=200); 24 | translate([-15.5, -15.5, 0]) 25 | cylinder(r=bolt/2, h=wallThickness+5,$fn=200); 26 | 27 | cylinder(r=11.5, h=wallThickness+5,$fn=200); 28 | rotate([0,0,90]) 29 | { 30 | translate([-11.5, 0, 0]) 31 | cube([23, motorWidth, wallThickness+5]); 32 | } 33 | } 34 | } 35 | 36 | 37 | } 38 | } 39 | 40 | e=3; 41 | 42 | nemaPlate(e); 43 | l=70; 44 | sp = 30; 45 | 46 | rotate([-90,0,0]) 47 | difference() 48 | { 49 | union() 50 | { 51 | translate([20-e/2,0,-22-e/2]) 52 | cube([40,l,3],center=true); 53 | translate([0,30-e,-0]) 54 | cube([3,16,45+0.01],center=true); 55 | } 56 | union() 57 | { 58 | for (x = [5:1.0:34] ) 59 | { 60 | if( round(x / 5) %2 !=0 ) 61 | { 62 | translate([x,sp,0]) 63 | cylinder(r=2.5,h=100,center=true,$fn=100); 64 | translate([x,-sp,0]) 65 | cylinder(r=2.5,h=100,center=true,$fn=100); 66 | } 67 | 68 | } 69 | 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /PID.py: -------------------------------------------------------------------------------- 1 | from collections import deque 2 | 3 | 4 | class PIDController: 5 | def __init__(self,t0, Kp,Ki,Kd): 6 | self.Kp = Kp 7 | self.Ki = Ki 8 | self.Kd = Kd 9 | self.output = 0 10 | self.I = 0 11 | self.t =t0 12 | self.recentPoints = deque() 13 | 14 | 15 | 16 | 17 | def AppendPoint(self, currentTime, err): 18 | self.recentPoints.append( (currentTime,err)) 19 | #remove oldPoints 20 | while( currentTime - self.recentPoints[0][0] > 0.5 and len(self.recentPoints)>1 ): 21 | self.recentPoints.popleft() 22 | 23 | dt = currentTime - self.t 24 | if len(self.recentPoints) == 1: 25 | D = 0 26 | else: 27 | w = 1.0 28 | D = (1-w)*(err - self.recentPoints[0][1] )/ ( currentTime - self.recentPoints[0][0]) + w*(err-self.recentPoints[-2][1]) / ( currentTime - self.recentPoints[-2][0]) 29 | 30 | if( dt < 1.0): 31 | self.I += dt* err 32 | else: 33 | self.I = 0 34 | 35 | self.output = self.Kp*err + self.Ki* self.I + self.Kd*D 36 | self.t = currentTime -------------------------------------------------------------------------------- /doc/images/2017-11-08-174942.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/doc/images/2017-11-08-174942.jpg -------------------------------------------------------------------------------- /doc/images/2017-11-08-175406.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/doc/images/2017-11-08-175406.jpg -------------------------------------------------------------------------------- /doc/images/2017-11-08-175601.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/doc/images/2017-11-08-175601.jpg -------------------------------------------------------------------------------- /doc/images/2017-11-08-175633.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/doc/images/2017-11-08-175633.jpg -------------------------------------------------------------------------------- /doc/images/2017-11-08-175816.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/doc/images/2017-11-08-175816.jpg -------------------------------------------------------------------------------- /doc/images/2017-11-08-175838.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/doc/images/2017-11-08-175838.jpg -------------------------------------------------------------------------------- /doc/images/2017-11-08-175858.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/doc/images/2017-11-08-175858.jpg -------------------------------------------------------------------------------- /doc/images/2017-11-08-175910.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/doc/images/2017-11-08-175910.jpg -------------------------------------------------------------------------------- /doc/images/2017-11-08-175922.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/doc/images/2017-11-08-175922.jpg -------------------------------------------------------------------------------- /doc/images/2017-11-08-182828.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/doc/images/2017-11-08-182828.jpg -------------------------------------------------------------------------------- /doc/images/IMG_20171105_134613.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/doc/images/IMG_20171105_134613.jpg -------------------------------------------------------------------------------- /doc/images/linn-photobooth-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/doc/images/linn-photobooth-logo.png -------------------------------------------------------------------------------- /doc/images/readme.txt: -------------------------------------------------------------------------------- 1 | In this folder I'll put the various photos and screenshots of LINN and its interface 2 | -------------------------------------------------------------------------------- /docker/gettingbluetoothtowork.txt: -------------------------------------------------------------------------------- 1 | start container 2 | 3 | on host : 4 | connect usb 5 | sixpair 6 | sixad -s 7 | (press play button) 8 | (Ctrl-c to stop sixad) 9 | 10 | then in container : 11 | sixad -s 12 | press play button -------------------------------------------------------------------------------- /docker/image/etc/nginx/sites-enabled/default: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | #listen [::]:6080 default_server ipv6only=on; 4 | 5 | root /usr/share/nginx/html; 6 | index index.html index.htm; 7 | 8 | location / { 9 | try_files $uri @proxy; 10 | } 11 | 12 | location = / { 13 | try_files $uri @proxy2; 14 | } 15 | 16 | location = /redirect.html { 17 | try_files $uri @proxy2; 18 | } 19 | 20 | location @proxy2 { 21 | proxy_set_header X-Real-IP $remote_addr; 22 | proxy_set_header X-Forwarded-For $remote_addr; 23 | proxy_set_header Host $host; 24 | proxy_pass http://127.0.0.1:6079; 25 | max_ranges 0; 26 | } 27 | 28 | location @proxy { 29 | proxy_set_header X-Real-IP $remote_addr; 30 | proxy_set_header X-Forwarded-For $remote_addr; 31 | proxy_set_header Host $host; 32 | proxy_pass http://127.0.0.1:6081; 33 | max_ranges 0; 34 | } 35 | 36 | location = /websockify { 37 | proxy_http_version 1.1; 38 | proxy_set_header Upgrade $http_upgrade; 39 | proxy_set_header Connection "upgrade"; 40 | proxy_pass http://127.0.0.1:6081; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /docker/image/etc/supervisor/conf.d/supervisord.conf: -------------------------------------------------------------------------------- 1 | [program:xvfb] 2 | priority=10 3 | directory=/ 4 | command=/usr/bin/Xvfb :1 -screen 0 1920x1080x24 5 | user=root 6 | autostart=true 7 | autorestart=true 8 | stopsignal=QUIT 9 | stdout_logfile=/var/log/xvfb.log 10 | redirect_stderr=true 11 | 12 | [program:lxsession] 13 | priority=15 14 | directory=/root 15 | command=/usr/bin/openbox 16 | user=root 17 | autostart=true 18 | autorestart=true 19 | stopsignal=QUIT 20 | environment=DISPLAY=":1",HOME="/root",USER="root" 21 | stdout_logfile=/var/log/openbox.log 22 | redirect_stderr=true 23 | 24 | [program:lxpanel] 25 | priority=15 26 | directory=/root 27 | command=/usr/bin/lxpanel --profile LXDE 28 | user=root 29 | autostart=true 30 | autorestart=true 31 | stopsignal=QUIT 32 | environment=DISPLAY=":1",HOME="/root",USER="root" 33 | stdout_logfile=/var/log/lxpanel.log 34 | redirect_stderr=true 35 | 36 | [program:pcmanfm] 37 | priority=15 38 | directory=/root 39 | command=/usr/bin/pcmanfm --desktop --profile LXDE 40 | user=root 41 | autostart=true 42 | autorestart=true 43 | stopsignal=QUIT 44 | environment=DISPLAY=":1",HOME="/root",USER="root" 45 | stdout_logfile=/var/log/pcmanfm.log 46 | 47 | 48 | [program:x11vnc] 49 | priority=20 50 | directory=/ 51 | command=x11vnc -display :1 -xkb -forever -shared 52 | user=root 53 | autostart=true 54 | autorestart=true 55 | stopsignal=QUIT 56 | stdout_logfile=/var/log/x11vnc.log 57 | redirect_stderr=true 58 | 59 | [program:novnc] 60 | priority=25 61 | directory=/usr/lib/noVNC/ 62 | command=/usr/lib/noVNC/utils/launch.sh --listen 6081 63 | user=root 64 | autostart=true 65 | autorestart=true 66 | stopsignal=QUIT 67 | stdout_logfile=/var/log/novnc.log 68 | redirect_stderr=true 69 | stopasgroup=true 70 | -------------------------------------------------------------------------------- /docker/image/root/.gtkrc-2.0: -------------------------------------------------------------------------------- 1 | # DO NOT EDIT! This file will be overwritten by LXAppearance. 2 | # Any customization should be done in ~/.gtkrc-2.0.mine instead. 3 | include "/usr/share/themes/Arc/gtk-2.0/gtkrc" 4 | 5 | gtk-theme-name="Arc" 6 | gtk-icon-theme-name="nuoveXT2" 7 | gtk-font-name="Sans 10" 8 | gtk-cursor-theme-name="DMZ-White" 9 | gtk-cursor-theme-size=18 10 | gtk-toolbar-style=GTK_TOOLBAR_BOTH_HORIZ 11 | gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR 12 | gtk-button-images=1 13 | gtk-menu-images=1 14 | gtk-enable-event-sounds=1 15 | gtk-enable-input-feedback-sounds=1 16 | gtk-xft-antialias=1 17 | gtk-xft-hinting=1 18 | gtk-xft-hintstyle="hintslight" 19 | gtk-xft-rgba="rgb" 20 | include "/root/.gtkrc-2.0.mine" 21 | -------------------------------------------------------------------------------- /docker/image/startup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | dbus-uuidgen > /etc/machine-id 4 | mkdir -p /var/run/sshd 5 | 6 | chown -R root:root /root 7 | mkdir -p /root/.config/pcmanfm/LXDE/ 8 | cp /usr/share/doro-lxde-wallpapers/desktop-items-0.conf /root/.config/pcmanfm/LXDE/ 9 | 10 | if [ -n "$VNC_PASSWORD" ]; then 11 | echo -n "$VNC_PASSWORD" > /.password1 12 | x11vnc -storepasswd $(cat /.password1) /.password2 13 | chmod 400 /.password* 14 | sed -i 's/^command=x11vnc.*/& -rfbauth \/.password2/' /etc/supervisor/conf.d/supervisord.conf 15 | export VNC_PASSWORD= 16 | fi 17 | 18 | cd /usr/lib/web && ./run.py > /var/log/web.log 2>&1 & 19 | nginx -c /etc/nginx/nginx.conf 20 | exec /bin/tini -- /usr/bin/supervisord -n 21 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/.gitlastcommit: -------------------------------------------------------------------------------- 1 | 56d97524807b125d047730331031ddd00f9c61f 2 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/.npmignore: -------------------------------------------------------------------------------- 1 | app 2 | core 3 | .gitmodules 4 | node_modules 5 | .* 6 | *~ 7 | *.swp 8 | *.swo 9 | tests 10 | .travis.yml 11 | utils 12 | docs/notes 13 | docs/links 14 | docs/release.txt 15 | docs/rfb_notes 16 | docs/*.pdf 17 | vnc.html 18 | vnc_auto.html 19 | karma.conf.js 20 | docs/flash_policy.txt 21 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | sudo: false 3 | cache: 4 | directories: 5 | - node_modules 6 | node_js: 7 | - '6.1' 8 | env: 9 | matrix: 10 | - TEST_BROWSER_NAME=PhantomJS 11 | - TEST_BROWSER_NAME=chrome TEST_BROWSER_OS='Windows 10,Linux,OS X 10.11' 12 | - TEST_BROWSER_NAME=firefox TEST_BROWSER_OS='Windows 10,Linux,OS X 10.11' 13 | - TEST_BROWSER_NAME='internet explorer' TEST_BROWSER_OS='Windows 10' 14 | - TEST_BROWSER_NAME=safari TEST_BROWSER_OS='OS X 10.11' 15 | global: 16 | - secure: QE5GqGd2hrpQsIgd8dlv3oRUUHqZayomzzQjNXOB81VQi241uz/ru+3GtBZLB5WLZCq/Gj89vbLnR0LN4ixlmPaWv3/WJQGyDGuRD/vMnccVl+rBUP/Hh2zdYwiISIGcrywNAE+KLus/lyt/ahVgzbaRaDSzrM1HaZFT/rndGck= 17 | - secure: g75sdctEwj0hoLW0Y08Tdv8s5scNzplB6a9EtaJ2vJD9S/bK+AsPqbWesGv1UlrFPCWdbV7Vg61vkmoUjcmb5xhqFIjcM9TlYJoKWeOTsOmnQoSIkIq6gMF1k02+LmKInbPgIzrp3m3jluS1qaOs/EzFpDnJp9hWBiAfXa12Jxk= 18 | before_script: npm install -g karma-cli 19 | addons: 20 | sauce_connect: true 21 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | How to contribute to noVNC 2 | ========================== 3 | 4 | We accept code via pull requests on GitHub. There are several guidelines that 5 | we expect contributors submitting code requests to follow. If you have issues 6 | following any of these guidelines, feel free to drop us a line by leaving a 7 | comment in the code request or sending us an email. 8 | 9 | Contributing Guidelines 10 | ----------------------- 11 | 12 | * While we don't have an official coding style guide, please try to follow 13 | the general coding style of the existing code. 14 | ** Use four spaces instead of tabs 15 | ** prefix private variables and functions with an `_` 16 | 17 | * Please try to include unit tests for your code. For instance, if you 18 | introduce a new encoding, add a test to `tests/test.rfb.js` under the 19 | "Encoding Handlers" section (basically, input a small pattern in your 20 | encoding and make sure the pattern gets displayed correctly). If you 21 | fix a bug, try to add a unit test that would have caught that bug 22 | (if possible -- some bugs, especially visual ones, are hard to test for). 23 | 24 | * Squash your commits down in to a clean commit history. For instance, there 25 | should not be "cleanup" commits where you fix issues in previous commits in 26 | the same pull request. Before you go to commit, use `git rebase -i` to 27 | squash these changes into the relevant commits. For instance, a good commit 28 | history might look like "Added support for FOO encoding, Added support for 29 | BAR message, Placed Button in UI to Trigger BAR" (where each comma denotes 30 | a separate commit). 31 | 32 | * Add both a title and description to your commit, if possible. Place more 33 | detail on what you did in the description. 34 | 35 | Running the unit tests 36 | ---------------------- 37 | 38 | There are two ways to run the unit tests. For both ways, you should first run 39 | `npm install` (not as root). 40 | 41 | The first way to run the tests is to run `npm test`. This will run all the 42 | tests in the headless PhantomJS browser (which uses WebKit). 43 | 44 | The second way to run the tests is using the `tests/run_from_console.js` file. 45 | This way is a bit more flexible, and can provide more information about what 46 | went wrong. To run all the tests, simply run `tests/run_from_console.js`. 47 | To run a specific test file, you can use the `-t path/to/test/file.js` option. 48 | If you wish to simply generate the HTML for the test, use the `-g` option, and 49 | the path to the temporary HTML file will be written to standard out. To open 50 | this file in your default browser automatically, pass the `-o` option as well. 51 | More information can be found by passing the `--help` or `-h` option. 52 | 53 | 54 | Thanks, and happy coding! 55 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/LICENSE.txt: -------------------------------------------------------------------------------- 1 | noVNC is Copyright (C) 2011 Joel Martin 2 | 3 | The noVNC core library files are licensed under the MPL 2.0 (Mozilla 4 | Public License 2.0). The noVNC core library is composed of the 5 | Javascript code necessary for full noVNC operation. This includes (but 6 | is not limited to): 7 | 8 | core/base64.js 9 | core/des.js 10 | core/display.js 11 | core/input/devices.js 12 | core/input/keysym.js 13 | core/logo.js 14 | core/playback.js 15 | core/rfb.js 16 | app/ui.js 17 | core/util.js 18 | core/websock.js 19 | app/webutil.js 20 | core/input/xtscancodes.js 21 | 22 | The HTML, CSS, font and images files that included with the noVNC 23 | source distibution (or repository) are not considered part of the 24 | noVNC core library and are licensed under more permissive licenses. 25 | The intent is to allow easy integration of noVNC into existing web 26 | sites and web applications. 27 | 28 | The HTML, CSS, font and image files are licensed as follows: 29 | 30 | *.html : 2-Clause BSD license 31 | 32 | app/styles/*.css : 2-Clause BSD license 33 | 34 | app/styles/Orbitron* : SIL Open Font License 1.1 35 | (Copyright 2009 Matt McInerney) 36 | 37 | app/images/ : Creative Commons Attribution-ShareAlike 38 | http://creativecommons.org/licenses/by-sa/3.0/ 39 | 40 | Some portions of noVNC are copyright to their individual authors. 41 | Please refer to the individual source files and/or to the noVNC commit 42 | history: https://github.com/kanaka/noVNC/commits/master 43 | 44 | The are several files and projects that have been incorporated into 45 | the noVNC core library. Here is a list of those files and the original 46 | licenses (all MPL 2.0 compatible): 47 | 48 | core/base64.js : MPL 2.0 49 | 50 | core/des.js : Various BSD style licenses 51 | 52 | utils/inflator.mod.js 53 | include/inflator.js : MIT (for pako) 54 | 55 | Any other files not mentioned above are typically marked with 56 | a copyright/license header at the top of the file. The default noVNC 57 | license is MPL-2.0. 58 | 59 | The following license texts are included: 60 | 61 | docs/LICENSE.MPL-2.0 62 | docs/LICENSE.LGPL-3 and 63 | docs/LICENSE.GPL-3 64 | docs/LICENSE.OFL-1.1 65 | docs/LICENSE.BSD-3-Clause (New BSD) 66 | docs/LICENSE.BSD-2-Clause (Simplified BSD / FreeBSD) 67 | docs/LICENSE.zlib 68 | docs/LICENSE.Apache-2.0 69 | docs/LICENSE.pako 70 | 71 | Or alternatively the license texts may be found here: 72 | 73 | http://www.mozilla.org/MPL/2.0/ 74 | http://www.gnu.org/licenses/lgpl.html and 75 | http://www.gnu.org/licenses/gpl.html 76 | http://scripts.sil.org/OFL 77 | http://en.wikipedia.org/wiki/BSD_licenses 78 | http://www.gzip.org/zlib/zlib_license.html 79 | http://www.apache.org/licenses/LICENSE-2.0.html 80 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 78 | 82 | 86 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/connect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 53 | 56 | 57 | 59 | 60 | 62 | image/svg+xml 63 | 65 | 66 | 67 | 68 | 69 | 74 | 77 | 83 | 89 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/ctrlaltdel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 83 | 91 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/error.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/expander.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 45 | 46 | 48 | 49 | 51 | image/svg+xml 52 | 54 | 55 | 56 | 57 | 58 | 63 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/fullscreen.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 53 | 56 | 57 | 59 | 60 | 62 | image/svg+xml 63 | 65 | 66 | 67 | 68 | 69 | 74 | 82 | 87 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/handle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/Makefile: -------------------------------------------------------------------------------- 1 | ICONS := \ 2 | novnc-16x16.png \ 3 | novnc-24x24.png \ 4 | novnc-32x32.png \ 5 | novnc-48x48.png \ 6 | novnc-64x64.png 7 | 8 | ANDROID_LAUNCHER := \ 9 | novnc-48x48.png \ 10 | novnc-72x72.png \ 11 | novnc-96x96.png \ 12 | novnc-144x144.png \ 13 | novnc-192x192.png 14 | 15 | IPHONE_LAUNCHER := \ 16 | novnc-60x60.png \ 17 | novnc-120x120.png 18 | 19 | IPAD_LAUNCHER := \ 20 | novnc-76x76.png \ 21 | novnc-152x152.png 22 | 23 | ALL_ICONS := $(ICONS) $(ANDROID_LAUNCHER) $(IPHONE_LAUNCHER) $(IPAD_LAUNCHER) 24 | 25 | all: $(ALL_ICONS) 26 | 27 | novnc-16x16.png: novnc-icon-sm.svg 28 | convert -density 90 \ 29 | -background transparent "$<" "$@" 30 | novnc-24x24.png: novnc-icon-sm.svg 31 | convert -density 135 \ 32 | -background transparent "$<" "$@" 33 | novnc-32x32.png: novnc-icon-sm.svg 34 | convert -density 180 \ 35 | -background transparent "$<" "$@" 36 | 37 | novnc-%.png: novnc-icon.svg 38 | convert -density $$[`echo $* | cut -d x -f 1` * 90 / 48] \ 39 | -background transparent "$<" "$@" 40 | 41 | clean: 42 | rm -f *.png 43 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-120x120.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-144x144.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-152x152.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-16x16.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-192x192.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-24x24.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-32x32.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-48x48.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-60x60.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-64x64.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-72x72.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-76x76.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/icons/novnc-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/images/icons/novnc-96x96.png -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/info.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/settings.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 49 | 52 | 53 | 55 | 56 | 58 | image/svg+xml 59 | 61 | 62 | 63 | 64 | 65 | 70 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 80 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/images/warning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 54 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/locale/de.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Translations for de 3 | * 4 | * This file was autotomatically generated from de.po 5 | * DO NOT EDIT! 6 | */ 7 | 8 | Language = { 9 | "Connecting...": "Verbunden...", 10 | "Connected (encrypted) to ": "Verbunden mit (verschlüsselt) ", 11 | "Connected (unencrypted) to ": "Verbunden mit (unverschlüsselt) ", 12 | "Disconnecting...": "Verbindung trennen...", 13 | "Disconnected": "Verbindung zum Server getrennt", 14 | "Must set host and port": "Richten Sie Host und Port ein", 15 | "Password is required": "Passwort ist erforderlich", 16 | "Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "'Clipping-Modus' aktiviert, Scrollbalken in 'IE-Vollbildmodus' werden nicht unterstützt", 17 | "Disconnect timeout": "Timeout beim trennen", 18 | }; 19 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/locale/el.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Translations for el 3 | * 4 | * This file was autotomatically generated from el.po 5 | * DO NOT EDIT! 6 | */ 7 | 8 | Language = { 9 | "Connecting...": "Συνδέεται...", 10 | "Connected (encrypted) to ": "Συνδέθηκε (κρυπτογραφημένα) με το ", 11 | "Connected (unencrypted) to ": "Συνδέθηκε (μη κρυπτογραφημένα) με το ", 12 | "Disconnecting...": "Aποσυνδέεται...", 13 | "Disconnected": "Αποσυνδέθηκε", 14 | "Must set host and port": "Πρέπει να οριστεί το όνομα και η πόρτα του διακομιστή", 15 | "Password is required": "Απαιτείται ο κωδικός πρόσβασης", 16 | "Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Εφαρμογή λειτουργίας αποκοπής αφού δεν υποστηρίζονται οι λωρίδες κύλισης σε πλήρη οθόνη στον IE", 17 | "Disconnect timeout": "Παρέλευση χρονικού ορίου αποσύνδεσης", 18 | "noVNC encountered an error:": "το noVNC αντιμετώπισε ένα σφάλμα", 19 | "Hide/Show the control bar": "Απόκρυψη/Εμφάνιση γραμμής ελέγχου", 20 | "Move/Drag Viewport": "Μετακίνηση/Σύρσιμο Θεατού πεδίου", 21 | "viewport drag": "σύρσιμο θεατού πεδίου", 22 | "Active Mouse Button": "Ενεργό Πλήκτρο Ποντικιού", 23 | "No mousebutton": "Χωρίς Πλήκτρο Ποντικιού", 24 | "Left mousebutton": "Αριστερό Πλήκτρο Ποντικιού", 25 | "Middle mousebutton": "Μεσαίο Πλήκτρο Ποντικιού", 26 | "Right mousebutton": "Δεξί Πλήκτρο Ποντικιού", 27 | "Keyboard": "Πληκτρολόγιο", 28 | "Show Keyboard": "Εμφάνιση Πληκτρολογίου", 29 | "Extra keys": "Επιπλέον πλήκτρα", 30 | "Show Extra Keys": "Εμφάνιση Επιπλέον Πλήκτρων", 31 | "Ctrl": "Ctrl", 32 | "Toggle Ctrl": "Εναλλαγή Ctrl", 33 | "Alt": "Alt", 34 | "Toggle Alt": "Εναλλαγή Alt", 35 | "Send Tab": "Αποστολή Tab", 36 | "Tab": "Tab", 37 | "Esc": "Esc", 38 | "Send Escape": "Αποστολή Escape", 39 | "Ctrl+Alt+Del": "Ctrl+Alt+Del", 40 | "Send Ctrl-Alt-Del": "Αποστολή Ctrl-Alt-Del", 41 | "Shutdown/Reboot": "Κλείσιμο/Επανεκκίνηση", 42 | "Shutdown/Reboot...": "Κλείσιμο/Επανεκκίνηση...", 43 | "Power": "Απενεργοποίηση", 44 | "Shutdown": "Κλείσιμο", 45 | "Reboot": "Επανεκκίνηση", 46 | "Reset": "Επαναφορά", 47 | "Clipboard": "Πρόχειρο", 48 | "Clear": "Καθάρισμα", 49 | "Fullscreen": "Πλήρης Οθόνη", 50 | "Settings": "Ρυθμίσεις", 51 | "Encrypt": "Κρυπτογράφηση", 52 | "True Color": "Πραγματικά Χρώματα", 53 | "Local Cursor": "Τοπικός Δρομέας", 54 | "Clip to Window": "Αποκοπή στο όριο του Παράθυρου", 55 | "Shared Mode": "Κοινόχρηστη Λειτουργία", 56 | "View Only": "Μόνο Θέαση", 57 | "Path:": "Διαδρομή:", 58 | "Scaling Mode:": "Λειτουργία Κλιμάκωσης:", 59 | "None": "Καμία", 60 | "Local Scaling": "Τοπική Κλιμάκωση", 61 | "Local Downscaling": "Τοπική Συρρίκνωση", 62 | "Remote Resizing": "Απομακρυσμένη Αλλαγή μεγέθους", 63 | "Repeater ID:": "Repeater ID:", 64 | "Style:": "Στυλ:", 65 | "default": "προεπιλεγμένο", 66 | "Logging:": "Καταγραφή:", 67 | "Apply": "Εφαρμογή", 68 | "Host:": "Όνομα διακομιστή:", 69 | "Port:": "Πόρτα διακομιστή:", 70 | "Password:": "Κωδικός Πρόσβασης:", 71 | "Token:": "Διακριτικό:", 72 | "Send Password": "Αποστολή Κωδικού Πρόσβασης", 73 | "Canvas not supported.": "Δεν υποστηρίζεται το στοιχείο Canvas", 74 | }; 75 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/locale/nl.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Translations for nl 3 | * 4 | * This file was autotomatically generated from nl.po 5 | * DO NOT EDIT! 6 | */ 7 | 8 | Language = { 9 | "Connecting...": "Verbinden...", 10 | "Connected (encrypted) to ": "Verbonden (versleuteld) met ", 11 | "Connected (unencrypted) to ": "Verbonden (onversleuteld) met ", 12 | "Disconnecting...": "Verbinding verbreken...", 13 | "Disconnected": "Verbinding verbroken", 14 | "Must set host and port": "Host en poort moeten worden ingesteld", 15 | "Password is required": "Wachtwoord is vereist", 16 | "Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "''Clipping mode' ingeschakeld, omdat schuifbalken in volledige-scherm-modus in IE niet worden ondersteund", 17 | "Disconnect timeout": "Timeout tijdens verbreken van verbinding", 18 | }; 19 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/locale/sv.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Translations for sv 3 | * 4 | * This file was autotomatically generated from sv.po 5 | * DO NOT EDIT! 6 | */ 7 | 8 | Language = { 9 | "Connecting...": "Ansluter...", 10 | "Connected (encrypted) to ": "Ansluten (krypterat) till ", 11 | "Connected (unencrypted) to ": "Ansluten (okrypterat) till ", 12 | "Disconnecting...": "Kopplar ner...", 13 | "Disconnected": "Frånkopplad", 14 | "Must set host and port": "Du måste specifiera en host och port", 15 | "Password is required": "Lösenord krävs", 16 | "Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Tvingar 'Clipping mode' eftersom skrollning inte stödjs av IE i fullskärm", 17 | "Disconnect timeout": "Det tog för lång tid att koppla ner", 18 | "noVNC encountered an error:": "noVNC stötte på ett problem:", 19 | "Hide/Show the control bar": "Göm/Visa kontrollbaren", 20 | "Move/Drag Viewport": "Flytta/Dra Vyn", 21 | "viewport drag": "dra vy", 22 | "Active Mouse Button": "Aktiv musknapp", 23 | "No mousebutton": "Ingen musknapp", 24 | "Left mousebutton": "Vänster musknapp", 25 | "Middle mousebutton": "Mitten-musknapp", 26 | "Right mousebutton": "Höger musknapp", 27 | "Keyboard": "Tangentbord", 28 | "Show Keyboard": "Visa Tangentbord", 29 | "Extra keys": "Extraknappar", 30 | "Show Extra Keys": "Visa Extraknappar", 31 | "Ctrl": "Ctrl", 32 | "Toggle Ctrl": "Växla Ctrl", 33 | "Alt": "Alt", 34 | "Toggle Alt": "Växla Alt", 35 | "Send Tab": "Skicka Tab", 36 | "Tab": "Tab", 37 | "Esc": "Esc", 38 | "Send Escape": "Skicka Escape", 39 | "Ctrl+Alt+Del": "Ctrl+Alt+Del", 40 | "Send Ctrl-Alt-Del": "Skicka Ctrl-Alt-Del", 41 | "Shutdown/Reboot": "Stäng av/Boota om", 42 | "Shutdown/Reboot...": "Stäng av/Boota om...", 43 | "Power": "Ström", 44 | "Shutdown": "Stäng av", 45 | "Reboot": "Boota om", 46 | "Reset": "Återställ", 47 | "Clipboard": "Urklipp", 48 | "Clear": "Rensa", 49 | "Fullscreen": "Fullskärm", 50 | "Settings": "Inställningar", 51 | "Encrypt": "Kryptera", 52 | "True Color": "Fullfärg", 53 | "Local Cursor": "Lokal Muspekare", 54 | "Clip to Window": "Begränsa till Fönster", 55 | "Shared Mode": "Delat Läge", 56 | "View Only": "Endast Visning", 57 | "Path:": "Sökväg:", 58 | "Scaling Mode:": "Skalningsläge:", 59 | "None": "Ingen", 60 | "Local Scaling": "Lokal Skalning", 61 | "Local Downscaling": "Lokal Nedskalning", 62 | "Remote Resizing": "Ändra Storlek", 63 | "Repeater ID:": "Repeater-ID:", 64 | "Style:": "Stil:", 65 | "default": "standard", 66 | "Logging:": "Loggning:", 67 | "Apply": "Verkställ", 68 | "Connect": "Anslut", 69 | "Disconnect": "Koppla från", 70 | "Connection": "Uppkoppling", 71 | "Host:": "Värd:", 72 | "Port:": "Port:", 73 | "Password:": "Lösenord:", 74 | "Token:": "Token:", 75 | "Send Password": "Skicka Lösenord", 76 | "Canvas not supported.": "Canvas stöds ej", 77 | }; 78 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/sounds/CREDITS: -------------------------------------------------------------------------------- 1 | bell 2 | Copyright: Dr. Richard Boulanger et al 3 | URL: http://www.archive.org/details/Berklee44v12 4 | License: CC-BY Attribution 3.0 Unported 5 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/sounds/bell.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/sounds/bell.mp3 -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/sounds/bell.oga: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/sounds/bell.oga -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/styles/Orbitron700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/styles/Orbitron700.ttf -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/styles/Orbitron700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/app/styles/Orbitron700.woff -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/app/styles/auto.css: -------------------------------------------------------------------------------- 1 | /* 2 | * noVNC auto CSS 3 | * Copyright (C) 2012 Joel Martin 4 | * Copyright (C) 2016 Samuel Mannehed for Cendio AB 5 | * noVNC is licensed under the MPL 2.0 (see LICENSE.txt) 6 | * This file is licensed under the 2-Clause BSD license (see LICENSE.txt). 7 | */ 8 | 9 | body { 10 | margin:0; 11 | padding:0; 12 | font-family: Helvetica; 13 | /*Background image with light grey curve.*/ 14 | background-color:#494949; 15 | background-repeat:no-repeat; 16 | background-position:right bottom; 17 | height:100%; 18 | } 19 | 20 | html { 21 | height:100%; 22 | } 23 | 24 | #noVNC_container { 25 | display: table; 26 | width:100%; 27 | height:100%; 28 | background-color:#313131; 29 | border-bottom-right-radius: 800px 600px; 30 | /*border-top-left-radius: 800px 600px;*/ 31 | } 32 | 33 | #noVNC_status { 34 | font-size: 12px; 35 | padding-top: 4px; 36 | height:32px; 37 | text-align: center; 38 | font-weight: bold; 39 | color: #fff; 40 | z-index: 0; 41 | position: absolute; 42 | width: 100%; 43 | margin-left: 0px; 44 | } 45 | 46 | .noVNC_status_normal { 47 | background: #b2bdcd; /* Old browsers */ 48 | background: -moz-linear-gradient(top, #b2bdcd 0%, #899cb3 49%, #7e93af 51%, #6e84a3 100%); /* FF3.6+ */ 49 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#b2bdcd), color-stop(49%,#899cb3), color-stop(51%,#7e93af), color-stop(100%,#6e84a3)); /* Chrome,Safari4+ */ 50 | background: -webkit-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Chrome10+,Safari5.1+ */ 51 | background: -o-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Opera11.10+ */ 52 | background: -ms-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* IE10+ */ 53 | background: linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* W3C */ 54 | } 55 | 56 | .noVNC_status_error { 57 | background: #f04040; /* Old browsers */ 58 | background: -moz-linear-gradient(top, #f04040 0%, #899cb3 49%, #7e93af 51%, #6e84a3 100%); /* FF3.6+ */ 59 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f04040), color-stop(49%,#899cb3), color-stop(51%,#7e93af), color-stop(100%,#6e84a3)); /* Chrome,Safari4+ */ 60 | background: -webkit-linear-gradient(top, #f04040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Chrome10+,Safari5.1+ */ 61 | background: -o-linear-gradient(top, #f04040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Opera11.10+ */ 62 | background: -ms-linear-gradient(top, #f04040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* IE10+ */ 63 | background: linear-gradient(top, #f04040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* W3C */ 64 | } 65 | 66 | .noVNC_status_warn { 67 | background: #f0f040; /* Old browsers */ 68 | background: -moz-linear-gradient(top, #f0f040 0%, #899cb3 49%, #7e93af 51%, #6e84a3 100%); /* FF3.6+ */ 69 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f0f040), color-stop(49%,#899cb3), color-stop(51%,#7e93af), color-stop(100%,#6e84a3)); /* Chrome,Safari4+ */ 70 | background: -webkit-linear-gradient(top, #f0f040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Chrome10+,Safari5.1+ */ 71 | background: -o-linear-gradient(top, #f0f040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Opera11.10+ */ 72 | background: -ms-linear-gradient(top, #f0f040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* IE10+ */ 73 | background: linear-gradient(top, #f0f040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* W3C */ 74 | } 75 | 76 | #noVNC_buttons { 77 | white-space: nowrap; 78 | } 79 | 80 | /* Do not set width/height for VNC_canvas or incorrect 81 | * scaling will occur. Canvas size depends on remote VNC 82 | * settings and noVNC settings. */ 83 | #noVNC_canvas { 84 | position: absolute; 85 | left: 0; 86 | right: 0; 87 | margin-left: auto; 88 | margin-right: auto; 89 | } 90 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/core/inflator.mod.js: -------------------------------------------------------------------------------- 1 | var zlib = require('pako/lib/zlib/inflate.js'); 2 | var ZStream = require('pako/lib/zlib/zstream.js'); 3 | 4 | function Inflate() { 5 | this.strm = new ZStream(); 6 | this.chunkSize = 1024 * 10 * 10; 7 | this.strm.output = new Uint8Array(this.chunkSize); 8 | this.windowBits = 5; 9 | 10 | zlib.inflateInit(this.strm, this.windowBits); 11 | }; 12 | 13 | Inflate.prototype = { 14 | inflate: function (data, flush, expected) { 15 | this.strm.input = data; 16 | this.strm.avail_in = this.strm.input.length; 17 | this.strm.next_in = 0; 18 | this.strm.next_out = 0; 19 | 20 | // resize our output buffer if it's too small 21 | // (we could just use multiple chunks, but that would cause an extra 22 | // allocation each time to flatten the chunks) 23 | if (expected > this.chunkSize) { 24 | this.chunkSize = expected; 25 | this.strm.output = new Uint8Array(this.chunkSize); 26 | } 27 | 28 | this.strm.avail_out = this.chunkSize; 29 | 30 | zlib.inflate(this.strm, flush); 31 | 32 | return new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out); 33 | }, 34 | 35 | reset: function () { 36 | zlib.inflateReset(this.strm); 37 | } 38 | }; 39 | 40 | module.exports = { Inflate: Inflate }; 41 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/docs/LICENSE.BSD-2-Clause: -------------------------------------------------------------------------------- 1 | Copyright (c) , 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 14 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 | DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY 17 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 20 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/docs/LICENSE.BSD-3-Clause: -------------------------------------------------------------------------------- 1 | Copyright (c) , 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | * Redistributions of source code must retain the above copyright 7 | notice, this list of conditions and the following disclaimer. 8 | * Redistributions in binary form must reproduce the above copyright 9 | notice, this list of conditions and the following disclaimer in the 10 | documentation and/or other materials provided with the distribution. 11 | * Neither the name of the nor the 12 | names of its contributors may be used to endorse or promote products 13 | derived from this software without specific prior written permission. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY 19 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/docs/LICENSE.pako: -------------------------------------------------------------------------------- 1 | (The MIT License) 2 | 3 | Copyright (C) 2014 by Vitaly Puzrin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/docs/LICENSE.zlib: -------------------------------------------------------------------------------- 1 | Copyright (c) , 2 | All rights reserved. 3 | 4 | This software is provided 'as-is', without any express 5 | or implied warranty. In no event will the authors be 6 | held liable for any damages arising from the use of 7 | this software. 8 | 9 | Permission is granted to anyone to use this software 10 | for any purpose, including commercial applications, 11 | and to alter it and redistribute it freely, subject to 12 | the following restrictions: 13 | 14 | 1. The origin of this software must not be 15 | misrepresented; you must not claim that you 16 | wrote the original software. If you use this 17 | software in a product, an acknowledgment in 18 | the product documentation would be appreciated 19 | but is not required. 20 | 21 | 2. Altered source versions must be plainly marked 22 | as such, and must not be misrepresented as 23 | being the original software. 24 | 25 | 3. This notice may not be removed or altered from 26 | any source distribution. 27 | 28 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/docs/VERSION: -------------------------------------------------------------------------------- 1 | 0.6.1 2 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/docs/flash_policy.txt: -------------------------------------------------------------------------------- 1 | Manual setup: 2 | 3 | DATA="echo \'\'" 4 | /usr/bin/socat -T 1 TCP-L:843,reuseaddr,fork,crlf SYSTEM:"$DATA" 5 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/docs/links: -------------------------------------------------------------------------------- 1 | New tight PNG protocol: 2 | http://wiki.qemu.org/VNC_Tight_PNG 3 | http://xf.iksaif.net/blog/index.php?post/2010/06/14/QEMU:-Tight-PNG-and-some-profiling 4 | 5 | RFB protocol and extensions: 6 | http://tigervnc.org/cgi-bin/rfbproto 7 | 8 | Canvas Browser Compatibility: 9 | http://philip.html5.org/tests/canvas/suite/tests/results.html 10 | 11 | WebSockets API standard: 12 | http://www.whatwg.org/specs/web-apps/current-work/complete.html#websocket 13 | http://dev.w3.org/html5/websockets/ 14 | http://www.ietf.org/id/draft-ietf-hybi-thewebsocketprotocol-00.txt 15 | 16 | Browser Keyboard Events detailed: 17 | http://unixpapa.com/js/key.html 18 | 19 | ActionScript (Flash) WebSocket implementation: 20 | http://github.com/gimite/web-socket-js 21 | 22 | ActionScript (Flash) crypto/TLS library: 23 | http://code.google.com/p/as3crypto 24 | http://github.com/lyokato/as3crypto_patched 25 | 26 | TLS Protocol: 27 | http://en.wikipedia.org/wiki/Transport_Layer_Security 28 | 29 | Generate self-signed certificate: 30 | http://docs.python.org/dev/library/ssl.html#certificates 31 | 32 | Cursor appearance/style (for Cursor pseudo-encoding): 33 | http://en.wikipedia.org/wiki/ICO_(file_format) 34 | http://www.daubnet.com/en/file-format-cur 35 | https://developer.mozilla.org/en/Using_URL_values_for_the_cursor_property 36 | http://www.fileformat.info/format/bmp/egff.htm 37 | 38 | Icon/Cursor file format: 39 | http://msdn.microsoft.com/en-us/library/ms997538 40 | http://msdn.microsoft.com/en-us/library/aa921550.aspx 41 | http://msdn.microsoft.com/en-us/library/aa930622.aspx 42 | 43 | 44 | RDP Protocol specification: 45 | http://msdn.microsoft.com/en-us/library/cc240445(v=PROT.10).aspx 46 | 47 | 48 | Related projects: 49 | 50 | guacamole: http://guacamole.sourceforge.net/ 51 | 52 | - Web client, but Java servlet does pre-processing 53 | 54 | jsvnc: http://code.google.com/p/jsvnc/ 55 | 56 | - No releases 57 | 58 | webvnc: http://code.google.com/p/webvnc/ 59 | 60 | - Jetty web server gateway, no updates since April 2008. 61 | 62 | RealVNC Java applet: http://www.realvnc.com/support/javavncviewer.html 63 | 64 | - Java applet 65 | 66 | Flashlight-VNC: http://www.wizhelp.com/flashlight-vnc/ 67 | 68 | - Adobe Flash implementation 69 | 70 | FVNC: http://osflash.org/fvnc 71 | 72 | - Adbove Flash implementation 73 | 74 | CanVNC: http://canvnc.sourceforge.net/ 75 | 76 | - HTML client with REST to VNC python proxy. Mostly vapor. 77 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/docs/notes: -------------------------------------------------------------------------------- 1 | Rebuilding inflator.js 2 | 3 | - Download pako from npm 4 | - Install browserify using npm 5 | - browserify core/inflator.mod.js -o core/inflator.js -s Inflator 6 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/docs/release.txt: -------------------------------------------------------------------------------- 1 | - Decide a new version number X.Y.Z (follow SemVer) 2 | - Update version in package.json 3 | - Update version in docs/VERSION 4 | - Commit the change with a commit like "Release X.Y.Z" 5 | - Add a new release on GitHub called "vX.Y.Z", and populate it with 6 | release notes of the following form (where A.B.C is the last release): 7 | 8 | Major Changes Since A.B.C 9 | ========================= 10 | 11 | *Insert warnings here about incompatibilities* 12 | 13 | *Thanks to all the contributors who filed bugs, added features, and fixed bugs 14 | during this release :tada:* 15 | 16 | App-visible Changes 17 | ------------------- 18 | 19 | - *feature* a feature which improves the app usage (#PRNUM) 20 | - *bugfix* a bug fix which fixes the app usage (#PRNUM) 21 | - *refactor* a refactor which changes the app usage (#PRNUM) 22 | 23 | Library-visible Changes 24 | ----------------------- 25 | 26 | - *feature* a feature which improves the noVNC APIs (#PRNUM) 27 | - *bugfix* a bug fix which fixes the noVNC APIs (#PRNUM) 28 | - *refactor* a refactor which changes the noVNC APIs (#PRNUM) 29 | 30 | App-internals Changes 31 | --------------------- 32 | 33 | - *bugfix* a bug fix with affects the internals of noVNC only (#PRNUM) 34 | - *refactor* a refactor which affects the internals of noVNC only (#PRNUM) 35 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/docs/rfbproto-3.3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/docs/rfbproto-3.3.pdf -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/docs/rfbproto-3.7.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/docs/rfbproto-3.7.pdf -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/docs/rfbproto-3.8.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/noVNC/docs/rfbproto-3.8.pdf -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "noVNC", 3 | "version": "0.6.1", 4 | "description": "An HTML5 VNC client", 5 | "main": "karma.conf.js", 6 | "directories": { 7 | "doc": "docs", 8 | "test": "tests" 9 | }, 10 | "scripts": { 11 | "test": "PATH=$PATH:node_modules/karma/bin karma start karma.conf.js", 12 | "prepublish": "node ./utils/use_require.js --as-require", 13 | "build-es6": "node ./utils/use_require.js" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/kanaka/noVNC.git" 18 | }, 19 | "author": "Joel Martin (https://github.com/kanaka)", 20 | "contributors": [ 21 | "Solly Ross (https://github.com/directxman12)", 22 | "Peter Åstrand (https://github.com/astrand)", 23 | "Samuel Mannehed (https://github.com/samhed)" 24 | ], 25 | "license": "MPL 2.0", 26 | "bugs": { 27 | "url": "https://github.com/kanaka/noVNC/issues" 28 | }, 29 | "homepage": "https://github.com/kanaka/noVNC", 30 | "devDependencies": { 31 | "ansi": "^0.3.1", 32 | "babel-plugin-add-module-exports": "^0.2.1", 33 | "babel-plugin-transform-es2015-modules-commonjs": "^6.18.0", 34 | "babelify": "^7.3.0", 35 | "browserify": "^13.1.0", 36 | "casperjs": "^1.1.3", 37 | "chai": "^3.5.0", 38 | "commander": "^2.9.0", 39 | "fs-extra": "^1.0.0", 40 | "jsdom": "*", 41 | "karma": "^1.3.0", 42 | "karma-chai": "^0.1.0", 43 | "karma-mocha": "^1.3.0", 44 | "karma-mocha-reporter": "^2.2.0", 45 | "karma-phantomjs-launcher": "^1.0.2", 46 | "karma-sauce-launcher": "^1.0.0", 47 | "karma-sinon": "^1.0.5", 48 | "karma-sinon-chai-latest": "^0.1.0", 49 | "mocha": "^3.1.2", 50 | "node-getopt": "*", 51 | "open": "^0.0.5", 52 | "phantomjs-prebuilt": "^2.1.13", 53 | "po2json": "*", 54 | "sinon": "^1.17.6", 55 | "sinon-chai": "^2.8.0", 56 | "spooky": "^0.2.5", 57 | "temp": "^0.8.3", 58 | "through2": "^2.0.1" 59 | }, 60 | "dependencies": { 61 | "pako": "^1.0.3" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/po/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | .PHONY: update-po update-js update-pot 3 | 4 | LINGUAS := de el nl sv 5 | 6 | VERSION := $(shell grep '"version"' ../package.json | cut -d '"' -f 4) 7 | 8 | POFILES := $(addsuffix .po,$(LINGUAS)) 9 | JSFILES := $(addprefix ../app/locale/,$(addsuffix .js,$(LINGUAS))) 10 | 11 | update-po: $(POFILES) 12 | update-js: $(JSFILES) 13 | 14 | %.po: noVNC.pot 15 | msgmerge --update --lang=$* $@ $< 16 | ../app/locale/%.js: %.po 17 | ./po2js $< $@ 18 | 19 | update-pot: 20 | xgettext --output=noVNC.js.pot \ 21 | --copyright-holder="Various Authors" \ 22 | --package-name="noVNC" \ 23 | --package-version="$(VERSION)" \ 24 | --msgid-bugs-address="novnc@googlegroups.com" \ 25 | --add-comments=TRANSLATORS: \ 26 | --sort-by-file \ 27 | ../app/*.js \ 28 | ../core/*.js \ 29 | ../core/input/*.js 30 | ./xgettext-html --output=noVNC.html.pot \ 31 | ../vnc.html 32 | msgcat --output-file=noVNC.pot \ 33 | --sort-by-file noVNC.js.pot noVNC.html.pot 34 | rm -f noVNC.js.pot noVNC.html.pot 35 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/po/de.po: -------------------------------------------------------------------------------- 1 | # German translations for noVNC package 2 | # German translation for noVNC. 3 | # Copyright (C) 2016 Various Authors 4 | # This file is distributed under the same license as the noVNC package. 5 | # Loek Janssen , 2016. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: noVNC 0.6.1\n" 10 | "Report-Msgid-Bugs-To: novnc@googlegroups.com\n" 11 | "POT-Creation-Date: 2016-11-15 08:11+0100\n" 12 | "PO-Revision-Date: 2016-11-15 07:51+0100\n" 13 | "Last-Translator: Loek Janssen \n" 14 | "Language-Team: none\n" 15 | "Language: de\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 20 | 21 | #: ../app/ui.js:402 22 | msgid "Connecting..." 23 | msgstr "Verbunden..." 24 | 25 | #: ../app/ui.js:409 26 | msgid "Connected (encrypted) to " 27 | msgstr "Verbunden mit (verschlüsselt) " 28 | 29 | #: ../app/ui.js:411 30 | msgid "Connected (unencrypted) to " 31 | msgstr "Verbunden mit (unverschlüsselt) " 32 | 33 | #: ../app/ui.js:416 34 | msgid "Disconnecting..." 35 | msgstr "Verbindung trennen..." 36 | 37 | #: ../app/ui.js:421 38 | msgid "Disconnected" 39 | msgstr "Verbindung zum Server getrennt" 40 | 41 | #: ../app/ui.js:1006 ../core/rfb.js:278 42 | msgid "Must set host and port" 43 | msgstr "Richten Sie Host und Port ein" 44 | 45 | #: ../app/ui.js:1059 46 | msgid "Password is required" 47 | msgstr "Passwort ist erforderlich" 48 | 49 | #: ../app/ui.js:1272 50 | msgid "" 51 | "Forcing clipping mode since scrollbars aren't supported by IE in fullscreen" 52 | msgstr "" 53 | "'Clipping-Modus' aktiviert, Scrollbalken in 'IE-Vollbildmodus' werden nicht " 54 | "unterstützt" 55 | 56 | #: ../core/rfb.js:556 57 | msgid "Disconnect timeout" 58 | msgstr "Timeout beim trennen" 59 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/po/nl.po: -------------------------------------------------------------------------------- 1 | # Dutch translations for noVNC package 2 | # Nederlandse vertalingen voor het pakket noVNC. 3 | # Copyright (C) 2016 Various Authors 4 | # This file is distributed under the same license as the noVNC package. 5 | # Loek Janssen , 2016. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: noVNC 0.6.1\n" 10 | "Report-Msgid-Bugs-To: novnc@googlegroups.com\n" 11 | "POT-Creation-Date: 2016-11-15 08:11+0100\n" 12 | "PO-Revision-Date: 2016-11-15 07:51+0100\n" 13 | "Last-Translator: Loek Janssen \n" 14 | "Language-Team: none\n" 15 | "Language: nl\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 20 | 21 | #: ../app/ui.js:402 22 | msgid "Connecting..." 23 | msgstr "Verbinden..." 24 | 25 | #: ../app/ui.js:409 26 | msgid "Connected (encrypted) to " 27 | msgstr "Verbonden (versleuteld) met " 28 | 29 | #: ../app/ui.js:411 30 | msgid "Connected (unencrypted) to " 31 | msgstr "Verbonden (onversleuteld) met " 32 | 33 | #: ../app/ui.js:416 34 | msgid "Disconnecting..." 35 | msgstr "Verbinding verbreken..." 36 | 37 | #: ../app/ui.js:421 38 | msgid "Disconnected" 39 | msgstr "Verbinding verbroken" 40 | 41 | #: ../app/ui.js:1006 ../core/rfb.js:278 42 | msgid "Must set host and port" 43 | msgstr "Host en poort moeten worden ingesteld" 44 | 45 | #: ../app/ui.js:1059 46 | msgid "Password is required" 47 | msgstr "Wachtwoord is vereist" 48 | 49 | #: ../app/ui.js:1272 50 | msgid "" 51 | "Forcing clipping mode since scrollbars aren't supported by IE in fullscreen" 52 | msgstr "" 53 | "''Clipping mode' ingeschakeld, omdat schuifbalken in volledige-scherm-modus " 54 | "in IE niet worden ondersteund" 55 | 56 | #: ../core/rfb.js:556 57 | msgid "Disconnect timeout" 58 | msgstr "Timeout tijdens verbreken van verbinding" 59 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/po/po2js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | /* 3 | * ps2js: gettext .po to noVNC .js converter 4 | * Copyright (C) 2016 Pierre Ossman 5 | * 6 | * This program is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation, either version 3 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * This program is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with this program. If not, see . 18 | */ 19 | 20 | var getopt = require('node-getopt'); 21 | var fs = require('fs'); 22 | var po2json = require("po2json"); 23 | 24 | opt = getopt.create([ 25 | ['h' , 'help' , 'display this help'], 26 | ]).bindHelp().parseSystem(); 27 | 28 | if (opt.argv.length != 2) { 29 | console.error("Incorrect number of arguments given"); 30 | process.exit(1); 31 | } 32 | 33 | var data = po2json.parseFileSync(opt.argv[0]); 34 | 35 | var output = 36 | "/*\n" + 37 | " * Translations for " + data[""]["language"] + "\n" + 38 | " *\n" + 39 | " * This file was autotomatically generated from " + opt.argv[0] + "\n" + 40 | " * DO NOT EDIT!\n" + 41 | " */\n" + 42 | "\n" + 43 | "Language = {\n"; 44 | 45 | for (msgid in data) { 46 | if (msgid === "") 47 | continue; 48 | 49 | msgstr = data[msgid][1]; 50 | output += " " + JSON.stringify(msgid) + ": " + 51 | JSON.stringify(msgstr) + ",\n"; 52 | } 53 | 54 | output += "};\n"; 55 | 56 | fs.writeFileSync(opt.argv[1], output); 57 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/po/xgettext-html: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | /* 3 | * xgettext-html: HTML gettext parser 4 | * Copyright (C) 2016 Pierre Ossman 5 | * Licensed under MPL 2.0 (see LICENSE.txt) 6 | */ 7 | 8 | var getopt = require('node-getopt'); 9 | 10 | var jsdom = require("jsdom"); 11 | var fs = require("fs"); 12 | 13 | opt = getopt.create([ 14 | ['o' , 'output=FILE' , 'write output to specified file'], 15 | ['h' , 'help' , 'display this help'], 16 | ]).bindHelp().parseSystem(); 17 | 18 | var strings = {}; 19 | 20 | function addString(str, location) { 21 | if (str.length == 0) { 22 | return; 23 | } 24 | 25 | if (strings[str] === undefined) { 26 | strings[str] = {} 27 | } 28 | strings[str][location] = null; 29 | } 30 | 31 | // See https://html.spec.whatwg.org/multipage/dom.html#attr-translate 32 | function process(elem, locator, enabled) { 33 | function isAnyOf(searchElement, items) { 34 | return items.indexOf(searchElement) !== -1; 35 | } 36 | 37 | if (elem.hasAttribute("translate")) { 38 | if (isAnyOf(elem.getAttribute("translate"), ["", "yes"])) { 39 | enabled = true; 40 | } else if (isAnyOf(elem.getAttribute("translate"), ["no"])) { 41 | enabled = false; 42 | } 43 | } 44 | 45 | if (enabled) { 46 | if (elem.hasAttribute("abbr") && 47 | elem.tagName === "TH") { 48 | addString(elem.getAttribute("abbr"), locator(elem)); 49 | } 50 | if (elem.hasAttribute("alt") && 51 | isAnyOf(elem.tagName, ["AREA", "IMG", "INPUT"])) { 52 | addString(elem.getAttribute("alt"), locator(elem)); 53 | } 54 | if (elem.hasAttribute("download") && 55 | isAnyOf(elem.tagName, ["A", "AREA"])) { 56 | addString(elem.getAttribute("download"), locator(elem)); 57 | } 58 | if (elem.hasAttribute("label") && 59 | isAnyOf(elem.tagName, ["MENUITEM", "MENU", "OPTGROUP", 60 | "OPTION", "TRACK"])) { 61 | addString(elem.getAttribute("label"), locator(elem)); 62 | } 63 | if (elem.hasAttribute("placeholder") && 64 | isAnyOf(elem.tagName in ["INPUT", "TEXTAREA"])) { 65 | addString(elem.getAttribute("placeholder"), locator(elem)); 66 | } 67 | if (elem.hasAttribute("title")) { 68 | addString(elem.getAttribute("title"), locator(elem)); 69 | } 70 | if (elem.hasAttribute("value") && 71 | elem.tagName === "INPUT" && 72 | isAnyOf(elem.getAttribute("type"), ["reset", "button"])) { 73 | addString(elem.getAttribute("value"), locator(elem)); 74 | } 75 | } 76 | 77 | for (var i = 0;i < elem.childNodes.length;i++) { 78 | node = elem.childNodes[i]; 79 | if (node.nodeType === node.ELEMENT_NODE) { 80 | process(node, locator, enabled); 81 | } else if (node.nodeType === node.TEXT_NODE && enabled) { 82 | addString(node.data.trim(), locator(node)); 83 | } 84 | } 85 | } 86 | 87 | for (var i = 0;i < opt.argv.length;i++) { 88 | var file; 89 | 90 | fn = opt.argv[i]; 91 | file = fs.readFileSync(fn, "utf8"); 92 | doc = jsdom.jsdom(file); 93 | 94 | locator = function (elem) { 95 | offset = jsdom.nodeLocation(elem).start; 96 | line = file.slice(0, offset).split("\n").length; 97 | return fn + ":" + line; 98 | }; 99 | 100 | process(doc.body, locator, true); 101 | } 102 | 103 | var output = ""; 104 | 105 | for (str in strings) { 106 | output += "#:"; 107 | for (location in strings[str]) { 108 | output += " " + location; 109 | } 110 | output += "\n"; 111 | 112 | output += "msgid " + JSON.stringify(str) + "\n"; 113 | output += "msgstr \"\"\n"; 114 | output += "\n"; 115 | } 116 | 117 | fs.writeFileSync(opt.options.output, output); 118 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/tests/fake.websocket.js: -------------------------------------------------------------------------------- 1 | var FakeWebSocket; 2 | 3 | (function () { 4 | // PhantomJS can't create Event objects directly, so we need to use this 5 | function make_event(name, props) { 6 | var evt = document.createEvent('Event'); 7 | evt.initEvent(name, true, true); 8 | if (props) { 9 | for (var prop in props) { 10 | evt[prop] = props[prop]; 11 | } 12 | } 13 | return evt; 14 | } 15 | 16 | FakeWebSocket = function (uri, protocols) { 17 | this.url = uri; 18 | this.binaryType = "arraybuffer"; 19 | this.extensions = ""; 20 | 21 | if (!protocols || typeof protocols === 'string') { 22 | this.protocol = protocols; 23 | } else { 24 | this.protocol = protocols[0]; 25 | } 26 | 27 | this._send_queue = new Uint8Array(20000); 28 | 29 | this.readyState = FakeWebSocket.CONNECTING; 30 | this.bufferedAmount = 0; 31 | 32 | this.__is_fake = true; 33 | }; 34 | 35 | FakeWebSocket.prototype = { 36 | close: function (code, reason) { 37 | this.readyState = FakeWebSocket.CLOSED; 38 | if (this.onclose) { 39 | this.onclose(make_event("close", { 'code': code, 'reason': reason, 'wasClean': true })); 40 | } 41 | }, 42 | 43 | send: function (data) { 44 | if (this.protocol == 'base64') { 45 | data = Base64.decode(data); 46 | } else { 47 | data = new Uint8Array(data); 48 | } 49 | this._send_queue.set(data, this.bufferedAmount); 50 | this.bufferedAmount += data.length; 51 | }, 52 | 53 | _get_sent_data: function () { 54 | var res = new Uint8Array(this._send_queue.buffer, 0, this.bufferedAmount); 55 | this.bufferedAmount = 0; 56 | return res; 57 | }, 58 | 59 | _open: function (data) { 60 | this.readyState = FakeWebSocket.OPEN; 61 | if (this.onopen) { 62 | this.onopen(make_event('open')); 63 | } 64 | }, 65 | 66 | _receive_data: function (data) { 67 | this.onmessage(make_event("message", { 'data': data })); 68 | } 69 | }; 70 | 71 | FakeWebSocket.OPEN = WebSocket.OPEN; 72 | FakeWebSocket.CONNECTING = WebSocket.CONNECTING; 73 | FakeWebSocket.CLOSING = WebSocket.CLOSING; 74 | FakeWebSocket.CLOSED = WebSocket.CLOSED; 75 | 76 | FakeWebSocket.__is_fake = true; 77 | 78 | FakeWebSocket.replace = function () { 79 | if (!WebSocket.__is_fake) { 80 | var real_version = WebSocket; 81 | WebSocket = FakeWebSocket; 82 | FakeWebSocket.__real_version = real_version; 83 | } 84 | }; 85 | 86 | FakeWebSocket.restore = function () { 87 | if (WebSocket.__is_fake) { 88 | WebSocket = WebSocket.__real_version; 89 | } 90 | }; 91 | })(); 92 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/tests/run_from_console.zombie.js: -------------------------------------------------------------------------------- 1 | var Browser = require('zombie'); 2 | var path = require('path'); 3 | var EventEmitter = require('events').EventEmitter; 4 | var Q = require('q'); 5 | 6 | var provide_emitter = function(file_paths) { 7 | var emitter = new EventEmitter(); 8 | 9 | file_paths.reduce(function(prom, file_path, path_ind) { 10 | return prom.then(function(browser) { 11 | browser.visit('file://'+file_path, function() { 12 | if (browser.error) throw new Error(browser.errors); 13 | 14 | var res_json = {}; 15 | res_json.file_ind = path_ind; 16 | 17 | res_json.num_tests = browser.querySelectorAll('li.test').length; 18 | res_json.num_fails = browser.querySelectorAll('li.test.fail').length; 19 | res_json.num_passes = browser.querySelectorAll('li.test.pass').length; 20 | res_json.num_slow = browser.querySelectorAll('li.test.pass:not(.fast)').length; 21 | res_json.num_skipped = browser.querySelectorAll('li.test.pending').length; 22 | res_json.duration = browser.text('li.duration em'); 23 | 24 | var traverse_node = function(elem) { 25 | var classList = elem.className.split(' '); 26 | var res; 27 | if (classList.indexOf('suite') > -1) { 28 | res = { 29 | type: 'suite', 30 | name: elem.querySelector('h1').textContent, 31 | has_subfailures: elem.querySelectorAll('li.test.fail').length > 0 32 | }; 33 | 34 | var child_elems = elem.querySelector('ul').children; 35 | res.children = Array.prototype.map.call(child_elems, traverse_node); 36 | return res; 37 | } 38 | else { 39 | var h2_content = elem.querySelector('h2').childNodes; 40 | res = { 41 | type: 'test', 42 | text: h2_content[0].textContent 43 | }; 44 | 45 | if (classList.indexOf('pass') > -1) { 46 | res.pass = true; 47 | if (classList.indexOf('pending') > -1) { 48 | res.slow = false; 49 | res.skipped = true; 50 | } 51 | else { 52 | res.slow = classList.indexOf('fast') < 0; 53 | res.skipped = false; 54 | res.duration = h2_content[1].textContent; 55 | } 56 | } 57 | else { 58 | res.error = elem.querySelector('pre.error').textContent; 59 | } 60 | 61 | return res; 62 | } 63 | }; 64 | 65 | var top_suites = browser.querySelectorAll('#mocha-report > li.suite'); 66 | res_json.suites = Array.prototype.map.call(top_suites, traverse_node); 67 | res_json.replay = browser.querySelector('a.replay').textContent; 68 | 69 | emitter.emit('test_ready', res_json); 70 | }); 71 | 72 | return new Browser(); 73 | }); 74 | }, Q(new Browser())); 75 | 76 | return emitter; 77 | }; 78 | 79 | module.exports = { 80 | provide_emitter: provide_emitter, 81 | name: 'ZombieJS' 82 | }; 83 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/tests/test.base64.js: -------------------------------------------------------------------------------- 1 | // requires local modules: base64 2 | var assert = chai.assert; 3 | var expect = chai.expect; 4 | 5 | describe('Base64 Tools', function() { 6 | "use strict"; 7 | 8 | var BIN_ARR = new Array(256); 9 | for (var i = 0; i < 256; i++) { 10 | BIN_ARR[i] = i; 11 | } 12 | 13 | var B64_STR = "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=="; 14 | 15 | 16 | describe('encode', function() { 17 | it('should encode a binary string into Base64', function() { 18 | var encoded = Base64.encode(BIN_ARR); 19 | expect(encoded).to.equal(B64_STR); 20 | }); 21 | }); 22 | 23 | describe('decode', function() { 24 | it('should decode a Base64 string into a normal string', function() { 25 | var decoded = Base64.decode(B64_STR); 26 | expect(decoded).to.deep.equal(BIN_ARR); 27 | }); 28 | 29 | it('should throw an error if we have extra characters at the end of the string', function() { 30 | expect(function () { Base64.decode(B64_STR+'abcdef'); }).to.throw(Error); 31 | }); 32 | }); 33 | }); 34 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/README.md: -------------------------------------------------------------------------------- 1 | ## WebSockets Proxy/Bridge 2 | 3 | Websockify has been forked out into its own project. `launch.sh` wil 4 | automatically download it here if it is not already present and not 5 | installed as system-wide. 6 | 7 | For more detailed description and usage information please refer to 8 | the [websockify README](https://github.com/kanaka/websockify/blob/master/README.md). 9 | 10 | The other versions of websockify (C, Node.js) and the associated test 11 | programs have been moved to 12 | [websockify](https://github.com/kanaka/websockify). Websockify was 13 | formerly named wsproxy. 14 | 15 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/b64-to-binary.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | use MIME::Base64; 3 | 4 | for (<>) { 5 | unless (/^'([{}])(\d+)\1(.+?)',$/) { 6 | print; 7 | next; 8 | } 9 | 10 | my ($dir, $amt, $b64) = ($1, $2, $3); 11 | 12 | my $decoded = MIME::Base64::decode($b64) or die "Could not base64-decode line `$_`"; 13 | 14 | my $decoded_escaped = join "", map { "\\x$_" } unpack("(H2)*", $decoded); 15 | 16 | print "'${dir}${amt}${dir}${decoded_escaped}',\n"; 17 | } 18 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/img2js.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # 4 | # Convert image to Javascript compatible base64 Data URI 5 | # Copyright 2011 Joel Martin 6 | # Licensed under MPL 2.0 (see docs/LICENSE.MPL-2.0) 7 | # 8 | 9 | import sys, base64 10 | 11 | try: 12 | from PIL import Image 13 | except: 14 | print "python PIL module required (python-imaging package)" 15 | sys.exit(1) 16 | 17 | 18 | if len(sys.argv) < 3: 19 | print "Usage: %s IMAGE JS_VARIABLE" % sys.argv[0] 20 | sys.exit(1) 21 | 22 | fname = sys.argv[1] 23 | var = sys.argv[2] 24 | 25 | ext = fname.lower().split('.')[-1] 26 | if ext == "png": mime = "image/png" 27 | elif ext in ["jpg", "jpeg"]: mime = "image/jpeg" 28 | elif ext == "gif": mime = "image/gif" 29 | else: 30 | print "Only PNG, JPEG and GIF images are supported" 31 | sys.exit(1) 32 | uri = "data:%s;base64," % mime 33 | 34 | im = Image.open(fname) 35 | w, h = im.size 36 | 37 | raw = open(fname).read() 38 | 39 | print '%s = {"width": %s, "height": %s, "data": "%s%s"};' % ( 40 | var, w, h, uri, base64.b64encode(raw)) 41 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/make-module-transform.js: -------------------------------------------------------------------------------- 1 | var through = require('through2'); 2 | 3 | var singleLineRe = /\/\* \[module\] ((.(?!\*\/))+) \*\//g; 4 | var multiLineRe = /\/\* \[module\]\n(( * .+\n)+) \*\//g; 5 | 6 | var skipAsModule = /\/\* \[begin skip-as-module\] \*\/(.|\n)+\/\* \[end skip-as-module\] \*\//g; 7 | 8 | module.exports = function (file) { 9 | var stream = through(function (buf, enc, next) { 10 | var bufStr = buf.toString('utf8'); 11 | bufStr = bufStr.replace(singleLineRe, "$1"); 12 | bufStr = bufStr.replace(multiLineRe, function (match, mainLines) { 13 | return mainLines.split(" * ").join(""); 14 | }); 15 | 16 | bufStr = bufStr.replace(skipAsModule, ""); 17 | 18 | this.push(bufStr); 19 | next(); 20 | }); 21 | 22 | stream._is_make_module = true; 23 | 24 | return stream; 25 | }; 26 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/parse.js: -------------------------------------------------------------------------------- 1 | // Utility to parse keysymdef.h to produce mappings from Unicode codepoints to keysyms 2 | "use strict"; 3 | 4 | var fs = require('fs'); 5 | 6 | var show_help = process.argv.length === 2; 7 | var use_keynames = false; 8 | var filename; 9 | 10 | for (var i = 2; i < process.argv.length; ++i) { 11 | switch (process.argv[i]) { 12 | case "--help": 13 | case "-h": 14 | show_help = true; 15 | break; 16 | case "--debug-names": 17 | case "-d": 18 | use_keynames = true; 19 | break; 20 | case "--file": 21 | case "-f": 22 | default: 23 | filename = process.argv[i]; 24 | } 25 | } 26 | 27 | if (!filename) { 28 | show_help = true; 29 | console.log("Error: No filename specified\n"); 30 | } 31 | 32 | if (show_help) { 33 | console.log("Parses a *nix keysymdef.h to generate Unicode code point mappings"); 34 | console.log("Usage: node parse.js [options] filename:"); 35 | console.log(" -h [ --help ] Produce this help message"); 36 | console.log(" -d [ --debug-names ] Preserve keysym names for debugging (Increases file size by ~40KB)"); 37 | console.log(" filename The keysymdef.h file to parse"); 38 | return; 39 | } 40 | 41 | // Set this to false to omit key names from the generated keysymdef.js 42 | // This reduces the file size by around 40kb, but may hinder debugging 43 | 44 | var buf = fs.readFileSync(filename); 45 | var str = buf.toString('utf8'); 46 | 47 | var re = /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-fA-F]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/m; 48 | 49 | var arr = str.split('\n'); 50 | 51 | var keysyms = {}; 52 | var codepoints = {}; 53 | 54 | for (var i = 0; i < arr.length; ++i) { 55 | var result = re.exec(arr[i]); 56 | if (result){ 57 | var keyname = result[1]; 58 | var keysym = parseInt(result[2], 16); 59 | var remainder = result[3]; 60 | 61 | keysyms[keysym] = keyname; 62 | 63 | var unicodeRes = /U\+([0-9a-fA-F]+)/.exec(remainder); 64 | if (unicodeRes) { 65 | var unicode = parseInt(unicodeRes[1], 16); 66 | if (!codepoints[unicode]){ 67 | codepoints[unicode] = keysym; 68 | } 69 | } 70 | else { 71 | console.log("no unicode codepoint found:", arr[i]); 72 | } 73 | } 74 | else { 75 | console.log("line is not a keysym:", arr[i]); 76 | } 77 | } 78 | 79 | var out = "// This file describes mappings from Unicode codepoints to the keysym values\n" + 80 | "// (and optionally, key names) expected by the RFB protocol\n" + 81 | "// How this file was generated:\n" + 82 | "// " + process.argv.join(" ") + "\n" + 83 | "var keysyms = (function(){\n" + 84 | " \"use strict\";\n" + 85 | " var keynames = {keysyms};\n" + 86 | " var codepoints = {codepoints};\n" + 87 | "\n" + 88 | " function lookup(k) { return k ? {keysym: k, keyname: keynames ? keynames[k] : k} : undefined; }\n" + 89 | " return {\n" + 90 | " fromUnicode : function(u) {\n" + 91 | " var keysym = codepoints[u];\n" + 92 | " if (keysym === undefined) {\n" + 93 | " keysym = 0x01000000 | u;\n" + 94 | " }\n" + 95 | " return lookup(keysym);\n" + 96 | " },\n" + 97 | " lookup : lookup\n" + 98 | " };\n" + 99 | "})();\n"; 100 | out = out.replace('{keysyms}', use_keynames ? JSON.stringify(keysyms) : "null"); 101 | out = out.replace('{codepoints}', JSON.stringify(codepoints)); 102 | 103 | fs.writeFileSync("keysymdef.js", out); 104 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/u2x11: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Convert "U+..." commented entries in /usr/include/X11/keysymdef.h 4 | # into JavaScript for use by noVNC. Note this is likely to produce 5 | # a few duplicate properties with clashing values, that will need 6 | # resolving manually. 7 | # 8 | # Colin Dean 9 | # 10 | 11 | regex="^#define[ \t]+XK_[A-Za-z0-9_]+[ \t]+0x([0-9a-fA-F]+)[ \t]+\/\*[ \t]+U\+([0-9a-fA-F]+)[ \t]+[^*]+.[ \t]+\*\/[ \t]*$" 12 | echo "unicodeTable = {" 13 | while read line; do 14 | if echo "${line}" | egrep -qs "${regex}"; then 15 | 16 | x11=$(echo "${line}" | sed -r "s/${regex}/\1/") 17 | vnc=$(echo "${line}" | sed -r "s/${regex}/\2/") 18 | 19 | if echo "${vnc}" | egrep -qs "^00[2-9A-F][0-9A-F]$"; then 20 | : # skip ISO Latin-1 (U+0020 to U+00FF) as 1-to-1 mapping 21 | else 22 | # note 1-to-1 is possible (e.g. for Euro symbol, U+20AC) 23 | echo " 0x${vnc} : 0x${x11}," 24 | fi 25 | fi 26 | done < /usr/include/X11/keysymdef.h | uniq 27 | echo "};" 28 | 29 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - 2.6 4 | - 2.7 5 | - 3.3 6 | - 3.4 7 | 8 | install: pip install -r test-requirements.txt 9 | 10 | script: python setup.py nosetests --verbosity=3 11 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/CHANGES.txt: -------------------------------------------------------------------------------- 1 | Changes 2 | ======= 3 | 4 | 0.8.0 5 | ----- 6 | 7 | * Make websockify properly terminate children on SIGTERM (#226) 8 | * Remove logging in signal handlers (this can cause Python to hang under certain conditions) (#219) 9 | * Make it easier to log to a file (#205) 10 | * Add support for IPv6 addresses in tokens in the TokenFile token plugins (#197) 11 | * Improve auth plugin framework to enable better support for HTTP auth (#194, #201) 12 | * Fix bug in JSONTokenAPI token plugin (#192) 13 | * Fix a missing variable in the exception handler (#178) 14 | 15 | 0.7.0 16 | ----- 17 | 18 | * Python 3 support fixes (#140, #155, #159) 19 | * Generic token-parsing plugins support (#162) 20 | * Generic authentication plugins support (#172) 21 | * Fixed frame corruption on big-endian systems (#161) 22 | * Support heartbeats (via PING) and automatic responses to PONG (#169) 23 | * Automatically reject unmasked client frames by default (strict mode) (#174) 24 | * Automatically restart interrupted select calls (#175) 25 | * Make 'run' respect environment settings (including virtualenv) (#176) 26 | 27 | 0.6.1 - May 11, 2015 28 | -------------------- 29 | 30 | * **PATCH RELEASE**: Fixes a bug causing file_only to not be passed properly 31 | 32 | 0.6.0 - Feb 18, 2014 33 | -------------------- 34 | 35 | * **NOTE** : 0.6.0 will break existing code that sub-classes WebsocketProxy 36 | * Refactor to use standard SocketServer RequestHandler design 37 | * Fix zombie process bug on certain systems when using multiprocessing 38 | * Add better unit tests 39 | * Log information via python `logging` module 40 | 41 | 0.5.1 - Jun 27, 2013 42 | -------------------- 43 | 44 | * use upstream einaros/ws (>=0.4.27) with websockify.js 45 | * file_only and no_parent security options for WSRequestHandler 46 | * Update build of web-socket-js (c0855c6cae) 47 | * add include/web-socket-js-project submodule to gimite/web-socket-js 48 | for DSFG compliance. 49 | * drop Hixie protocol support 50 | 51 | 0.4.1 - Mar 12, 2013 52 | -------------------- 53 | 54 | * ***NOTE*** : 0.5.0 will drop Hixie protocol support 55 | * add include/ directory and remove some dev files from source 56 | distribution. 57 | 58 | 0.4.0 - Mar 12, 2013 59 | -------------------- 60 | 61 | * ***NOTE*** : 0.5.0 will drop Hixie protocol support 62 | * use Buffer base64 support in Node.js implementation 63 | 64 | 0.3.0 - Jan 15, 2013 65 | -------------------- 66 | 67 | * refactor into modules: websocket, websocketproxy 68 | * switch to web-socket-js that uses IETF 6455 69 | * change to MPL 2.0 license for include/*.js 70 | * fix session recording 71 | 72 | 0.2.1 - Oct 15, 2012 73 | -------------------- 74 | 75 | * re-released with updated version number 76 | 77 | 0.2.0 - Sep 17, 2012 78 | -------------------- 79 | 80 | * Binary data support in websock.js 81 | * Target config file/dir and multiple targets with token selector 82 | * IPv6 fixes 83 | * SSL target support 84 | * Proxy to/from unix socket 85 | 86 | 87 | 0.1.0 - May 11, 2012 88 | -------------------- 89 | 90 | * Initial versioned release. 91 | 92 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/LICENSE.txt: -------------------------------------------------------------------------------- 1 | websockify is licensed under the LGPL version 3 (see docs/LICENSE.GPL-3 and 2 | docs/LICENSE.LGPL-3) with the following exceptions: 3 | 4 | include/websock.js : MPL 2.0 5 | 6 | include/des.js : Various BSD style licenses 7 | 8 | include/web-socket-js/ : New BSD license (3-clause). Source code at 9 | https://github.com/gimite/web-socket-js 10 | 11 | other/kumina.c : Simplified BSD license (2 clause). 12 | Original source at 13 | https://github.com/kumina/wsproxy 14 | 15 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include CHANGES.txt README.md LICENSE.txt 2 | graft include 3 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/Makefile: -------------------------------------------------------------------------------- 1 | TARGETS=rebind.so 2 | CFLAGS += -fPIC 3 | 4 | all: $(TARGETS) 5 | 6 | rebind.so: rebind.o 7 | $(CC) $(LDFLAGS) $^ -shared -fPIC -ldl -o $@ 8 | 9 | clean: 10 | rm -f rebind.o rebind.so 11 | 12 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/Windows/Windows Service Readme.txt: -------------------------------------------------------------------------------- 1 | ----------------------------------- 2 | Windows noVNC Websockify Service 3 | ----------------------------------- 4 | 5 | The "noVNC Websocket Service.exe" file is a windows service wrapper created with Visual Studio 2010 to create a windows service to start stop the noVNC Websocket Server. All files used to create the wrapper can be found in 'noVNC Websocket Service Project' folder. 6 | 7 | To download the precompiled executables please grab the zip in the downloads section of websockify project: 8 | https://github.com/kanaka/websockify 9 | 10 | --------------------------- 11 | Installation 12 | --------------------------- 13 | 14 | 1. This service requires websockify.exe be in the same directory. Instructions on how to compile websockify python script as a windows executable can be found here: 15 | https://github.com/kanaka/websockify/wiki/Compiling-Websockify-as-Windows-Executable 16 | 17 | 2.To add this service to a Windows PC you need to run the commandline as administrator and then run this line: 18 | 19 | sc create "noVNC Websocket Server" binPath= "PATH TO noVNC eg C:\noVNC\utils\Windows\Websocket Service.exe" DisplayName= "noVNC Websocket Server" 20 | 21 | 3 .Once this is run you will be able to access the service via Control Panel > Admin Tools > Services. In here you can specify whether you want the service to run automatically and start at stop the service. 22 | 23 | --------------------------- 24 | Configuration 25 | --------------------------- 26 | The file noVNCConfig.ini must be in the same directory as "noVNC Websocket Service.exe". 27 | 28 | This file contains a single line which is the websockify.exe statup arguements. An example is: 29 | 192.168.0.1:5901 192.168.0.1:5900 30 | 31 | All websockify supported arguements will work if added here. 32 | 33 | --------------------------- 34 | Deletion 35 | --------------------------- 36 | 37 | You can delete the service at any time by running the commandline as admin and using this command: 38 | sc delete "noVNC Websocket Server". 39 | 40 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/Windows/noVNC Websocket Service Project/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.ServiceProcess; 5 | using System.Text; 6 | 7 | namespace MELT_Command_Websocket 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// The main entry point for the application. 13 | /// 14 | static void Main() 15 | { 16 | ServiceBase[] ServicesToRun; 17 | ServicesToRun = new ServiceBase[] 18 | { 19 | new Service1() 20 | }; 21 | ServiceBase.Run(ServicesToRun); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/Windows/noVNC Websocket Service Project/ProjectInstaller.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace MELT_Command_Websocket 2 | { 3 | partial class ProjectInstaller 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Component Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller(); 32 | this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller(); 33 | // 34 | // serviceProcessInstaller1 35 | // 36 | this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.NetworkService; 37 | this.serviceProcessInstaller1.Installers.AddRange(new System.Configuration.Install.Installer[] { 38 | this.serviceInstaller1}); 39 | this.serviceProcessInstaller1.Password = null; 40 | this.serviceProcessInstaller1.Username = null; 41 | // 42 | // serviceInstaller1 43 | // 44 | this.serviceInstaller1.Description = "noVNC Websocket Service"; 45 | this.serviceInstaller1.DisplayName = "noVNC Websocket Service"; 46 | this.serviceInstaller1.ServiceName = "noVNC Websocket Service"; 47 | this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic; 48 | // 49 | // ProjectInstaller 50 | // 51 | this.Installers.AddRange(new System.Configuration.Install.Installer[] { 52 | this.serviceProcessInstaller1}); 53 | 54 | } 55 | 56 | #endregion 57 | 58 | private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1; 59 | private System.ServiceProcess.ServiceInstaller serviceInstaller1; 60 | } 61 | } -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/Windows/noVNC Websocket Service Project/ProjectInstaller.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.ComponentModel; 5 | using System.Configuration.Install; 6 | using System.Linq; 7 | 8 | 9 | namespace MELT_Command_Websocket 10 | { 11 | [RunInstaller(true)] 12 | public partial class ProjectInstaller : System.Configuration.Install.Installer 13 | { 14 | public ProjectInstaller() 15 | { 16 | InitializeComponent(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/Windows/noVNC Websocket Service Project/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("MELT Command Websocket")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Microsoft")] 12 | [assembly: AssemblyProduct("MELT Command Websocket")] 13 | [assembly: AssemblyCopyright("Copyright © Microsoft 2011")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("5ab831cb-6852-4ce1-849c-b26725b0e10b")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/Windows/noVNC Websocket Service Project/Service1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace MELT_Command_Websocket 2 | { 3 | partial class Service1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Component Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | components = new System.ComponentModel.Container(); 32 | this.ServiceName = "Service1"; 33 | } 34 | 35 | #endregion 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/Windows/noVNC Websocket Service Project/Service1.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Diagnostics; 6 | using System.Linq; 7 | using System.ServiceProcess; 8 | using System.Text; 9 | using System.IO; 10 | 11 | namespace MELT_Command_Websocket 12 | { 13 | public partial class Service1 : ServiceBase 14 | { 15 | Process websockify; 16 | public Service1() 17 | { 18 | InitializeComponent(); 19 | } 20 | 21 | protected override void OnStart(string[] args) 22 | { 23 | 24 | string configpath = AppDomain.CurrentDomain.BaseDirectory + "\\noVNCConfig.ini"; 25 | string sockifypath = AppDomain.CurrentDomain.BaseDirectory + "\\websockify.exe"; 26 | //Load commandline arguements from config file. 27 | StreamReader streamReader = new StreamReader(configpath); 28 | string arguements = streamReader.ReadLine(); 29 | streamReader.Close(); 30 | 31 | //Start websockify. 32 | websockify = System.Diagnostics.Process.Start(sockifypath, arguements); 33 | } 34 | 35 | protected override void OnStop() 36 | { 37 | //Service stopped. Close websockify. 38 | websockify.Kill(); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/Windows/noVNC Websocket Service Project/noVNC Websocket.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | x86 6 | 8.0.30703 7 | 2.0 8 | {6B86AE7B-6BBD-4E74-8802-5995E8B6D27D} 9 | WinExe 10 | Properties 11 | noVNC_Websocket_Service 12 | noVNC Websocket Service 13 | v3.5 14 | 512 15 | 16 | 17 | x86 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | x86 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | Component 49 | 50 | 51 | ProjectInstaller.cs 52 | 53 | 54 | Component 55 | 56 | 57 | Service1.cs 58 | 59 | 60 | 61 | 62 | 63 | 64 | ProjectInstaller.cs 65 | 66 | 67 | 68 | 75 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/Windows/noVNC Websocket Service Project/noVNC Websocket.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual Studio 2010 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "noVNC Websocket", "noVNC Websocket.csproj", "{6B86AE7B-6BBD-4E74-8802-5995E8B6D27D}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|x86 = Debug|x86 9 | Release|x86 = Release|x86 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {6B86AE7B-6BBD-4E74-8802-5995E8B6D27D}.Debug|x86.ActiveCfg = Debug|x86 13 | {6B86AE7B-6BBD-4E74-8802-5995E8B6D27D}.Debug|x86.Build.0 = Debug|x86 14 | {6B86AE7B-6BBD-4E74-8802-5995E8B6D27D}.Release|x86.ActiveCfg = Release|x86 15 | {6B86AE7B-6BBD-4E74-8802-5995E8B6D27D}.Release|x86.Build.0 = Release|x86 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/docs/TODO: -------------------------------------------------------------------------------- 1 | - Go implementation 2 | - Rust implementation 3 | - Add sub-protocol support to upstream einaros/ws module and use that 4 | instead of the patched module. 5 | - wstelnet: support CSI L and CSI M 6 | 7 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/docs/flash_policy.txt: -------------------------------------------------------------------------------- 1 | Manual setup: 2 | 3 | DATA="echo \'\'" 4 | /usr/bin/socat -T 1 TCP-L:843,reuseaddr,fork,crlf SYSTEM:"$DATA" 5 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/docs/notes: -------------------------------------------------------------------------------- 1 | Building release tarball: 2 | - not really necessary since tagged revision can be downloaded 3 | from github as tarballs 4 | 5 | git archive --format=tar --prefix=websockify-${WVER}/ v${WVER} > websockify-${WVER}.tar 6 | gzip websockify-${WVER}.tar 7 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/docs/release.txt: -------------------------------------------------------------------------------- 1 | - Update setup.py, CHANGES.txt and other/package.json and commit 2 | - Create version tag and tarball from tag 3 | WVER=0.1.0 4 | git tag v${WVER} 5 | git push origin master 6 | git push origin v${WVER} 7 | - Register with pypi.python.org (once): 8 | python setup.py register 9 | - Upload the source distribution to pypi 10 | python setup.py sdist upload 11 | - Register with npmjs.org (once) 12 | - Upload websockify.js npmjs.org package 13 | npm publish other/js 14 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/other/Makefile: -------------------------------------------------------------------------------- 1 | TARGETS=websockify 2 | CFLAGS += -fPIC 3 | 4 | all: $(TARGETS) 5 | 6 | websockify: websockify.o websocket.o 7 | $(CC) $(LDFLAGS) $^ -lssl -lcrypto -lresolv -o $@ 8 | 9 | websocket.o: websocket.c websocket.h 10 | websockify.o: websockify.c websocket.h 11 | 12 | clean: 13 | rm -f websockify *.o 14 | 15 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/other/README.md: -------------------------------------------------------------------------------- 1 | This directory contain alternate implementations of 2 | WebSockets-to-TCP-Socket proxies (for noVNC). 3 | 4 | ## websockify.c (C) 5 | 6 | ### Description 7 | 8 | This is a C version of the original websockify. It is more limited in 9 | functionality than the original. 10 | 11 | 12 | ## websockify.js 13 | 14 | ### Description 15 | 16 | This is a Node.JS (server-side event driven Javascript) implementation 17 | of websockify. 18 | 19 | 20 | ## kumina.c (C) 21 | 22 | ### Description 23 | 24 | The upstream source of the kumina proxy is [here](https://github.com/kumina/wsproxy). 25 | 26 | [This article](http://blog.kumina.nl/2011/06/proxying-and-multiplexing-novnc-using-wsproxy/) 27 | describes the kumina proxy. 28 | 29 | kumina is an application that is run from inetd, which allows noVNC 30 | to connect to an unmodified VNC server. Furthermore, it makes use of 31 | the recently added support in noVNC for file names. The file name is 32 | used to denote the port number. Say, you connect to: 33 | 34 | ws://host:41337/25900 35 | 36 | The kumina proxy opens a connection to: 37 | 38 | vnc://host:25900/ 39 | 40 | The address to which kumina connects, is the same as the address to 41 | which the client connected (using getsockname()). 42 | 43 | ### Configuration 44 | 45 | kumina can be enabled by adding the following line to inetd.conf: 46 | 47 | 41337 stream tcp nowait nobody /usr/sbin/kumina kumina 25900 25909 48 | 49 | The two parameters of kumina denote the minimum and the maximum allowed 50 | port numbers. This allows a single kumina instance to multiplex 51 | connections to multiple VNC servers. 52 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/other/js/README.md: -------------------------------------------------------------------------------- 1 | A JavaScript implementation of the websockify WebSocket-to-TCP bridge/proxy. 2 | 3 | Copyright (C) 2013 - Joel Martin (github.com/kanaka) 4 | 5 | Licensed under LGPL-3. 6 | 7 | See http://github.com/kanaka/websockify for more info. 8 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/other/js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Joel Martin (http://github.com/kanaka)", 3 | "name": "websockify", 4 | "description": "websockify is a WebSocket-to-TCP proxy/bridge", 5 | "license": "LGPL-3.0", 6 | "version": "0.8.0", 7 | "repository": { 8 | "type": "git", 9 | "url": "git://github.com/kanaka/websockify.git" 10 | }, 11 | "files": ["../../docs/LICENSE.LGPL-3","websockify.js"], 12 | "bin": { 13 | "websockify": "./websockify.js" 14 | }, 15 | "engines": { 16 | "node": ">=0.8.9" 17 | }, 18 | "dependencies": { 19 | "ws": ">=0.4.27", 20 | "optimist": "latest", 21 | "policyfile": "latest" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/other/launch.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | usage() { 4 | if [ "$*" ]; then 5 | echo "$*" 6 | echo 7 | fi 8 | echo "Usage: ${NAME} [--listen PORT] [--vnc VNC_HOST:PORT] [--cert CERT]" 9 | echo 10 | echo "Starts the WebSockets proxy and a mini-webserver and " 11 | echo "provides a cut-and-paste URL to go to." 12 | echo 13 | echo " --listen PORT Port for proxy/webserver to listen on" 14 | echo " Default: 6080" 15 | echo " --vnc VNC_HOST:PORT VNC server host:port proxy target" 16 | echo " Default: localhost:5900" 17 | echo " --cert CERT Path to combined cert/key file" 18 | echo " Default: self.pem" 19 | echo " --web WEB Path to web files (e.g. vnc.html)" 20 | echo " Default: ./" 21 | exit 2 22 | } 23 | 24 | NAME="$(basename $0)" 25 | HERE="$(cd "$(dirname "$0")" && pwd)" 26 | PORT="6080" 27 | VNC_DEST="localhost:5900" 28 | CERT="" 29 | WEB="" 30 | proxy_pid="" 31 | 32 | die() { 33 | echo "$*" 34 | exit 1 35 | } 36 | 37 | cleanup() { 38 | trap - TERM QUIT INT EXIT 39 | trap "true" CHLD # Ignore cleanup messages 40 | echo 41 | if [ -n "${proxy_pid}" ]; then 42 | echo "Terminating WebSockets proxy (${proxy_pid})" 43 | kill ${proxy_pid} 44 | fi 45 | } 46 | 47 | # Process Arguments 48 | 49 | # Arguments that only apply to chrooter itself 50 | while [ "$*" ]; do 51 | param=$1; shift; OPTARG=$1 52 | case $param in 53 | --listen) PORT="${OPTARG}"; shift ;; 54 | --vnc) VNC_DEST="${OPTARG}"; shift ;; 55 | --cert) CERT="${OPTARG}"; shift ;; 56 | --web) WEB="${OPTARG}"; shift ;; 57 | -h|--help) usage ;; 58 | -*) usage "Unknown chrooter option: ${param}" ;; 59 | *) break ;; 60 | esac 61 | done 62 | 63 | # Sanity checks 64 | which netstat >/dev/null 2>&1 \ 65 | || die "Must have netstat installed" 66 | 67 | netstat -ltn | grep -qs "${PORT} .*LISTEN" \ 68 | && die "Port ${PORT} in use. Try --listen PORT" 69 | 70 | trap "cleanup" TERM QUIT INT EXIT 71 | 72 | # Find vnc.html 73 | if [ -n "${WEB}" ]; then 74 | if [ ! -e "${WEB}/vnc.html" ]; then 75 | die "Could not find ${WEB}/vnc.html" 76 | fi 77 | elif [ -e "$(pwd)/vnc.html" ]; then 78 | WEB=$(pwd) 79 | elif [ -e "${HERE}/../vnc.html" ]; then 80 | WEB=${HERE}/../ 81 | elif [ -e "${HERE}/vnc.html" ]; then 82 | WEB=${HERE} 83 | elif [ -e "${HERE}/../share/novnc/vnc.html" ]; then 84 | WEB=${HERE}/../share/novnc/ 85 | else 86 | die "Could not find vnc.html" 87 | fi 88 | 89 | # Find self.pem 90 | if [ -n "${CERT}" ]; then 91 | if [ ! -e "${CERT}" ]; then 92 | die "Could not find ${CERT}" 93 | fi 94 | elif [ -e "$(pwd)/self.pem" ]; then 95 | CERT="$(pwd)/self.pem" 96 | elif [ -e "${HERE}/../self.pem" ]; then 97 | CERT="${HERE}/../self.pem" 98 | elif [ -e "${HERE}/self.pem" ]; then 99 | CERT="${HERE}/self.pem" 100 | else 101 | echo "Warning: could not find self.pem" 102 | fi 103 | 104 | echo "Starting webserver and WebSockets proxy on port ${PORT}" 105 | ${HERE}/websockify --web ${WEB} ${CERT:+--cert ${CERT}} ${PORT} ${VNC_DEST} & 106 | proxy_pid="$!" 107 | sleep 1 108 | if ! ps -p ${proxy_pid} >/dev/null; then 109 | proxy_pid= 110 | echo "Failed to start WebSockets proxy" 111 | exit 1 112 | fi 113 | 114 | echo -e "\n\nNavigate to this URL:\n" 115 | echo -e " http://$(hostname):${PORT}/vnc.html?host=$(hostname)&port=${PORT}\n" 116 | echo -e "Press Ctrl-C to exit\n\n" 117 | 118 | wait ${proxy_pid} 119 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/other/project.clj: -------------------------------------------------------------------------------- 1 | (defproject websockify "1.0.0-SNAPSHOT" 2 | :description "Clojure implementation of Websockify" 3 | :url "https://github.com/kanaka/websockify" 4 | :dependencies [[org.clojure/clojure "1.2.1"] 5 | [org.clojure/tools.cli "0.2.1"] 6 | [ring/ring-jetty-adapter "1.0.0-beta2"] 7 | [org.eclipse.jetty/jetty-websocket "7.5.4.v20111024"] 8 | [org.eclipse.jetty/jetty-server "7.5.4.v20111024"] 9 | [org.eclipse.jetty/jetty-servlet "7.5.4.v20111024"] 10 | [org.jboss.netty/netty "3.2.5.Final"]] 11 | ;:dev-dependencies [[swank-clojure "1.3.0-SNAPSHOT"]] 12 | :main websockify 13 | ) 14 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/other/websocket.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #define BUFSIZE 65536 4 | #define DBUFSIZE (BUFSIZE * 3) / 4 - 20 5 | 6 | #define SERVER_HANDSHAKE_HIXIE "HTTP/1.1 101 Web Socket Protocol Handshake\r\n\ 7 | Upgrade: WebSocket\r\n\ 8 | Connection: Upgrade\r\n\ 9 | %sWebSocket-Origin: %s\r\n\ 10 | %sWebSocket-Location: %s://%s%s\r\n\ 11 | %sWebSocket-Protocol: %s\r\n\ 12 | \r\n%s" 13 | 14 | #define SERVER_HANDSHAKE_HYBI "HTTP/1.1 101 Switching Protocols\r\n\ 15 | Upgrade: websocket\r\n\ 16 | Connection: Upgrade\r\n\ 17 | Sec-WebSocket-Accept: %s\r\n\ 18 | Sec-WebSocket-Protocol: %s\r\n\ 19 | \r\n" 20 | 21 | #define HYBI_GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 22 | 23 | #define HYBI10_ACCEPTHDRLEN 29 24 | 25 | #define HIXIE_MD5_DIGEST_LENGTH 16 26 | 27 | #define POLICY_RESPONSE "\n" 28 | 29 | typedef struct { 30 | char path[1024+1]; 31 | char host[1024+1]; 32 | char origin[1024+1]; 33 | char version[1024+1]; 34 | char connection[1024+1]; 35 | char protocols[1024+1]; 36 | char key1[1024+1]; 37 | char key2[1024+1]; 38 | char key3[8+1]; 39 | } headers_t; 40 | 41 | typedef struct { 42 | int sockfd; 43 | SSL_CTX *ssl_ctx; 44 | SSL *ssl; 45 | int hixie; 46 | int hybi; 47 | headers_t *headers; 48 | char *cin_buf; 49 | char *cout_buf; 50 | char *tin_buf; 51 | char *tout_buf; 52 | } ws_ctx_t; 53 | 54 | typedef struct { 55 | int verbose; 56 | char listen_host[256]; 57 | int listen_port; 58 | void (*handler)(ws_ctx_t*); 59 | int handler_id; 60 | char *cert; 61 | char *key; 62 | int ssl_only; 63 | int daemon; 64 | int run_once; 65 | } settings_t; 66 | 67 | 68 | ssize_t ws_recv(ws_ctx_t *ctx, void *buf, size_t len); 69 | 70 | ssize_t ws_send(ws_ctx_t *ctx, const void *buf, size_t len); 71 | 72 | /* base64.c declarations */ 73 | //int b64_ntop(u_char const *src, size_t srclength, char *target, size_t targsize); 74 | //int b64_pton(char const *src, u_char *target, size_t targsize); 75 | 76 | #define gen_handler_msg(stream, ...) \ 77 | if (! settings.daemon) { \ 78 | fprintf(stream, " %d: ", settings.handler_id); \ 79 | fprintf(stream, __VA_ARGS__); \ 80 | } 81 | 82 | #define handler_msg(...) gen_handler_msg(stdout, __VA_ARGS__); 83 | #define handler_emsg(...) gen_handler_msg(stderr, __VA_ARGS__); 84 | 85 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/other/wswrap: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | usage() { 4 | echo "Usage: $(basename $0) PORT CMDLINE" 5 | echo 6 | echo " PORT Port to wrap with WebSockets support" 7 | echo " CMDLINE Command line to wrap" 8 | exit 2 9 | } 10 | 11 | # Parameter defaults 12 | mydir=$(readlink -f $(dirname ${0})) 13 | 14 | # Process parameters 15 | #while [ "${1}" != "${1#-}" ]; do 16 | # param=$1; shift 17 | #done 18 | 19 | export WSWRAP_PORT="${1}"; shift 20 | 21 | LD_PRELOAD=${mydir}/wswrapper.so "${@}" 22 | 23 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/rebind: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | usage() { 4 | echo "Usage: $(basename $0) OLD_PORT NEW_PORT COMMAND_LINE" 5 | echo 6 | echo "Launch COMMAND_LINE, but intercept system calls to bind" 7 | echo "to OLD_PORT and instead bind them to localhost:NEW_PORT" 8 | exit 2 9 | } 10 | 11 | # Parameter defaults 12 | mydir=$(readlink -f $(dirname ${0})) 13 | 14 | export REBIND_PORT_OLD="${1}"; shift 15 | export REBIND_PORT_NEW="${1}"; shift 16 | 17 | LD_PRELOAD=${mydir}/rebind.so "${@}" 18 | 19 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/rebind.c: -------------------------------------------------------------------------------- 1 | /* 2 | * rebind: Intercept bind calls and bind to a different port 3 | * Copyright 2010 Joel Martin 4 | * Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) 5 | * 6 | * Overload (LD_PRELOAD) bind system call. If REBIND_PORT_OLD and 7 | * REBIND_PORT_NEW environment variables are set then bind on the new 8 | * port (of localhost) instead of the old port. 9 | * 10 | * This allows a bridge/proxy (such as websockify) to run on the old port and 11 | * translate traffic to/from the new port. 12 | * 13 | * Usage: 14 | * LD_PRELOAD=./rebind.so \ 15 | * REBIND_PORT_OLD=23 \ 16 | * REBIND_PORT_NEW=2023 \ 17 | * program 18 | */ 19 | 20 | //#define DO_DEBUG 1 21 | 22 | #include 23 | #include 24 | 25 | #define __USE_GNU 1 // Pull in RTLD_NEXT 26 | #include 27 | 28 | #include 29 | #include 30 | 31 | 32 | #if defined(DO_DEBUG) 33 | #define DEBUG(...) \ 34 | fprintf(stderr, "rebind: "); \ 35 | fprintf(stderr, __VA_ARGS__); 36 | #else 37 | #define DEBUG(...) 38 | #endif 39 | 40 | 41 | int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) 42 | { 43 | static void * (*func)(); 44 | int do_move = 0; 45 | struct sockaddr_in * addr_in = (struct sockaddr_in *)addr; 46 | struct sockaddr_in addr_tmp; 47 | socklen_t addrlen_tmp; 48 | char * PORT_OLD, * PORT_NEW, * end1, * end2; 49 | int ret, oldport, newport, askport = htons(addr_in->sin_port); 50 | uint32_t askaddr = htons(addr_in->sin_addr.s_addr); 51 | if (!func) func = (void *(*)()) dlsym(RTLD_NEXT, "bind"); 52 | 53 | DEBUG(">> bind(%d, _, %d), askaddr %d, askport %d\n", 54 | sockfd, addrlen, askaddr, askport); 55 | 56 | /* Determine if we should move this socket */ 57 | if (addr_in->sin_family == AF_INET) { 58 | // TODO: support IPv6 59 | PORT_OLD = getenv("REBIND_OLD_PORT"); 60 | PORT_NEW = getenv("REBIND_NEW_PORT"); 61 | if (PORT_OLD && (*PORT_OLD != '\0') && 62 | PORT_NEW && (*PORT_NEW != '\0')) { 63 | oldport = strtol(PORT_OLD, &end1, 10); 64 | newport = strtol(PORT_NEW, &end2, 10); 65 | if (oldport && (*end1 == '\0') && 66 | newport && (*end2 == '\0') && 67 | (oldport == askport)) { 68 | do_move = 1; 69 | } 70 | } 71 | } 72 | 73 | if (! do_move) { 74 | /* Just pass everything right through to the real bind */ 75 | ret = (long) func(sockfd, addr, addrlen); 76 | DEBUG("<< bind(%d, _, %d) ret %d\n", sockfd, addrlen, ret); 77 | return ret; 78 | } 79 | 80 | DEBUG("binding fd %d on localhost:%d instead of 0x%x:%d\n", 81 | sockfd, newport, ntohl(addr_in->sin_addr.s_addr), oldport); 82 | 83 | /* Use a temporary location for the new address information */ 84 | addrlen_tmp = sizeof(addr_tmp); 85 | memcpy(&addr_tmp, addr, addrlen_tmp); 86 | 87 | /* Bind to other port on the loopback instead */ 88 | addr_tmp.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 89 | addr_tmp.sin_port = htons(newport); 90 | ret = (long) func(sockfd, &addr_tmp, addrlen_tmp); 91 | 92 | DEBUG("<< bind(%d, _, %d) ret %d\n", sockfd, addrlen, ret); 93 | return ret; 94 | } 95 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import websockify 4 | 5 | websockify.websocketproxy.websockify_init() 6 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | version = '0.8.0' 4 | name = 'websockify' 5 | long_description = open("README.md").read() + "\n" + \ 6 | open("CHANGES.txt").read() + "\n" 7 | 8 | setup(name=name, 9 | version=version, 10 | description="Websockify.", 11 | long_description=long_description, 12 | classifiers=[ 13 | "Programming Language :: Python", 14 | "Programming Language :: Python :: 2", 15 | "Programming Language :: Python :: 2.6", 16 | "Programming Language :: Python :: 2.7", 17 | "Programming Language :: Python :: 3", 18 | "Programming Language :: Python :: 3.3", 19 | "Programming Language :: Python :: 3.4" 20 | ], 21 | data_files=[('share/websockify/include', 22 | ['include/util.js', 23 | 'include/base64.js', 24 | 'include/websock.js']), 25 | ('share/websockify/include/web-socket-js', 26 | ['include/web-socket-js/WebSocketMain.swf', 27 | 'include/web-socket-js/swfobject.js', 28 | 'include/web-socket-js/web_socket.js'])], 29 | keywords='noVNC websockify', 30 | license='LGPLv3', 31 | url="https://github.com/kanaka/websockify", 32 | author="Joel Martin", 33 | author_email="github@martintribe.org", 34 | 35 | packages=['websockify'], 36 | include_package_data=True, 37 | install_requires=['numpy'], 38 | zip_safe=False, 39 | entry_points={ 40 | 'console_scripts': [ 41 | 'websockify = websockify.websocketproxy:websockify_init', 42 | ] 43 | }, 44 | ) 45 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/test-requirements.txt: -------------------------------------------------------------------------------- 1 | mox3 2 | nose 3 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/tests/echo.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | ''' 4 | A WebSocket server that echos back whatever it receives from the client. 5 | Copyright 2010 Joel Martin 6 | Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) 7 | 8 | You can make a cert/key with openssl using: 9 | openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem 10 | as taken from http://docs.python.org/dev/library/ssl.html#certificates 11 | ''' 12 | 13 | import os, sys, select, optparse, logging 14 | sys.path.insert(0,os.path.join(os.path.dirname(__file__), "..")) 15 | from websockify.websockifyserver import WebSockifyServer, WebSockifyRequestHandler 16 | 17 | class WebSocketEcho(WebSockifyRequestHandler): 18 | """ 19 | WebSockets server that echos back whatever is received from the 20 | client. """ 21 | buffer_size = 8096 22 | 23 | def new_websocket_client(self): 24 | """ 25 | Echo back whatever is received. 26 | """ 27 | 28 | cqueue = [] 29 | c_pend = 0 30 | cpartial = "" 31 | rlist = [self.request] 32 | 33 | while True: 34 | wlist = [] 35 | 36 | if cqueue or c_pend: wlist.append(self.request) 37 | ins, outs, excepts = select.select(rlist, wlist, [], 1) 38 | if excepts: raise Exception("Socket exception") 39 | 40 | if self.request in outs: 41 | # Send queued target data to the client 42 | c_pend = self.send_frames(cqueue) 43 | cqueue = [] 44 | 45 | if self.request in ins: 46 | # Receive client data, decode it, and send it back 47 | frames, closed = self.recv_frames() 48 | cqueue.extend(frames) 49 | 50 | if closed: 51 | break 52 | 53 | if __name__ == '__main__': 54 | parser = optparse.OptionParser(usage="%prog [options] listen_port") 55 | parser.add_option("--verbose", "-v", action="store_true", 56 | help="verbose messages and per frame traffic") 57 | parser.add_option("--cert", default="self.pem", 58 | help="SSL certificate file") 59 | parser.add_option("--key", default=None, 60 | help="SSL key file (if separate from cert)") 61 | parser.add_option("--ssl-only", action="store_true", 62 | help="disallow non-encrypted connections") 63 | (opts, args) = parser.parse_args() 64 | 65 | try: 66 | if len(args) != 1: raise 67 | opts.listen_port = int(args[0]) 68 | except: 69 | parser.error("Invalid arguments") 70 | 71 | logging.basicConfig(level=logging.INFO) 72 | 73 | opts.web = "." 74 | server = WebSockifyServer(WebSocketEcho, **opts.__dict__) 75 | server.start_server() 76 | 77 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/tests/echo.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | # A WebSocket server that echos back whatever it receives from the client. 4 | # Copyright 2011 Joel Martin 5 | # Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) 6 | 7 | require 'socket' 8 | $: << "other" 9 | $: << "../other" 10 | require 'websocket' 11 | 12 | class WebSocketEcho < WebSocketServer 13 | 14 | # Echo back whatever is received 15 | def new_websocket_client(client) 16 | 17 | cqueue = [] 18 | c_pend = 0 19 | rlist = [client] 20 | 21 | loop do 22 | wlist = [] 23 | 24 | if cqueue.length > 0 or c_pend 25 | wlist << client 26 | end 27 | 28 | ins, outs, excepts = IO.select(rlist, wlist, nil, 1) 29 | if excepts.length > 0 30 | raise Exception, "Socket exception" 31 | end 32 | 33 | if outs.include?(client) 34 | # Send queued data to the client 35 | c_pend = send_frames(cqueue) 36 | cqueue = [] 37 | end 38 | 39 | if ins.include?(client) 40 | # Receive client data, decode it, and send it back 41 | frames, closed = recv_frames 42 | cqueue += frames 43 | 44 | if closed 45 | raise EClose, closed 46 | end 47 | end 48 | 49 | end # loop 50 | end 51 | end 52 | 53 | port = ARGV[0].to_i || 8080 54 | puts "Starting server on port #{port}" 55 | server_cert = nil 56 | server_key = nil 57 | if ARGV.length > 2 58 | server_cert = ARGV[1] 59 | server_key = ARGV[2] 60 | end 61 | 62 | server = WebSocketEcho.new('listen_port' => port, 'verbose' => true, 63 | 'server_cert' => server_cert, 'server_key' => server_key) 64 | server.start 65 | server.join 66 | 67 | puts "Server has been terminated" 68 | 69 | # vim: sw=2 70 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/tests/echo_client.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import os 4 | import sys 5 | import optparse 6 | import select 7 | 8 | sys.path.insert(0,os.path.join(os.path.dirname(__file__), "..")) 9 | from websockify.websocket import WebSocket, \ 10 | WebSocketWantReadError, WebSocketWantWriteError 11 | 12 | parser = optparse.OptionParser(usage="%prog URL") 13 | (opts, args) = parser.parse_args() 14 | 15 | try: 16 | if len(args) != 1: raise 17 | URL = args[0] 18 | except: 19 | parser.error("Invalid arguments") 20 | 21 | sock = WebSocket() 22 | print("Connecting to %s..." % URL) 23 | sock.connect(URL) 24 | print("Connected.") 25 | 26 | def send(msg): 27 | while True: 28 | try: 29 | sock.sendmsg(msg) 30 | break 31 | except WebSocketWantReadError: 32 | msg = '' 33 | ins, outs, excepts = select.select([sock], [], []) 34 | if excepts: raise Exception("Socket exception") 35 | except WebSocketWantWriteError: 36 | msg = '' 37 | ins, outs, excepts = select.select([], [sock], []) 38 | if excepts: raise Exception("Socket exception") 39 | 40 | def read(): 41 | while True: 42 | try: 43 | return sock.recvmsg() 44 | except WebSocketWantReadError: 45 | ins, outs, excepts = select.select([sock], [], []) 46 | if excepts: raise Exception("Socket exception") 47 | except WebSocketWantWriteError: 48 | ins, outs, excepts = select.select([], [sock], []) 49 | if excepts: raise Exception("Socket exception") 50 | 51 | counter = 1 52 | while True: 53 | msg = "Message #%d" % counter 54 | counter += 1 55 | send(msg) 56 | print("Sent message: %r" % msg) 57 | 58 | while True: 59 | ins, outs, excepts = select.select([sock], [], [], 1.0) 60 | if excepts: raise Exception("Socket exception") 61 | 62 | if ins == []: 63 | break 64 | 65 | while True: 66 | msg = read() 67 | print("Received message: %r" % msg) 68 | 69 | if not sock.pending(): 70 | break 71 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/tests/simple.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Websock Simple Client 5 | 6 | 7 | 8 | 9 | 10 | WebSocket/websockify URI:   11 | 13 |

14 |   15 |   17 |

18 | Log:
19 | 20 | 21 | 22 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/tests/test_auth_plugins.py: -------------------------------------------------------------------------------- 1 | # vim: tabstop=4 shiftwidth=4 softtabstop=4 2 | 3 | """ Unit tests for Authentication plugins""" 4 | 5 | from websockify.auth_plugins import BasicHTTPAuth, AuthenticationError 6 | import unittest 7 | 8 | 9 | class BasicHTTPAuthTestCase(unittest.TestCase): 10 | 11 | def setUp(self): 12 | self.plugin = BasicHTTPAuth('Aladdin:open sesame') 13 | 14 | def test_no_auth(self): 15 | headers = {} 16 | self.assertRaises(AuthenticationError, self.plugin.authenticate, headers, 'localhost', '1234') 17 | 18 | def test_invalid_password(self): 19 | headers = {'Authorization': 'Basic QWxhZGRpbjpzZXNhbWUgc3RyZWV0'} 20 | self.assertRaises(AuthenticationError, self.plugin.authenticate, headers, 'localhost', '1234') 21 | 22 | def test_valid_password(self): 23 | headers = {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='} 24 | self.plugin.authenticate(headers, 'localhost', '1234') 25 | 26 | def test_garbage_auth(self): 27 | headers = {'Authorization': 'Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx'} 28 | self.assertRaises(AuthenticationError, self.plugin.authenticate, headers, 'localhost', '1234') 29 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/tox.ini: -------------------------------------------------------------------------------- 1 | # Tox (http://tox.testrun.org/) is a tool for running tests 2 | # in multiple virtualenvs. This configuration file will run the 3 | # test suite on all supported python versions. To use it, "pip install tox" 4 | # and then run "tox" from this directory. 5 | 6 | [tox] 7 | envlist = py24,py26,py27,py33,py34 8 | 9 | [testenv] 10 | commands = nosetests {posargs} 11 | deps = -r{toxinidir}/test-requirements.txt 12 | 13 | # At some point we should enable this since tox expects it to exist but 14 | # the code will need pep8ising first. 15 | #[testenv:pep8] 16 | #commands = flake8 17 | #dep = flake8 18 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/websockify/__init__.py: -------------------------------------------------------------------------------- 1 | from websockify.websocket import * 2 | from websockify.websocketproxy import * 3 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/websockify/auth_plugins.py: -------------------------------------------------------------------------------- 1 | class BasePlugin(object): 2 | def __init__(self, src=None): 3 | self.source = src 4 | 5 | def authenticate(self, headers, target_host, target_port): 6 | pass 7 | 8 | 9 | class AuthenticationError(Exception): 10 | def __init__(self, log_msg=None, response_code=403, response_headers={}, response_msg=None): 11 | self.code = response_code 12 | self.headers = response_headers 13 | self.msg = response_msg 14 | 15 | if log_msg is None: 16 | log_msg = response_msg 17 | 18 | super(AuthenticationError, self).__init__('%s %s' % (self.code, log_msg)) 19 | 20 | 21 | class InvalidOriginError(AuthenticationError): 22 | def __init__(self, expected, actual): 23 | self.expected_origin = expected 24 | self.actual_origin = actual 25 | 26 | super(InvalidOriginError, self).__init__( 27 | response_msg='Invalid Origin', 28 | log_msg="Invalid Origin Header: Expected one of " 29 | "%s, got '%s'" % (expected, actual)) 30 | 31 | 32 | class BasicHTTPAuth(object): 33 | """Verifies Basic Auth headers. Specify src as username:password""" 34 | 35 | def __init__(self, src=None): 36 | self.src = src 37 | 38 | def authenticate(self, headers, target_host, target_port): 39 | import base64 40 | auth_header = headers.get('Authorization') 41 | if auth_header: 42 | if not auth_header.startswith('Basic '): 43 | raise AuthenticationError(response_code=403) 44 | 45 | try: 46 | user_pass_raw = base64.b64decode(auth_header[6:]) 47 | except TypeError: 48 | raise AuthenticationError(response_code=403) 49 | 50 | try: 51 | # http://stackoverflow.com/questions/7242316/what-encoding-should-i-use-for-http-basic-authentication 52 | user_pass_as_text = user_pass_raw.decode('ISO-8859-1') 53 | except UnicodeDecodeError: 54 | raise AuthenticationError(response_code=403) 55 | 56 | user_pass = user_pass_as_text.split(':', 1) 57 | if len(user_pass) != 2: 58 | raise AuthenticationError(response_code=403) 59 | 60 | if not self.validate_creds(*user_pass): 61 | raise AuthenticationError(response_code=403) 62 | 63 | else: 64 | raise AuthenticationError(response_code=401, 65 | response_headers={'WWW-Authenticate': 'Basic realm="Websockify"'}) 66 | 67 | def validate_creds(self, username, password): 68 | if '%s:%s' % (username, password) == self.src: 69 | return True 70 | else: 71 | return False 72 | 73 | class ExpectOrigin(object): 74 | def __init__(self, src=None): 75 | if src is None: 76 | self.source = [] 77 | else: 78 | self.source = src.split() 79 | 80 | def authenticate(self, headers, target_host, target_port): 81 | origin = headers.get('Origin', None) 82 | if origin is None or origin not in self.source: 83 | raise InvalidOriginError(expected=self.source, actual=origin) 84 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/websockify/token_plugins.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | class BasePlugin(object): 4 | def __init__(self, src): 5 | self.source = src 6 | 7 | def lookup(self, token): 8 | return None 9 | 10 | 11 | class ReadOnlyTokenFile(BasePlugin): 12 | # source is a token file with lines like 13 | # token: host:port 14 | # or a directory of such files 15 | def __init__(self, *args, **kwargs): 16 | super(ReadOnlyTokenFile, self).__init__(*args, **kwargs) 17 | self._targets = None 18 | 19 | def _load_targets(self): 20 | if os.path.isdir(self.source): 21 | cfg_files = [os.path.join(self.source, f) for 22 | f in os.listdir(self.source)] 23 | else: 24 | cfg_files = [self.source] 25 | 26 | self._targets = {} 27 | for f in cfg_files: 28 | for line in [l.strip() for l in open(f).readlines()]: 29 | if line and not line.startswith('#'): 30 | tok, target = line.split(': ') 31 | self._targets[tok] = target.strip().rsplit(':', 1) 32 | 33 | def lookup(self, token): 34 | if self._targets is None: 35 | self._load_targets() 36 | 37 | if token in self._targets: 38 | return self._targets[token] 39 | else: 40 | return None 41 | 42 | 43 | # the above one is probably more efficient, but this one is 44 | # more backwards compatible (although in most cases 45 | # ReadOnlyTokenFile should suffice) 46 | class TokenFile(ReadOnlyTokenFile): 47 | # source is a token file with lines like 48 | # token: host:port 49 | # or a directory of such files 50 | def lookup(self, token): 51 | self._load_targets() 52 | 53 | return super(TokenFile, self).lookup(token) 54 | 55 | 56 | class BaseTokenAPI(BasePlugin): 57 | # source is a url with a '%s' in it where the token 58 | # should go 59 | 60 | # we import things on demand so that other plugins 61 | # in this file can be used w/o unecessary dependencies 62 | 63 | def process_result(self, resp): 64 | return resp.text.split(':') 65 | 66 | def lookup(self, token): 67 | import requests 68 | 69 | resp = requests.get(self.source % token) 70 | 71 | if resp.ok: 72 | return self.process_result(resp) 73 | else: 74 | return None 75 | 76 | 77 | class JSONTokenApi(BaseTokenAPI): 78 | # source is a url with a '%s' in it where the token 79 | # should go 80 | 81 | def process_result(self, resp): 82 | resp_json = resp.json() 83 | return (resp_json['host'], resp_json['port']) 84 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/websockify/websocketserver.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | ''' 4 | Python WebSocket server base 5 | Copyright 2011 Joel Martin 6 | Copyright 2016 Pierre Ossman 7 | Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) 8 | ''' 9 | 10 | import sys 11 | 12 | # python 3.0 differences 13 | try: from http.server import BaseHTTPRequestHandler, HTTPServer 14 | except: from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 15 | 16 | from websockify.websocket import WebSocket, WebSocketWantReadError, WebSocketWantWriteError 17 | 18 | class WebSocketRequestHandler(BaseHTTPRequestHandler): 19 | """WebSocket request handler base class. 20 | 21 | This class forms the base for a server that wishes to handle 22 | WebSocket requests. It functions exactly as BastHTTPRequestHandler, 23 | except that WebSocket requests are intercepted and the methods 24 | handle_upgrade() and handle_websocket() are called. The standard 25 | do_GET() will be called for normal requests. 26 | 27 | The class instance SocketClass can be overridden with the class to 28 | use for the WebSocket connection. 29 | """ 30 | 31 | SocketClass = WebSocket 32 | 33 | def __init__(self, request, client_address, server): 34 | BaseHTTPRequestHandler.__init__(self, request, client_address, server) 35 | 36 | def handle_one_request(self): 37 | """Extended request handler 38 | 39 | This is where WebSocketRequestHandler redirects requests to the 40 | new methods. Any sub-classes must call this method in order for 41 | the calls to function. 42 | """ 43 | self._real_do_GET = self.do_GET 44 | self.do_GET = self._websocket_do_GET 45 | try: 46 | BaseHTTPRequestHandler.handle_one_request(self) 47 | finally: 48 | self.do_GET = self._real_do_GET 49 | 50 | def _websocket_do_GET(self): 51 | # Checks if it is a websocket request and redirects 52 | self.do_GET = self._real_do_GET 53 | 54 | if (self.headers.get('upgrade') and 55 | self.headers.get('upgrade').lower() == 'websocket'): 56 | self.handle_upgrade() 57 | else: 58 | self.do_GET() 59 | 60 | def handle_upgrade(self): 61 | """Initial handler for a WebSocket request 62 | 63 | This method is called when a WebSocket is requested. By default 64 | it will create a WebSocket object and perform the negotiation. 65 | The WebSocket object will then replace the request object and 66 | handle_websocket() will be called. 67 | """ 68 | websocket = self.SocketClass() 69 | try: 70 | websocket.accept(self.request, self.headers) 71 | except Exception: 72 | exc = sys.exc_info()[1] 73 | self.send_error(400, str(exc)) 74 | return 75 | 76 | self.log_request(101) 77 | 78 | self.request = websocket 79 | 80 | # Other requests cannot follow Websocket data 81 | self.close_connection = True 82 | 83 | self.handle_websocket() 84 | 85 | def handle_websocket(self): 86 | """Handle a WebSocket connection. 87 | 88 | This is called when the WebSocket is ready to be used. A 89 | sub-class should perform the necessary communication here and 90 | return once done. 91 | """ 92 | pass 93 | 94 | class WebSocketServer(HTTPServer): 95 | pass 96 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/wsirc.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | IRC Client using WebSockets 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | Host:   23 | Port:   24 | Encrypt:   25 | 26 |
27 | Nick:   28 |
29 | Channel: #  30 | 31 |

32 | 33 |
34 | > 35 | 36 | 37 | 95 | 96 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /docker/image/usr/lib/noVNC/utils/websockify/wstelnet.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Telnet client using WebSockets 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | Host:   23 | Port:   24 | Encrypt:   25 |   27 | 28 |

29 | 30 |

31 | 
32 |         
70 | 
71 |     
72 | 
73 | 
74 | 


--------------------------------------------------------------------------------
/docker/image/usr/lib/web/config/__init__.py:
--------------------------------------------------------------------------------
 1 | class Default(object):
 2 |     DEBUG = True
 3 | 
 4 | 
 5 | class Development(Default):
 6 |     PHASE = 'development'
 7 | 
 8 | 
 9 | class Staging(Default):
10 |     PHASE = 'staging'
11 | 
12 | 
13 | class Production(Default):
14 |     PHASE = 'production'
15 |     DEBUG = False
16 | 


--------------------------------------------------------------------------------
/docker/image/usr/lib/web/lightop/__init__.py:
--------------------------------------------------------------------------------
  1 | from flask import (Flask,
  2 |                    request,
  3 |                    abort,
  4 |                    )
  5 | import os
  6 | 
  7 | 
  8 | # Flask app
  9 | app = Flask(__name__,
 10 |             static_folder='static', static_url_path='',
 11 |             instance_relative_config=True)
 12 | CONFIG = os.environ.get('CONFIG') or 'config.Development'
 13 | app.config.from_object('config.Default')
 14 | app.config.from_object(CONFIG)
 15 | 
 16 | # logging
 17 | import logging
 18 | from log.config import LoggingConfiguration
 19 | LoggingConfiguration.set(
 20 |     logging.DEBUG if os.getenv('DEBUG') else logging.INFO,
 21 |     'lightop.log', name='Web')
 22 | 
 23 | 
 24 | import json
 25 | from functools import wraps
 26 | import subprocess
 27 | import time
 28 | 
 29 | 
 30 | FIRST = True
 31 | 
 32 | 
 33 | def exception_to_json(func):
 34 |     @wraps(func)
 35 |     def wrapper(*args, **kwargs):
 36 |         try:
 37 |             result = func(*args, **kwargs)
 38 |             return result
 39 |         except (BadRequest,
 40 |                 KeyError,
 41 |                 ValueError,
 42 |                 ) as e:
 43 |             result = {'error': {'code': 400,
 44 |                                 'message': str(e)}}
 45 |         except PermissionDenied as e:
 46 |             result = {'error': {'code': 403,
 47 |                                 'message': ', '.join(e.args)}}
 48 |         except (NotImplementedError, RuntimeError, AttributeError) as e:
 49 |             result = {'error': {'code': 500,
 50 |                                 'message': ', '.join(e.args)}}
 51 |         return json.dumps(result)
 52 |     return wrapper
 53 | 
 54 | 
 55 | class PermissionDenied(Exception):
 56 |     pass
 57 | 
 58 | 
 59 | class BadRequest(Exception):
 60 |     pass
 61 | 
 62 | 
 63 | HTML_INDEX = '''
 64 |     
 73 |     Page Redirection
 74 | '''
 75 | 
 76 | 
 77 | HTML_REDIRECT = '''
 78 |     
 84 |     Page Redirection
 85 | '''
 86 | 
 87 | 
 88 | @app.route('/')
 89 | def index():
 90 |     return HTML_INDEX
 91 | 
 92 | 
 93 | @app.route('/redirect.html')
 94 | def redirectme():
 95 |     global FIRST
 96 | 
 97 |     if not FIRST:
 98 |         return HTML_REDIRECT
 99 | 
100 |     env = {'width': 1024, 'height': 768}
101 |     if 'width' in request.args:
102 |         env['width'] = request.args['width']
103 |     if 'height' in request.args:
104 |         env['height'] = request.args['height']
105 | 
106 |     # sed
107 |     subprocess.check_call(r"sed -i 's#^command=/usr/bin/Xvfb.*$#command=/usr/bin/Xvfb :1 -screen 0 {width}x{height}x16#' /etc/supervisor/conf.d/supervisord.conf".format(**env),
108 |                           shell=True)
109 |     # supervisorctrl reload
110 |     subprocess.check_call(r"supervisorctl reload", shell=True)
111 | 
112 |     # check all running
113 |     for i in xrange(20):
114 |         output = subprocess.check_output(r"supervisorctl status | grep RUNNING | wc -l", shell=True)
115 |         if output.strip() == "6":
116 |             FIRST = False
117 |             return HTML_REDIRECT
118 |         time.sleep(2)
119 |     abort(500, 'service is not ready, please restart container')
120 | 
121 | 
122 | if __name__ == '__main__':
123 |     app.run(host=app.config['ADDRESS'], port=app.config['PORT'])
124 | 


--------------------------------------------------------------------------------
/docker/image/usr/lib/web/log/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/web/log/__init__.py


--------------------------------------------------------------------------------
/docker/image/usr/lib/web/log/config.py:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | import sys
 3 | import logging
 4 | import logging.handlers
 5 | 
 6 | 
 7 | #The terminal has 8 colors with codes from 0 to 7
 8 | BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)
 9 | 
10 | #These are the sequences need to get colored ouput
11 | RESET_SEQ = "\033[0m"
12 | COLOR_SEQ = "\033[1;%dm"
13 | BOLD_SEQ = "\033[1m"
14 | 
15 | #The background is set with 40 plus the number of the color,
16 | #and the foreground with 30
17 | COLORS = {
18 |     'WARNING':  COLOR_SEQ % (30 + YELLOW) + 'WARN ' + RESET_SEQ,
19 |     'INFO':     COLOR_SEQ % (30 + WHITE) + 'INFO ' + RESET_SEQ,
20 |     'DEBUG':    COLOR_SEQ % (30 + BLUE) + 'DEBUG' + RESET_SEQ,
21 |     'CRITICAL': COLOR_SEQ % (30 + YELLOW) + 'CRITI' + RESET_SEQ,
22 |     'ERROR':    COLOR_SEQ % (30 + RED) + 'ERROR' + RESET_SEQ,
23 | }
24 | 
25 | 
26 | class ColoredFormatter(logging.Formatter):
27 |     def __init__(self, msg, use_color=True):
28 |         logging.Formatter.__init__(self, msg)
29 |         self.use_color = use_color
30 | 
31 |     def format(self, record):
32 |         if self.use_color:
33 |             record.levelname = COLORS.get(record.levelname, record.levelname)
34 |         return logging.Formatter.format(self, record)
35 | 
36 | 
37 | class LoggingConfiguration(object):
38 |     COLOR_FORMAT = "[%(asctime)s" + \
39 |                    "][%(threadName)-22s][%(levelname)s] %(message)s " + \
40 |                    "(" + BOLD_SEQ + "%(filename)s" + RESET_SEQ + ":%(lineno)d)"
41 |     NO_COLOR_FORMAT = "[%(asctime)s][%(threadName)-22s][%(levelname)s] " + \
42 |                       "%(message)s " + \
43 |                       "(%(filename)s:%(lineno)d)"
44 |     FILE_FORMAT = "[%(asctime)s][%(threadName)-22s][%(levelname)s] " + \
45 |                   "%(message)s "
46 | 
47 |     @classmethod
48 |     def set(cls, log_level, log_filename, append=None, **kwargs):
49 |         """ Configure a rotating file logging
50 |         """
51 |         logger = logging.getLogger()
52 |         logger.setLevel(log_level)
53 | 
54 |         COLOR_FORMAT = cls.COLOR_FORMAT
55 |         NO_COLOR_FORMAT = cls.NO_COLOR_FORMAT
56 |         FILE_FORMAT = cls.FILE_FORMAT
57 |         if 'name' in kwargs:
58 |             COLOR_FORMAT = COLOR_FORMAT.replace('%(threadName)-22s',
59 |                                                 '%-22s' % (kwargs['name']))
60 |             NO_COLOR_FORMAT = NO_COLOR_FORMAT.replace(
61 |                 '%(threadName)-22s', '%-22s' % (kwargs['name']))
62 |             FILE_FORMAT = FILE_FORMAT.replace(
63 |                 '%(threadName)-22s', '%s' % (kwargs['name']))
64 | 
65 |         # Log to rotating file
66 |         try:
67 |             fh = logging.handlers.RotatingFileHandler(log_filename,
68 |                                                       mode='a+',
69 |                                                       backupCount=3)
70 |             fh = logging.FileHandler(log_filename, mode='a+')
71 |             fh.setFormatter(ColoredFormatter(FILE_FORMAT, False))
72 |             fh.setLevel(log_level)
73 |             logger.addHandler(fh)
74 |             if not append:
75 |                 # Create a new log file on every new
76 |                 fh.doRollover()
77 |         except:
78 |             pass
79 | 
80 |         # Log to sys.stderr using log level passed through command line
81 |         if log_level != logging.NOTSET:
82 |             log_handler = logging.StreamHandler(sys.stdout)
83 |             if sys.platform.find('linux') >= 0:
84 |                 formatter = ColoredFormatter(COLOR_FORMAT)
85 |             else:
86 |                 formatter = ColoredFormatter(NO_COLOR_FORMAT, False)
87 |             log_handler.setFormatter(formatter)
88 |             log_handler.setLevel(log_level)
89 |             logger.addHandler(log_handler)
90 | 


--------------------------------------------------------------------------------
/docker/image/usr/lib/web/requirements.txt:
--------------------------------------------------------------------------------
 1 | Flask==0.12.3
 2 | Flask-Login==0.2.11
 3 | Jinja2==2.10.1
 4 | MarkupSafe==0.23
 5 | Werkzeug==0.9.6
 6 | argparse==1.2.1
 7 | backports.ssl-match-hostname==3.4.0.2
 8 | docker-py==0.5.3
 9 | gevent==1.0.1
10 | gevent-websocket==0.9.3
11 | greenlet==0.4.5
12 | itsdangerous==0.24
13 | peewee==2.4.1
14 | requests==2.20.0
15 | six==1.8.0
16 | websocket-client==0.21.0
17 | wsgiref==0.1.2
18 | 


--------------------------------------------------------------------------------
/docker/image/usr/lib/web/run.py:
--------------------------------------------------------------------------------
  1 | #!/usr/bin/env python
  2 | 
  3 | import os
  4 | import time
  5 | import sys
  6 | import subprocess
  7 | import signal
  8 | 
  9 | 
 10 | def run_with_reloader(main_func, extra_files=None, interval=1):
 11 |     """Run the given function in an independent python interpreter."""
 12 |     def find_files(directory="./"):
 13 |         for root, dirs, files in os.walk(directory):
 14 |             for basename in files:
 15 |                 if basename.endswith('.py'):
 16 |                     filename = os.path.join(root, basename)
 17 |                     yield filename
 18 | 
 19 |     if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
 20 |         try:
 21 |             os.setpgid(0, 0)
 22 |             main_func()
 23 |         except KeyboardInterrupt:
 24 |             pass
 25 |         return
 26 | 
 27 |     procs = None
 28 |     try:
 29 |         while True:
 30 |             print('* Restarting with reloader ' + str(sys.executable))
 31 |             args = [sys.executable] + sys.argv
 32 |             new_environ = os.environ.copy()
 33 |             new_environ['WERKZEUG_RUN_MAIN'] = 'true'
 34 | 
 35 |             procs = subprocess.Popen(args, env=new_environ)
 36 |             mtimes = {}
 37 |             restart = False
 38 |             while not restart:
 39 |                 for filename in find_files():
 40 |                     try:
 41 |                         mtime = os.stat(filename).st_mtime
 42 |                     except OSError:
 43 |                         continue
 44 | 
 45 |                     old_time = mtimes.get(filename)
 46 |                     if old_time is None:
 47 |                         mtimes[filename] = mtime
 48 |                         continue
 49 |                     elif mtime > old_time:
 50 |                         print('* Detected change in %r, reloading' % filename)
 51 |                         restart = True
 52 |                         break
 53 |                     time.sleep(interval)
 54 | 
 55 |             killpg(procs.pid, signal.SIGTERM)
 56 |     except KeyboardInterrupt:
 57 |         pass
 58 |     finally:
 59 |         killpg(procs.pid, signal.SIGTERM)
 60 | 
 61 | 
 62 | def killpg(pgid, send_signal=signal.SIGKILL):
 63 |     print('kill PGID {}'.format(pgid))
 64 |     try:
 65 |         os.killpg(pgid, send_signal)
 66 |         #os.killpg(pgid, signal.SIGKILL)
 67 |     except:
 68 |         pass
 69 | 
 70 | 
 71 | def main():
 72 |     def run_server():
 73 |         import socket
 74 | 
 75 |         os.environ['CONFIG'] = CONFIG
 76 |         from lightop import app
 77 | 
 78 |         # websocket conflict: WebSocketHandler
 79 |         if DEBUG or STAGING:
 80 |             # from werkzeug.debug import DebuggedApplication
 81 |             app.debug = True
 82 |             # app = DebuggedApplication(app, evalex=True)
 83 | 
 84 |         print('Fork monitor programs')
 85 |         pgid = os.getpgid(0)
 86 |         procs = []
 87 |         procs.extend([subprocess.Popen(program, close_fds=True, shell=True)
 88 |                       for program in PROGRAMS])
 89 |         signal.signal(signal.SIGTERM, lambda *args: killpg(pgid))
 90 |         signal.signal(signal.SIGHUP, lambda *args: killpg(pgid))
 91 |         signal.signal(signal.SIGINT, lambda *args: killpg(pgid))
 92 | 
 93 |         print('Running on port ' + str(PORT))
 94 |         try:
 95 |             app.run(host='', port=PORT)
 96 |         except socket.error as e:
 97 |             print(e)
 98 | 
 99 |     DEBUG = True if '--debug' in sys.argv else False
100 |     STAGING = True if '--staging' in sys.argv else False
101 |     CONFIG = 'config.Development' if DEBUG else 'config.Production'
102 |     CONFIG = 'config.Staging' if STAGING else CONFIG
103 |     PORT = 6079
104 |     PROGRAMS = tuple()
105 |     signal.signal(signal.SIGCHLD, signal.SIG_IGN)
106 | 
107 |     if DEBUG or STAGING:
108 |         main = lambda: run_with_reloader(run_server)
109 |     else:
110 |         main = run_server
111 |     main()
112 | 
113 | 
114 | if __name__ == "__main__":
115 |     main()
116 | 


--------------------------------------------------------------------------------
/docker/image/usr/lib/web/static/6df2b309.favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/web/static/6df2b309.favicon.ico


--------------------------------------------------------------------------------
/docker/image/usr/lib/web/static/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/web/static/fonts/glyphicons-halflings-regular.eot


--------------------------------------------------------------------------------
/docker/image/usr/lib/web/static/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/web/static/fonts/glyphicons-halflings-regular.ttf


--------------------------------------------------------------------------------
/docker/image/usr/lib/web/static/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/lib/web/static/fonts/glyphicons-halflings-regular.woff


--------------------------------------------------------------------------------
/docker/image/usr/lib/web/static/robots.txt:
--------------------------------------------------------------------------------
1 | # robotstxt.org/
2 | 
3 | User-agent: *
4 | 


--------------------------------------------------------------------------------
/docker/image/usr/lib/web/static/styles/536b3e9f.main.css:
--------------------------------------------------------------------------------
1 | body{padding-top:50px}.container-block{padding-top:64px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:4px 0 0 4px}.btn-group>.btn{width:90%;text-align:left}.btn-group>.btn+.dropdown-toggle{width:10%}


--------------------------------------------------------------------------------
/docker/image/usr/share/doro-lxde-wallpapers/bg1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/share/doro-lxde-wallpapers/bg1.jpg


--------------------------------------------------------------------------------
/docker/image/usr/share/doro-lxde-wallpapers/bg2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/share/doro-lxde-wallpapers/bg2.jpg


--------------------------------------------------------------------------------
/docker/image/usr/share/doro-lxde-wallpapers/bg3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/share/doro-lxde-wallpapers/bg3.jpg


--------------------------------------------------------------------------------
/docker/image/usr/share/doro-lxde-wallpapers/bg4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/docker/image/usr/share/doro-lxde-wallpapers/bg4.jpg


--------------------------------------------------------------------------------
/docker/image/usr/share/doro-lxde-wallpapers/desktop-items-0.conf:
--------------------------------------------------------------------------------
 1 | [*]
 2 | wallpaper_mode=stretch
 3 | wallpaper_common=0
 4 | wallpapers_configured=4
 5 | wallpaper0=/usr/share/doro-lxde-wallpapers/bg1.jpg
 6 | wallpaper1=/usr/share/doro-lxde-wallpapers/bg2.jpg
 7 | wallpaper2=/usr/share/doro-lxde-wallpapers/bg3.jpg
 8 | wallpaper3=/usr/share/doro-lxde-wallpapers/bg4.jpg
 9 | desktop_bg=#000000
10 | desktop_fg=#ffffff
11 | desktop_shadow=#000000
12 | desktop_font=Sans 12
13 | show_wm_menu=0
14 | sort=mtime;ascending;mingle;
15 | show_documents=0
16 | show_trash=0
17 | show_mounts=0
18 | 
19 | 


--------------------------------------------------------------------------------
/docker/readme.txt:
--------------------------------------------------------------------------------
 1 | Docker currently working but still a work in progress to make it more user friendly. I'll put it on dockerhub when fully functional
 2 | Currently working from a lubuntu 16.04 host, (with ps3 controller working),  though there is still some configuration
 3 | I took https://github.com/fcwu/docker-ubuntu-vnc-desktop as a starting point 
 4 | 
 5 | build using : 
 6 | docker build -t linn-photobooth . 
 7 | 
 8 | run the image using (set mypassword to the password you want to use and the persistent folder path):
 9 | If you need all functionalities (i.e. bluetooth ps3 controller) you will need to give more permissions
10 | docker run --privileged  --cap-add=ALL --net=host --device=/dev/video0:/dev/video0 -v /lib/modules:/lib/modules -v /var/run/dbus:/var/run/dbus -v ABSOLUTE_PATH_TO_HOST_LINN-PHOTOBOOTH_PERSISTENT_FOLDER:/root/Linn-Photobooth/persistent -p5900:5900 -p6080:80 -e VNC_PASSWORD=mypassword linn-photobooth
11 | 
12 | Otherwise use :
13 | docker run --privileged --net=host --device=/dev/video0:/dev/video0 -v ABSOLUTE_PATH_TO_HOST_LINN-PHOTOBOOTH_PERSISTENT_FOLDER:/root/Linn-Photobooth/persistent -p5900:5900 -p6080:80 -e VNC_PASSWORD=mypassword linn-photobooth
14 | 
15 | Then connect via vnc :
16 | either vncviewer -fullscreen localhost:5900
17 | or go to http://localhost:8080
18 | 
19 | Inside the container 
20 | 
21 | cd /root/Linn-Photobooth
22 | 
23 | 
24 | Configure remoteart.sh with your art server username and ip
25 | Make sure you can ssh without password inside your artserver using ssh-copy-id
26 | 
27 | Then
28 | python3 photobooth.py
29 | 
30 | Check that files are correctly saved inside both host and container
31 | 
32 | If you use the persistent folder it will use ROOT permissions so when you are finished on host 
33 | you can get your original permissions back with sudo chown -R username persistent
34 | 
35 | 
36 | 


--------------------------------------------------------------------------------
/docker/runcommand.txt:
--------------------------------------------------------------------------------
1 | docker run --privileged  --cap-add=ALL --net=host --device=/dev/video0:/dev/video0 -v /lib/modules:/lib/modules -v /var/run/dbus:/var/run/dbus -v ABSOLUTE_PATH_TO_HOST_LINN-PHOTOBOOTH_PERSISTENT_FOLDER:/root/Linn-Photobooth/persistent -p5900:5900 -p6080:80 -e VNC_PASSWORD=mypassword linn-photobooth
2 | 


--------------------------------------------------------------------------------
/fast-neural-style/liststyles.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | for i in $( ls -tr stylemodel/*.t7); do
3 | 	filename=$(basename "$i")
4 | 	extension="${filename##*.}"
5 | 	filename="${filename%.*}"
6 | 	echo \"$filename\",
7 | done


--------------------------------------------------------------------------------
/fast-neural-style/readme.txt:
--------------------------------------------------------------------------------
1 | I have trained a few styles, to avoid overloading the repo I have created a second repository with these pretrained models :
2 | GistNoesis/Linn-Photobooth-Fast-Neural-Style-Trained-Models
3 | For remoteArt.sh to work :
4 | You need to replace "beast" by username@ipofyourlocalartserver and configure it so you can ssh into it without having to input the password.
5 | You can use ssh-copy-id for this. Even on localhost we go over ssh.
6 | The fast neural style is intended to be cloned from https://github.com/jcjohnson/fast-neural-style into ~
7 | Then you create a folder named photos, and a folder named stylemodel where t7 files should go inside the fast-neural-style folder
8 | You can also use the provided script to train multiple styles
9 | 


--------------------------------------------------------------------------------
/fast-neural-style/train.sh:
--------------------------------------------------------------------------------
 1 |  #!/bin/bash
 2 |  # folder gpuindex
 3 | for i in $( ls $1); do
 4 | 	filename=$(basename "$i")
 5 | 	extension="${filename##*.}"
 6 | 	filename="${filename%.*}"
 7 | 	echo item: $filename
 8 | 
 9 | 	th train.lua \
10 |   -h5_file ~/Downloads/coco.h5 \
11 |   -style_image $1/$i \
12 |   -style_image_size 784 \
13 |   -content_weights 1.0 \
14 |   -style_weights 5.0 \
15 |   -checkpoint_name stylemodel/$filename \
16 |   -gpu $2
17 | 	
18 | 	mv folder/$1 styles
19 | done


--------------------------------------------------------------------------------
/openpose/examples/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | add_subdirectory(openpose)
2 | add_subdirectory(tests)
3 | add_subdirectory(tutorial_add_module)
4 | add_subdirectory(tutorial_pose)
5 | add_subdirectory(tutorial_thread)
6 | add_subdirectory(tutorial_wrapper)
7 | add_subdirectory(zmq_pose_server)


--------------------------------------------------------------------------------
/openpose/examples/readme.txt:
--------------------------------------------------------------------------------
1 | Put the zmq_pose_server folder and CMakeLists.txt inside the openpose/examples folder and compile openpose as explained on openpose github
2 | Obviously you'll need zmq installed.
3 | Then you can run the server by running from openpose folder
4 | ./build/examples/zmq_pose_server/multipleimages.bin 
5 | 


--------------------------------------------------------------------------------
/openpose/examples/zmq_pose_server/CMakeLists.txt:
--------------------------------------------------------------------------------
 1 | set(EXAMPLE_FILES 
 2 |   multipleimages.cpp)
 3 | 
 4 | foreach(EXAMPLE_FILE ${EXAMPLE_FILES})
 5 | 
 6 |   get_filename_component(SOURCE_NAME ${EXAMPLE_FILE} NAME_WE)
 7 |   message(STATUS "Adding Example ${SOURCE_NAME}")
 8 |   add_executable(${SOURCE_NAME}.bin ${EXAMPLE_FILE})
 9 |   target_link_libraries( ${SOURCE_NAME}.bin
10 |       openpose ${GLOG_LIBRARY} ${GFLAGS_LIBRARY} ${Caffe_LIBS} zmq
11 |   )
12 | 
13 | endforeach()
14 | 


--------------------------------------------------------------------------------
/persistent/art/readme.txt:
--------------------------------------------------------------------------------
1 | In this folder we will store the generated art
2 | 


--------------------------------------------------------------------------------
/persistent/deleted/readme.txt:
--------------------------------------------------------------------------------
1 | In this folder we will store the picture which were deleted
2 | 


--------------------------------------------------------------------------------
/persistent/extraframes/readme.txt:
--------------------------------------------------------------------------------
1 | In this folder we will store the extra frame which you can later use for super resolution or mini videos
2 | 


--------------------------------------------------------------------------------
/persistent/photos/readme.txt:
--------------------------------------------------------------------------------
1 | In this folder your picture will be stored
2 | 


--------------------------------------------------------------------------------
/persistent/printedPhotos.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/persistent/printedPhotos.txt


--------------------------------------------------------------------------------
/pose.py:
--------------------------------------------------------------------------------
 1 | import zmq
 2 | import cv2
 3 | import json
 4 | import uuid
 5 | 
 6 | def getContext():
 7 |     return zmq.Context()
 8 | 
 9 | def getSocket(context):
10 |     #  Socket to talk to server
11 |     print("Connecting to hello world server…")
12 |     socket = context.socket(zmq.DEALER)
13 |     socket.setsockopt(zmq.IDENTITY, uuid.uuid4().bytes)
14 |     socket.setsockopt(zmq.LINGER,0)
15 |     socket.connect("tcp://localhost:5555")
16 |     return socket
17 | 
18 | def getPoseFromImage(socket, image ):
19 |     encoded = cv2.imencode(".jpg",image)
20 |     socket.send_multipart([b"",encoded[1].tostring()])
21 |     #socket.send(encoded[1].tostring())
22 |     print("Sending request")
23 |     message = socket.recv()
24 |     #print("Received reply %s :"% message)
25 | 
26 |     data = json.loads(message.decode("utf-8") )
27 |     return data
28 | 
29 | 
30 | 
31 | def ProcessZmq( socket,test ):
32 |     socket.send_multipart([b"A",test.encode("utf-8")])
33 |     print("Sending request")
34 |     reply = socket.recv()
35 |     print("Received reply %s :" % reply)
36 |     #message = socket.recv()
37 |     #print("Received reply %s :"% message)
38 | 
39 | 
40 | 
41 | 
42 | 


--------------------------------------------------------------------------------
/ps3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/ps3.jpg


--------------------------------------------------------------------------------
/remoteart.sh:
--------------------------------------------------------------------------------
 1 | #!/bin/bash
 2 | #./remoteart.sh localfileimage stylename outname
 3 | filename="persistent/photos/$1" ;
 4 | photopath="photos/$1";
 5 | echo $filename ;
 6 | echo $photopath
 7 | #scp "${filename}" beast:~/fast-neural-style/photos ;
 8 | rsync -a -v --ignore-existing "${filename}" beast:~/fast-neural-style/photos ;
 9 | ssh beast \
10 | "cd ~/fast-neural-style; \
11 | bash -i th fast_neural_style.lua \
12 |   -model "stylemodel/$2.t7" \
13 |   -input_image "${photopath}"  \
14 |   -output_image "output/$3" \
15 |   -image_size 1920 \
16 |   -gpu $4" 
17 | 
18 | #scp beast:"~/fast-neural-style/output/$3" "art/$3"
19 | rsync -a -v --ignore-existing beast:"~/fast-neural-style/output/$3" "persistent/art/$3"


--------------------------------------------------------------------------------
/styles/Avatarjakeneytiri.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/Avatarjakeneytiri.jpg


--------------------------------------------------------------------------------
/styles/Meisje_met_de_parel.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/Meisje_met_de_parel.jpg


--------------------------------------------------------------------------------
/styles/Peasant-039-s-Head-Renaissance-Oil-Painting-LP03957.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/Peasant-039-s-Head-Renaissance-Oil-Painting-LP03957.jpg


--------------------------------------------------------------------------------
/styles/albrecht-durer.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/albrecht-durer.jpg


--------------------------------------------------------------------------------
/styles/candy.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/candy.jpg


--------------------------------------------------------------------------------
/styles/composition_vii.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/composition_vii.jpg


--------------------------------------------------------------------------------
/styles/feathers.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/feathers.jpg


--------------------------------------------------------------------------------
/styles/la_muse.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/la_muse.jpg


--------------------------------------------------------------------------------
/styles/lisa_simpson.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/lisa_simpson.jpg


--------------------------------------------------------------------------------
/styles/low-poly-character-dinges.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/low-poly-character-dinges.jpg


--------------------------------------------------------------------------------
/styles/low-poly-intro.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/low-poly-intro.jpg


--------------------------------------------------------------------------------
/styles/marc-chagall-wallpaper.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/marc-chagall-wallpaper.jpg


--------------------------------------------------------------------------------
/styles/mickey.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/mickey.jpg


--------------------------------------------------------------------------------
/styles/mondrian.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/mondrian.jpg


--------------------------------------------------------------------------------
/styles/monet1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/monet1.jpg


--------------------------------------------------------------------------------
/styles/mosaic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/mosaic.jpg


--------------------------------------------------------------------------------
/styles/oneline-mona-lisa-joconde-vinci.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/oneline-mona-lisa-joconde-vinci.jpg


--------------------------------------------------------------------------------
/styles/picasso1.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/picasso1.jpeg


--------------------------------------------------------------------------------
/styles/pieter-bruegel-les-chasseurs-dans-la-neige.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/pieter-bruegel-les-chasseurs-dans-la-neige.jpg


--------------------------------------------------------------------------------
/styles/sketch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/sketch.png


--------------------------------------------------------------------------------
/styles/starry_night.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/starry_night.jpg


--------------------------------------------------------------------------------
/styles/starry_night_crop.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/starry_night_crop.jpg


--------------------------------------------------------------------------------
/styles/the_scream.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/the_scream.jpg


--------------------------------------------------------------------------------
/styles/udnie.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/udnie.jpg


--------------------------------------------------------------------------------
/styles/vermeer-milmaid.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/vermeer-milmaid.jpg


--------------------------------------------------------------------------------
/styles/wave.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/wave.jpg


--------------------------------------------------------------------------------
/styles/wave_crop.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/styles/wave_crop.jpg


--------------------------------------------------------------------------------
/title.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GistNoesis/Linn-Photobooth/8f68a845d10c9dcec5ac0f69dbc9a4cd044f3072/title.png


--------------------------------------------------------------------------------