processwanker 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
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