hostor 1.0.0-mswin32

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,241 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'optparse'
4
+ require 'etc'
5
+ require 'ftools'
6
+ require 'tempfile'
7
+ require 'rbconfig'
8
+
9
+ class File
10
+ def self.prepend(path, string)
11
+ Tempfile.open File.basename(path) do |tempfile|
12
+ # prepend data to tempfile
13
+ tempfile << string
14
+
15
+ File.open(path, 'r+') do |file|
16
+ # append original data to tempfile
17
+ tempfile << file.read
18
+ # reset file positions
19
+ file.pos = tempfile.pos = 0
20
+ # copy all data back to original file
21
+ file << tempfile.read
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+
28
+ module Hostor
29
+ def os
30
+ host_os = RbConfig::CONFIG['host_os']
31
+ case host_os
32
+ when /mswin|msys|mingw32/
33
+ :windows
34
+ when /darwin|mac os/
35
+ :macosx
36
+ when /linux/
37
+ :linux
38
+ when /solaris|bsd/
39
+ :unix
40
+ else
41
+ raise Error::WebDriverError, "unknown os: #{host_os.inspect}"
42
+ end
43
+ end
44
+
45
+ def is_windows
46
+ os.eql? :windows
47
+ end
48
+
49
+ def is_mac
50
+ os.eql? :macosx
51
+ end
52
+
53
+ def is_linux
54
+ os.eql? :linux
55
+ end
56
+
57
+ #todo: 根据不同平台获取当前目录
58
+ def hostor_dir
59
+ user = Etc.getlogin
60
+ is_windows ? "#{ENV['USERPROFILE']}\\hostor" : "#{ENV['HOME']}/.hostor"
61
+ end
62
+
63
+ def default_host
64
+ "#{hostor_dir}/default.host"
65
+ end
66
+
67
+ def sys_host_file
68
+ is_windows ? "#{ENV['SystemDrive']}/windows/system32/drivers/etc/hosts" : '/etc/hosts'
69
+ end
70
+
71
+ def get_host_name(path)
72
+ unknown = "未定名称的HOST文件"
73
+ ln = nil
74
+ File.open(path, 'r').each_line do |line|
75
+ ln = line
76
+ break
77
+ end
78
+ return unknown if ln.nil?
79
+
80
+ if (ln =~ /#==\[.*?\]==/).eql? 0
81
+ m = ln.match /#==\[(.*)?\.host\]==\B/
82
+ m[1] || unknown
83
+ else
84
+ unknown
85
+ end
86
+ end
87
+
88
+ def init
89
+ if File.exists?(hostor_dir)
90
+ puts "已经初始化过了!"
91
+ else
92
+ Dir.mkdir(hostor_dir)
93
+ puts "创建hostor配置目录#{hostor_dir}"
94
+
95
+ File.copy(sys_host_file, default_host)
96
+ puts "复制#{sys_host_file}到#{default_host}"
97
+
98
+ File.prepend(default_host, "#==[default.host]==\n")
99
+
100
+ puts "初始化完成"
101
+ end
102
+ end
103
+
104
+ def get_path_by_name(name)
105
+ p1 = "#{hostor_dir}/#{name}"
106
+ return p1 if File.exists? p1
107
+
108
+ p2 = "#{hostor_dir}/#{name}.host"
109
+ return p2 if File.exists? p2
110
+
111
+ raise "名为#{name}.host的文件不存在"
112
+ end
113
+
114
+ def switch(file)
115
+ File.copy(get_path_by_name(file), sys_host_file)
116
+ end
117
+
118
+ def current
119
+ get_host_name(sys_host_file)
120
+ end
121
+
122
+ def view(file)
123
+ dest = file ? get_path_by_name(file) : sys_host_file
124
+ File.open(dest, 'r').each_line{|ln| puts ln }
125
+ end
126
+
127
+ def remove(file)
128
+ File.delete(get_path_by_name(file))
129
+ end
130
+
131
+ def delete(keyword)
132
+ end
133
+
134
+ def list
135
+ files = []
136
+ Dir.foreach(hostor_dir) do |file|
137
+ if not File.directory? file and File.extname(file).eql? '.host'
138
+ files << file
139
+ end
140
+ end
141
+ files
142
+ end
143
+
144
+ def add(file)
145
+ if File.exists? file
146
+ file_bak = file.to_s + "" #for_win
147
+ basename = File.basename(file)
148
+ ext = File.extname(file)
149
+ if ext.empty?
150
+ basename += '.host'
151
+ elsif not ext.eql? '.host'
152
+ basename.gsub!(/\.[^.]*?$/, '.host')
153
+ end
154
+ dest = hostor_dir + "/" + basename
155
+ if File.exists? dest
156
+ raise "已经添加了名为#{basename}文件,请重命名后添加或者使用#$0 --remove #{basename} 删除已有文件"
157
+ else
158
+ File.copy(file_bak, dest)
159
+ File.prepend(dest, "#==[#{basename}]==\n")
160
+ end
161
+ else
162
+ raise "文件#{file}不存在"
163
+ end
164
+ end
165
+
166
+ def main(args)
167
+ opts = OptionParser.new do |opts|
168
+ opts.banner = <<-EOF
169
+ Usage:
170
+ #$0 查看系统当前host文件
171
+ #$0 <hostname> 设定指定的文件为系统host文件
172
+ EOF
173
+
174
+ opts.on('--init', "初始化hostor") do
175
+ init()
176
+ end
177
+
178
+ opts.on('-a', '--add <file>', "将指定文件加入hostor管理") do |file|
179
+ add(file)
180
+ end
181
+
182
+ opts.on('-e', '--edit [file]', "编辑指定的HOST文件") do |file|
183
+ f = file || current
184
+ dest = get_path_by_name(f)
185
+ if is_mac
186
+ `open -a macvim #{dest}`
187
+ elsif is_linux
188
+ `xterm -e vim #{dest}`
189
+ elsif is_windows
190
+ `notepad #{dest}`
191
+ end
192
+ if f.gsub(/\..*/, '') == current
193
+ switch( f )
194
+ end
195
+ end
196
+
197
+ opts.on('-r', '--remove <file>', "从hostor文件夹移除指定的HOST文件") do |file|
198
+ remove(file)
199
+ end
200
+
201
+ #适用于 -a -d
202
+ #opts.on('-t', '--target <file>', "指定操作的HOST文件") do |name|
203
+ #end
204
+
205
+ opts.on('-l', '--list', "列举当前用户的所有HOST文件") do
206
+ list().each{|l| puts l}
207
+ end
208
+
209
+ opts.on('-v', '--view [file]', "查看指定的HOST文件") do |name|
210
+ view(name)
211
+ end
212
+
213
+ opts.on('-c', '--curr', "列举当前使用HOST文件") do
214
+ puts current()
215
+ end
216
+
217
+ opts.on('-s', '--switch <file>', "将指定HOST文件设为系统当前HOST文件") do |file|
218
+ switch(file)
219
+ end
220
+ end
221
+
222
+ begin
223
+ if args.length.eql? 0
224
+ view(nil)
225
+ elsif args.length.eql? 1 and args[0] =~ /^[^-]/
226
+ switch(args[0])
227
+ else
228
+ opts.parse!(args)
229
+ end
230
+ rescue OptionParser::InvalidOption => e
231
+ puts "参数非法, 查看帮助请使用: #$0 --help "
232
+ rescue Exception => e
233
+ puts e.to_s
234
+ end
235
+ end
236
+ end
237
+
238
+ include Hostor
239
+ main ARGV
240
+
241
+
Binary file
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env jruby
2
+ require 'java'
3
+ module Hostor
4
+ module SysPopupMenu
5
+ def self.run
6
+ if (Java::JavaAwt::SystemTray.isSupported())
7
+ tray = Java::JavaAwt::SystemTray.getSystemTray();
8
+ image = Java::JavaAwt::Toolkit.getDefaultToolkit().getImage(File.expand_path(File.dirname(__FILE__))+"/hostor.png")
9
+
10
+ popup = Java::JavaAwt::PopupMenu.new
11
+ self.refresh(popup)
12
+
13
+ icon = Java::JavaAwt::TrayIcon.new(image, "hostor", popup)
14
+ icon.setImageAutoSize true
15
+
16
+ begin
17
+ tray.add(icon)
18
+ rescue Java::JavaAwt::AWTException => e
19
+ java::lang::System.err.println("TrayIcon could not be added.")
20
+ end
21
+ else
22
+ java::lang::System.err.println("System tray is currently not supported.")
23
+ end
24
+ end
25
+
26
+ def self.refresh(popup)
27
+ popup.removeAll()
28
+
29
+ curr = get_curr_host()
30
+ get_host_list.each do |name|
31
+ popup.add(make_host_item(name, curr))
32
+ end
33
+
34
+ popup.add(Java::JavaAwt::MenuItem.new("--------"))
35
+ popup.add(make_refresh_item())
36
+ popup.add(make_exit_item())
37
+ end
38
+
39
+ class << self
40
+ private
41
+ def get_host_list()
42
+ return (`hostor -l`).split("\n").collect {|x| x.sub /.host/, ''}
43
+ end
44
+
45
+ def get_curr_host()
46
+ return (`hostor -c`).delete("\n")
47
+ end
48
+
49
+ def get_prefix(name, curr)
50
+ name.eql?(curr) ? "*" : " "
51
+ end
52
+
53
+ def get_host_item_label(name, curr)
54
+ get_prefix(name, curr) + name
55
+ end
56
+
57
+ def make_host_item(name, curr)
58
+ item = Java::JavaAwt::MenuItem.new(get_host_item_label(name, curr))
59
+ item.setActionCommand(name)
60
+ listener = java::awt::event::ActionListener.new
61
+ def listener.actionPerformed(e)
62
+ item = e.getSource()
63
+ curr_host = item.getActionCommand()
64
+
65
+ old_host = (`hostor -c`).delete("\n")
66
+ system("hostor #{curr_host}")
67
+
68
+ if curr_host != old_host
69
+ item.setLabel("*"+curr_host)
70
+ popup = item.getParent()
71
+
72
+ n = popup.getItemCount()
73
+ n.times do |i|
74
+ o = popup.getItem(i)
75
+ name = o.getActionCommand()
76
+ if(name == old_host)
77
+ o.setLabel(' '+ name)
78
+ break
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ item.addActionListener(listener)
85
+ return item
86
+ end
87
+
88
+ def make_exit_item()
89
+ item = Java::JavaAwt::MenuItem.new("exit")
90
+ listener = java::awt::event::ActionListener.new
91
+ def listener.actionPerformed(e)
92
+ java::lang::System.exit(0)
93
+ end
94
+ item.addActionListener(listener)
95
+ return item
96
+ end
97
+
98
+ def make_refresh_item()
99
+ item = Java::JavaAwt::MenuItem.new("reload")
100
+ listener = java::awt::event::ActionListener.new
101
+ def listener.actionPerformed(e)
102
+ Hostor::SysPopupMenu.refresh(e.getSource().getParent())
103
+ end
104
+ item.addActionListener(listener)
105
+ return item
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ Hostor::SysPopupMenu.run
@@ -0,0 +1,2 @@
1
+ @ECHO OFF
2
+ @start jrubyw hostor_gui
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hostor
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 0
8
+ - 0
9
+ version: 1.0.0
10
+ platform: mswin32
11
+ authors:
12
+ - Zhong Xingdou
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-12-24 00:00:00 +08:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: " system host file manager\n"
22
+ email: zhongxingdou@gmail.com
23
+ executables:
24
+ - hostor
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - bin/hostor_gui.bat
31
+ - bin/hostor
32
+ - bin/hostor_gui
33
+ - bin/hostor.png
34
+ has_rdoc: true
35
+ homepage:
36
+ licenses: []
37
+
38
+ post_install_message:
39
+ rdoc_options: []
40
+
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ segments:
49
+ - 0
50
+ version: "0"
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ segments:
57
+ - 0
58
+ version: "0"
59
+ requirements: []
60
+
61
+ rubyforge_project:
62
+ rubygems_version: 1.3.7
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: system host file manager
66
+ test_files: []
67
+