dyn-ruby-win32daemon 0.1.0 → 0.1.1
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.
- checksums.yaml +4 -4
- data/README.md +1 -39
- data/bin/dyn-daemon +82 -48
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c349c753ae751c89d130b86d40b32dbacce2f8f
|
4
|
+
data.tar.gz: 750b26cfa474661a03c6a20a0fb72edd6b6cb128
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72232eb1742a29b560597adf8e728be138e25138e08701af779777756a84548ba606aa3f5723ac0f1472c7ac035edcdd4ff7496bcfabe1edfece9a8aa3e132b7
|
7
|
+
data.tar.gz: 4742ecdfdda8667c55c41ce768dfbba1f5810bff0f03cb0cd1cbcd95b356bf9be90c62877df67975f60125c6743863db41030cce6d0bb1fa01501fe5a7cae7da
|
data/README.md
CHANGED
@@ -1,39 +1 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
First of all, inspiration DynTask comes from the filewatcher project. The goal is a bit different since the goal is to provide a very basic system to manage chainable tasks.
|
4
|
-
|
5
|
-
|
6
|
-
## Kinds of task
|
7
|
-
|
8
|
-
when depending on source (and/or output) file or content to be copied in some particular path, one may be interested in:
|
9
|
-
|
10
|
-
* local task: everything is executed inside the same computer. This allows to write task in any path different from the source file path.
|
11
|
-
* remote task: when using docker or dropbox-like tools, a synchronized task can be executed in a different computer or docker container. As a constraint, the source (and/or output) file path and the task file path have to be defined relatively to a common root independently in any synchronized computers supposed to execute the tasks. Obviously, the task file and source file can be in the same directory which is the simplest case.
|
12
|
-
|
13
|
-
The goal of such approach is to watch only one folder containing task file with predefined extension and not subdirectories which makes the watching less reactive.
|
14
|
-
|
15
|
-
## Main actions to perform
|
16
|
-
|
17
|
-
* dyn
|
18
|
-
* dyn-cli
|
19
|
-
* pdflatex
|
20
|
-
* pandoc
|
21
|
-
|
22
|
-
|
23
|
-
## Examples
|
24
|
-
|
25
|
-
```{bash}
|
26
|
-
## To specify a folder to watch with specific tasks
|
27
|
-
dyntask-init default <dyndoc-project-folder>:dyn,pandoc,dyn_cli
|
28
|
-
|
29
|
-
## Optional for pandoc task
|
30
|
-
dyntask-init pandoc-extra dir --force /dyndoc-library/pandoc-extra
|
31
|
-
##
|
32
|
-
dyntask-init pandoc-extra wget
|
33
|
-
```
|
34
|
-
|
35
|
-
## How this works
|
36
|
-
|
37
|
-
* add_task: to push task
|
38
|
-
* save_tasks: to save all the pushed tasks
|
39
|
-
* read_tasks: read first task and pop to the stack of tasks
|
1
|
+
# Dyn Win32daemon
|
data/bin/dyn-daemon
CHANGED
@@ -1,65 +1,99 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require "fileutils"
|
3
|
-
SRV=ARGV[0].strip
|
4
|
-
exit! unless ["srv","dyntask"].include? SRV
|
5
|
-
CMD={ "srv" => "dyn-srv", "dyntask" => "dyntask-server"}
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
SRV=(ARGV[0] || "help").strip
|
4
|
+
exit! unless ["srv","dyntask","help","status","list"].include? SRV
|
5
|
+
CMD={ "srv" => "dyn-srv", "dyntask" => "dyntask-server"}[SRV]
|
6
|
+
if CMD
|
7
|
+
FileUtils.mkdir_p File.join(ENV["USERPROFILE"],"dyndoc","log")
|
8
|
+
DYN_DAEMON_LOG_FILE = File.join(ENV["USERPROFILE"],"dyndoc","log","")+CMD+".log"
|
9
|
+
DYN_DAEMON_DIR = File.dirname `where ruby`.strip
|
10
|
+
end
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
12
|
+
unless RUBY_PLATFORM =~ /mswin|mingw/i
|
13
|
+
puts "Only available for Windows!"
|
14
|
+
exit!
|
15
|
+
end
|
13
16
|
|
14
|
-
|
17
|
+
case SRV
|
18
|
+
when "help"
|
19
|
+
puts <<-DOC
|
20
|
+
Service helpers to launch dyn-srv or dyntask daemon.
|
21
|
+
Usage:
|
22
|
+
dyn-daemon srv|dyntask new|load => create when not existing the service
|
23
|
+
dyn-daemon srv|dyntask delete|unload => unload existing service
|
24
|
+
dyn-daemon srv|dyntask start/stop => start/stop the service
|
25
|
+
dyn-daemon srv|dyntask log => to watch log files
|
15
26
|
|
16
|
-
|
17
|
-
|
27
|
+
dyn-daemon status => status of dyntask service
|
28
|
+
dyn-daemon list => echo
|
29
|
+
DOC
|
30
|
+
when "status"
|
31
|
+
require 'sys/proctable'
|
32
|
+
msg={"dyn-srv" => "","dyntask-server" => ""}
|
33
|
+
msg.keys.each do |srv|
|
34
|
+
Sys::ProcTable.ps{ |s| msg[srv] << "["+s.pid.to_s+"] "+s.cmdline if s.pid != Process.pid and s.cmdline =~ /#{srv}/ }
|
35
|
+
end
|
36
|
+
puts (msg["dyn-srv"].empty? ? "Stopped" : "Running") + "|" + (msg["dyntask-server"].empty? ? "Stopped" : "Running")
|
37
|
+
else
|
18
38
|
|
19
|
-
|
20
|
-
|
21
|
-
|
39
|
+
require 'win32/daemon'
|
40
|
+
require 'win32/process'
|
41
|
+
include Win32
|
22
42
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
43
|
+
class DynDaemon < Daemon
|
44
|
+
|
45
|
+
def service_init
|
46
|
+
File.open(DYN_DAEMON_LOG_FILE, 'a'){ |f| f.puts "Initializing service #{Time.now}" }
|
47
|
+
|
48
|
+
@server_pid = Process.spawn CMD, :chdir => DYN_DAEMON_DIR, :err => [DYN_DAEMON_LOG_FILE, 'a']
|
49
|
+
File.open(DYN_DAEMON_LOG_FILE, 'a'){ |f| f.puts @server_pid.inspect }
|
50
|
+
end
|
51
|
+
|
52
|
+
def service_main
|
53
|
+
File.open(DYN_DAEMON_LOG_FILE, 'a'){ |f| f.puts "Service is running #{Time.now} with pid #{@server_pid}" }
|
54
|
+
while running?
|
55
|
+
sleep 10
|
56
|
+
end
|
27
57
|
end
|
28
|
-
end
|
29
58
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
59
|
+
def service_stop
|
60
|
+
File.open(DYN_DAEMON_LOG_FILE, 'a'){ |f| f.puts "Stopping server thread #{Time.now}" }
|
61
|
+
system "taskkill /PID #{@server_pid} /T /F"
|
62
|
+
Process.waitall
|
63
|
+
File.open(DYN_DAEMON_LOG_FILE, 'a'){ |f| f.puts "Service stopped #{Time.now}" }
|
64
|
+
exit!
|
65
|
+
end
|
36
66
|
end
|
37
|
-
end
|
38
67
|
|
39
|
-
action = ARGV[1] || "status"
|
40
68
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
69
|
+
action = ARGV[1] || "status"
|
70
|
+
|
71
|
+
case action
|
72
|
+
when "start"
|
73
|
+
begin
|
74
|
+
DynDaemon.mainloop
|
75
|
+
rescue Exception => e
|
76
|
+
File.open(DYN_DAEMON_LOG_FILE,'a+'){ |f| f.puts " ***Daemon failure #{Time.now} exception=#{e.inspect}\n#{e.backtrace.join($/)}" }
|
77
|
+
raise
|
78
|
+
end
|
79
|
+
when "stop"
|
80
|
+
require 'sys/proctable'
|
51
81
|
|
52
|
-
|
82
|
+
pids = []
|
53
83
|
|
54
|
-
|
84
|
+
Sys::ProcTable.ps{ |s| pids.push(s.pid) if s.cmdline =~ /#{SRV}/ }
|
55
85
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
86
|
+
pids -= [Process.pid]
|
87
|
+
unless pids.empty?
|
88
|
+
print "Kill process with pid #{pids.last}"
|
89
|
+
res=Process.kill(9,pids.last)
|
90
|
+
puts " => "+(res == 1 ? "Ok!" : "Failed!")
|
91
|
+
end
|
92
|
+
when "status"
|
93
|
+
require 'sys/proctable'
|
94
|
+
Sys::ProcTable.ps{ |s| puts "["+s.pid.to_s+"] "+s.cmdline if s.pid != Process.pid and s.cmdline =~ /#{SRV}/ }
|
95
|
+
when "log"
|
96
|
+
puts File.read(DYN_DAEMON_LOG_FILE)
|
61
97
|
end
|
62
|
-
|
63
|
-
require 'sys/proctable'
|
64
|
-
Sys::ProcTable.ps{ |s| puts "["+s.pid.to_s+"] "+s.cmdline if s.pid != Process.pid and s.cmdline =~ /#{SRV}/ }
|
98
|
+
|
65
99
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dyn-ruby-win32daemon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- CQLS
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: win32-service
|