initial source commit

This commit is contained in:
Gary Sharp
2013-02-01 12:35:28 +11:00
parent 543a005d31
commit 0a93429800
1103 changed files with 285609 additions and 0 deletions
@@ -0,0 +1,130 @@
@model Disco.Web.Areas.Config.Models.Enrolment.IndexModel
@{
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Enrolment");
}
<div class="form" style="width: 530px;">
<h2>Apple Mac Secure Enrol</h2>
<table>
<tr>
<th>Username:
</th>
<td>@Html.TextBoxFor(model => model.MacSshUsername)
@AjaxHelpers.AjaxSave()
@AjaxHelpers.AjaxLoader()
<script type="text/javascript">
$(function () {
var $DOM = $('#MacSshUsername');
var $DOMAjaxSave = $DOM.next('.ajaxSave');
$DOM
.watermark('Username')
.focus(function () { $DOM.select() })
.keydown(function (e) {
$DOMAjaxSave.show();
if (e.which == 13) {
$(this).blur();
}
}).blur(function () {
$DOMAjaxSave.hide();
})
.change(function () {
$DOMAjaxSave.hide();
var $ajaxLoading = $DOMAjaxSave.next('.ajaxLoading').show();
var data = { MacSshUsername: $DOM.val() };
$.ajax({
url: '@Url.Action(MVC.API.Bootstrapper.MacSshUsername())',
dataType: 'json',
data: data,
success: function (d) {
if (d == 'OK') {
$ajaxLoading.hide().next('.ajaxOk').show().delay('fast').fadeOut('slow');
} else {
$ajaxLoading.hide();
alert('Unable to update Username: ' + d);
}
},
error: function (jqXHR, textStatus, errorThrown) {
alert('Unable to update Username: ' + textStatus);
$ajaxLoading.hide();
}
});
});
});
</script>
</td>
</tr>
<tr>
<th>Password:
</th>
<td>
<input id="MacSshPassword" type="password" />
@AjaxHelpers.AjaxSave()
@AjaxHelpers.AjaxLoader()
<script type="text/javascript">
$(function () {
var $DOM = $('#MacSshPassword');
var $DOMAjaxSave = $DOM.next('.ajaxSave');
$DOM
.watermark('Password')
.focus(function () { $DOM.select() })
.keydown(function (e) {
$DOMAjaxSave.show();
if (e.which == 13) {
$(this).blur();
}
}).blur(function () {
$DOMAjaxSave.hide();
})
.change(function () {
$DOMAjaxSave.hide();
var $ajaxLoading = $DOMAjaxSave.next('.ajaxLoading').show();
var data = { MacSshPassword: $DOM.val() };
$.ajax({
url: '@Url.Action(MVC.API.Bootstrapper.MacSshPassword())',
dataType: 'json',
data: data,
success: function (d) {
if (d == 'OK') {
$ajaxLoading.hide().next('.ajaxOk').show().delay('fast').fadeOut('slow');
} else {
$ajaxLoading.hide();
alert('Unable to update Password: ' + d);
}
},
error: function (jqXHR, textStatus, errorThrown) {
alert('Unable to update Password: ' + textStatus);
$ajaxLoading.hide();
}
});
});
});
</script>
</td>
</tr>
<tr>
<td colspan="2">
<span class="smallText"><strong>Instructions:</strong> The above credentials must be
able to connect to the requesting Apple Mac client via <a target="_blank" href="http://en.wikipedia.org/wiki/Secure_Shell">SSH</a>. Enter/Script the following command:</span>
<div class="code">
curl&nbsp;<a target="_blank" href="http://disco:9292/Services/Client/Unauthenticated/MacSecureEnrol">http://disco:9292/Services/Client/Unauthenticated/MacSecureEnrol</a>
</div>
<span class="smallText">This url will return a <a target="_blank" href="http://json.org/">JSON</a> response containing basic information about the enrolment.</span><br />
<span class="smallMessage">This command makes use of <a target="_blank" href="http://curl.haxx.se/">cURL</a> (bundled with OSX). Other methods can also trigger a Mac Secure Enrol,
such as an anchor (<span class="code">&lt;a&gt;</span>) or <span class="code">&lt;script&gt;</span>
tag embedded on the organisation's intranet.</span>
</td>
</tr>
</table>
</div>
<h2>Live Enrolment Logging</h2>
@Html.Partial(MVC.Config.Shared.Views.LogEvents, new Disco.Web.Areas.Config.Models.Shared.LogEventsModel()
{
IsLive = true,
TakeFilter = 100,
StartFilter = DateTime.Today.AddDays(-1),
ModuleFilter = Disco.BI.DeviceBI.EnrolmentLog.Current,
ViewPortHeight = 250
})
<div class="actionBar">
@Html.ActionLinkButton("Download Bootstrapper", MVC.Services.Client.Bootstrapper())
@Html.ActionLinkButton("Enrolment Status", MVC.Config.Enrolment.Status())
</div>
@@ -0,0 +1,335 @@
#pragma warning disable 1591
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.17929
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Disco.Web.Areas.Config.Views.Enrolment
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Helpers;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
using System.Web.Security;
using System.Web.UI;
using System.Web.WebPages;
using Disco.BI.Extensions;
using Disco.Models.Repository;
using Disco.Web;
using Disco.Web.Extensions;
[System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "1.5.0.0")]
[System.Web.WebPages.PageVirtualPathAttribute("~/Areas/Config/Views/Enrolment/Index.cshtml")]
public class Index : System.Web.Mvc.WebViewPage<Disco.Web.Areas.Config.Models.Enrolment.IndexModel>
{
public Index()
{
}
public override void Execute()
{
#line 2 "..\..\Areas\Config\Views\Enrolment\Index.cshtml"
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Enrolment");
#line default
#line hidden
WriteLiteral("\r\n<div");
WriteLiteral(" class=\"form\"");
WriteLiteral(" style=\"width: 530px;\"");
WriteLiteral(">\r\n <h2>Apple Mac Secure Enrol</h2>\r\n <table>\r\n <tr>\r\n <t" +
"h>Username:\r\n </th>\r\n <td>");
#line 11 "..\..\Areas\Config\Views\Enrolment\Index.cshtml"
Write(Html.TextBoxFor(model => model.MacSshUsername));
#line default
#line hidden
WriteLiteral("\r\n");
WriteLiteral(" ");
#line 12 "..\..\Areas\Config\Views\Enrolment\Index.cshtml"
Write(AjaxHelpers.AjaxSave());
#line default
#line hidden
WriteLiteral("\r\n");
WriteLiteral(" ");
#line 13 "..\..\Areas\Config\Views\Enrolment\Index.cshtml"
Write(AjaxHelpers.AjaxLoader());
#line default
#line hidden
WriteLiteral("\r\n <script");
WriteLiteral(" type=\"text/javascript\"");
WriteLiteral(@">
$(function () {
var $DOM = $('#MacSshUsername');
var $DOMAjaxSave = $DOM.next('.ajaxSave');
$DOM
.watermark('Username')
.focus(function () { $DOM.select() })
.keydown(function (e) {
$DOMAjaxSave.show();
if (e.which == 13) {
$(this).blur();
}
}).blur(function () {
$DOMAjaxSave.hide();
})
.change(function () {
$DOMAjaxSave.hide();
var $ajaxLoading = $DOMAjaxSave.next('.ajaxLoading').show();
var data = { MacSshUsername: $DOM.val() };
$.ajax({
url: '");
#line 34 "..\..\Areas\Config\Views\Enrolment\Index.cshtml"
Write(Url.Action(MVC.API.Bootstrapper.MacSshUsername()));
#line default
#line hidden
WriteLiteral(@"',
dataType: 'json',
data: data,
success: function (d) {
if (d == 'OK') {
$ajaxLoading.hide().next('.ajaxOk').show().delay('fast').fadeOut('slow');
} else {
$ajaxLoading.hide();
alert('Unable to update Username: ' + d);
}
},
error: function (jqXHR, textStatus, errorThrown) {
alert('Unable to update Username: ' + textStatus);
$ajaxLoading.hide();
}
});
});
});
</script>
</td>
</tr>
<tr>
<th>Password:
</th>
<td>
<input");
WriteLiteral(" id=\"MacSshPassword\"");
WriteLiteral(" type=\"password\"");
WriteLiteral(" />\r\n");
WriteLiteral(" ");
#line 60 "..\..\Areas\Config\Views\Enrolment\Index.cshtml"
Write(AjaxHelpers.AjaxSave());
#line default
#line hidden
WriteLiteral("\r\n");
WriteLiteral(" ");
#line 61 "..\..\Areas\Config\Views\Enrolment\Index.cshtml"
Write(AjaxHelpers.AjaxLoader());
#line default
#line hidden
WriteLiteral("\r\n <script");
WriteLiteral(" type=\"text/javascript\"");
WriteLiteral(@">
$(function () {
var $DOM = $('#MacSshPassword');
var $DOMAjaxSave = $DOM.next('.ajaxSave');
$DOM
.watermark('Password')
.focus(function () { $DOM.select() })
.keydown(function (e) {
$DOMAjaxSave.show();
if (e.which == 13) {
$(this).blur();
}
}).blur(function () {
$DOMAjaxSave.hide();
})
.change(function () {
$DOMAjaxSave.hide();
var $ajaxLoading = $DOMAjaxSave.next('.ajaxLoading').show();
var data = { MacSshPassword: $DOM.val() };
$.ajax({
url: '");
#line 82 "..\..\Areas\Config\Views\Enrolment\Index.cshtml"
Write(Url.Action(MVC.API.Bootstrapper.MacSshPassword()));
#line default
#line hidden
WriteLiteral(@"',
dataType: 'json',
data: data,
success: function (d) {
if (d == 'OK') {
$ajaxLoading.hide().next('.ajaxOk').show().delay('fast').fadeOut('slow');
} else {
$ajaxLoading.hide();
alert('Unable to update Password: ' + d);
}
},
error: function (jqXHR, textStatus, errorThrown) {
alert('Unable to update Password: ' + textStatus);
$ajaxLoading.hide();
}
});
});
});
</script>
</td>
</tr>
<tr>
<td");
WriteLiteral(" colspan=\"2\"");
WriteLiteral(">\r\n <span");
WriteLiteral(" class=\"smallText\"");
WriteLiteral("><strong>Instructions:</strong> The above credentials must be\r\n " +
" able to connect to the requesting Apple Mac client via <a");
WriteLiteral(" target=\"_blank\"");
WriteLiteral(" href=\"http://en.wikipedia.org/wiki/Secure_Shell\"");
WriteLiteral(">SSH</a>. Enter/Script the following command:</span>\r\n <div");
WriteLiteral(" class=\"code\"");
WriteLiteral(">\r\n curl&nbsp;<a");
WriteLiteral(" target=\"_blank\"");
WriteLiteral(" href=\"http://disco:9292/Services/Client/Unauthenticated/MacSecureEnrol\"");
WriteLiteral(">http://disco:9292/Services/Client/Unauthenticated/MacSecureEnrol</a>\r\n " +
" </div>\r\n <span");
WriteLiteral(" class=\"smallText\"");
WriteLiteral(">This url will return a <a");
WriteLiteral(" target=\"_blank\"");
WriteLiteral(" href=\"http://json.org/\"");
WriteLiteral(">JSON</a> response containing basic information about the enrolment.</span><br />" +
"\r\n <span");
WriteLiteral(" class=\"smallMessage\"");
WriteLiteral(">This command makes use of <a");
WriteLiteral(" target=\"_blank\"");
WriteLiteral(" href=\"http://curl.haxx.se/\"");
WriteLiteral(">cURL</a> (bundled with OSX). Other methods can also trigger a Mac Secure Enrol,\r" +
"\n such as an anchor (<span");
WriteLiteral(" class=\"code\"");
WriteLiteral(">&lt;a&gt;</span>) or <span");
WriteLiteral(" class=\"code\"");
WriteLiteral(">&lt;script&gt;</span>\r\n tag embedded on the organisation\'s in" +
"tranet.</span>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n<h2>Live" +
" Enrolment Logging</h2>\r\n");
#line 119 "..\..\Areas\Config\Views\Enrolment\Index.cshtml"
Write(Html.Partial(MVC.Config.Shared.Views.LogEvents, new Disco.Web.Areas.Config.Models.Shared.LogEventsModel()
{
IsLive = true,
TakeFilter = 100,
StartFilter = DateTime.Today.AddDays(-1),
ModuleFilter = Disco.BI.DeviceBI.EnrolmentLog.Current,
ViewPortHeight = 250
}));
#line default
#line hidden
WriteLiteral("\r\n<div");
WriteLiteral(" class=\"actionBar\"");
WriteLiteral(">\r\n");
WriteLiteral(" ");
#line 128 "..\..\Areas\Config\Views\Enrolment\Index.cshtml"
Write(Html.ActionLinkButton("Download Bootstrapper", MVC.Services.Client.Bootstrapper()));
#line default
#line hidden
WriteLiteral("\r\n");
WriteLiteral(" ");
#line 129 "..\..\Areas\Config\Views\Enrolment\Index.cshtml"
Write(Html.ActionLinkButton("Enrolment Status", MVC.Config.Enrolment.Status()));
#line default
#line hidden
WriteLiteral("\r\n</div>\r\n");
}
}
}
#pragma warning restore 1591
@@ -0,0 +1,370 @@
@{
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Enrolment", MVC.Config.Enrolment.Index(), "Status");
Html.BundleDeferred("~/ClientScripts/Modules/Knockout");
Html.BundleDeferred("~/ClientScripts/Modules/jQuery-SignalR");
Html.BundleDeferred("~/ClientScripts/Modules/jQuery-Isotope");
}
<div id="enrolStatus">
<div id="noSessions" data-bind="visible: noSessions">
<h2>
No enrolment sessions today</h2>
</div>
<div id="sessions" data-bind="visible: !noSessions(), foreach: {data: sessions, afterRender: sessionRendered, afterAdd: sessionAdded}"
style="display: none">
<div class="session" data-bind="style: {backgroundImage: deviceModelImageUrl}, click: select">
<h3>
<span data-bind="text: title"></span><span class="details" data-bind="text: '(' + deviceModelDescription() + ')'">
</span>
</h3>
<p class="sessionStart" data-bind="text: startTime">
</p>
<p class="sessionStatus" data-bind="text: progressStatus">
</p>
<div data-bind="visible: !sessionEnded(), progressValue: progressValue" class="sessionProgress">
</div>
</div>
</div>
<div id="dialogSession" data-bind="with: currentSession">
<div class="sessionHeader clearfix" data-bind="style: {backgroundImage: deviceModelImageUrl}">
<h2>
<a href="" target="_blank" data-bind="text: title, attr: {href: deviceUrl}"></a>
</h2>
<h3 data-bind="text: deviceModelDescription">
</h3>
<table data-bind="if: sessionDeviceInfo">
<tr>
<th style="width: 128px">
Computer Name:
</th>
<td data-bind="text: sessionDeviceInfo().Arguments[3]">
</td>
</tr>
<tr>
<th style="width: 128px">
UUID:
</th>
<td data-bind="text: sessionDeviceInfo().Arguments[2]">
</td>
</tr>
<tr>
<th style="width: 128px">
LAN Mac Address:
</th>
<td data-bind="text: sessionDeviceInfo().Arguments[4]">
</td>
</tr>
<tr>
<th style="width: 128px">
WLAN Mac Address:
</th>
<td data-bind="text: sessionDeviceInfo().Arguments[5]">
</td>
</tr>
<tr>
<th style="width: 128px">
Manufacturer/Model:
</th>
<td data-bind="text: sessionDeviceInfo().Arguments[6] + ' ' + sessionDeviceInfo().Arguments[7]">
</td>
</tr>
</table>
</div>
<div class="sessionProgress clearfix">
<p class="sessionStart" data-bind="text: startTime">
</p>
<p class="sessionStatus" data-bind="text: progressStatus">
</p>
<div data-bind="visible: !sessionEnded(), progressValue: progressValue">
</div>
</div>
<div class="sessionInfoContainer clearfix">
<div class="sessionInfoMessages">
<table class="logEventsViewport">
<thead>
<tr>
<th class="icon">
&nbsp;
</th>
<th class="message">
Message
</th>
</tr>
</thead>
</table>
<div class="logEventsViewportContainer">
<div class="logEventsViewportNoLogs" data-bind="visible: messages().length == 0"
style="display: none">
No logs
</div>
<table class="logEventsViewport" data-bind="visible: messages().length > 0" style="display: none">
<tbody data-bind="foreach: messages">
<tr>
<td class="icon" data-bind="attr: {title: FormattedTimestamp}, css: {information: EventTypeSeverity == 0, warning: EventTypeSeverity == 1, error: EventTypeSeverity == 2}">
&nbsp;
</td>
<td class="message" data-bind="text: FormattedMessage, attr: {title: EventTypeName}">
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="sessionInfoConsole" data-bind="foreach: console">
<span data-bind="text: Arguments[1]"></span>
</div>
</div>
</div>
</div>
<script type="text/javascript">
ko.bindingHandlers.progressValue = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var v = ko.utils.unwrapObservable(valueAccessor());
var vInt = parseInt(v);
if (vInt >= 0) {
$element = $(element);
if (!$element.is('.ui-progressbar'))
$element.progressbar();
$(element).progressbar('option', 'value', vInt);
}
}
};
</script>
<script type="text/javascript">
$(function () {
var vm;
var host = $('#enrolStatus');
var hostSessions = $('#sessions');
var hostDialogSessions = $('#dialogSession');
//var hostDialogSessionsProgress = $('#dialogSession').find('.sessionProgress');
var deviceModels = {};
var liveConnection;
var deviceBaseUrl = '@(Url.Action(MVC.Device.Show()))/'
var deviceModelImageUrl = '@(Url.Action(MVC.API.DeviceModel.Image()))/'
var iconWarningUrl = 'url(@(Links.ClientSource.Style.Images.Status.warning32_png))';
var iconErrorUrl = 'url(@(Links.ClientSource.Style.Images.Status.fail32_png))';
function pageViewModel() {
var self = this;
self.noSessions = ko.observable(true);
self.sessions = ko.observableArray();
self.sessionIndex = {};
self.isotopeInited = false;
self.currentSession = ko.observable();
self.sessionRendered = function (e, d) {
if (!d.sessionEnded()) {
d.progressbar = $(e).find('.sessionProgress').progressbar();
}
};
self.sessionAdded = function (e, d) {
if (self.isotopeInited) {
hostSessions.isotope('reloadItems').isotope({ sortBy: 'original-order' });
}
};
}
function sessionViewModel(id) {
var self = this;
self.title = ko.observable(id);
self.messages = ko.observableArray();
self.console = ko.observableArray();
self.serialNumber = ko.observable();
self.sessionDeviceInfo = ko.observable();
self.progressStatus = ko.observable();
self.progressValue = ko.observable();
self.startTime = ko.observable();
self.sessionEnded = ko.observable(false);
self.progressbar = null;
self.hasError = ko.observable(false);
self.hasWarning = ko.observable(false);
self.deviceModelId = ko.observable();
self.deviceModelDescription = ko.computed(function () {
var deviceModelId = self.deviceModelId();
var sessionDeviceInfo = self.sessionDeviceInfo();
if (deviceModelId) {
var dm = deviceModels[deviceModelId];
if (dm) {
if (dm.Description)
return dm.Description;
else
return dm.Manufacturer + ' ' + dm.Model;
}
}
if (sessionDeviceInfo) {
return sessionDeviceInfo.Arguments[6] + ' ' + sessionDeviceInfo.Arguments[7];
}
});
self.deviceUrl = ko.computed(function () {
var serialNumber = self.serialNumber();
if (serialNumber)
return deviceBaseUrl + serialNumber;
else
return null;
});
self.deviceModelImageUrl = ko.computed(function () {
var deviceModelImage;
if (self.deviceModelId())
deviceModelImage = 'url(' + deviceModelImageUrl + self.deviceModelId() + ')';
else
deviceModelImage = 'url(' + deviceModelImageUrl + ')';
if (self.hasError())
return iconErrorUrl + ', ' + deviceModelImage;
else
if (self.hasWarning())
return iconWarningUrl + ', ' + deviceModelImage;
else
return 'none, ' + deviceModelImage;
});
self.select = function (e, d) {
vm.currentSession(self);
hostDialogSessions.dialog('open');
hostDialogSessions.dialog('option', 'title', 'Device Enrolment: ' + self.title());
}
}
function parseLog(log) {
if (log.ModuleId === 50 && log.Arguments && log.Arguments.length > 0) {
// find session
var sessionId = log.Arguments[0];
var session = vm.sessionIndex[sessionId];
if (!session && log.EventTypeId === 10) { // Starting Session (Ignore 'partial' sessions)
session = new sessionViewModel(sessionId);
vm.sessionIndex[sessionId] = session;
vm.sessions.unshift(session);
vm.noSessions(false);
}
if (session) {
switch (log.EventTypeId) {
case 10: // SessionStarting
session.title(log.Arguments[1]);
session.startTime(log.FormattedTimestamp.substring(log.FormattedTimestamp.indexOf(' ') + 1));
session.messages.unshift(log);
break;
case 11: // SessionProgress
//session.progressbar.progressbar('option', 'value', log.Arguments[1]);
session.progressValue(log.Arguments[1]);
session.progressStatus(log.Arguments[2]);
break;
case 12: // SessionDevice
session.title(log.Arguments[1]);
session.serialNumber(log.Arguments[1]);
if (log.Arguments.length >= 3 && log.Arguments[2])
session.deviceModelId(log.Arguments[2]);
break;
break;
case 13: // SessionDeviceInfo
session.title(log.Arguments[1]);
session.serialNumber(log.Arguments[1]);
session.sessionDeviceInfo(log);
if (log.Arguments.length >= 10 && log.Arguments[9])
session.deviceModelId(log.Arguments[9]);
break;
case 20: // SessionFinished
session.sessionEnded(true);
if (session.hasError())
session.progressStatus('Enrolment Finished with an Error');
else
if (session.hasWarning())
session.progressStatus('Enrolment Finished with a Warning');
else
session.progressStatus('Enrolment Finished Successfully');
session.messages.unshift(log);
break;
case 21: // SessionDiagnosticInformation
session.console.push(log);
break;
case 22: // SessionWarning
session.hasWarning(true);
session.messages.unshift(log);
break;
case 23: // SessionError
case 24: // SessionErrorWithInner
case 25: // SessionClientError
session.hasError(true);
session.messages.unshift(log);
break;
default:
session.messages.unshift(log);
}
}
}
}
function init() {
hostDialogSessions.dialog({
modal: true,
height: 664,
width: 900,
resizable: false,
autoOpen: false,
buttons: { 'Close': function () { $(this).dialog('close'); } }
});
//hostDialogSessionsProgress.progressbar();
// Create View Model
vm = new pageViewModel();
$.ajax({
url: '@(Url.Action(MVC.API.DeviceModel.Index()))',
dataType: 'json',
type: 'POST',
success: init_loadedDeviceModels,
error: function (jqXHR, textStatus, errorThrown) {
alert('Unable to retrieve device models: ' + errorThrown);
}
});
}
function init_loadedDeviceModels(models) {
for (var i = 0; i < models.length; i++) {
var m = models[i];
deviceModels[m.Id] = m;
}
// Load Logs
var d = new Date();
var loadData = {
Format: "json",
Start: d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate(),
End: null,
ModuleId: 50,
Take: 2000
};
$.ajax({
url: '@(Url.Action(MVC.API.Logging.RetrieveEvents()))',
dataType: 'json',
type: 'POST',
traditional: true,
data: loadData,
success: init_loadedLogs,
error: function (jqXHR, textStatus, errorThrown) {
alert('Unable to retrieve logs: ' + errorThrown);
}
});
}
function init_loadedLogs(logs) {
logs.reverse();
for (var i = 0; i < logs.length; i++) {
parseLog(logs[i]);
}
// Bind
ko.applyBindings(vm);
// Isotope
hostSessions.isotope({
itemSelector: '.session',
layoutMode: 'fitRows'
});
vm.isotopeInited = true;
// Init Persistent Connection
liveConnection = $.connection('@(Url.Content("~/API/Logging/Notifications"))');
liveConnection.received(parseLog);
liveConnection.error(function (e) { alert('Live-Log Error: ' + e) });
liveConnection.start(function () {
liveConnection.send('/addToGroups:@(Disco.BI.DeviceBI.EnrolmentLog.Current.LiveLogGroupName)');
});
}
init();
});
</script>
@@ -0,0 +1,539 @@
#pragma warning disable 1591
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.17929
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Disco.Web.Areas.Config.Views.Enrolment
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Helpers;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
using System.Web.Security;
using System.Web.UI;
using System.Web.WebPages;
using Disco.BI.Extensions;
using Disco.Models.Repository;
using Disco.Web;
using Disco.Web.Extensions;
[System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "1.5.0.0")]
[System.Web.WebPages.PageVirtualPathAttribute("~/Areas/Config/Views/Enrolment/Status.cshtml")]
public class Status : System.Web.Mvc.WebViewPage<dynamic>
{
public Status()
{
}
public override void Execute()
{
#line 1 "..\..\Areas\Config\Views\Enrolment\Status.cshtml"
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Enrolment", MVC.Config.Enrolment.Index(), "Status");
Html.BundleDeferred("~/ClientScripts/Modules/Knockout");
Html.BundleDeferred("~/ClientScripts/Modules/jQuery-SignalR");
Html.BundleDeferred("~/ClientScripts/Modules/jQuery-Isotope");
#line default
#line hidden
WriteLiteral("\r\n<div");
WriteLiteral(" id=\"enrolStatus\"");
WriteLiteral(">\r\n <div");
WriteLiteral(" id=\"noSessions\"");
WriteLiteral(" data-bind=\"visible: noSessions\"");
WriteLiteral(">\r\n <h2>\r\n No enrolment sessions today</h2>\r\n </div>\r\n <d" +
"iv");
WriteLiteral(" id=\"sessions\"");
WriteLiteral(" data-bind=\"visible: !noSessions(), foreach: {data: sessions, afterRender: sessio" +
"nRendered, afterAdd: sessionAdded}\"");
WriteLiteral("\r\n style=\"display: none\"");
WriteLiteral(">\r\n <div");
WriteLiteral(" class=\"session\"");
WriteLiteral(" data-bind=\"style: {backgroundImage: deviceModelImageUrl}, click: select\"");
WriteLiteral(">\r\n <h3>\r\n <span");
WriteLiteral(" data-bind=\"text: title\"");
WriteLiteral("></span><span");
WriteLiteral(" class=\"details\"");
WriteLiteral(" data-bind=\"text: \'(\' + deviceModelDescription() + \')\'\"");
WriteLiteral(">\r\n </span>\r\n </h3>\r\n <p");
WriteLiteral(" class=\"sessionStart\"");
WriteLiteral(" data-bind=\"text: startTime\"");
WriteLiteral(">\r\n </p>\r\n <p");
WriteLiteral(" class=\"sessionStatus\"");
WriteLiteral(" data-bind=\"text: progressStatus\"");
WriteLiteral(">\r\n </p>\r\n <div");
WriteLiteral(" data-bind=\"visible: !sessionEnded(), progressValue: progressValue\"");
WriteLiteral(" class=\"sessionProgress\"");
WriteLiteral(">\r\n </div>\r\n </div>\r\n </div>\r\n <div");
WriteLiteral(" id=\"dialogSession\"");
WriteLiteral(" data-bind=\"with: currentSession\"");
WriteLiteral(">\r\n <div");
WriteLiteral(" class=\"sessionHeader clearfix\"");
WriteLiteral(" data-bind=\"style: {backgroundImage: deviceModelImageUrl}\"");
WriteLiteral(">\r\n <h2>\r\n <a");
WriteLiteral(" href=\"\"");
WriteLiteral(" target=\"_blank\"");
WriteLiteral(" data-bind=\"text: title, attr: {href: deviceUrl}\"");
WriteLiteral("></a>\r\n </h2>\r\n <h3");
WriteLiteral(" data-bind=\"text: deviceModelDescription\"");
WriteLiteral(">\r\n </h3>\r\n <table");
WriteLiteral(" data-bind=\"if: sessionDeviceInfo\"");
WriteLiteral(">\r\n <tr>\r\n <th");
WriteLiteral(" style=\"width: 128px\"");
WriteLiteral(">\r\n Computer Name:\r\n </th>\r\n " +
" <td");
WriteLiteral(" data-bind=\"text: sessionDeviceInfo().Arguments[3]\"");
WriteLiteral(">\r\n </td>\r\n </tr>\r\n <tr>\r\n " +
" <th");
WriteLiteral(" style=\"width: 128px\"");
WriteLiteral(">\r\n UUID:\r\n </th>\r\n " +
"<td");
WriteLiteral(" data-bind=\"text: sessionDeviceInfo().Arguments[2]\"");
WriteLiteral(">\r\n </td>\r\n </tr>\r\n <tr>\r\n " +
" <th");
WriteLiteral(" style=\"width: 128px\"");
WriteLiteral(">\r\n LAN Mac Address:\r\n </th>\r\n " +
" <td");
WriteLiteral(" data-bind=\"text: sessionDeviceInfo().Arguments[4]\"");
WriteLiteral(">\r\n </td>\r\n </tr>\r\n <tr>\r\n " +
" <th");
WriteLiteral(" style=\"width: 128px\"");
WriteLiteral(">\r\n WLAN Mac Address:\r\n </th>\r\n " +
" <td");
WriteLiteral(" data-bind=\"text: sessionDeviceInfo().Arguments[5]\"");
WriteLiteral(">\r\n </td>\r\n </tr>\r\n <tr>\r\n " +
" <th");
WriteLiteral(" style=\"width: 128px\"");
WriteLiteral(">\r\n Manufacturer/Model:\r\n </th>\r\n " +
" <td");
WriteLiteral(" data-bind=\"text: sessionDeviceInfo().Arguments[6] + \' \' + sessionDeviceInfo().Ar" +
"guments[7]\"");
WriteLiteral(">\r\n </td>\r\n </tr>\r\n </table>\r\n " +
" </div>\r\n <div");
WriteLiteral(" class=\"sessionProgress clearfix\"");
WriteLiteral(">\r\n <p");
WriteLiteral(" class=\"sessionStart\"");
WriteLiteral(" data-bind=\"text: startTime\"");
WriteLiteral(">\r\n </p>\r\n <p");
WriteLiteral(" class=\"sessionStatus\"");
WriteLiteral(" data-bind=\"text: progressStatus\"");
WriteLiteral(">\r\n </p>\r\n <div");
WriteLiteral(" data-bind=\"visible: !sessionEnded(), progressValue: progressValue\"");
WriteLiteral(">\r\n </div>\r\n </div>\r\n <div");
WriteLiteral(" class=\"sessionInfoContainer clearfix\"");
WriteLiteral(">\r\n <div");
WriteLiteral(" class=\"sessionInfoMessages\"");
WriteLiteral(">\r\n <table");
WriteLiteral(" class=\"logEventsViewport\"");
WriteLiteral(">\r\n <thead>\r\n <tr>\r\n " +
" <th");
WriteLiteral(" class=\"icon\"");
WriteLiteral(">\r\n &nbsp;\r\n </th>\r\n " +
" <th");
WriteLiteral(" class=\"message\"");
WriteLiteral(">\r\n Message\r\n </th>\r\n " +
" </tr>\r\n </thead>\r\n </tab" +
"le>\r\n <div");
WriteLiteral(" class=\"logEventsViewportContainer\"");
WriteLiteral(">\r\n <div");
WriteLiteral(" class=\"logEventsViewportNoLogs\"");
WriteLiteral(" data-bind=\"visible: messages().length == 0\"");
WriteLiteral("\r\n style=\"display: none\"");
WriteLiteral(">\r\n No logs\r\n </div>\r\n " +
" <table");
WriteLiteral(" class=\"logEventsViewport\"");
WriteLiteral(" data-bind=\"visible: messages().length > 0\"");
WriteLiteral(" style=\"display: none\"");
WriteLiteral(">\r\n <tbody");
WriteLiteral(" data-bind=\"foreach: messages\"");
WriteLiteral(">\r\n <tr>\r\n <td");
WriteLiteral(" class=\"icon\"");
WriteLiteral(" data-bind=\"attr: {title: FormattedTimestamp}, css: {information: EventTypeSeveri" +
"ty == 0, warning: EventTypeSeverity == 1, error: EventTypeSeverity == 2}\"");
WriteLiteral(">\r\n &nbsp;\r\n </" +
"td>\r\n <td");
WriteLiteral(" class=\"message\"");
WriteLiteral(" data-bind=\"text: FormattedMessage, attr: {title: EventTypeName}\"");
WriteLiteral(">\r\n </td>\r\n </tr>\r\n " +
" </tbody>\r\n </table>\r\n </di" +
"v>\r\n </div>\r\n <div");
WriteLiteral(" class=\"sessionInfoConsole\"");
WriteLiteral(" data-bind=\"foreach: console\"");
WriteLiteral(">\r\n <span");
WriteLiteral(" data-bind=\"text: Arguments[1]\"");
WriteLiteral("></span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<script");
WriteLiteral(" type=\"text/javascript\"");
WriteLiteral(@">
ko.bindingHandlers.progressValue = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var v = ko.utils.unwrapObservable(valueAccessor());
var vInt = parseInt(v);
if (vInt >= 0) {
$element = $(element);
if (!$element.is('.ui-progressbar'))
$element.progressbar();
$(element).progressbar('option', 'value', vInt);
}
}
};
</script>
<script");
WriteLiteral(" type=\"text/javascript\"");
WriteLiteral(@">
$(function () {
var vm;
var host = $('#enrolStatus');
var hostSessions = $('#sessions');
var hostDialogSessions = $('#dialogSession');
//var hostDialogSessionsProgress = $('#dialogSession').find('.sessionProgress');
var deviceModels = {};
var liveConnection;
var deviceBaseUrl = '");
#line 141 "..\..\Areas\Config\Views\Enrolment\Status.cshtml"
Write(Url.Action(MVC.Device.Show()));
#line default
#line hidden
WriteLiteral("/\'\r\n var deviceModelImageUrl = \'");
#line 142 "..\..\Areas\Config\Views\Enrolment\Status.cshtml"
Write(Url.Action(MVC.API.DeviceModel.Image()));
#line default
#line hidden
WriteLiteral("/\'\r\n var iconWarningUrl = \'url(");
#line 143 "..\..\Areas\Config\Views\Enrolment\Status.cshtml"
Write(Links.ClientSource.Style.Images.Status.warning32_png);
#line default
#line hidden
WriteLiteral(")\';\r\n var iconErrorUrl = \'url(");
#line 144 "..\..\Areas\Config\Views\Enrolment\Status.cshtml"
Write(Links.ClientSource.Style.Images.Status.fail32_png);
#line default
#line hidden
WriteLiteral(")\';\r\n\r\n function pageViewModel() {\r\n var self = this;\r\n\r\n " +
" self.noSessions = ko.observable(true);\r\n self.sessions = ko.obs" +
"ervableArray();\r\n self.sessionIndex = {};\r\n\r\n self.isotope" +
"Inited = false;\r\n\r\n self.currentSession = ko.observable();\r\n\r\n " +
" self.sessionRendered = function (e, d) {\r\n if (!d.sessionEnd" +
"ed()) {\r\n d.progressbar = $(e).find(\'.sessionProgress\').progr" +
"essbar();\r\n }\r\n };\r\n self.sessionAdded = fu" +
"nction (e, d) {\r\n if (self.isotopeInited) {\r\n " +
"hostSessions.isotope(\'reloadItems\').isotope({ sortBy: \'original-order\' });\r\n " +
" }\r\n };\r\n }\r\n function sessionViewModel(id) " +
"{\r\n var self = this;\r\n\r\n self.title = ko.observable(id);\r\n" +
" self.messages = ko.observableArray();\r\n self.console = ko" +
".observableArray();\r\n self.serialNumber = ko.observable();\r\n " +
" self.sessionDeviceInfo = ko.observable();\r\n self.progressStatus = " +
"ko.observable();\r\n self.progressValue = ko.observable();\r\n " +
" self.startTime = ko.observable();\r\n self.sessionEnded = ko.observabl" +
"e(false);\r\n self.progressbar = null;\r\n self.hasError = ko." +
"observable(false);\r\n self.hasWarning = ko.observable(false);\r\n " +
" self.deviceModelId = ko.observable();\r\n self.deviceModelDescript" +
"ion = ko.computed(function () {\r\n var deviceModelId = self.device" +
"ModelId();\r\n var sessionDeviceInfo = self.sessionDeviceInfo();\r\n " +
" if (deviceModelId) {\r\n var dm = deviceModels[d" +
"eviceModelId];\r\n if (dm) {\r\n if (dm.De" +
"scription)\r\n return dm.Description;\r\n " +
" else\r\n return dm.Manufacturer + \' \' + dm.Mode" +
"l;\r\n }\r\n }\r\n if (sessionDeviceI" +
"nfo) {\r\n return sessionDeviceInfo.Arguments[6] + \' \' + sessio" +
"nDeviceInfo.Arguments[7];\r\n }\r\n });\r\n self." +
"deviceUrl = ko.computed(function () {\r\n var serialNumber = self.s" +
"erialNumber();\r\n if (serialNumber)\r\n return de" +
"viceBaseUrl + serialNumber;\r\n else\r\n return nu" +
"ll;\r\n });\r\n self.deviceModelImageUrl = ko.computed(functio" +
"n () {\r\n var deviceModelImage;\r\n if (self.deviceMo" +
"delId())\r\n deviceModelImage = \'url(\' + deviceModelImageUrl + " +
"self.deviceModelId() + \')\';\r\n else\r\n deviceMod" +
"elImage = \'url(\' + deviceModelImageUrl + \')\';\r\n if (self.hasError" +
"())\r\n return iconErrorUrl + \', \' + deviceModelImage;\r\n " +
" else\r\n if (self.hasWarning())\r\n " +
" return iconWarningUrl + \', \' + deviceModelImage;\r\n else\r\n " +
" return \'none, \' + deviceModelImage;\r\n });\r\n " +
" self.select = function (e, d) {\r\n vm.currentSession(self" +
");\r\n hostDialogSessions.dialog(\'open\');\r\n hostDial" +
"ogSessions.dialog(\'option\', \'title\', \'Device Enrolment: \' + self.title());\r\n " +
" }\r\n }\r\n\r\n function parseLog(log) {\r\n if (log.Mo" +
"duleId === 50 && log.Arguments && log.Arguments.length > 0) {\r\n /" +
"/ find session\r\n var sessionId = log.Arguments[0];\r\n " +
" var session = vm.sessionIndex[sessionId];\r\n if (!session && lo" +
"g.EventTypeId === 10) { // Starting Session (Ignore \'partial\' sessions)\r\n " +
" session = new sessionViewModel(sessionId);\r\n vm." +
"sessionIndex[sessionId] = session;\r\n vm.sessions.unshift(sess" +
"ion);\r\n vm.noSessions(false);\r\n }\r\n " +
" if (session) {\r\n switch (log.EventTypeId) {\r\n " +
" case 10: // SessionStarting\r\n session.ti" +
"tle(log.Arguments[1]);\r\n session.startTime(log.Format" +
"tedTimestamp.substring(log.FormattedTimestamp.indexOf(\' \') + 1));\r\n " +
" session.messages.unshift(log);\r\n break" +
";\r\n case 11: // SessionProgress\r\n " +
" //session.progressbar.progressbar(\'option\', \'value\', log.Arguments[1]);\r\n " +
" session.progressValue(log.Arguments[1]);\r\n " +
" session.progressStatus(log.Arguments[2]);\r\n " +
" break;\r\n case 12: // SessionDevice\r\n " +
" session.title(log.Arguments[1]);\r\n sessi" +
"on.serialNumber(log.Arguments[1]);\r\n if (log.Argument" +
"s.length >= 3 && log.Arguments[2])\r\n session.devi" +
"ceModelId(log.Arguments[2]);\r\n break;\r\n " +
" break;\r\n case 13: // SessionDeviceInfo\r\n " +
" session.title(log.Arguments[1]);\r\n " +
" session.serialNumber(log.Arguments[1]);\r\n sess" +
"ion.sessionDeviceInfo(log);\r\n if (log.Arguments.lengt" +
"h >= 10 && log.Arguments[9])\r\n session.deviceMode" +
"lId(log.Arguments[9]);\r\n break;\r\n " +
" case 20: // SessionFinished\r\n session.sessionEnde" +
"d(true);\r\n if (session.hasError())\r\n " +
" session.progressStatus(\'Enrolment Finished with an Error\');\r\n " +
" else\r\n if (session.hasWar" +
"ning())\r\n session.progressStatus(\'Enrolment F" +
"inished with a Warning\');\r\n else\r\n " +
" session.progressStatus(\'Enrolment Finished Successfully\');\r" +
"\n session.messages.unshift(log);\r\n " +
" break;\r\n case 21: // SessionDiagnosticInformatio" +
"n\r\n session.console.push(log);\r\n " +
" break;\r\n case 22: // SessionWarning\r\n " +
" session.hasWarning(true);\r\n session.me" +
"ssages.unshift(log);\r\n break;\r\n " +
" case 23: // SessionError\r\n case 24: // SessionErrorWith" +
"Inner\r\n case 25: // SessionClientError\r\n " +
" session.hasError(true);\r\n session.messages" +
".unshift(log);\r\n break;\r\n defa" +
"ult:\r\n session.messages.unshift(log);\r\n " +
" }\r\n }\r\n }\r\n }\r\n function init() {\r" +
"\n hostDialogSessions.dialog({\r\n modal: true,\r\n " +
" height: 664,\r\n width: 900,\r\n resizable: fa" +
"lse,\r\n autoOpen: false,\r\n buttons: { \'Close\': func" +
"tion () { $(this).dialog(\'close\'); } }\r\n });\r\n //hostDialo" +
"gSessionsProgress.progressbar();\r\n\r\n // Create View Model\r\n " +
" vm = new pageViewModel();\r\n $.ajax({\r\n url: \'");
#line 309 "..\..\Areas\Config\Views\Enrolment\Status.cshtml"
Write(Url.Action(MVC.API.DeviceModel.Index()));
#line default
#line hidden
WriteLiteral(@"',
dataType: 'json',
type: 'POST',
success: init_loadedDeviceModels,
error: function (jqXHR, textStatus, errorThrown) {
alert('Unable to retrieve device models: ' + errorThrown);
}
});
}
function init_loadedDeviceModels(models) {
for (var i = 0; i < models.length; i++) {
var m = models[i];
deviceModels[m.Id] = m;
}
// Load Logs
var d = new Date();
var loadData = {
Format: ""json"",
Start: d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate(),
End: null,
ModuleId: 50,
Take: 2000
};
$.ajax({
url: '");
#line 334 "..\..\Areas\Config\Views\Enrolment\Status.cshtml"
Write(Url.Action(MVC.API.Logging.RetrieveEvents()));
#line default
#line hidden
WriteLiteral(@"',
dataType: 'json',
type: 'POST',
traditional: true,
data: loadData,
success: init_loadedLogs,
error: function (jqXHR, textStatus, errorThrown) {
alert('Unable to retrieve logs: ' + errorThrown);
}
});
}
function init_loadedLogs(logs) {
logs.reverse();
for (var i = 0; i < logs.length; i++) {
parseLog(logs[i]);
}
// Bind
ko.applyBindings(vm);
// Isotope
hostSessions.isotope({
itemSelector: '.session',
layoutMode: 'fitRows'
});
vm.isotopeInited = true;
// Init Persistent Connection
liveConnection = $.connection('");
#line 361 "..\..\Areas\Config\Views\Enrolment\Status.cshtml"
Write(Url.Content("~/API/Logging/Notifications"));
#line default
#line hidden
WriteLiteral("\');\r\n liveConnection.received(parseLog);\r\n liveConnection.e" +
"rror(function (e) { alert(\'Live-Log Error: \' + e) });\r\n liveConnectio" +
"n.start(function () {\r\n liveConnection.send(\'/addToGroups:");
#line 365 "..\..\Areas\Config\Views\Enrolment\Status.cshtml"
Write(Disco.BI.DeviceBI.EnrolmentLog.Current.LiveLogGroupName);
#line default
#line hidden
WriteLiteral("\');\r\n });\r\n }\r\n init();\r\n });\r\n</script>\r\n");
}
}
}
#pragma warning restore 1591