-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathhautclient.py
More file actions
executable file
·398 lines (348 loc) · 58.2 KB
/
hautclient.py
File metadata and controls
executable file
·398 lines (348 loc) · 58.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
#!/usr/bin/env python
# coding:utf-8
# Author: kehr
# Email:kehr.china@gmail.com
__version__ = '0.1'
HAUTCLIENT_LOGO_DATA="""
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
"""
import sys
import os
import re
import thread
import base64
import platform
import subprocess,signal
try:
import pygtk
pygtk.require('2.0')
import gtk
gtk.gdk.threads_init()
except Exception:
sys.exit(os.system(u'gdialog --title "Hautclient" --msgbox "\u8bf7\u5b89\u88c5 python-gtk2" 15 60'.encode(sys.getfilesystemencoding() or sys.getdefaultencoding(), 'replace')))
try:
import pynotify
pynotify.init('HautClient Notify')
except ImportError:
pynotify = None
try:
import appindicator
except ImportError:
appindicator = None
try:
import vte
except ImportError:
sys.exit(gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, u'请安装 python-vte').run())
def spawn_later(seconds, target, *args, **kwargs):
def wrap(*args, **kwargs):
import time
time.sleep(seconds)
return target(*args, **kwargs)
return thread.start_new_thread(wrap, args, kwargs)
def drop_desktop():
filename = os.path.abspath(__file__)
dirname = os.path.dirname(filename)
DESKTOP_FILE = '''\
#!/usr/bin/env xdg-open
[Desktop Entry]
Type=Application
Name=HautClient
Comment=HautClient Launcher
Categories=Network;
Exec=/usr/bin/env python "%s"
Icon=%s/hautclient-logo.png
Terminal=false
StartupNotify=true
''' % (filename, dirname)
for dirname in map(os.path.expanduser, ['~/Desktop', u'~/桌面']):
if os.path.isdir(dirname):
filename = os.path.join(dirname, 'hautclient.desktop')
with open(filename, 'w') as fp:
fp.write(DESKTOP_FILE)
os.chmod(filename, 0755)
def should_visible():
import ConfigParser
ConfigParser.RawConfigParser.OPTCRE = re.compile(r'(?P<option>[^=\s][^=]*)\s*(?P<vi>[=])\s*(?P<value>.*)$')
config = ConfigParser.ConfigParser()
config.read(['proxy.ini', 'proxy.user.ini'])
visible = config.has_option('listen', 'visible') and config.getint('listen', 'visible')
return visible
def get_abs_filepath(str):
return os.path.join(os.path.abspath(os.path.dirname(__file__)), str)
class HautClient:
#excute_file = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'extend/excute.py')
excute_file = get_abs_filepath('extend/excute.py')
exit_file = get_abs_filepath('extend/exit.py')
command = ['/usr/bin/env','python',excute_file]
command_exit = ['/usr/bin/env','python',exit_file]
message = u'Hautclient 已经启动,单击托盘图标可以最小化!'
fail_message = u'HautClient 启动失败,请查看控制台窗口的错误信息!'
def __init__(self, window, terminal):
self.window = window
self.window.set_size_request(652, 447)
self.window.set_position(gtk.WIN_POS_CENTER)
self.window.connect('delete-event',self.delete_event)
self.terminal = terminal
for cmd in ('python2.7', 'python27', 'python2'):
if os.system('which %s' % cmd) == 0:
self.command[1] = cmd
self.command_exit[1] = cmd
break
self.window.add(terminal)
self.childpid = self.terminal.fork_command(self.command[0], self.command, os.getcwd())
if self.childpid > 0:
pass
#self.childexited = self.terminal.connect('child-exited', self.on_child_exited)
#self.window.connect('delete-event', lambda w, e: gtk.main_quit())
else:
self.childexited = None
self.childexited = None
spawn_later(0.5, self.show_startup_notify)
# if should_visible():
# self.window.show_all()
self.window.show_all()
logo_filename = get_abs_filepath('hautclient-logo.png')
if not os.path.isfile(logo_filename):
with open(logo_filename, 'wb') as fp:
fp.write(base64.b64decode(HAUTCLIENT_LOGO_DATA))
self.window.set_icon_from_file(logo_filename)
if appindicator:
self.trayicon = appindicator.Indicator('HautClient', 'indicator-messages', appindicator.CATEGORY_APPLICATION_STATUS)
self.trayicon.set_status(appindicator.STATUS_ACTIVE)
self.trayicon.set_attention_icon('indicator-messages-new')
self.trayicon.set_icon(logo_filename)
self.trayicon.set_menu(self.make_menu())
else:
self.trayicon = gtk.StatusIcon()
self.trayicon.set_from_file(logo_filename)
self.trayicon.connect('popup-menu', lambda i, b, t: self.make_menu().popup(None, None, gtk.status_icon_position_menu, b, t, self.trayicon))
self.trayicon.connect('activate', self.show_hide_toggle)
self.trayicon.set_tooltip('Hautclient')
self.trayicon.set_visible(True)
def make_menu(self):
menu = gtk.Menu()
itemlist = [(u'\u767b\u5f55\u4fe1\u606f', self.on_show),
(u'\u9690\u85cf\u4fe1\u606f', self.on_hide),
(u'\u767b\u9646', self.on_reload),
(u'\u505c\u6b62', self.on_stop),
(u'\u9000\u51fa', self.on_quit)]
for text, callback in itemlist:
item = gtk.MenuItem(text)
item.connect('activate', callback)
item.show()
menu.append(item)
menu.show()
return menu
def show_notify(self, message=None, timeout=None):
if pynotify and message:
notification = pynotify.Notification('Hautclient Notify', message)
notification.set_hint('x', 200)
notification.set_hint('y', 400)
if timeout:
notification.set_timeout(timeout)
notification.show()
def show_startup_notify(self):
if self.check_child_exists():
self.show_notify(self.message, timeout=3)
def check_child_exists(self):
if self.childpid <= 0:
return False
cmd = 'ps -p %s' % self.childpid
lines = os.popen(cmd).read().strip().splitlines()
if len(lines) < 2:
return False
return True
def on_child_exited(self, term):
if self.terminal.get_child_exit_status() == 0:
gtk.main_quit()
else:
self.show_notify(self.fail_message)
def on_show(self, widget, data=None):
self.window.show_all()
self.window.present()
self.terminal.feed('\r')
def on_hide(self, widget, data=None):
self.window.hide_all()
def on_stop(self, widget, data=None):
if self.childexited:
self.terminal.disconnect(self.childexited)
os.system('kill -9 %s' % self.childpid)
self.childpid = self.terminal.fork_command(self.command_exit[0], self.command_exit, os.getcwd())
def on_reload(self, widget, data=None):
if self.childexited:
self.terminal.disconnect(self.childexited)
os.system('kill -9 %s' % self.childpid)
self.on_show(widget, data)
#self.childpid = self.terminal.fork_command(self.command_exit[0], self.command_exit, os.getcwd())
self.childpid = self.terminal.fork_command(self.command[0], self.command, os.getcwd())
#self.childexited = self.terminal.connect('child-exited', lambda term: gtk.main_quit())
def show_hide_toggle(self, widget, data= None):
if self.window.get_property('visible'):
self.on_hide(widget, data)
else:
self.on_show(widget, data)
def delete_event(self, widget, data=None):
self.on_hide(widget, data)
# 默认最小化至托盘
return True
def on_quit(self, widget, data=None):
# self.on_stop(widget,data)
self.childpid = self.terminal.fork_command(self.command_exit[0], self.command_exit, os.getcwd())
gtk.main_quit()
def main():
# __file__ 脚本所在相对路径
global __file__
__file__ = os.path.abspath(__file__) #获取文件所在绝对路径
if os.path.islink(__file__):
__file__ = getattr(os, 'readlink', lambda x: x)(__file__)
# 切换到当前工作目录
os.chdir(os.path.dirname(os.path.abspath(__file__)))
if not os.path.exists('hautclient-logo.png'):
# first run and drop shortcut to desktop
drop_desktop()
window = gtk.Window()
terminal = vte.Terminal()
HautClient(window, terminal)
gtk.main()
if __name__ == '__main__':
main()