Skip to content
This repository was archived by the owner on Jan 17, 2020. It is now read-only.

Commit ef14fab

Browse files
author
benjaoming
committed
Fix poll computers thread, add toggle for shutdown, register in separate thread, log window, reset confirmation, auto submit button should not reset itself
Former-commit-id: 3faf99f0a896935cd3a8251de712559feb58e8ec
1 parent ec91809 commit ef14fab

File tree

11 files changed

+304
-95
lines changed

11 files changed

+304
-95
lines changed

data/lcrs-master.desktop

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Name=LCRS
33
Comment=Large-scale Computer Reuse Suite
44
Exec=lcrs
55
Icon=lcrs-lcrs
6-
Terminal=false
6+
Terminal=true
77
Type=Application
88
StartupNotify=true
99
Categories=Network

lcrs/master/computer.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ def __init__(self, computer_id, ipAddress, macAddress, config_master):
221221
self.wipe_hexsample_before = None # Hex-digest of some sector on HD
222222
self.wipe_hexsample_after = None # Hex-digest of some sector on HD
223223

224+
self.shutdown_after_wiping = False
225+
224226
self.debug_mode_request = config_master.DEBUG
225227

226228
self.is_registered = False # Says whether the computer has been registered in some database
@@ -363,8 +365,8 @@ def __analyze_scan_data(self, data):
363365
def __send_to_slave(self, request):
364366
request = json.dumps(request)
365367
reply = ""
366-
for __ in range(3):
367-
# Retry 3 times
368+
for __ in range(1):
369+
# Retry 1 times
368370
try:
369371
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
370372
s.settimeout (2.0)
@@ -392,6 +394,7 @@ def __send_to_slave(self, request):
392394
raise ConnectionException("Timeout connecting")
393395

