processwanker 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Manifest ADDED
@@ -0,0 +1,34 @@
1
+ README
2
+ Rakefile
3
+ bin/pw
4
+ lib/config/config.rb
5
+ lib/config/config_auth.rb
6
+ lib/config/config_client.rb
7
+ lib/config/config_client_cluster.rb
8
+ lib/config/config_client_clusters.rb
9
+ lib/config/config_client_host.rb
10
+ lib/config/config_daemon.rb
11
+ lib/config/config_daemon_service.rb
12
+ lib/config/config_daemon_service_dependency.rb
13
+ lib/config/config_daemon_services.rb
14
+ lib/config/config_hook.rb
15
+ lib/config/config_node.rb
16
+ lib/config/config_smtp.rb
17
+ lib/events.rb
18
+ lib/log.rb
19
+ lib/net/net_api.rb
20
+ lib/net/net_client.rb
21
+ lib/net/net_connection.rb
22
+ lib/net/net_server.rb
23
+ lib/net/net_server_client.rb
24
+ lib/net/net_util.rb
25
+ lib/process_util.rb
26
+ lib/pw_app.rb
27
+ lib/service.rb
28
+ lib/service_classes/dummy_service.rb
29
+ lib/service_classes/pid_service.rb
30
+ lib/service_classes/process_service.rb
31
+ lib/service_classes/upstart_service.rb
32
+ lib/service_mgr.rb
33
+ lib/util.rb
34
+ Manifest
data/README ADDED
@@ -0,0 +1,11 @@
1
+ ProcessWanker is a work-in-progress.
2
+
3
+ Enough features are implemented for it to be useful.
4
+
5
+ Docs (not yet complete) are available at:
6
+
7
+ http://codepuppies.com/~ben/pw
8
+
9
+
10
+ (Important note: under more recent versions of Ubuntu running "upstart", you may need to use the upstart_service class)
11
+
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('processwanker', '0.0.7') do |p|
6
+ p.description = "Process monitoring and remote control system"
7
+ p.url = "http://codepuppies.com/~ben/pw"
8
+ p.author = "Ben Stragnell"
9
+ p.email = "pw@codepuppies.com"
10
+ p.ignore_pattern = ["tmp/*", "script/*"]
11
+ p.runtime_dependencies = [ "echoe" ]
12
+ p.development_dependencies = []
13
+ end
data/bin/pw ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ gem 'processwanker'
5
+ require 'pw_app'
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env ruby
2
+ ############################################################################
3
+ #
4
+ # config.rb
5
+ #
6
+ # base configuration loader
7
+ #
8
+ ############################################################################
9
+
10
+ require 'config_node'
11
+ require 'config_client'
12
+ require 'config_daemon'
13
+ require 'config_auth'
14
+
15
+ module ProcessWanker
16
+
17
+ ############################################################################
18
+ #
19
+ # Configuration - the root configuration object
20
+ #
21
+ # client - the client configuration section
22
+ # daemon - the daemon configuration section
23
+ #
24
+ ############################################################################
25
+
26
+ class Configuration < ConfigNode
27
+
28
+ attr_accessor :client
29
+ attr_accessor :daemon
30
+ attr_accessor :auth
31
+
32
+ ############################################################################
33
+ #
34
+ #
35
+ #
36
+ ############################################################################
37
+
38
+ def initialize()
39
+ @client=nil
40
+ @daemon=nil
41
+ end
42
+
43
+ def add_defaults()
44
+
45
+ # ensure there's a default auth block
46
+ if(!@auth)
47
+ @auth = ConfigAuth.new()
48
+ @auth.container=self
49
+ end
50
+
51
+ # ensure there's a default client config
52
+ if(!@client)
53
+ @client = ConfigClient.new
54
+ @client.container=self
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ ############################################################################
62
+ #
63
+ #
64
+ #
65
+ ############################################################################
66
+
67
+ class ConfigurationBuilder < Builder
68
+
69
+ def build(container,args,block)
70
+ super(container,args,block)
71
+ @config.add_defaults()
72
+ @config
73
+ end
74
+
75
+ def client(&block)
76
+ @config.client=Deferred.new(@config,[],block,ConfigClientBuilder)
77
+ end
78
+
79
+ def daemon(&block)
80
+ @config.daemon=Deferred.new(@config,[],block,ConfigDaemonBuilder)
81
+ end
82
+
83
+ def auth(&block)
84
+ @config.auth=Deferred.new(@config,[],block,ConfigAuthBuilder)
85
+ end
86
+
87
+ end
88
+
89
+ ############################################################################
90
+ #
91
+ #
92
+ #
93
+ ############################################################################
94
+
95
+
96
+ end
@@ -0,0 +1,208 @@
1
+ ############################################################################
2
+ #
3
+ # config_auth.rb
4
+ #
5
+ # auth block parser:
6
+ #
7
+ # auth {
8
+ # ca_cert "ca_cert_path"
9
+ # my_cert "my_cert_path"
10
+ # my_key "my_key_path"
11
+ # accept_peers "blah","hello"
12
+ # reject_peers "fred"
13
+ # accept_ip 10.1.99.0/24
14
+ # reject_ip 10.1.99.0/24
15
+ # }
16
+ #
17
+ ############################################################################
18
+
19
+ require 'ipaddr'
20
+ require 'openssl'
21
+ require 'config'
22
+
23
+ module ProcessWanker
24
+
25
+ ############################################################################
26
+ #
27
+ #
28
+ #
29
+ ############################################################################
30
+
31
+ class IPFilter
32
+
33
+ attr_accessor :ips
34
+
35
+ def initialize()
36
+ @ips=[]
37
+ end
38
+
39
+ def contains(ip)
40
+ ips.each do |x|
41
+ return(true) if(x.include?(ip))
42
+ end
43
+ false
44
+ end
45
+
46
+ end
47
+
48
+ ############################################################################
49
+ #
50
+ #
51
+ #
52
+ ############################################################################
53
+
54
+ class ConfigAuth < ConfigNode
55
+
56
+ attr_accessor :ca_cert
57
+ attr_accessor :my_cert
58
+ attr_accessor :my_key
59
+ attr_accessor :accept_peers
60
+ attr_accessor :reject_peers
61
+ attr_accessor :is_default
62
+ attr_accessor :accept_ip
63
+ attr_accessor :reject_ip
64
+
65
+ def initialize()
66
+ init_default()
67
+ end
68
+
69
+ def init_default()
70
+ @is_default=true
71
+ @ca_cert=OpenSSL::X509::Certificate.new(DEFAULT_CA_CERT)
72
+ @my_cert=OpenSSL::X509::Certificate.new(DEFAULT_MY_CERT)
73
+ @my_key=OpenSSL::PKey::RSA.new(DEFAULT_MY_KEY)
74
+ end
75
+
76
+ def allow_ip(ip)
77
+ return(false) if(accept_ip && !accept_ip.contains(ip))
78
+ return(false) if(reject_ip && reject_ip.contains(ip))
79
+ true
80
+ end
81
+
82
+ end
83
+
84
+ ############################################################################
85
+ #
86
+ #
87
+ #
88
+ ############################################################################
89
+
90
+ class ConfigAuthBuilder < Builder
91
+
92
+ def ca_cert(v)
93
+ @config.ca_cert=OpenSSL::X509::Certificate.new(File.read(v))
94
+ @config.is_default=false
95
+ end
96
+
97
+ def my_cert(v)
98
+ @config.my_cert=OpenSSL::X509::Certificate.new(File.read(v))
99
+ end
100
+
101
+ def my_key(v)
102
+ @config.my_key=OpenSSL::PKey::RSA.new(File.read(v))
103
+ end
104
+
105
+ def accept_peers(*v)
106
+ @config.accept_peers ||= {}
107
+ v.each do |vv|
108
+ @config.accept_peers[vv]=true
109
+ end
110
+ end
111
+
112
+ def reject_peers(*v)
113
+ @config.reject_peers ||= {}
114
+ v.each do |vv|
115
+ @config.reject_peers[vv]=true
116
+ end
117
+ end
118
+
119
+ def accept_ip(v)
120
+ @config.accept_ip ||= IPFilter.new
121
+ @config.accept_ip.ips << IPAddr.new(v)
122
+ end
123
+
124
+ def reject_ip(v)
125
+ @config.reject_ip ||= IPFilter.new
126
+ @config.reject_ip.ips << IPAddr.new(v)
127
+ end
128
+
129
+ end
130
+
131
+ ############################################################################
132
+ #
133
+ #
134
+ #
135
+ ############################################################################
136
+
137
+ DEFAULT_CA_CERT=<<END_CA_CERT
138
+ -----BEGIN CERTIFICATE-----
139
+ MIICkzCCAXugAwIBAgIBADANBgkqhkiG9w0BAQUFADANMQswCQYDVQQDDAJjYTAe
140
+ Fw03MDAxMDEwMDAwMDBaFw0zODAxMTkwMzE0MDdaMA0xCzAJBgNVBAMMAmNhMIIB
141
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzSNGNA/eiCAWgHvpv73VnR31
142
+ 4UIk2KYayXMJqg7QFVBJF6VHHrlX2Ec5GtdQmCewbcxsdgGxRsg2YV+l9Yl0SCkK
143
+ swnly+HLwW8zuyeUuTRxVbOH6yxAyvqdk5e9Ic5X3Bmc+YCIcqZGo3uAYBs4mpaw
144
+ a+loKMLwS+HO7ZoPyGBOYOen1MjEbF40l07KuwiLtesDF5yQ40qWIjbwtJPznPs9
145
+ AjRIOQBN9NbLzJQAJRCxXG8ZhAsjyxtdW4/0G8uLHHAjVLVuLxESwIVm2ZaCA6pG
146
+ v6hzqjtUYoB21C0jJeZm60RWeh8h8AYBJMWEZTHqgcRfxanPKSe7srtw1BmzSwID
147
+ AQABMA0GCSqGSIb3DQEBBQUAA4IBAQBV7nbpFCQpgBP9angRhzCRpOkLeMkXOy7F
148
+ jlBPWJHdEheNuOyfV6Mfnfc0Tc/b7l6AafzYPUk7cl5EHPYVnRBWiVqI8xPbC5Hy
149
+ lfb6dojPfp6WTzSzcqnNlhXwSoelBXs3Qj46Xkaix8bWyL0rsbjmFI2k+hhPrZdj
150
+ DKhPjAFJIK5luzWrtpUToq4FdoMBuIErD9nwp4/+aWRRRQvp3H43hY4Nu4Pguiv4
151
+ 4Otn1gz5A+7xkItNzj2I2YeFx05yuUpISLHPFaJ7NOAGECxymcP3IEqkP6+ggMWb
152
+ V58KB/erhTtQ0asXfeW9eyGNOeoLFMROP0iecbSzmbaCkSVK7Gyf
153
+ -----END CERTIFICATE-----
154
+ END_CA_CERT
155
+
156
+ DEFAULT_MY_CERT=<<END_MY_CERT
157
+ -----BEGIN CERTIFICATE-----
158
+ MIICmDCCAYCgAwIBAgIBADANBgkqhkiG9w0BAQUFADANMQswCQYDVQQDDAJjYTAe
159
+ Fw03MDAxMDEwMDAwMDBaFw0zODAxMTkwMzE0MDdaMBIxEDAOBgNVBAMMB2RlZmF1
160
+ bHQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+9jTYOZ1vXFxzHSfX
161
+ NeeC6jAuYqGn9ZYUzBz759O9lRVIK4qXejo+E2QHTN5fhxd9YKMFBiGo6j+ONTg/
162
+ kJT9h0vUfwODlR8LF/qQAkRv25frMK5NYef1QSOCFiLZuPM6wwb8qL27v+XU6OsY
163
+ xk4c2CqNHDTjgxdMDaAshJTWj5cQYwlU3sEXZ5NDOQzNtkdXhbcOLGJ+RFqiSzb7
164
+ KWzVV3jXMNb8acndnvNyLUNRpTEANJsWCMefzGoMJMw55d5DU6/EQuAyMacFBM30
165
+ kCKzpcOM39DoISgjNiVcfuHG0dXzDwMQu0LjvOJZkKyL5qYtsU0twzFPcLQvn3+p
166
+ uNz5AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAGIj7CZ/St5F40jNmdIHG4xRnxP/
167
+ 4Pz6BDSNHokRqQ97rQ/vl6f+jKf9IGOeBYpo2bxBz+oce290vLPuTkosj5Bgwa2e
168
+ jM4y89qdMoDJn8mcqU/LV4sspwddY2kuKvn4DTzmbm+XvezrkX6tQXdeKeIl3yJP
169
+ CZOnc78OdVArHjrK4IbFdW3jSsLIjtfGX3VCLVmWpGR5vVcKy5steFRtAUwwDpPj
170
+ +XdYcDJJV28ziN6918/baiP9kIR0nws9o0R+u90h0YWS46k/kHOrLwGoSy/S9xjD
171
+ weHGtHeoRPLKH8n3tcrXJ6ZBoow12au4QM0YIkhGgl6+t21Td49WRaMfEkY=
172
+ -----END CERTIFICATE-----
173
+ END_MY_CERT
174
+
175
+ DEFAULT_MY_KEY=<<END_MY_KEY
176
+ -----BEGIN RSA PRIVATE KEY-----
177
+ MIIEpAIBAAKCAQEAvvY02Dmdb1xccx0n1zXnguowLmKhp/WWFMwc++fTvZUVSCuK
178
+ l3o6PhNkB0zeX4cXfWCjBQYhqOo/jjU4P5CU/YdL1H8Dg5UfCxf6kAJEb9uX6zCu
179
+ TWHn9UEjghYi2bjzOsMG/Ki9u7/l1OjrGMZOHNgqjRw044MXTA2gLISU1o+XEGMJ
180
+ VN7BF2eTQzkMzbZHV4W3DixifkRaoks2+yls1Vd41zDW/GnJ3Z7zci1DUaUxADSb
181
+ FgjHn8xqDCTMOeXeQ1OvxELgMjGnBQTN9JAis6XDjN/Q6CEoIzYlXH7hxtHV8w8D
182
+ ELtC47ziWZCsi+amLbFNLcMxT3C0L59/qbjc+QIDAQABAoIBABfJy+Nzqe0JcGrW
183
+ ovPoPyLL0Zy1pLWrnjqRArtOsc3YGIKZCfa8vyykdb2DEeCMj5yKwUQK8357T9eD
184
+ QbKJbEX46LVb7TAjD27uWcQ+xA+7Jz2hHtV88MxYhPfbkhPVOleDnAc1bg1JZnQT
185
+ X9YCPhDRzNsvPFdrKSfMOrvQ+EmR+oINwzE6jWNsvr3kZsuT3LXzjuiAU1aLP3fX
186
+ dIJexw/xKdVaXCJYbJzgW6XmTiNSWVedgnfanORLcIh8o4+EemE1QSXMl9gxrUFW
187
+ huEjyYXLyw/skVfldHngafz+xQiG0KMkAOT8+qtSWA4IfqcAQgwp6Fc8PaVI3W6z
188
+ xB6380ECgYEA4fLn4Iexn9WBnC4qnqeUHd4aJQ5GgBAW9TvfYO7YeYHm1BodEttL
189
+ 1wnbtA8yW4MxeTYF/WeJiv/2+AzSbE1cXpDWWZ4WY8WVAyQdkmX/iL/ovdmP4gJq
190
+ fkys/zjPpTesjYvBGPLN3hbsT03mFUf+21PVT3NbEfb4yIxbk340r10CgYEA2FwP
191
+ wNpKpiZczbvHKkrtGLxD6GsJwxvQpCSa3GNCu2zFAFkavlZoHA1t8IvvHTAlTd3I
192
+ 9A8rLRr+j1mX/HQ/8Cdmj1/Q/zjDGfAWQve3Rn4Lg4OpMt15EPYdqSsPoKxgEoiF
193
+ 2siTuRQm448ZMo/S8DcuAXSGUrk4fmcluyzEtk0CgYEA2fUKbtIWqxs3GuSB4me+
194
+ /ozIZaR+p3xd2RR3Z7cfBR8k/sdt8kmuv/HXiLr8FcDZUZamcoqU6Iv/vcoIlcaO
195
+ av6Gdw6DhJ0NIGmPSTCxLkYJilG7dQZlmg3293/i9fpdrnD4xUs7AZjVPa7kWvUH
196
+ SKV26Fxbplm6JSMYF5Av3FUCgYAeQOFDCkMd8IdRjUxQMaHtr4WfXjhDPAR0r1mo
197
+ L4kJRDBX2B3RN6vfIFGbLTYGUtEkjjqnRee3quqliNWjy22VWy0QJ0nGJl3Bpry2
198
+ KIVMKhvaC/MA1c8z+/YxzX+l6/STItv0t89QNe0qLLxNQacxR8X7FhwiPRwVML8p
199
+ 6RyokQKBgQCg9M1u9w5XR+JQYri6hVt4vTaN3MvEn6IvgqoRmSF3nquhoNBr6D6g
200
+ m0xYiL0CYzrRPPcjixdQtRNMjmgHvIunjYdm8HcDUpSK26UAi3wBzVWpQnDbioX6
201
+ ho684wh+7fuOavKTpaBoddUjD6+4Msu6i+px8jhjXA7+fTazZ19mYQ==
202
+ -----END RSA PRIVATE KEY-----
203
+ END_MY_KEY
204
+
205
+
206
+
207
+ end
208
+
@@ -0,0 +1,75 @@
1
+ ############################################################################
2
+ #
3
+ # config_client.rb
4
+ #
5
+ # client {
6
+ #
7
+ # auth {
8
+ # ...
9
+ # }
10
+ #
11
+ # clusters {
12
+ # cluster("name") {
13
+ # ...
14
+ # }
15
+ # }
16
+ # }
17
+ #
18
+ #
19
+ #
20
+ ############################################################################
21
+
22
+ require 'config_auth'
23
+ require 'config_client_clusters'
24
+ require 'config'
25
+
26
+ module ProcessWanker
27
+
28
+ ############################################################################
29
+ #
30
+ #
31
+ #
32
+ ############################################################################
33
+
34
+ class ConfigClient < ConfigNode
35
+
36
+ attr_accessor :auth
37
+ attr_accessor :clusters
38
+
39
+ def get_cluster(name)
40
+
41
+ @clusters ||= ConfigClientClusters.new
42
+
43
+ if(name == "default" && !@clusters.clusters[name])
44
+ @clusters.clusters[name]=Deferred.new(self,[name],proc {
45
+ host("localhost") {
46
+ }
47
+ },ConfigClientClusterBuilder)
48
+ end
49
+
50
+ @clusters.clusters[name]
51
+
52
+ end
53
+
54
+ end
55
+
56
+ ############################################################################
57
+ #
58
+ #
59
+ #
60
+ ############################################################################
61
+
62
+ class ConfigClientBuilder < Builder
63
+
64
+ def auth(&block)
65
+ @config.auth=Deferred.new(@config,[],block,ConfigAuthBuilder)
66
+ end
67
+
68
+ def clusters(&block)
69
+ @config.clusters=Deferred.new(@config,[],block,ConfigClientClustersBuilder)
70
+ end
71
+
72
+ end
73
+
74
+
75
+ end
@@ -0,0 +1,66 @@
1
+ ############################################################################
2
+ #
3
+ # config_client_cluster.rb
4
+ #
5
+ # cluster {
6
+ # auth {
7
+ # ...
8
+ # }
9
+ # host("name") {
10
+ # ...
11
+ # }
12
+ # }
13
+ #
14
+ ############################################################################
15
+
16
+ require 'config_client_host'
17
+ require 'config_auth'
18
+ require 'config'
19
+
20
+ module ProcessWanker
21
+
22
+ ############################################################################
23
+ #
24
+ #
25
+ #
26
+ ############################################################################
27
+
28
+ class ConfigClientCluster < ConfigNode
29
+
30
+ attr_accessor :name
31
+ attr_accessor :auth
32
+ attr_accessor :hosts
33
+
34
+ def initialize(name)
35
+ @name=name
36
+ @hosts={}
37
+ end
38
+
39
+ end
40
+
41
+ ############################################################################
42
+ #
43
+ #
44
+ #
45
+ ############################################################################
46
+
47
+ class ConfigClientClusterBuilder < Builder
48
+
49
+ def auth(&block)
50
+ @config.auth=Deferred.new(@config,[],block,ConfigAuthBuilder)
51
+ end
52
+
53
+ def host(name,&block)
54
+ @config.hosts[name]=Deferred.new(@config,[name],block,ConfigClientHostBuilder)
55
+ end
56
+
57
+ end
58
+
59
+ ############################################################################
60
+ #
61
+ #
62
+ #
63
+ ############################################################################
64
+
65
+
66
+ end
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+ ############################################################################
3
+ #
4
+ # config_client_clusters.rb
5
+ #
6
+ # clusters {
7
+ # auth {
8
+ # ...
9
+ # }
10
+ # cluster("name") {
11
+ # ...
12
+ # }
13
+ # }
14
+ #
15
+ #
16
+ #
17
+ ############################################################################
18
+
19
+ require 'config_auth'
20
+ require 'config_client_cluster'
21
+ require 'config'
22
+
23
+ module ProcessWanker
24
+
25
+ ############################################################################
26
+ #
27
+ #
28
+ #
29
+ ############################################################################
30
+
31
+ class ConfigClientClusters < ConfigNode
32
+
33
+ attr_accessor :clusters
34
+ attr_accessor :auth
35
+
36
+ def initialize()
37
+ @clusters={}
38
+ end
39
+
40
+ end
41
+
42
+ ############################################################################
43
+ #
44
+ #
45
+ #
46
+ ############################################################################
47
+
48
+ class ConfigClientClustersBuilder < Builder
49
+
50
+ def cluster(name,&block)
51
+ cluster=Deferred.new(@config,[name],block,ConfigClientClusterBuilder)
52
+ @config.clusters[name]=cluster
53
+ end
54
+
55
+ def auth(&block)
56
+ @config.auth=Deferred.new(@config,[],block,ConfigAuthBuilder)
57
+ end
58
+
59
+ end
60
+
61
+
62
+ end