-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathkey_server.rb
More file actions
122 lines (112 loc) · 2.39 KB
/
key_server.rb
File metadata and controls
122 lines (112 loc) · 2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
require 'securerandom'
require 'thread'
module KeyServer
class KeyServerClass
attr_reader :keys
attr_reader :used
def initialize
@keys = Hash.new
@used = Hash.new
@max_size = 1000
@lock = Mutex.new
end
def create_keys(size)
create_count = 0
raise ArgumentError unless size > 0
while @keys.size < @max_size && create_count < size
key = SecureRandom.hex.to_sym
@lock.synchronize {
if @keys[key] == nil
@keys[key] = {created_at: Time.now}
create_count += 1
end
}
end
end
def get_key_info(k)
val = nil
@lock.synchronize {
val = @used[k.to_sym]
}
val
end
def get_free_key
k,v = nil,nil
@lock.synchronize {
k,v = @keys.first
if k != nil
@used[k.to_sym] = {assigned_at: Time.now}
@keys.delete(k.to_sym)
end
}
return k
end
def release_key(k)
val = nil
@lock.synchronize {
val = @used[k.to_sym]
}
if val == nil
return false
else
@lock.synchronize {
@used.delete(k.to_sym)
@keys[k.to_sym] = {created_at: Time.now}
}
end
return true
end
def delete_key(k)
val = nil
@lock.synchronize {
val = @used[k.to_sym]
}
if val == nil
false
else
@lock.synchronize {
@used.delete(k.to_sym)
}
true
end
end
def keepalive(k)
val_k = nil
val_u = nil
@lock.synchronize {
val_k = @keys[k.to_sym]
val_u = @used[k.to_sym]
}
if val_k == nil
if val_u == nil
false
else
@lock.synchronize {
@used[k.to_sym] = {assigned_at: Time.now}
}
end
else
@lock.synchronize {
@keys[k.to_sym] = {created_at: Time.now}
}
end
end
def freeup_keys
@used.each { |x,v|
@lock.synchronize {
if Time.now - @used[x][:assigned_at] > 60
@used.delete(x)
@keys[x] = {created_at: Time.now}
end
}
}
@keys.each { |x,v|
@lock.synchronize {
if Time.now - @keys[x][:created_at] > 300
@keys.delete(x)
end
}
}
end
end
end