abalone 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cf7b62895d93f13d9861d2c5ce5c2ab33a09a06c
4
- data.tar.gz: 367318f5b93c858b63e81938dbcd9306581490b7
3
+ metadata.gz: ea051e4cf4c221ad17b102a504eff7a40452ad1e
4
+ data.tar.gz: dba07d3f25fb3529a7bdf645587b7096fe5e6803
5
5
  SHA512:
6
- metadata.gz: f7341f2dcd7f603c0c30fc28811927f61fe8383a5789a637cfe3635ebdec06dd76819b4f4153e77d780a8ed224410703ef026fd0627f9e74097ec4bd5defc6fa
7
- data.tar.gz: 94985e52ad596aba1788dc28e4f802d0a9b183f5ed52c010c730f12eef6147ea30bbe58058d724ed3279b8f5287d470898135c133e49f4d852f74a3ed5fdec48
6
+ metadata.gz: 6342b905e0315d42a301fc0367d67c6a2a4481821669befb4f3044adf20def7cb804093f6aef0a1135f4d602137fb73e9b1f674cd48c49a67ea29f090cab24f8
7
+ data.tar.gz: 13f2c302b13da357add6286a605f2cbb56ba2853ea82afc7fbafea698c987059bde51756410353e720ef766e47411d73164c91b50870e45da5f8ae6baded641e
data/README.md CHANGED
@@ -42,6 +42,11 @@ can set several options:
42
42
  * The path of a file to log to.
43
43
  * Default value: Log only to `STDERR`. If you pass `-l` at the command line
44
44
  with no filename, it will log to `/var/log/abalone`.
45
+ * `:timeout`
46
+ * Maximum number of seconds a session can last. The shell will be killed at the
47
+ end of that time. For example, set it to 300 for shells that last for up to
48
+ five minutes.
49
+ * Default value: unset.
45
50
  * One of [`:command`](#configuring-a-custom-command) or [`:ssh`](#configuring-ssh), exclusive.
46
51
  * The login method to use. Abalone can use `login`, SSH, or a custom command
47
52
  to start a shell. See configuration instructions below.
@@ -14,6 +14,13 @@ class Abalone < Sinatra::Base
14
14
 
15
15
  before {
16
16
  env["rack.logger"] = settings.logger if settings.logger
17
+
18
+ trap('INT') do
19
+ # this forces all the spawned children to terminate as well
20
+ puts "Caught SIGINT. Terminating active sessions (#{Process.pid}) now."
21
+ exit!
22
+ end
23
+
17
24
  }
18
25
 
19
26
  get '/?:user?' do
@@ -59,7 +66,7 @@ class Abalone < Sinatra::Base
59
66
  data = (carry + output[0..last_low]).pack('C*').force_encoding('UTF-8') # repack into a string up until the last low bit
60
67
  carry = output[trailing..-1] # save the any remaining high bits and partial chars for next go-round
61
68
 
62
- ws.send(data)
69
+ ws.send({'data' => data}.to_json)
63
70
 
64
71
  rescue IO::WaitReadable
65
72
  IO.select([reader])
@@ -69,12 +76,32 @@ class Abalone < Sinatra::Base
69
76
  warn('Terminal has exited!')
70
77
  ws.close_connection
71
78
 
79
+ @timer.terminate
80
+ @timer.join rescue nil
72
81
  Thread.exit
73
82
  end
83
+
74
84
  sleep(0.05)
75
85
  end
76
86
  end
77
87
 
88
+ if settings.respond_to? :timeout
89
+ @timer = Thread.new do
90
+ expiration = Time.now + settings.timeout
91
+ loop do
92
+ remaining = expiration - Time.now
93
+ stop_term if remaining < 0
94
+
95
+ time = {
96
+ 'event' => 'time',
97
+ 'data' => Time.at(remaining).utc.strftime("%H:%M:%S"),
98
+ }
99
+ ws.send(time.to_json)
100
+ sleep 1
101
+ end
102
+ end
103
+ end
104
+
78
105
  end
79
106
 
80
107
  ws.onclose do
@@ -120,7 +147,7 @@ class Abalone < Sinatra::Base
120
147
 
121
148
  helpers do
122
149
  def stop_term()
123
- Process.kill('TERM', @pid) rescue nil
150
+ Process.kill('HUP', @pid) rescue nil
124
151
  @term.join rescue nil
125
152
  end
126
153
 
@@ -12,6 +12,14 @@
12
12
  width: 100%;
13
13
  margin: 0px;
14
14
  }
15
+ #timer {
16
+ position: absolute;
17
+ z-index: 1000;
18
+ top: 15px;
19
+ right: 15px;
20
+ opacity: 0.5;
21
+ display: none;
22
+ }
15
23
  #overlay {
16
24
  position: absolute;
17
25
  z-index: 1000;
@@ -37,6 +45,7 @@
37
45
  </head>
38
46
 
39
47
  <body onload="connect();">
48
+ <div id="timer"></div>
40
49
  <div id="overlay"><input type="button" onclick="javascript:connect();" value="reconnect" /></div>
41
50
  <div id="terminal"></div>
42
51
  </body>
@@ -60,12 +60,24 @@ function disconnected() {
60
60
  document.getElementById("overlay").style.display = "block";
61
61
  }
62
62
 
63
- function messageHandler(data) {
64
- if (!term) {
65
- buf += data;
66
- return;
63
+ function messageHandler(message) {
64
+ var message = JSON.parse(message);
65
+ var event = message['event'];
66
+ var data = message['data'];
67
+
68
+ switch(event) {
69
+ case 'time':
70
+ document.getElementById("timer").style.display = "block";
71
+ document.getElementById("timer").innerHTML = data;
72
+ break;
73
+
74
+ default:
75
+ if (!term) {
76
+ buf += data;
77
+ return;
78
+ }
79
+ term.io.writeUTF16(data);
67
80
  }
68
- term.io.writeUTF16(data);
69
81
  }
70
82
 
71
83
  /* borrowed from https://github.com/krishnasrinivas/wetty */
@@ -12,6 +12,17 @@
12
12
  width: 100%;
13
13
  margin: 0px;
14
14
  }
15
+ #timer {
16
+ position: absolute;
17
+ z-index: 1000;
18
+ top: 15px;
19
+ right: 15px;
20
+ opacity: 0.25;
21
+ font-size: 3em;
22
+ font-weight: bolder;
23
+ color: red;
24
+ display: none;
25
+ }
15
26
  #overlay {
16
27
  position: absolute;
17
28
  z-index: 1000;
@@ -37,6 +48,7 @@
37
48
  </head>
38
49
 
39
50
  <body <% if @autoconnect %>onload="connect(<%= @requestUsername %>);"<% end %>>
51
+ <div id="timer"></div>
40
52
  <div id="overlay"><input type="button" onclick="javascript:connect(<%= @requestUsername %>);" value="Start Session" /></div>
41
53
  <div id="terminal"></div>
42
54
  </body>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abalone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Ford
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-18 00:00:00.000000000 Z
11
+ date: 2016-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra