win32-service 1.0.1 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile DELETED
@@ -1,83 +0,0 @@
1
- require "rubygems"
2
- require 'rake'
3
- require 'rake/clean'
4
- require 'rake/testtask'
5
- require 'rbconfig'
6
- include RbConfig
7
-
8
- CLEAN.include(
9
- '**/*.gem', # Gem files
10
- '**/*.rbc' # Rubinius
11
- )
12
-
13
- namespace :example do
14
- desc "Run the services example program."
15
- task :services do
16
- sh "ruby -Ilib examples/demo_services.rb"
17
- end
18
- end
19
-
20
- namespace 'test' do
21
- desc 'Run all tests for the win32-service library'
22
- Rake::TestTask.new('all') do |t|
23
- t.verbose = true
24
- t.warning = true
25
- end
26
-
27
- desc 'Run the tests for the Win32::Daemon class'
28
- Rake::TestTask.new('daemon') do |t|
29
- task :daemon
30
- t.verbose = true
31
- t.warning = true
32
- t.test_files = FileList['test/test_win32_daemon.rb']
33
- end
34
-
35
- namespace 'service' do
36
- desc 'Run the tests for the Win32::Service class'
37
- Rake::TestTask.new('all') do |t|
38
- t.verbose = true
39
- t.warning = true
40
- t.test_files = FileList['test/test_win32_service*.rb']
41
- end
42
-
43
- Rake::TestTask.new('configure') do |t|
44
- t.verbose = true
45
- t.warning = true
46
- t.test_files = FileList['test/test_win32_service_configure.rb']
47
- end
48
-
49
- Rake::TestTask.new('control') do |t|
50
- t.verbose = true
51
- t.warning = true
52
- t.test_files = FileList['test/test_win32_service.rb']
53
- end
54
-
55
- Rake::TestTask.new('create') do |t|
56
- t.verbose = true
57
- t.warning = true
58
- t.test_files = FileList['test/test_win32_service_create.rb']
59
- end
60
-
61
- Rake::TestTask.new('info') do |t|
62
- t.verbose = true
63
- t.warning = true
64
- t.test_files = FileList['test/test_win32_service_info.rb']
65
- end
66
-
67
- Rake::TestTask.new('status') do |t|
68
- t.verbose = true
69
- t.warning = true
70
- t.test_files = FileList['test/test_win32_service_status.rb']
71
- end
72
- end
73
-
74
- task :all do
75
- Rake.application[:clean].execute
76
- end
77
-
78
- task :daemon do
79
- Rake.application[:clean].execute
80
- end
81
- end
82
-
83
- task :default => 'test:all'
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 1.0.1
@@ -1,48 +0,0 @@
1
- version: '{build}'
2
- branches:
3
- only:
4
- - ffi
5
- skip_tags: true
6
- clone_depth: 10
7
- environment:
8
- matrix:
9
- - ruby_version: 193
10
- ruby_dir: 1.9.1
11
- - ruby_version: 200
12
- ruby_dir: 2.0.0
13
- - ruby_version: 200-x64
14
- ruby_dir: 2.0.0
15
- - ruby_version: 21
16
- ruby_dir: 2.1.0
17
- - ruby_version: 21-x64
18
- ruby_dir: 2.1.0
19
- - ruby_version: 22
20
- ruby_dir: 2.2.0
21
- - ruby_version: 22-x64
22
- ruby_dir: 2.2.0
23
- install:
24
- - ps: >-
25
- $env:path = "C:\Ruby" + $env:ruby_version + "\bin;" + $env:path
26
-
27
- $tpath = "C:\Ruby" + $env:ruby_version + "\lib\ruby\" + $env:ruby_dir + "\test"
28
-
29
- if ((test-path $tpath) -eq $True){ rm -recurse -force $tpath }
30
-
31
- gem update --system > $null
32
-
33
- if ((gem query -i ffi) -eq $False){ gem install ffi --no-document }
34
-
35
- if ((gem query -i win32-security) -eq $False){ gem install win32-security --no-document }
36
-
37
- if ((gem query -i test-unit -v ">= 3.0") -eq $False){ gem install test-unit --no-document }
38
- cache:
39
- - C:\Ruby193\lib\ruby\gems\1.9.1
40
- - C:\Ruby200\lib\ruby\gems\2.0.0
41
- - C:\Ruby200-x64\lib\ruby\gems\2.0.0
42
- - C:\Ruby21\lib\ruby\gems\2.1.0
43
- - C:\Ruby21-x64\lib\ruby\gems\2.1.0
44
- - C:\Ruby22\lib\ruby\gems\2.2.0
45
- - C:\Ruby22-x64\lib\ruby\gems\2.2.0
46
- build: off
47
- test_script:
48
- - cmd: rake
@@ -1,157 +0,0 @@
1
- = Description
2
- The Daemon class is a wrapper class that allows you to run your code as a
3
- Windows service.
4
-
5
- = Synopsis
6
- class Daemon
7
- def service_main
8
- while running?
9
- sleep 3
10
- File.open("c:\\test.log", "a"){ |f| f.puts "service is running" }
11
- end
12
- end
13
- end
14
-
15
- Daemon.mainloop
16
-
17
- = Singleton Methods
18
- Daemon.mainloop
19
- This is the method that actually puts your code into a loop and allows it
20
- to run as a service. The code that is actually run while in the mainloop
21
- is what you defined in the Daemon#service_main method.
22
-
23
- = Instance Methods
24
- Daemon#running?
25
- Returns whether or not the daemon is running. This is just a shortcut
26
- for checking if the state is RUNNING, PAUSED or IDLE.
27
-
28
- This is typically used within your service_main method. See the
29
- demo_daemon.rb file in the 'examples' directory for an example of how it's
30
- used in practice.
31
-
32
- Daemon#service_init
33
- Any code defined defined within this method occurs before service_main is
34
- reached. Any initialization code that takes more than two seconds to
35
- execute should be placed here. Otherwise, your service may timeout when
36
- you try to start it.
37
-
38
- Daemon#service_main(*args)
39
- You are expected to define your own service_main() method. The code
40
- defined in this method is the code that will run while running as a
41
- service.
42
-
43
- Any +args+ passed to Service.start are passed to this method.
44
-
45
- Daemon#state
46
- Returns the current state of the Daemon. For a list of valid states, see
47
- the Constants section below.
48
-
49
- = Signal Event Hooks
50
- These methods are called if defined within your Daemon class, and the
51
- appropriate signal is received by your service.
52
-
53
- Daemon#service_stop
54
- Called if the service receives a SERVICE_CONTROL_STOP signal. This is
55
- what the Service.stop() method sends.
56
-
57
- Daemon#service_pause
58
- Called if the service receives a SERVICE_CONTROL_PAUSE signal. This is
59
- what the Service.pause() method sends.
60
-
61
- Daemon#service_resume
62
- Called if the service receives a SERVICE_CONTROL_CONTINUE signal. This
63
- is what the Service.resume() method sends.
64
-
65
- Daemon#service_interrogate
66
- Called if the service receives a SERVICE_CONTROL_INTERROGATE signal. This
67
- notifies a service that it should report its current status information to
68
- the service control manager.
69
-
70
- Daemon#service_shutdown
71
- Called if the service receives a SERVICE_CONTROL_SHUTDOWN signal.
72
-
73
- Daemon#service_netbindadd
74
- Called if the service receives a SERVICE_CONTROL_NETBINDADD signal. This
75
- notifies a network service that there is a new component for binding.
76
-
77
- Daemon#service_netbinddisable
78
- Called if the service receives a SERVICE_CONTROL_NETBINDDISABLE signal.
79
- This notifies a network service that one of its bindings has been
80
- disabled.
81
-
82
- Daemon#service_netbindenable
83
- Called if the service receives a SERVICE_CONTROL_NETBINDENABLE signal.
84
- This Notifies a network service that a disabled binding has been enabled.
85
-
86
- Daemon#service_netbindremove
87
- Called if the service receives a SERVICE_CONTROL_NETBINDREMOVE signal.
88
- This notifies a network service that that a component for binding has
89
- been removed.
90
-
91
- Daemon#service_paramchange
92
- Called if the service receives a SERVICE_CONTROL_PARAMCHANGE signal.
93
- This notifies a service that its startup parameters have changed.
94
-
95
- = Constants
96
-
97
- === Service state constants
98
- Daemon::CONTINUE_PENDING
99
- The service continue is pending.
100
-
101
- Daemon::PAUSE_PENDING
102
- The service pause is pending.
103
-
104
- Daemon::PAUSED
105
- The service is paused (but not STOPPED).
106
-
107
- Daemon::RUNNING
108
- The service is running.
109
-
110
- Daemon::START_PENDING
111
- The service is starting (but is not yet in a RUNNING state).
112
-
113
- Daemon::STOP_PENDING
114
- The service is stopping (but is not yet in a STOPPED state).
115
-
116
- Daemon::STOPPED
117
- The service is not running.
118
-
119
- Daemon::IDLE
120
- The service is running, in an idle state. This is a custom state that
121
- we added that gets around a thread blocking issue.
122
-
123
- = Notes
124
- You must create a service before you can actually run it. Look in the
125
- examples directory for the files 'demo_daemon.rb' and 'demodaemon_ctl.rb'.
126
- They're small and straightforward examples of how to control, install and
127
- setup your own Daemon.
128
-
129
- = Known Bugs
130
- None known. Please report any bugs you find on the issue tracker at
131
- https//github.com/djberg96/win32-service
132
-
133
- = Future Plans
134
- None at this time.
135
-
136
- Suggestions welcome. Please post them on the github project page at
137
- https//github.com/djberg96/win32-service
138
-
139
- = Acknowledgements
140
- Many thanks go to Patrick Hurley for providing the fix for the thread
141
- blocking issue for the original C code. Thanks also go to Kevin Burge for
142
- his patch that solved service responsiveness issues.
143
-
144
- = Copyright
145
- (C) 2003-2016 Daniel J. Berger, All Rights Reserved
146
-
147
- = License
148
- Artistic 2.0
149
-
150
- = Warranty
151
- This package is provided "as is" and without any express or
152
- implied warranties, including, without limitation, the implied
153
- warranties of merchantability and fitness for a particular purpose.
154
-
155
- = Author(s)
156
- * Daniel J. Berger
157
- * Park Heesob
@@ -1,363 +0,0 @@
1
- = Description
2
- An interface for MS Windows Services.
3
-
4
- = Prerequisites
5
- ffi 1.0 or later
6
-
7
- This library is only supported for the Windows NT family of operating
8
- systems, e.g. 2000, XP, 2003, etc. It is NOT supported (and won't
9
- work) for any version of DOS or Windows 95/98/ME. It is also not
10
- supported on NT 4, as that platform is defunct.
11
-
12
- It should work on Windows XP Home, but is not officially supported for
13
- that platform.
14
-
15
- = Synopsis
16
- require "win32/service"
17
- include Win32
18
-
19
- # Create a new service
20
- Service.create(
21
- :service_name => 'some_service',
22
- :service_type => Service::WIN32_OWN_PROCESS,
23
- :description => 'A custom service I wrote just for fun'
24
- :start_type => Service::AUTO_START,
25
- :error_control => Service::ERROR_NORMAL,
26
- :binary_path_name => 'C:\path\to\some_service.exe',
27
- :load_order_group => 'Network',
28
- :dependencies => ['W32Time','Schedule']
29
- :service_start_name => 'SomeDomain\\User',
30
- :password => 'XXXXXXX',
31
- :display_name => 'This is some service'
32
- )
33
-
34
- # Configure a service that already exists
35
- Service.configure(:display_name => "My Bar Service")
36
-
37
- Service.start("foo")
38
- Service.pause("foo")
39
- Service.resume("foo")
40
- Service.stop("foo")
41
-
42
- Service.delete("foo")
43
-
44
- Service.get_display_name("Schedule") # "Task Scheduler"
45
- Service.get_service_name("ClipBook") # "ClipSrv"
46
-
47
- Service.status('W32Time') => <struct Struct::ServiceStatus ...>
48
-
49
- # Enumerate over all services, inspecting each struct
50
- Service.services{ |s|
51
- puts s.inspect
52
- }
53
-
54
- = Class Methods
55
- Service.new(options={})
56
- Creates a new service. The +options+ parameter is a hash that can
57
- contain any of the following parameters, and their default values:
58
-
59
- KEY DEFAULT
60
- * service_name => nil (mandatory)
61
- * host => nil
62
- * display_name => service_name
63
- * desired_access => Service::ALL_ACCESS
64
- * service_type => Service::WIN32_OWN_PROCESS|Service::INTERACTIVE_PROCESS
65
- * start_type => Service::DEMAND_START
66
- * error_control => Service::ERROR_NORMAL
67
- * binary_path_name => nil
68
- * load_order_group => nil
69
- * dependencies => nil
70
- * service_start_name => nil
71
- * password => nil
72
- * description => nil
73
-
74
- Service.configure(options={})
75
- Configures an existing service. The +options+ parameter is a hash that can
76
- contain any of the following parameters:
77
-
78
- * service_name (mandatory)
79
- * host
80
- * service_type
81
- * start_type
82
- * error_control
83
- * binary_path_name
84
- * load_order_group
85
- * dependencies
86
- * service_start_name
87
- * password (used with service_start_name)
88
- * display_name
89
- * description
90
-
91
- Service.config_info(service, host=nil)
92
- Returns a ServiceConfigInfo struct containing the configuration information
93
- about +service+ on +host+, or the local host if no host is specified.
94
-
95
- Service.create
96
- Alias for Service.new
97
-
98
- Service.delete(service, host=nil)
99
- Deletes the specified +service+ on +host+. If no host is given,
100
- then it deletes it on the local machine.
101
-
102
- Service.exists?(service)
103
- Returns true if the specified service exists, false otherwise.
104
-
105
- Service.pause(service, host=nil)
106
- Pauses the specified +service+ on +host+, or the local machine if
107
- no host is provided.
108
-
109
- Service.resume(service, host=nil)
110
- Resumes the specified +service+ on +host+, or the local machine if
111
- no host is specified.
112
-
113
- Service.services(host=nil, group=nil){ |struct| ... }
114
- Enumerates over a list of service types on host, or the local
115
- machine if no host is specified, yielding a Win32Service struct for each
116
- service.
117
-
118
- If a 'group' is specified, then only those services that belong to
119
- that group are enumerated. If an empty string is provided, then only
120
- services that do not belong to any group are enumerated. If this parameter
121
- is nil, group membership is ignored and all services are enumerated.
122
-
123
- The 'group' option is only available on Windows 2000 or later, and only
124
- if compiled with VC++ 7.0 or later, or the .NET SDK. The Win32Service
125
- struct contains the following members:
126
-
127
- * service_name
128
- * display_name
129
- * service_type
130
- * current_state
131
- * controls_accepted
132
- * win32_exit_code
133
- * service_specific_exit_code
134
- * check_point
135
- * wait_hint
136
- * binary_path_name
137
- * start_type
138
- * error_control
139
- * load_order_group
140
- * tag_id
141
- * start_name
142
- * dependencies
143
- * description
144
- * interactive?
145
- * pid (Win2k or later)
146
- * service_flags (Win2k or later)
147
-
148
- Note that the 'pid' and 'service_flags' members are only available on
149
- Windows 2000 or later, and only if built with VC++ 7.0 or later (or the
150
- .NET SDK).
151
-
152
- Service.start(service, host=nil, *args)
153
- Starts the specified +service+ on +host+, or the local machine if no
154
- host is specified. Any +args+ passed here are passed as start parameters
155
- to the service.
156
-
157
- Service.status(service)
158
- Returns a Win32ServiceStatus struct for the specified service (or
159
- raises a Win32::ServiceError if not found). The Win32ServiceStatus
160
- struct contains the following members.
161
-
162
- * service_type
163
- * current_state
164
- * controls_accepted
165
- * win32_exit_code
166
- * service_specific_exit_code
167
- * check_point
168
- * wait_hint
169
- * interactive?
170
-
171
- Service.stop(service, host=nil)
172
- Stops the specified +service+ on +host+, or the local machine if no
173
- host is specified.
174
-
175
- = Create and configure options
176
- binary_path_name
177
- The binary to be used for the service. The path must be the fully
178
- qualified path name. A path that contains a space must be quoted so that
179
- it is correctly interpreted. The path may also include arguments to the
180
- service entry point (typically the 'main' function).
181
-
182
- dependencies
183
- Any dependencies the service has in order to run. This can be a string
184
- or an array of strings.
185
-
186
- description
187
- A text string describing the service.
188
-
189
- display_name
190
- The display name to be used by user interface programs to identify the
191
- service. The string has a maximum length of 256 characters. Case
192
- sensitivity is preserved.
193
-
194
- The default is to set the display name to the same string as the
195
- service name.
196
-
197
- error_control
198
- The error control for the service. The default is Service::ERROR_NORMAL.
199
-
200
- See the "Error Control Contants" section for available options and their
201
- meanings.
202
-
203
- load_order_group
204
- The load order group, a string that names the load ordering group of
205
- which this service is a member. The default is nil.
206
-
207
- password
208
- Sets the passsword to the account name specified in the Service#start_name
209
- method. By default, this value is set to nil, which is appropriate if
210
- the account has no password or if the service runs in the
211
- 'LocalService', 'NetworkService', or 'LocalSystem' account.
212
-
213
- Note that passwords are ignored for driver services.
214
-
215
- service_name
216
- The service name for the service. This value must be set in order
217
- to create a service. The string has a maximum length of 256 characters.
218
-
219
- service_type
220
- The service type for the service. The default is
221
- Service::WIN32_OWN_PROCESS | Service::INTERACTIVE_PROCESS.
222
-
223
- See the "Service Type Contants" section for available options and their
224
- meanings.
225
-
226
- start_name
227
- Sets the name of the account under which the service should run.
228
- By default the 'LocalSystem' account is used.
229
-
230
- start_type
231
- The start type for the service. The default is Service::DEMAND_START.
232
-
233
- See the "Start Type Contants" section for available options and their
234
- meanings.
235
-
236
- = Constants
237
-
238
- === Standard Constants
239
- VERSION
240
- The current version number of this package, returned as a string.
241
-
242
- === Desired Access Constants
243
- Service::MANAGER_ALL_ACCESS
244
- Includes STANDARD_RIGHTS_REQUIRED, in addition to all access rights
245
- in the table.
246
-
247
- Service::MANAGER_CREATE_SERVICE
248
- Required to call the CreateService function to create a service object
249
- and add it to the database.
250
-
251
- Service::MANAGER_CONNECT
252
- Required to connect to the service control manager.
253
-
254
- Service::MANAGER_ENUMERATE_SERVICE
255
- Required to call the EnumServicesStatus function to list the services
256
- that are in the database.
257
-
258
- Service::MANAGER_LOCK
259
- Required to call the LockServiceDatabase function to acquire a lock on the
260
- database.
261
-
262
- Service::MANAGER_BOOT_CONFIG
263
- Required to call the NotifyBootConfigStatus() (internal) function. Not
264
- defined with all compilers.
265
-
266
- Service::MANAGER_QUERY_LOCK_STATUS
267
- Required to call the QueryServiceLockStatus() (internal) function to
268
- retrieve the lock status information for the database.
269
-
270
- === Service Type Constants
271
- Service::FILE_SYSTEM_DRIVER
272
- File system driver service.
273
-
274
- Service::KERNEL_DRIVER
275
- Driver service.
276
-
277
- Service::WIN32_OWN_PROCESS
278
- Service that runs in its own process.
279
-
280
- Service::WIN32_SHARE_PROCESS
281
- Service that shares a process with one or more other services.
282
-
283
- Service::INTERACTIVE_PROCESS
284
- The service can interact with the desktop. This can only be used if
285
- either SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS is
286
- specified as well, and the service is running in the context of the
287
- LocalSystem account (which is the default for this module, btw).
288
-
289
- === Start Type Constants
290
- Service::AUTO_START
291
- A service started automatically by the service control manager during
292
- system startup.
293
-
294
- Service::BOOT_START
295
- A device driver started by the system loader. This value is valid only
296
- for driver services.
297
-
298
- Service::DEMAND_START
299
- A service started by the service control manager when a process calls
300
- the StartService() function.
301
-
302
- Service::DISABLED
303
- A service that cannot be started. Attempts to start the service result
304
- in an error.
305
-
306
- Service::SYSTEM_START
307
- A device driver started by the IoInitSystem() function. This value is
308
- valid only for driver services.
309
-
310
- === Error Control Constants
311
- Service::ERROR_IGNORE
312
- The startup program logs the error but continues the startup operation.
313
-
314
- Service::ERROR_NORMAL
315
- The startup program logs the error and puts up a message box pop-up but
316
- continues the startup operation.
317
-
318
- Service::ERROR_SEVERE
319
- The startup program logs the error. If the last-known-good configuration
320
- is being started, the startup operation continues. Otherwise, the system
321
- is restarted with the last-known-good configuration.
322
-
323
- Service::ERROR_CRITICAL
324
- The startup program logs the error, if possible. If the last-known-good
325
- configuration is being started the startup operation fails. Otherwise,
326
- the system is restarted with the last-known-good configuration.
327
-
328
- = Notes
329
- See the MSDN API with regards to CreateService(), etc at http://www.msdn.com.
330
-
331
- Some API ideas taken (or not) from both Python's win32serviceutil.py and
332
- Perl's Win32::Service module.
333
-
334
- I don't truly understand how to allow a tag_id in the create_service()
335
- method, so for now it's set to NULL automatically. Suggestions welcome.
336
-
337
- = Known Bugs
338
- There may be a failure in the test suite if the W32Time dependency is
339
- not started.
340
-
341
- If you find any bugs please log them on the github project page at
342
- https://github.com/djberg96/win32-service
343
-
344
- = Acknowledgements
345
- Many thanks go to Patrick Hurley for providing the fix for the thread
346
- blocking issue in the original C code. Thanks also go to Kevin Burge for
347
- his patch that solved service responsiveness issues.
348
-
349
- = Future Plans
350
- Add Tag_ID support.
351
- Add ability to create or modify service failure actions.
352
-
353
- = Copyright
354
- (C) 2003-2016, Daniel J. Berger, All Rights Reserved
355
-
356
- = Warranty
357
- This package is provided "as is" and without any express or
358
- implied warranties, including, without limitation, the implied
359
- warranties of merchantability and fitness for a particular purpose.
360
-
361
- == Authors
362
- * Daniel J. Berger
363
- * Park Heesob