394396
retries = 0
397+
max_retries = 2
395398
while True:
396399
try:
397400
s.settimeout (5.0)
@@ -405,7 +408,7 @@ def __send_to_slave(self, request):
405408
continue
406409
except socket.timeout:
407410
retries += 1
408-
if retries > 5:
411+
if retries > max_retries:
409412
s.close()
410413
raise ConnectionException("Timeout while receiving reply")
411414
self.state.update(State.NOT_CONNECTED, "Connection timeout")
@@ -515,6 +518,8 @@ def __wipe_thread(self, method, badblocks=False,
515518
self.state.update(State.WIPED, info="All drives wiped!", progress=1.0)
516519
self.wipe_finished_on = datetime.now()
517520
callback_finished(self) if callback_finished else ()
521+
if self.drives and self.shutdown_after_wiping:
522+
self.shutdown()
518523

519524
def __verify_after_dump(self, dump_data):
520525
"""

lcrs/master/config_master.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import logging
2121
logger = logging.getLogger('lcrs')
2222

23+
LOG_FILE = "/var/log/lcrs.log"
24+
2325
DEBUG = False
2426

2527
TFTP_COMMAND = "in.tftpd -a %(ip)s -s -l -v -v -v -L %(path)s"

lcrs/master/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ def addGroup(self, name):
188188
config_master.DEBUG = args.debug
189189

190190
ch = logging.StreamHandler()
191-
fh = logging.FileHandler("/var/log/lcrs.log")
191+
fh = logging.FileHandler(config_master.LOG_FILE)
192192

193193
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
194194
ch.setFormatter(formatter)

lcrs/master/plugins/__init__.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
# You should have received a copy of the GNU General Public License
1616
# along with LCRS. If not, see <http://www.gnu.org/licenses/>.
1717

18+
import gtk
19+
1820
class CallbackFailed(Exception):
1921
pass
2022

@@ -39,3 +41,18 @@ def activate(self):
3941

4042
def deactivate(self):
4143
pass
44+
45+
def show_error_msg(self, msg, parent=None):
46+
"""Utility function to display a simple error message"""
47+
dialog = gtk.MessageDialog(parent=parent if parent else self.mainwindow_instance.win,
48+
type=gtk.MESSAGE_ERROR,
49+
buttons = gtk.BUTTONS_CLOSE,
50+
message_format=msg)
51+
dialog.set_modal(True)
52+
dialog.set_keep_above(True)
53+
def on_close(dialog, *args):
54+
dialog.destroy()
55+
56+
dialog.connect("response", on_close)
57+
dialog.show()
58+

lcrs/master/plugins/fair/__init__.py

Lines changed: 28 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,13 @@
2727
import simplejson as json
2828
import shlex
2929

30+
import threading
31+
3032
from lcrs.master.plugins import CallbackFailed, BasePlugin
3133

34+
import logging
35+
logger = logging.getLogger("lcrs")
36+
3237
class FairIDPlugin(BasePlugin):
3338

3439
plugin_id = "fair"
@@ -80,16 +85,7 @@ def on_set_id(self, computer, input_id):
8085

8186
if fail_msg:
8287

83-
def on_close(dialog, *args):
84-
dialog.destroy()
85-
86-
dialog = gtk.MessageDialog(parent=self.mainwindow_instance.win,
87-
type=gtk.MESSAGE_ERROR,
88-
buttons = gtk.BUTTONS_CLOSE,
89-
message_format=fail_msg)
90-
dialog.connect("response", on_close)
91-
dialog.show()
92-
88+
self.show_error_msg(fail_msg)
9389
raise CallbackFailed()
9490

9591
def on_ready_login(self, *args):
@@ -149,39 +145,15 @@ def login(self, *args):
149145
self.mainwindow_instance.fair_username = username
150146
self.mainwindow_instance.fair_password = password
151147
self.win.destroy()
152-
#def on_close(dialog, *args):
153-
# dialog.destroy()
154-
# self.win.destroy()
155-
#dialog = gtk.MessageDialog(parent=self.win,
156-
# type=gtk.MESSAGE_INFO,
157-
# buttons = gtk.BUTTONS_CLOSE,
158-
# message_format="You are now logged in!",)
159-
#dialog.set_modal(True)
160-
#dialog.connect("response", on_close)
161-
#dialog.show()
162-
163148
else:
164-
self.glade.get_object('buttonLogin').set_sensitive(True)
165149
fail_msg = r1.read()
166150
conn.close()
167151
except:
168152
fail_msg = "Could not connect to FAIR server"
169153

170-
171154
if fail_msg:
172-
173-
def on_close(dialog, *args):
174-
self.glade.get_object('buttonLogin').set_sensitive(True)
175-
dialog.destroy()
176-
177-
dialog = gtk.MessageDialog(parent=self.win,
178-
type=gtk.MESSAGE_ERROR,
179-
buttons = gtk.BUTTONS_CLOSE,
180-
message_format=fail_msg,)
181-
dialog.set_modal(True)
182-
dialog.connect("response", on_close)
183-
dialog.show()
184-
155+
self.glade.get_object('buttonLogin').set_sensitive(True)
156+
self.show_error_msg(fail_msg, parent=self.win)
185157

186158

187159
def on_auto_submit(self, computer):
@@ -213,25 +185,27 @@ def on_auto_submit(self, computer):
213185
response = conn.getresponse()
214186
data = response.read()
215187
if response.status != 200:
216-
# TODO: Handle this in the log file
217-
print "ERROR IN REGISTRATION: %s" % data
188+
errmsg = "autosubmit plugin failed: %s" % str(data)
189+
self.show_error_msg(errmsg)
190+
logger.critical(errmsg)
218191
conn.close()
219192

220-
221193
def on_register(self, computer):
222194

223-
computer.is_registered = True
224-
self.mainwindow_instance.update_computer(computer)
225-
self.on_auto_submit(computer)
226-
227-
if self.get_config("use_https"):
228-
url = "https://%s%s%s" % (self.get_config("fair_server"), URL_REGISTER, computer.id)
229-
else:
230-
url = "http://%s%s%s" % (self.get_config("fair_server"), URL_REGISTER, computer.id)
231-
username = os.getenv("SUDO_USER")
232-
233-
if username:
234-
subprocess.Popen(shlex.split("su %s -c \"xdg-open %s\"" % (username, url)))
235-
else:
236-
subprocess.Popen(shlex.split("xdg-open %s" % url))
237-
195+
def register_thread():
196+
self.on_auto_submit(computer)
197+
if self.get_config("use_https"):
198+
url = "https://%s%s%s" % (self.get_config("fair_server"), URL_REGISTER, computer.id)
199+
else:
200+
url = "http://%s%s%s" % (self.get_config("fair_server"), URL_REGISTER, computer.id)
201+
username = os.getenv("SUDO_USER")
202+
203+
if username:
204+
subprocess.Popen(shlex.split("su %s -c \"xdg-open %s\"" % (username, url)))
205+
else:
206+
subprocess.Popen(shlex.split("xdg-open %s" % url))
207+
208+
t = threading.Thread(target=register_thread)
209+
t.setDaemon(True)
210+
t.start()
211+

lcrs/master/ui/computerpanel.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ def __init__(self, computer, grouppage):
5050
self.glade.get_object('buttonComputerStart').connect('clicked', self.on_clicked_start)
5151
self.glade.get_object('checkbuttonWipe').connect('toggled', self.on_toggle_wipe)
5252
self.glade.get_object('checkbuttonScan').connect('toggled', self.on_toggle_scan)
53+
self.glade.get_object('togglebuttonShutdown').connect('toggled', self.on_shutdown_toggled)
5354

5455
self.set_headline()
5556

@@ -110,17 +111,25 @@ def set_hardware(self):
110111
row[COLUMN_VALUE] = str(hw[key])
111112
self.liststore.prepend(row=row)
112113

113-
114+
115+
def on_shutdown_toggled(self, *args, **kwargs):
116+
btn = self.glade.get_object("togglebuttonShutdown")
117+
on = btn.get_active()
118+
self.computer.shutdown_after_wiping = on
119+
if on:
120+
btn.set_label("On")
121+
else:
122+
btn.set_label("Off")
123+
114124
def on_clicked_start(self, *args, **kwargs):
115125
self.glade.get_object('buttonComputerStart').set_sensitive(False)
116126
scan = self.glade.get_object('checkbuttonScan').get_active()
117127
wipe = self.glade.get_object('checkbuttonWipe').get_active()
118-
shutdown = self.glade.get_object('checkbuttonShutdown').get_active()
119128
autosubmit = self.glade.get_object('checkbuttonAutosubmit').get_active()
120129
badblocks = self.glade.get_object('checkbuttonBadblocks').get_active()
121130
method = self.glade.get_object("comboboxMethod").get_active_text()
122131
self.grouppage.process(self.computer, scan, wipe, method, badblocks,
123-
shutdown=shutdown, autosubmit=autosubmit)
132+
autosubmit=autosubmit)
124133

125134
def on_toggle_wipe(self, *args):
126135
if not self.glade.get_object('checkbuttonWipe').get_active():
@@ -150,7 +159,6 @@ def update(self, *args, **kwargs):
150159
ready = not self.computer.is_active()
151160
self.glade.get_object('buttonComputerStart').set_sensitive(is_connected and ready)
152161
self.glade.get_object('checkbuttonAutosubmit').set_sensitive(bool(self.computer.id))
153-
self.glade.get_object('checkbuttonAutosubmit').set_active(bool(self.computer.id))
154162
if not small_update:
155163
self.set_hardware()
156164
self.set_headline()

lcrs/master/ui/getid.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def focus_id_entry(self):
5252
self.glade.get_object('entryID').grab_focus()
5353

5454
def on_cancel(self, *args):
55-
self.grouppage.cancel_get_id(self.computer)
55+
self.grouppage.on_cancel_get_id(self.computer)
5656

5757
def on_ok(self, *args):
5858
self.glade.get_object('buttonOK').set_sensitive(False)

0 commit comments

Comments
 (0)