Merge branch 'master' of ssh://localhost:12347/home/trac/git

This commit is contained in:
Axel Uhl committed 2011-06-21 01:44:22 +02:00
commit a4ef7755ce
6 files changed
+149 -81

No files matched your search

@@ -14,6 +14,7 @@ class URIConfigurator(object):
self.host = host
self.port = port
self.do_log = log
self.expedition = None
def copy(self):
inst = URIConfigurator(self.host, self.port)
@@ -29,10 +29,9 @@ class LiveDataReceiver(threading.Thread):
self.updatecount = 0
self.running = False
self.paused = False
# start thread paused - in real life there should only
# be one race running and therefore we only need one running listener
self.paused = True
self.error = ''
threading.Thread.__init__(self)
@@ -75,11 +74,14 @@ class LiveDataReceiver(threading.Thread):
self.last_update = datetime.datetime.now()
self.updatecount = updatecount
self.error = ''
except Exception, ex:
# print error but do not kill thread as this could be recoverable (connection problems, ...)
log.error('Error in thread for %s %s' % (self.eventname, self.racename), exc_info=True)
self.error = str(ex)
if str(ex).find('Race not found')>=0:
# if race is not found then pause
log.error(' Pausing listener because race is invalid.')
@@ -90,7 +92,7 @@ class LiveDataReceiver(threading.Thread):
time.sleep(5)
# avoid hammering java server - can occur if call does not block correctly or by using a delayed call
time.sleep(4)
time.sleep(5)
log.info('STOP listener for %s:%s (%s, %s)' % (self.host, self.port, self.eventname, self.racename))
@@ -111,6 +111,17 @@ class BaseView(object):
return self.session['listener-conf'].copy()
return None
def expeditionPort(self):
conf = self.listenerConf()
if conf.host.startswith('test') or conf.port == '8887':
return '2011'
elif conf.host.startswith('dev') or conf.port == '8886':
return '2010'
elif conf.host.startswith('prod1') or conf.port == '8888':
return '2013'
elif conf.host.startswith('prod2') or conf.port == '8889':
return '2014'
def currentRace(self):
if not self.session.has_key('current-race'):
return None
@@ -156,6 +156,23 @@ def configureListener(context, request):
delay = request.POST.get('delay', '')
startListenerThreads(conf, eventlist, delay)
if request.POST.get('expedition_port'):
expedition_port = request.POST.get('expedition_port')
# persist expedition port
view.session['listener-conf'].expedition = expedition_port
for event in eventlist:
eventname = event['name']
for race in event['races']:
racename = race['name']
conf.setContext(config.ADMIN)
conf.setCommand(config.START_EXP_WIND)
conf.setParameters(dict(port=expedition_port, eventname=eventname, racename=racename))
conf.trigger()
log.info('Configured expedition wind for event %s, race %s on port %s' % (eventname, racename, expedition_port))
except Exception, ex:
return view.yieldMessage('Could not gather any data! Seems that Java listener is not ready yet. Please reconnect. Error: %s' % str(ex))
@@ -256,7 +273,7 @@ def configuredListeners(context, request):
out.append( {'host': listener.host, 'port': listener.port,
'eventname': listener.eventname, 'last_update': listener.last_update and listener.last_update.strftime('%d.%m %H:%M:%S') or '-',
'paused' : listener.paused, 'running': listener.running, 'xid' : str(key),
'racename': listener.racename} )
'racename': listener.racename, 'error': listener.error} )
return out
@@ -664,6 +681,7 @@ def loadRacesForEvent(context, request):
data = jsonByUrl(conf)
races = data.sort(lambda x,y:cmp(x['name'], y['name']))
return render_to_response('templates/java-connector-select-races.pt', {'races' : data, 'view': view}, request=request)
@jsonize
@@ -3,14 +3,46 @@
When <i>stopping listener</i> it will trigger two methods: If you select a race it will call stoprace, if no race is selected it will call stopevent.</div>
<form method="POST" action="/++/configureListener">
<tal:if condition="not view.listenerStarted()">
<tal:if condition="view.listenerStarted() or request.params.get('debug')">
Event:
<select name="event">
<tal:for repeat="event view.allEvents()">
<option value="${event.name}">${event.name}</option>
</tal:for>
</select>
&nbsp;
Race:
<select name="race">
<option value=""></option>
<tal:for repeat="race view.allRacesFor()">
<option value="${race}">${race}</option>
</tal:for>
</select>
<br/><br/>
<fieldset>
<legend>Leaderboard</legend>
<input type="submit" name="leaderboard-default-event" style="background-color: green; color: white;" value="Set selected event as Leaderboard default"/>&nbsp;
<br/><br/>Leaderboard-Default: ${view.currentLeaderboardEvent() and view.currentLeaderboardEvent().name or 'N/A'}&nbsp;
<a target="_blank" href="${request.application_url}/@@/leaderboard-live">&raquo;&nbsp;Show Leaderboard</a>
</fieldset>
<br/><br/>
<fieldset>
<legend>Handling</legend>
<input type="submit" name="listener-event-refresh" value="(Re) load event data"/>&nbsp;
<input type="submit" name="disconnect-server" value="Disconnect your session"/>&nbsp;&nbsp;&nbsp;
<input type="submit" name="listener-stop" value="Stop Server (for whole event or single race)" style="background-color: #cc3300;"/>
</fieldset>
</tal:if>
<tal:if condition="not view.listenerStarted()">
<fieldset>
<legend>1. Connection</legend>
<div class="field">
<span>Host and Port:</span><br/>
<input type="text" id="serverhost" name="host"/>&nbsp;<input id="serverport" type="text" name="port"/>&nbsp;
<select name="hostport" id="hostport" onchange="$('#serverhost').val($('#hostport option:selected').attr('host'));$('#serverport').val($('#hostport option:selected').attr('port'))">
<select name="hostport" id="hostport" onchange="$('#serverhost').val($('#hostport option:selected').attr('host'));$('#serverport').val($('#hostport option:selected').attr('port'));$('input[name=expedition_port]').attr('value', $('#hostport option:selected').attr('expedition'))">
<option host="" port=""></option>
<option host="dev.kielweek.web4sap.com" port="80" expedition="2010">DEV-EXTERN ${view.serverStatus('dev.kielweek.web4sap.com', '80')}</option>
<option host="test.kielweek.web4sap.com" port="80" expedition="2011">TEST-EXTERN ${view.serverStatus('test.kielweek.web4sap.com', '80')}</option>
@@ -25,20 +57,29 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
<div class="field">
<span>Use given delay (UTCnow() - n Seconds) for loading race data</span><br/>
<input type="text" name="delay" value="" />
<input type="text" name="delay" value="30" />
</div>
<input type="submit" name="listener-event-refresh" value="Connect to already running server" /><br/><br/>
</fieldset>
</tal:if>
<br/><br/>
<fieldset>
<legend>2. Event Configuration</legend>
<tal:if condition="view.listenerStarted()">
<div class="field">
<span>Configured on ${view.listenerConf().host}:${view.listenerConf().port}</span>
<input id="serverhost" type="hidden" name="host" value="${view.listenerConf().host}"/><input id="serverport" type="hidden" name="port" value="${view.listenerConf().port}"/>
</div>
</tal:if>
<div class="field">
<span>URL to event configuration</span><br/>
<input class="large" type="text" name="eventJSONURL" id="eventJSONURL" value=""/>
<select name="eventJSONURLselect" onchange="$('input[name=eventJSONURL]').val($('select[name=eventJSONURLselect] option:selected').val())">
<option value=""></option>
<option value="http://germanmaster.traclive.dk/events/event_20110609_KielerWoch/jsonservice.php">Kiel Week</option>
<option value="http://germanmaster.traclive.dk/events/event_20110505_SailingTea/jsonservice.php">STG Training</option>
</select>
@@ -51,6 +92,7 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
</fieldset>
<div id="extended-conf" style="display:none;">
<br/><br/>
<fieldset>
<legend>3. Race Configuration </legend>
@@ -60,7 +102,6 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
<span>Live-Connection (host:port):</span><br/>
<input class="large" type="text" name="liveURI" value="" />
<select name="liveURIselect" onchange="$('input[name=liveURI]').val($('select[name=liveURIselect] option:selected').val())">
<option value=""></option>
<option value="tcp://germanmaster.traclive.dk:1520">Kiel Week</option>
<option value="tcp://sapsimulation.tracdev.dk:4420">J80 Race 12</option>
<option value="tcp://germanmaster.traclive.dk:4400">STG Training</option>
@@ -71,7 +112,6 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
<span>Data-Connection (host:port):</span><br/>
<input class="large" type="text" name="storedURI" value="" />
<select name="storedURIselect" onchange="$('input[name=storedURI]').val($('select[name=storedURIselect] option:selected').val())">
<option value=""></option>
<option value="tcp://germanmaster.traclive.dk:1521">Kiel Week</option>
<option value="tcp://sapsimulation.tracdev.dk:4421">J80 Race 12</option>
<option value="tcp://germanmaster.traclive.dk:4401">STG Training</option>
@@ -79,6 +119,7 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
</div>
</fieldset>
<br/><br/>
<fieldset>
<legend>4. Admin Configuration</legend>
@@ -98,62 +139,36 @@ When <i>stopping listener</i> it will trigger two methods: If you select a race
<div class="field">
<input type="checkbox" name="start_expedition" checked="checked" />&nbsp;
<span>Start UDP expedition wind listener</span><br/>
<input type="hidden" name="expedition_port" value=""/>
<input tal:condition="not view.listenerStarted()" type="hidden" name="expedition_port" value=""/>
<input tal:condition="view.listenerStarted()" type="hidden" name="expedition_port" value="${view.expeditionPort()}"/>
</div>
<input type="submit" name="listener-start" value="Connect to TracTrac"/>&nbsp;
<input type="submit" name="listener-start" value="Push configuration and listen"/>&nbsp;
</fieldset>
<br/><br/>
<fieldset tal:condition="view.listenerStarted()">
<legend>Averaging</legend>
<div>
Current Averaging: <span id="averaging">...</span>
</div>
<div class="field">
<span>Set averaging interval (in millis) for</span><br/>
Speed: <input type="text" name="averagingSpeed" value="20000"/>&nbsp;Wind: <input type="text" name="averagingWind" value="20000"/>
</div>
<input type="button" value="Load Averaging (needs unpaused listener for the selected race)" onclick="GET('showAveraging', {eventname: $('select[name=event] option:selected').val(), racename: $('select[name=race] option:selected').val()}, function(data) {$('#averaging').html(data)});"/>&nbsp;&nbsp;
<input type="submit" name="set-averaging" value="Set Averaging (for selected race)"/>
</fieldset>
</div>
</tal:if>
<tal:if condition="view.listenerStarted() or request.params.get('debug')">
Event:
<select name="event">
<tal:for repeat="event view.allEvents()">
<option value="${event.name}">${event.name}</option>
</tal:for>
</select>
&nbsp;
Race:
<select name="race">
<option value=""></option>
<tal:for repeat="race view.allRacesFor()">
<option value="${race}">${race}</option>
</tal:for>
</select>
<br/><br/>
<fieldset>
<legend>Handling</legend>
<input type="submit" name="listener-event-refresh" value="(Re) load event data"/>&nbsp;
<input type="submit" name="disconnect-server" value="Disconnect your session"/>&nbsp;&nbsp;&nbsp;
<script>
$(document).ready(function() {
$('select[name=eventJSONURLselect]').change();
$('select[name=liveURIselect]').change();
$('select[name=storedURIselect]').change();
});
</script>
<input type="submit" name="listener-stop" value="Stop Server" style="background-color: #cc3300;"/>
</fieldset>
<br/>
<fieldset>
<legend>Leaderboard</legend>
<input type="submit" name="leaderboard-default-event" style="background-color: green; color: white;" value="Set event as Leaderboard default"/>&nbsp;
Leaderboard-Default: ${view.currentLeaderboardEvent() and view.currentLeaderboardEvent().name or 'N/A'}&nbsp;
<a target="_blank" href="${request.application_url}/@@/leaderboard-live">&raquo;&nbsp;Show Leaderboard</a>
<br/>
</fieldset>
<br/>
<fieldset>
<legend>Averaging</legend>
<div>
Current Averaging: <span id="averaging">...</span>
</div>
<div class="field">
<span>Set averaging interval (in millis) for</span><br/>
Speed: <input type="text" name="averagingSpeed" value="20000"/>&nbsp;Wind: <input type="text" name="averagingWind" value="20000"/>
</div>
<input type="button" value="Load Averaging (needs unpaused listener for the selected race)" onclick="GET('showAveraging', {eventname: $('select[name=event] option:selected').val(), racename: $('select[name=race] option:selected').val()}, function(data) {$('#averaging').html(data)});"/>&nbsp;&nbsp;
<input type="submit" name="set-averaging" value="Set Averaging (for selected race)"/>
</fieldset>
</tal:if>
</form>
@@ -19,25 +19,26 @@
</div>
<div style="text-align: right;margin: 13px 1px 13px 1px;">
<form method="POST" action="/++/configureListener">
<div id="listeners-container">
<select id="listeners">
<option>Loading....</option>
</select>&nbsp;&nbsp;<br/>
<div align="right">
<input type="button" value="UnPause" onclick="GET('unPauseListener', {tid:$('#listeners option:selected').val()}, loadListeners)"/>
&nbsp;
<input type="button" value="Pause" onclick="GET('pauseListener', {tid:$('#listeners option:selected').val()}, loadListeners)"/>
&nbsp;
<input type="button" value="UnPause ALL" onclick="GET('unPauseListener', {all: true, tid:$('#listeners option:selected').val()}, loadListeners)"/>
&nbsp;
<input type="button" value="Pause ALL" onclick="GET('pauseListener', {all: true, tid:$('#listeners option:selected').val()}, loadListeners)"/>
&nbsp;
<input type="button" value="Stop" onclick="GET('stopListener', {tid: $('#listeners option:selected').val()}, loadListeners)"/>
&nbsp;&nbsp;
<form method="POST" action="/++/configureListener">
<div id="listeners-container">
<select id="listeners">
<option>Loading....</option>
</select>&nbsp;&nbsp;<br/>
<div align="right">
<input type="button" value="UnPause" onclick="GET('unPauseListener', {tid:$('#listeners option:selected').val()}, loadListeners)"/>
&nbsp;
<input type="button" value="Pause" onclick="GET('pauseListener', {tid:$('#listeners option:selected').val()}, loadListeners)"/>
&nbsp;
<input type="button" value="UnPause ALL" onclick="GET('unPauseListener', {all: true, tid:$('#listeners option:selected').val()}, loadListeners)"/>
&nbsp;
<input type="button" value="Pause ALL" onclick="GET('pauseListener', {all: true, tid:$('#listeners option:selected').val()}, loadListeners)"/>
&nbsp;
<input type="button" value="Stop" onclick="GET('stopListener', {tid: $('#listeners option:selected').val()}, loadListeners)"/>
&nbsp;&nbsp;
</div>
</div>
</div>
</form>
</form>
</div>
<div id="tabs">
@@ -52,8 +53,19 @@
<li><a href="/@@/leaderboard"><span>Leaderboard</span></a></li>
<li><a href="/@@/live-info"><span>Live Info</span></a></li>
<li><a href="/@@/database-stats"><span>DB</span></a></li>
<li><a href="#tab-error"><span>Errors</span></a></li>
</ul>
<div id="tab-error">
<div class="help">
If any errors occur then they will show up here.
</div>
<div style="margin: 10px;font-size: 14px;" id="errors">
&nbsp;
</div>
</div>
<div id="tab-simulator">
<div class="help">
Here you can control the TracTrac simulator. This application does not the state of the running
@@ -84,9 +96,18 @@
function loadListeners() {
if (run_listener == true)
$('#listeners').html('<option>Checking server...</option>');
$('#errors').html('&nbsp;');
GET('configuredListeners', {}, function(data) {
options = '';
$('#listeners').css('color', '');
for (d in data) {
if (data[d].error) {
$('#listeners').css('color', 'red');
$('#errors').html($('#errors').html() + '<br/><b>' + data[d].eventname + ' ' + data[d].racename + '</b><br/><pre>' + data[d].error + '</pre>');
}
options += format('<option value="'+data[d].xid+'">{host}:{port} | {eventname} | {racename} | U: {last_update} P: {paused}</option>', data[d]);
}