Created
January 2, 2026 18:20
-
-
Save elibosley/41c9192e2a1f0371a11f968ac2d3186a to your computer and use it in GitHub Desktop.
Invalid HTML on Container Install Script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en" class="Theme--black Theme--nav-top Theme--width-unlimited"> | |
| <head> | |
| <title>Unraid/AddContainer</title> | |
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> | |
| <meta http-equiv="Content-Security-Policy" content="block-all-mixed-content"> | |
| <meta name="format-detection" content="telephone=no"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <meta name="robots" content="noindex, nofollow"> | |
| <meta name="referrer" content="same-origin"> | |
| <link type="image/png" rel="icon" href="/webGui/images/green-on.png"> | |
| <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" /> | |
| <meta name="apple-mobile-web-app-title" content="Unraid" /> | |
| <link rel="manifest" href="/manifest.json" /> | |
| <link type="text/css" rel="stylesheet" href="/webGui/styles/default-fonts.css?v=1702488531"> | |
| <link type="text/css" rel="stylesheet" href="/webGui/styles/default-cases.css?v=1718142503"> | |
| <link type="text/css" rel="stylesheet" href="/webGui/styles/font-awesome.css?v=1700089733"> | |
| <link type="text/css" rel="stylesheet" href="/webGui/styles/context.standalone.css?v=1700089733"> | |
| <link type="text/css" rel="stylesheet" href="/webGui/styles/jquery.sweetalert.css?v=1755282121"> | |
| <link type="text/css" rel="stylesheet" href="/webGui/styles/jquery.ui.css?v=1700089733"> | |
| <link type="text/css" rel="stylesheet" href="/webGui/styles/default-color-palette.css?v=1743784653"> | |
| <link type="text/css" rel="stylesheet" href="/webGui/styles/default-base.css?v=1764883956"> | |
| <link type="text/css" rel="stylesheet" href="/webGui/styles/default-dynamix.css?v=1755018025"> | |
| <link type="text/css" rel="stylesheet" href="/webGui/styles/themes/black.css?v=1761203380"> | |
| <style> | |
| :root { | |
| --customer-header-background-image: url(/boot/config/plugins/dynamix/banner.png?v=1697565668); | |
| } | |
| </style> | |
| <noscript> | |
| <div class="upgrade_notice">Your browser has JavaScript disabled</div> | |
| </noscript> | |
| <script src="/webGui/javascript/dynamix.js?v=1758227634"></script> | |
| <script src="/webGui/javascript/translate.en_US.js?v=1700089733"></script> | |
| <script> | |
| String.prototype.actionName = function(){return this.split(/[\\/]/g).pop();} | |
| String.prototype.channel = function(){return this.split(':')[1].split(',').findIndex((e)=>/\[\d\]/.test(e));} | |
| Shadowbox.init({skipSetup:true}); | |
| context.init(); | |
| // Legacy code. No longer used in webGUI, and its purpose is removed, but plugins might still reference this prototype and its a fatal error to remove it. | |
| NchanSubscriber.prototype.monitor = function(){return null;} | |
| // server uptime | |
| var uptime = 1274591.81; | |
| var expiretime = 0; | |
| var before = new Date(); | |
| // page timer events | |
| const timers = {}; | |
| timers.bannerWarning = null; | |
| // tty window | |
| var tty_window = null; | |
| const addAlert = {}; | |
| addAlert.text = $.cookie('addAlert-text'); | |
| addAlert.cmd = $.cookie('addAlert-cmd'); | |
| addAlert.plg = $.cookie('addAlert-plg'); | |
| addAlert.func = $.cookie('addAlert-func'); | |
| // current csrf_token | |
| var csrf_token = "3DF6513BAB63B5CF"; | |
| // form has unsaved changes indicator | |
| var formHasUnsavedChanges = false; | |
| // docker progess indicators | |
| var progress_dots = [], progress_span = []; | |
| function pauseEvents(id) { | |
| $.each(timers, function(i,timer){ | |
| if (!id || i==id) clearTimeout(timer); | |
| }); | |
| } | |
| function resumeEvents(id,delay) { | |
| var startDelay = delay||50; | |
| $.each(timers, function(i,timer) { | |
| if (!id || i==id) timers[i] = setTimeout(i+'()', startDelay); | |
| startDelay += 50; | |
| }); | |
| } | |
| function plus(value,single,plural,last) { | |
| return value>0 ? (value+' '+(value==1?single:plural)+(last?'':', ')) : ''; | |
| } | |
| function updateTime() { | |
| var now = new Date(); | |
| var days = parseInt(uptime/86400); | |
| var hour = parseInt(uptime/3600%24); | |
| var mins = parseInt(uptime/60%60); | |
| $('span.uptime').html(((days|hour|mins)?plus(days,"day","days",(hour|mins)==0)+plus(hour,"hour","hours",mins==0)+plus(mins,"minute","minutes",true):"less than a minute")); | |
| uptime += Math.round((now.getTime() - before.getTime())/1000); | |
| before = now; | |
| if (expiretime > 0) { | |
| var remainingtime = expiretime - now.getTime()/1000; | |
| if (remainingtime > 0) { | |
| days = parseInt(remainingtime/86400); | |
| hour = parseInt(remainingtime/3600%24); | |
| mins = parseInt(remainingtime/60%60); | |
| if (days) { | |
| $('#licenseexpire').html(plus(days,"day","days",true)+" remaining"); | |
| } else if (hour) { | |
| $('#licenseexpire').html(plus(hour,"hour","hours",true)+" remaining").addClass('orange-text'); | |
| } else if (mins) { | |
| $('#licenseexpire').html(plus(mins,"minute","minutes",true)+" remaining").addClass('red-text'); | |
| } else { | |
| $('#licenseexpire').html("less than a minute remaining").addClass('red-text'); | |
| } | |
| } else { | |
| $('#licenseexpire').addClass('red-text'); | |
| } | |
| } | |
| setTimeout(updateTime,1000); | |
| } | |
| function refresh(top) { | |
| if (typeof top === 'undefined') { | |
| for (var i=0,element; element=document.querySelectorAll('input,button,select')[i]; i++) {element.disabled = true;} | |
| for (var i=0,link; link=document.getElementsByTagName('a')[i]; i++) { link.style.color = "gray"; } //fake disable | |
| location.replace(location.href); | |
| } else { | |
| $.cookie('top',top); | |
| location.replace(location.href); | |
| } | |
| } | |
| function initab(page) { // @todo remove in the future | |
| $.removeCookie('one'); | |
| $.removeCookie('tab'); | |
| if (page != null) location.replace(page); | |
| } | |
| function done(key) { | |
| var url = location.pathname.split('/'); | |
| var path = '/'+url[1]; | |
| if (key) for (var i=2; i<url.length; i++) if (url[i]==key) break; else path += '/'+url[i]; | |
| $.removeCookie('one'); | |
| location.replace(path); | |
| } | |
| function chkDelete(form, button) { | |
| button.value = form.confirmDelete.checked ? "Delete" : "Apply"; | |
| button.disabled = false; | |
| } | |
| function makeWindow(name,height,width) { | |
| var top = (screen.height-height)/2; | |
| if (top < 0) {top = 0; height = screen.availHeight;} | |
| var left = (screen.width-width)/2; | |
| if (left < 0) {left = 0; width = screen.availWidth;} | |
| return window.open('',name,'resizeable=yes,scrollbars=yes,height='+height+',width='+width+',top='+top+',left='+left); | |
| } | |
| function openBox(cmd,title,height,width,load,func,id) { | |
| // open shadowbox window (run in foreground) | |
| // included for legacy purposes, replaced by openPlugin | |
| var uri = cmd.split('?'); | |
| var run = uri[0].substr(-4)=='.php' ? cmd+(uri[1]?'&':'?')+'done=Done' : '/logging.htm?cmd='+cmd+'&csrf_token='+csrf_token+'&done=Done'; | |
| var options = load ? (func ? {modal:true,onClose:function(){setTimeout(func+'('+'"'+(id||'')+'")');}} : {modal:true,onClose:function(){location.reload();}}) : {modal:false}; | |
| Shadowbox.open({content:run, player:'iframe', title:title, height:Math.min(screen.availHeight,800), width:Math.min(screen.availWidth,1200), options:options}); | |
| } | |
| function openWindow(cmd,title,height,width) { | |
| // open regular window (run in background) | |
| // included for legacy purposes, replaced by openTerminal | |
| var window_name = title.replace(/ /g,"_"); | |
| var form_html = '<form action="/logging.htm" method="post" target="'+window_name+'">'+'<input type="hidden" name="csrf_token" value="'+csrf_token+'">'+'<input type="hidden" name="title" value="'+title+'">'; | |
| var vars = cmd.split('&'); | |
| form_html += '<input type="hidden" name="cmd" value="'+vars[0]+'">'; | |
| for (var i = 1; i < vars.length; i++) { | |
| var pair = vars[i].split('='); | |
| form_html += '<input type="hidden" name="'+pair[0]+'" value="'+pair[1]+'">'; | |
| } | |
| form_html += '</form>'; | |
| var form = $(form_html); | |
| $('body').append(form); | |
| makeWindow(window_name,height,width); | |
| form.submit(); | |
| } | |
| function openTerminal(tag,name,more) { | |
| if (/MSIE|Edge/.test(navigator.userAgent)) { | |
| swal({title:"_(Unsupported Feature)_",text:"_(Sorry, this feature is not supported by MSIE/Edge)_.<br>_(Please try a different browser)_",type:'error',html:true,animation:'none',confirmButtonText:"_(Ok)_"}); | |
| return; | |
| } | |
| // open terminal window (run in background) | |
| name = name.replace(/[ #]/g,"_"); | |
| tty_window = makeWindow(name+(more=='.log'?more:''),Math.min(screen.availHeight,800),Math.min(screen.availWidth,1200)); | |
| if ( tty_window === null ) { | |
| throw new Error('Failed to open terminal window'); | |
| } | |
| var socket = ['ttyd','syslog'].includes(tag) ? '/webterminal/'+tag+'/' : '/logterminal/'+name+(more=='.log'?more:'')+'/'; | |
| $.get('/webGui/include/OpenTerminal.php',{tag:tag,name:name,more:more},function(){setTimeout(function(){tty_window.location=socket; tty_window.focus();},200);}); | |
| } | |
| function bannerAlert(text,cmd,plg,func,start) { | |
| $.post('/webGui/include/StartCommand.php',{cmd:cmd,pid:1},function(pid) { | |
| if (pid == 0) { | |
| if ($(".upgrade_notice").hasClass('done') || timers.bannerAlert == null) { | |
| forcedBanner = false; | |
| if ($.cookie('addAlert') != null) { | |
| removeBannerWarning($.cookie('addAlert')); | |
| $.removeCookie('addAlert'); | |
| } | |
| $(".upgrade_notice").removeClass('alert done'); | |
| timers.callback = null; | |
| if (plg != null) { | |
| if ($.cookie('addAlert-page') == null || $.cookie('addAlert-page') == 'Apps') { | |
| setTimeout((func||'loadlist')+'("'+plg+'")',250); | |
| } else if ('Plugins' == 'Apps') { | |
| setTimeout(refresh); | |
| } | |
| } | |
| $.removeCookie('addAlert-page'); | |
| } else { | |
| $(".upgrade_notice").removeClass('alert').addClass('done'); | |
| timers.bannerAlert = null; | |
| setTimeout(function(){bannerAlert(text,cmd,plg,func,start);},1000); | |
| } | |
| } else { | |
| $.cookie('addAlert',addBannerWarning(text,true,true,true)); | |
| $.cookie('addAlert-text',text); | |
| $.cookie('addAlert-cmd',cmd); | |
| $.cookie('addAlert-plg',plg); | |
| $.cookie('addAlert-func',func); | |
| if ($.cookie('addAlert-page') == null) $.cookie('addAlert-page','Apps'); | |
| timers.bannerAlert = setTimeout(function(){bannerAlert(text,cmd,plg,func,start);},1000); | |
| if (start==1 && timers.callback==null && plg!=null) timers.callback = setTimeout((func||'loadlist')+'("'+plg+'")',250); | |
| } | |
| }); | |
| } | |
| function openPlugin(cmd,title,plg,func,start=0,button=0) { | |
| // start = 0 : run command only when not already running (default) | |
| // start = 1 : run command unconditionally | |
| // button = 0 : show CLOSE button (default) | |
| // button = 1 : hide CLOSE button | |
| nchan_plugins.start(); | |
| $.post('/webGui/include/StartCommand.php',{cmd:cmd+' nchan',start:start},function(pid) { | |
| if (pid==0) { | |
| nchan_plugins.stop(); | |
| $('div.spinner.fixed').hide(); | |
| $(".upgrade_notice").addClass('alert'); | |
| return; | |
| } | |
| swal({title:title + ' - <span id="pluginProgressTitle">In Progress <i class="fa fa-refresh fa-spin"></i></span>',text:"<pre id='swaltext'></pre><hr>",html:true,animation:'none',showConfirmButton:button==0,confirmButtonText:"Close"},function(close){ | |
| nchan_plugins.stop(); | |
| $('div.spinner.fixed').hide(); | |
| $('.sweet-alert').hide('fast').removeClass('nchan'); | |
| setTimeout(function(){bannerAlert("Attention - operation continues in background ["+pid.toString().padStart(8,'0')+"]<i class='fa fa-bomb fa-fw abortOps' title=\"Abort background process\" onclick='abortOperation("+pid+")'></i>",cmd,plg,func,start);}); | |
| }); | |
| $('.sweet-alert').addClass('nchan'); | |
| $('button.confirm').prop('disabled',button!=0); | |
| }); | |
| } | |
| function openDocker(cmd,title,plg,func,start=0,button=0) { | |
| // start = 0 : run command only when not already running (default) | |
| // start = 1 : run command unconditionally | |
| // button = 0 : hide CLOSE button (default) | |
| // button = 1 : show CLOSE button | |
| nchan_docker.start(); | |
| $.post('/webGui/include/StartCommand.php',{cmd:cmd,start:start},function(pid) { | |
| if (pid==0) { | |
| nchan_docker.stop(); | |
| $('div.spinner.fixed').hide(); | |
| $(".upgrade_notice").addClass('alert'); | |
| return; | |
| } | |
| swal({title:title + ' - <span id="pluginProgressTitle">In Progress <i class="fa fa-refresh fa-spin"></i></span>',text:"<pre id='swaltext'></pre><hr>",html:true,animation:'none',showConfirmButton:button!=0,confirmButtonText:"Close"},function(close){ | |
| nchan_docker.stop(); | |
| $('div.spinner.fixed').hide(); | |
| $('.sweet-alert').hide('fast').removeClass('nchan'); | |
| setTimeout(function(){bannerAlert("Attention - operation continues in background ["+pid.toString().padStart(8,'0')+"]<i class='fa fa-bomb fa-fw abortOps' title=\"Abort background process\" onclick='abortOperation("+pid+")'></i>",cmd,plg,func,start);}); | |
| }); | |
| $('.sweet-alert').addClass('nchan'); | |
| $('button.confirm').prop('disabled',button==0); | |
| }); | |
| } | |
| function openVMAction(cmd,title,plg,func,start=0,button=0) { | |
| // start = 0 : run command only when not already running (default) | |
| // start = 1 : run command unconditionally | |
| // button = 0 : hide CLOSE button (default) | |
| // button = 1 : show CLOSE button | |
| nchan_vmaction.start(); | |
| $.post('/webGui/include/StartCommand.php',{cmd:cmd,start:start},function(pid) { | |
| if (pid==0) { | |
| nchan_vmaction.stop(); | |
| $('div.spinner.fixed').hide(); | |
| $(".upgrade_notice").addClass('alert'); | |
| return; | |
| } | |
| swal({title:title + ' - <span id="pluginProgressTitle">In Progress <i class="fa fa-refresh fa-spin"></i></span>',text:"<pre id='swaltext'></pre><hr>",html:true,animation:'none',showConfirmButton:button!=0,confirmButtonText:"Close"},function(close){ | |
| nchan_vmaction.stop(); | |
| $('div.spinner.fixed').hide(); | |
| $('.sweet-alert').hide('fast').removeClass('nchan'); | |
| setTimeout(function(){bannerAlert("Attention - operation continues in background ["+pid.toString().padStart(8,'0')+"]<i class='fa fa-bomb fa-fw abortOps' title=\"Abort background process\" onclick='abortOperation("+pid+")'></i>",cmd,plg,func,start);}); | |
| }); | |
| $('.sweet-alert').addClass('nchan'); | |
| $('button.confirm').prop('disabled',button==0); | |
| }); | |
| } | |
| function abortOperation(pid) { | |
| swal({title:"Abort background operation",text:"This may leave an unknown state",html:true,animation:'none',type:'warning',showCancelButton:true,confirmButtonText:"Proceed",cancelButtonText:"Cancel"},function(){ | |
| $.post('/webGui/include/StartCommand.php',{kill:pid},function() { | |
| clearTimeout(timers.bannerAlert); | |
| timers.bannerAlert = null; | |
| timers.callback = null; | |
| forcedBanner = false; | |
| removeBannerWarning($.cookie('addAlert')); | |
| $.removeCookie('addAlert'); | |
| $(".upgrade_notice").removeClass('alert done').hide(); | |
| }); | |
| }); | |
| } | |
| function openChanges(cmd,title,nchan,button=0) { | |
| $('div.spinner.fixed').show(); | |
| // button = 0 : hide CLOSE button (default) | |
| // button = 1 : show CLOSE button | |
| // nchan argument is not used, exists for backward compatibility | |
| $.post('/webGui/include/StartCommand.php',{cmd:cmd,start:2},function(data) { | |
| $('div.spinner.fixed').hide(); | |
| swal({title:title,text:"<pre id='swalbody'></pre><hr>",html:true,animation:'none',showConfirmButton:button!=0,confirmButtonText:"Close"},function(close){ | |
| $('.sweet-alert').hide('fast').removeClass('nchan'); | |
| if ($('#submit_button').length > 0) $('#submit_button').remove(); | |
| }); | |
| $('.sweet-alert').addClass('nchan'); | |
| $('pre#swalbody').html(data); | |
| $('button.confirm').text("Done").prop('disabled',false).show(); | |
| }); | |
| } | |
| function openAlert(cmd,title,func) { | |
| $.post('/webGui/include/StartCommand.php',{cmd:cmd,start:2},function(data) { | |
| $('div.spinner.fixed').hide(); | |
| swal({title:title,text:"<pre id='swalbody'></pre><hr>",html:true,animation:'none',showCancelButton:true,closeOnConfirm:false,confirmButtonText:"Proceed",cancelButtonText:"Cancel"},function(proceed){ | |
| if (proceed) setTimeout(func+'()'); | |
| }); | |
| $('.sweet-alert').addClass('nchan'); | |
| $('pre#swalbody').html(data); | |
| }); | |
| } | |
| function openDone(data) { | |
| if (data == '_DONE_') { | |
| $('div.spinner.fixed').hide(); | |
| $('button.confirm').text("Done").prop('disabled',false).show(); | |
| if (typeof ca_done_override !== 'undefined') { | |
| if (ca_done_override == true) { | |
| $("button.confirm").trigger("click"); | |
| ca_done_override = false; | |
| } | |
| } | |
| $('#pluginProgressTitle').text("Finished"); | |
| return true; | |
| } | |
| return false; | |
| } | |
| function openError(data) { | |
| if (data == '_ERROR_') { | |
| $('div.spinner.fixed').hide(); | |
| $('button.confirm').text("Error").prop('disabled',false).show(); | |
| $('#pluginProgressTitle').text("Error"); | |
| return true; | |
| } | |
| return false; | |
| } | |
| function showStatus(name, plugin, job) { | |
| $.post('/webGui/include/ProcessStatus.php', | |
| { | |
| name, | |
| plugin, | |
| job, | |
| }, | |
| function(status) { | |
| $('.title .right').eq(0).append(status); | |
| } | |
| ); | |
| } | |
| function showFooter(data, id) { | |
| if (id !== undefined) $('#'+id).remove(); | |
| $('#copyright').prepend(data); | |
| } | |
| function showNotice(data) { | |
| $('#user-notice').html(data.replace(/<a>(.*)<\/a>/,"<a href='/Plugins'>$1</a>")); | |
| } | |
| function escapeQuotes(form) { | |
| $(form).find('input[type=text]').each(function(){$(this).val($(this).val().replace(/"/g,'\\"'));}); | |
| } | |
| // Banner warning system | |
| var bannerWarnings = []; | |
| var currentBannerWarning = 0; | |
| var osUpgradeWarning = false; | |
| var forcedBanner = false; | |
| function addBannerWarning(text, warning=true, noDismiss=false, forced=false) { | |
| var cookieText = text.replace(/[^a-z0-9]/gi,''); | |
| if ($.cookie(cookieText) == "true") return false; | |
| if (warning) text = "<i class='fa fa-warning fa-fw' style='float:initial'></i> "+text; | |
| if (bannerWarnings.indexOf(text) < 0) { | |
| if (forced) { | |
| var arrayEntry = 0; bannerWarnings = []; clearTimeout(timers.bannerWarning); timers.bannerWarning = null; forcedBanner = true; | |
| } else { | |
| var arrayEntry = bannerWarnings.push("placeholder") - 1; | |
| } | |
| if (!noDismiss) text += "<a class='bannerDismiss' onclick='dismissBannerWarning("+arrayEntry+",""+cookieText+"")'></a>"; | |
| bannerWarnings[arrayEntry] = text; | |
| } else { | |
| return bannerWarnings.indexOf(text); | |
| } | |
| if (timers.bannerWarning==null) showBannerWarnings(); | |
| return arrayEntry; | |
| } | |
| function dismissBannerWarning(entry,cookieText) { | |
| $.cookie(cookieText,"true",{expires:30}); // reset after 1 month | |
| removeBannerWarning(entry); | |
| } | |
| function removeBannerWarning(entry) { | |
| if (forcedBanner) return; | |
| bannerWarnings[entry] = false; | |
| clearTimeout(timers.bannerWarning); | |
| showBannerWarnings(); | |
| } | |
| function bannerFilterArray(array) { | |
| var newArray = []; | |
| array.filter(function(value,index,arr) { | |
| if (value) newArray.push(value); | |
| }); | |
| return newArray; | |
| } | |
| function showBannerWarnings() { | |
| var allWarnings = bannerFilterArray(Object.values(bannerWarnings)); | |
| if (allWarnings.length == 0) { | |
| $(".upgrade_notice").hide(); | |
| timers.bannerWarning = null; | |
| return; | |
| } | |
| if (currentBannerWarning >= allWarnings.length) currentBannerWarning = 0; | |
| $(".upgrade_notice").show().html(allWarnings[currentBannerWarning]); | |
| currentBannerWarning++; | |
| timers.bannerWarning = setTimeout(showBannerWarnings,3000); | |
| } | |
| function addRebootNotice(message="You must reboot for changes to take effect") { | |
| addBannerWarning("<i class='fa fa-warning' style='float:initial;'></i> "+message,false,true); | |
| $.post("/plugins/dynamix.plugin.manager/scripts/PluginAPI.php",{action:'addRebootNotice',message:message}); | |
| } | |
| function removeRebootNotice(message="You must reboot for changes to take effect") { | |
| var bannerIndex = bannerWarnings.indexOf("<i class='fa fa-warning' style='float:initial;'></i> "+message); | |
| if (bannerIndex < 0) return; | |
| removeBannerWarning(bannerIndex); | |
| $.post("/plugins/dynamix.plugin.manager/scripts/PluginAPI.php",{action:'removeRebootNotice',message:message}); | |
| } | |
| function showUpgradeChanges() { /** @note can likely be removed, not used in webgui or api repos */ | |
| openChanges("showchanges /tmp/plugins/unRAIDServer.txt","Release Notes"); | |
| } | |
| function showUpgrade(text,noDismiss=false) { /** @note can likely be removed, not used in webgui or api repos */ | |
| if ($.cookie('os_upgrade')==null) { | |
| if (osUpgradeWarning) removeBannerWarning(osUpgradeWarning); | |
| osUpgradeWarning = addBannerWarning(text.replace(/<a>(.+?)<\/a>/,"<a href='#' onclick='openUpgrade()'>$1</a>").replace(/<b>(.*)<\/b>/,"<a href='#' onclick='document.rebootNow.submit()'>$1</a>"),false,noDismiss); | |
| } | |
| } | |
| function hideUpgrade(set) { /** @note can likely be removed, not used in webgui or api repos */ | |
| removeBannerWarning(osUpgradeWarning); | |
| if (set) | |
| $.cookie('os_upgrade','true'); | |
| else | |
| $.removeCookie('os_upgrade'); | |
| } | |
| function confirmUpgrade(confirm) { | |
| if (confirm) { | |
| swal({title:"Update Unraid OS",text:"Do you want to update to the new version?",type:'warning',html:true,animation:'none',showCancelButton:true,closeOnConfirm:false,confirmButtonText:"Proceed",cancelButtonText:"Cancel"},function(){ | |
| openPlugin("plugin update unRAIDServer.plg","Update Unraid OS"); | |
| }); | |
| } else { | |
| openPlugin("plugin update unRAIDServer.plg","Update Unraid OS"); | |
| } | |
| } | |
| function openUpgrade() { | |
| hideUpgrade(); | |
| $.get('/plugins/dynamix.plugin.manager/include/ShowPlugins.php',{cmd:'alert'},function(data) { | |
| if (data==0) { | |
| // no alert message - proceed with upgrade | |
| confirmUpgrade(true); | |
| } else { | |
| // show alert message and ask for confirmation | |
| openAlert("showchanges /tmp/plugins/my_alerts.txt","Alert Message",'confirmUpgrade'); | |
| } | |
| }); | |
| } | |
| function digits(number) { | |
| if (number < 10) return 'one'; | |
| if (number < 100) return 'two'; | |
| return 'three'; | |
| } | |
| function flashReport() { | |
| $.post('/webGui/include/Report.php',{cmd:'config'},function(check){ | |
| if (check>0) addBannerWarning("Your flash drive is corrupted or offline. Post your diagnostics in the forum for help. <a target='_blank' href='https://docs.unraid.net/go/changing-the-flash-device/'>See also here</a>"); | |
| }); | |
| } | |
| $(function() { | |
| let tab; | |
| tab = $.cookie('one')||'tab1'; | |
| /* Check if the tab is 'tab0' */ | |
| if (tab === 'tab0') { | |
| /* Set tab to the last available tab based on input[name$="tabs"] length */ | |
| tab = 'tab' + $('input[name$="tabs"]').length; | |
| } else if ($('#' + tab).length === 0) { | |
| /* If the tab element does not exist, initialize a tab and set to 'tab1' */ | |
| initab(); | |
| tab = 'tab1'; | |
| } | |
| $('#'+tab).attr('checked', true); | |
| updateTime(); | |
| Shadowbox.setup('a.sb-enable', {modal:true}); | |
| // add any pre-existing reboot notices | |
| $.post('/webGui/include/Report.php',{cmd:'notice'},function(notices){ | |
| notices = notices.split('\n'); | |
| for (var i=0,notice; notice=notices[i]; i++) addBannerWarning("<i class='fa fa-warning' style='float:initial;'></i> "+notice,false,true); | |
| }); | |
| // check for flash offline / corrupted (delayed). | |
| timers.flashReport = setTimeout(flashReport,6000); | |
| }); | |
| var mobiles=['ipad','iphone','ipod','android']; | |
| var device=navigator.platform.toLowerCase(); | |
| for (var i=0,mobile; mobile=mobiles[i]; i++) { | |
| if (device.indexOf(mobile)>=0) {$('#footer').css('position','static'); break;} | |
| } | |
| $.ajaxPrefilter(function(s, orig, xhr){ | |
| if (s.type.toLowerCase() == "post" && !s.crossDomain) { | |
| s.data = s.data || ""; | |
| s.data += s.data?"&":""; | |
| s.data += "csrf_token="+csrf_token; | |
| } | |
| }); | |
| function debounce(func, wait = 300) { | |
| let timeout; | |
| return function(...args) { | |
| clearTimeout(timeout); | |
| timeout = setTimeout(() => func.apply(this, args), wait); | |
| }; | |
| } | |
| </script> | |
| <!-- | |
| ########################## | |
| webGui/LanguageButton.page | |
| ########################## | |
| --> | |
| <style> | |
| .nav-item.LanguageButton{display:none} | |
| </style> | |
| <script> | |
| function LanguageButton() { | |
| var locale = ''; | |
| // reset dashboard tiles when switching language | |
| if (locale != ($.cookie('locale')||'')) { | |
| $.removeCookie('db-box1'); | |
| $.removeCookie('db-box2'); | |
| $.removeCookie('db-box3'); | |
| $.removeCookie('inactive_content'); | |
| $.removeCookie('hidden_content'); | |
| } | |
| if (locale) { | |
| $.cookie('locale',locale); | |
| switchLanguage(''); | |
| } else { | |
| locale = $.cookie('locale'); | |
| $.removeCookie('locale'); | |
| switchLanguage(locale); | |
| } | |
| } | |
| function switchLanguage(lang) { | |
| $.post('/webGui/include/LanguageReset.php',{lang:lang},function(){location.reload();}); | |
| } | |
| </script> | |
| <!-- | |
| ########################################### | |
| plugins/dynamix.system.temp/TempButton.page | |
| ########################################### | |
| --> | |
| <script> | |
| // nchan updates | |
| var temperature = new NchanSubscriber('/sub/temperature'); | |
| temperature.on('message', function(data) { | |
| showFooter(data,'temp'); | |
| if ($('#mb-temp').length) { | |
| var temp = $('span#temp').text(); | |
| var unit = temp.indexOf('C')>0 ? 'C' : 'F'; | |
| temp = temp.split(unit); | |
| if (temp[0] && $('#cpu-temp').length>0) $('#cpu-temp').html("<i class='ups fa fa-thermometer'></i>Temperature: "+temp[0]+unit); | |
| if (temp[1] && $('#mb-temp').length>0) $('#mb-temp').html("<i class='ups fa fa-thermometer'></i>Temperature: "+temp[1]+unit); | |
| } | |
| }); | |
| temperature.start(); | |
| </script> | |
| <!-- | |
| ########################################## | |
| plugins/dynamix.gui.search/gui_search.page | |
| ########################################## | |
| --> | |
| <link type="text/css" rel="stylesheet" href="/plugins/dynamix.gui.search/sheets/gui_search.css?v=1762756312"> | |
| <script> | |
| var languageVisible; | |
| var guiSearchSuggestions; | |
| $(function(){ | |
| $.post('/plugins/dynamix.gui.search/include/exec.php',function(data) { | |
| if (data) { | |
| try {guiSearchSuggestions = JSON.parse(data); setupGUIsearch();} | |
| catch(e) {console.log('Invalid JSON for GUI search autocomplete');} | |
| } | |
| }); | |
| }); | |
| function guiSearchBoxSpan() { | |
| return $('#guiSearchBoxSpan').length>0; | |
| } | |
| function setupGUIsearch() { | |
| window.addEventListener('keydown',function(e){ | |
| if (!e.shiftKey && !e.altKey && (navigator.appVersion.indexOf('Mac')==-1 ? e.ctrlKey : e.metaKey) && e.keyCode==75) { | |
| // If a modal is visible, don't open the search box | |
| if ($('[role="modal"]').is(':visible')) return; | |
| e.preventDefault(); | |
| if (guiSearchBoxSpan()) closeSearchBox(e); else gui_search(); | |
| } | |
| }); | |
| } | |
| function gui_search() { | |
| languageVisible = $('.nav-item.LanguageButton').is(':visible'); | |
| $('.nav-tile.right').prepend("<span id='guiSearchBoxSpan'><input type='text' id='guiSearchBox' autocomplete='new-password'></input></span>").css('overflow','visible'); | |
| $('.nav-item.util,.nav-user.show').hide(); | |
| if (guiSearchSuggestions) { | |
| var guiSearchAwesomplete = new Awesomplete(document.getElementById('guiSearchBox')); | |
| guiSearchAwesomplete.list = guiSearchSuggestions; | |
| guiSearchAwesomplete.maxItems = 15; | |
| guiSearchAwesomplete.autoFirst = true; | |
| Awesomplete.$('#guiSearchBox').removeEventListener('awesomplete-selectcomplete',guiSearch); | |
| Awesomplete.$('#guiSearchBox').addEventListener('awesomplete-selectcomplete',guiSearch); | |
| $('#guiSearchBox').attr('autocomplete','new-password'); // Stop awesomplete from resetting autocomplete | |
| } | |
| $('#guiSearchBox').focus().keydown(function(e){if (e.which==27) closeSearchBox(e);}).blur(function(e){closeSearchBox(e);}); | |
| } | |
| function closeSearchBox(e) { | |
| e.stopPropagation(); | |
| $('#guiSearchBoxSpan').remove(); | |
| $('.nav-tile.right').css({'overflow-x':'auto','overflow-y':'hidden'}); | |
| $('.nav-item.util,.nav-user.show').show(); | |
| if (!languageVisible) $('.nav-item.LanguageButton').hide(); | |
| } | |
| function guiSearch() { | |
| // If a modal is visible, don't navigate away from the page | |
| if ($('[role="modal"]').is(':visible')) return; | |
| var searchInfo = $('#guiSearchBox').val().split('**'); | |
| var separator = ('fragmentDirective' in document) ? '#:~:text=' : '#'; | |
| var scrollText = (typeof searchInfo[1] != 'undefined') ? separator+searchInfo[1].replace(' ','%20').replace('-','%2d') : ''; | |
| var newPage = "AddContainer/Settings/Tools".replace(searchInfo[0]+'/',''); | |
| closeSearchBox(event); | |
| if (newPage == 'Dashboard/Settings/Tools') newPage = 'Settings'; | |
| /** | |
| * Prevents Community Apps from crashing | |
| * Hook script provided by CA - https://github.com/unraid/community.applications/blob/master/source/community.applications/usr/local/emhttp/plugins/community.applications/javascript/helpers.js | |
| */ | |
| if ( typeof guiSearchOnUnload === "function" ) { | |
| guiSearchOnUnload(); | |
| } | |
| location.assign('/'+newPage+'/'+searchInfo[0]+scrollText); | |
| } | |
| </script> | |
| <!-- | |
| ######################## | |
| webGui/LogoutButton.page | |
| ######################## | |
| --> | |
| <script> | |
| function LogoutButton() { | |
| var id = window.setTimeout(null,0); | |
| while (id--) window.clearTimeout(id); | |
| window.location.href = '/logout'; | |
| } | |
| </script> | |
| <!-- | |
| ########################## | |
| webGui/TerminalButton.page | |
| ########################## | |
| --> | |
| <script> | |
| function TerminalButton() { | |
| var d = new Date(); | |
| openTerminal('ttyd','Web Terminal '+d.getTime(),''); | |
| } | |
| </script> | |
| <!-- | |
| ######################## | |
| webGui/BrowseButton.page | |
| ######################## | |
| --> | |
| <link type="text/css" rel="stylesheet" href="/webGui/sheets/BrowseButton.css?v=1755018025"> | |
| <script> | |
| function BrowseButton() { | |
| location.replace('/Apps/Browse?dir=/mnt'); | |
| } | |
| // Prototypes | |
| String.prototype.dfm_patch = function(){return this.replace('rw','x+rw').replace('r-','wx+r').replace('--','rwx');} | |
| String.prototype.dfm_proxy = function(){return this.replace('name','row');} | |
| String.prototype.dfm_fetch = function(tag){return this.replace('check',tag);} | |
| String.prototype.dfm_bring = function(tag){return this.replace('row',tag);} | |
| String.prototype.dfm_strip = function(){return this.replace(/\/$/,'');} | |
| String.prototype.dfm_quote = function(){return this.replace(/"/g,'"');} | |
| String.prototype.dfm_alter = function(...a){var t=this;for(var i=0;i<a.length;i+=2){t=t.replace(a[i],a[i+1]);} return t;} | |
| String.prototype.dfm_build = function(){return this.replace(/\n(<!--!|!-->)\n/g,'');} | |
| String.prototype.dfm_wedge = function(len){len=len||70;return this.length<=len ? this : this.slice(0,Math.round(len/2)-2)+'...'+this.slice(-1-Math.round(len/2));} | |
| // General variables | |
| const dfm = { | |
| window: null, | |
| dialog: false, | |
| running: false, | |
| draggable: false, | |
| previous: '', | |
| height: 0, | |
| tsize: {0: 0, 1: 6, 2: 3, 3: 3, 4: 3, 11: 2, 12: 2, 14: 0, 15: 3}, | |
| }; | |
| var dfm_read = {}; | |
| function dfm_footer(action, text) { | |
| switch (action) { | |
| case 'show': | |
| $('#user-notice').show(); | |
| break; | |
| case 'hide': | |
| $('#user-notice').hide(); | |
| break; | |
| case 'write': | |
| let icon = '<a class="hand" onclick="dfm_openDialog(true)" title="File Manager"><i class="icon-u-duplicate dfm"></i></a>'; | |
| $('#user-notice').html(icon + text); | |
| break; | |
| case 'clear': | |
| $('#user-notice').html(''); | |
| break; | |
| } | |
| } | |
| function dfm_done() { | |
| dfm_footer('write', "<i class='fa fa-circle-thin dfm'></i>Searching... Done"); | |
| } | |
| function dfm_minimize() { | |
| dfm.window.dialog('close'); | |
| dfm_footer('show'); | |
| } | |
| function dfm_close_button() { | |
| $('.ui-dfm .ui-dialog-titlebar-close').html('<i class="fa fa-window-minimize"></i>').prop({'title':"Minimize"}).prop('onclick',null).off('click').click(function(){dfm_minimize();}).show(); | |
| } | |
| function dfm_htmlspecialchars(text) { | |
| var map = {'&':'&','<':'<','>':'>','"':'"',"'":'''}; | |
| return text.replace(/[&<>"']/g, function(m){return map[m];}); | |
| } | |
| function dfm_escapeHTML(name) { | |
| const data = document.createElement('div'); | |
| const text = document.createTextNode(name); | |
| data.appendChild(text); | |
| return data.innerHTML; | |
| } | |
| function dfm_createSource(source) { | |
| var select = dfm.window.find('#dfm_source'); | |
| if (Array.isArray(source)) { | |
| for (var i=0,object; object=source[i]; i++) { | |
| if (i < 10) { | |
| select.html(select.html()+'<option'+(i==0?' selected':'')+'>'+object+'</option>'); | |
| } else { | |
| select.html(select.html()+'<option><more> ...</option>'); | |
| break; | |
| } | |
| } | |
| } else { | |
| select.html('<option selected>'+source+'</option>'); | |
| } | |
| } | |
| function dfm_showProgress(data) { | |
| if (!data) return 0; | |
| let file = null; | |
| let text = data.split('\n'); | |
| let line = text[0].split('... '); | |
| let strict = /^mnt|^boot/; | |
| let footer = false; | |
| if (text[0] == '#cat#') { | |
| let loc = [], cat = []; | |
| for (let i=1,row; row=text[i]; i++) { | |
| if (!row) continue; | |
| row = row.split('\0'); | |
| loc.push(row[0]); | |
| cat.push(row[1].dfm_wedge(80)); | |
| } | |
| if (cat.length > 0) { | |
| dfm.window.find('.dfm_loc').html(loc.join('<br>')); | |
| dfm.window.find('.dfm_text').html(cat.join('<br>')); | |
| dfm.window.find('#dfm_files').html(loc.length+" "+"files"); | |
| } | |
| return cat.length; | |
| } else if (text.length == 1) { | |
| text = text[0].dfm_wedge(80); | |
| footer = text.indexOf("Searching") != -1; | |
| } else { | |
| if (strict.test(text[1])) { | |
| file = text[1]; | |
| text = dfm.previous; | |
| } else { | |
| file = line[1]; | |
| text = text[1].split(/\s+/); | |
| text = "<i class='fa fa-circle-o-notch fa-spin dfm'></i>Completed: "+text[1]+", Speed: "+text[2]+", ETA: "+text[3]; | |
| dfm.previous = text; | |
| footer = true; | |
| } | |
| } | |
| if (file == null || strict.test(file)) dfm.window.find('.dfm_text').html((file?line[0]+'... /'+dfm_escapeHTML(file.dfm_wedge())+'<br>':'')+text); | |
| if (footer) dfm_footer('write',text); | |
| return 0; | |
| } | |
| function dfm_fileManager(action) { | |
| switch (action) { | |
| case 'start': | |
| $('.ui-dfm .ui-dialog-buttonset button:lt(2)').prop('disabled',true); | |
| if (!dfm.running) nchan_filemanager.start(); | |
| dfm.running = true; | |
| break; | |
| case 'stop': | |
| if (dfm.running) nchan_filemanager.stop(); | |
| dfm_footer('clear'); | |
| dfm.running = false; | |
| break; | |
| } | |
| } | |
| function dfm_makeDialog(open) { | |
| if (open && dfm_read.action == 15) { | |
| dfm.window.dialog('open'); | |
| dfm_footer('hide'); | |
| return; | |
| } | |
| dfm.window = $('#dfm_dialogWindow'); | |
| if (dfm.window.dialog('instance') !== undefined) dfm.dialog = dfm.window.dialog('isOpen'); | |
| var dfm_source = dfm_read.source.split('\r').slice(0,9); | |
| switch (dfm_read.action) { | |
| case 0: // create folder/object | |
| dfm.window.html($('#dfm_templateCreateFolder').html()); | |
| dfm.height = 330; | |
| break; | |
| case 1: // delete folder/object | |
| dfm.window.html($('#dfm_templateDeleteFolder').html()); | |
| dfm.height = 330; | |
| break; | |
| case 2: // rename folder/object | |
| dfm.window.html($('#dfm_templateRenameFolder').html()); | |
| dfm.window.find('#dfm_target').val(dfm_read.target.strip().split('/').pop()); | |
| dfm.height = 330; | |
| break; | |
| case 3: // copy folder/object | |
| dfm.window.html($('#dfm_templateCopyFolder').html()); | |
| dfm.window.find('#dfm_target').val(dfm_read.target).prop('disabled',true); | |
| dfm.window.find('#dfm_sparse').prop('checked',dfm_read.sparse ? true : false); | |
| dfm.window.find('#dfm_exist').prop('checked',dfm_read.exist ? false : true); | |
| dfm.height = 630; | |
| break; | |
| case 4: // move folder/object (rsync) | |
| case 5: // move folder/object (mv) | |
| dfm.window.html($('#dfm_templateMoveFolder').html()); | |
| dfm.window.find('#dfm_target').val(dfm_read.target).prop('disabled',true); | |
| dfm.window.find('#dfm_sparse').prop('checked',dfm_read.sparse ? true : false); | |
| dfm.window.find('#dfm_exist').prop('checked',dfm_read.exist ? false : true); | |
| dfm.height = 630; | |
| break; | |
| case 6: // delete file | |
| dfm.window.html($('#dfm_templateDeleteFile').html()); | |
| dfm.height = 330; | |
| break; | |
| case 8: // copy file | |
| dfm.window.html($('#dfm_templateCopyFile').html()); | |
| dfm.window.find('#dfm_target').val(dfm_read.target).prop('disabled',true); | |
| dfm.window.find('#dfm_sparse').prop('checked',dfm_read.sparse ? true : false); | |
| dfm.window.find('#dfm_exist').prop('checked',dfm_read.exist ? false : true); | |
| dfm.height = 630; | |
| break; | |
| case 9: // move file (rsync) | |
| case 10: // move file (mv) | |
| dfm.window.html($('#dfm_templateMoveFile').html()); | |
| dfm.window.find('#dfm_target').val(dfm_read.target).prop('disabled',true); | |
| dfm.window.find('#dfm_sparse').prop('checked',dfm_read.sparse ? true :false); | |
| dfm.window.find('#dfm_exist').prop('checked',dfm_read.exist ? false : true); | |
| dfm.height = 630; | |
| break; | |
| case 11: // change owner | |
| dfm.window.html($('#dfm_templateChangeOwner').html()); | |
| dfm.window.find('#dfm_target').prop('disabled',true); | |
| dfm.height = 330; | |
| break; | |
| case 12: // change permission | |
| dfm.window.html($('#dfm_templateChangePermission').html()); | |
| dfm.window.find('#dfm_owner').prop('disabled',true); | |
| dfm.window.find('#dfm_group').prop('disabled',true); | |
| dfm.window.find('#dfm_other').prop('disabled',true); | |
| dfm.height = 330; | |
| break; | |
| case 15: // search | |
| dfm.window.html($('#dfm_templateSearch').html()); | |
| dfm.window.find('#dfm_target').val(dfm_read.target).prop('disabled',true); | |
| dfm.window.find('.dfm_loc').html(' ').css({'line-height':'normal'}); | |
| dfm.window.find('.dfm_text').html('').css({'line-height':'normal'}); | |
| dfm.height = 630; | |
| break; | |
| } | |
| dfm.window.find('#dfm_source').attr('size',Math.min(dfm.tsize[dfm_read.action],dfm_source.length)); | |
| dfm_createSource(dfm_source); | |
| dfm.window.find('#dfm_sparse').prop('disabled',true); | |
| dfm.window.find('#dfm_exist').prop('disabled',true); | |
| dfm.window.find('.dfm_sparse').css({'opacity':'0.5'}); | |
| dfm.window.find('.dfm_exist').css({'opacity':'0.5'}); | |
| dfm.window.dialog({ | |
| classes: {'ui-dialog': 'ui-dfm'}, | |
| autoOpen: open || dfm.dialog, | |
| title: dfm_read.title, | |
| height: dfm.height, | |
| width: 'auto', | |
| resizable: false, | |
| draggable: false, | |
| modal: true, | |
| buttons: { | |
| "Start": function(){ | |
| if (dfm_read.action == 15) { | |
| var dfm_target = dfm.window.find('#dfm_target').val(); | |
| dfm.window.find('.dfm_loc').html(' '); | |
| dfm.window.find('.dfm_text').html("Running..."); | |
| dfm_footer('hide'); | |
| dfm_fileManager('start'); | |
| $.post('/webGui/include/Control.php',{mode:'file',action:15,title:encodeURIComponent(dfm_read.title),source:encodeURIComponent(dfm_read.source),target:encodeURIComponent(dfm_target),hdlink:'',sparse:'',exist:'',zfs:''}); | |
| } else { | |
| return; | |
| } | |
| }, | |
| "Queue": function(){ | |
| return; | |
| }, | |
| "Cancel": function(){ | |
| dfm_fileManager('stop'); | |
| dfm.window.dialog('destroy'); | |
| $.post('/webGui/include/Control.php',{mode:'file',action:99},function(){}); | |
| } | |
| } | |
| }); | |
| dfm_close_button(); | |
| $('.ui-dfm .ui-dialog-buttonset button:lt(2)').prop('disabled',true); | |
| setTimeout(function(){$('.ui-dfm .ui-dialog-buttonset button:eq(2)').focus();}); | |
| if (open||dfm.dialog) dfm_footer('hide'); else dfm_footer('show'); | |
| } | |
| function dfm_openDialog(open) { | |
| $.post('/webGui/include/Control.php',{mode:'read'},function(data){ | |
| if (data) { | |
| dfm_read = JSON.parse(data); | |
| dfm_read.action = parseInt(dfm_read.action); | |
| } | |
| dfm_makeDialog(open); | |
| }); | |
| } | |
| var nchan_filemanager = new NchanSubscriber('/sub/filemanager',{subscriber:'websocket'}); | |
| nchan_filemanager.on('message', function(msg) { | |
| let data = $.parseJSON(msg); | |
| if (data.error) { | |
| dfm_fileManager('stop'); | |
| dfm.window.find('.dfm_text').addClass('orange-text').html(data.error); | |
| dfm.window.find('#dfm_target').prop('disabled',false); | |
| dfm.window.find('#dfm_sparse').prop('disabled',false); | |
| dfm.window.find('#dfm_exist').prop('disabled',false); | |
| dfm.window.find('#dfm_owner').prop('disabled',false); | |
| dfm.window.find('#dfm_group').prop('disabled',false); | |
| dfm.window.find('#dfm_other').prop('disabled',false); | |
| $('.ui-dfm .ui-dialog-buttonset button:lt(2)').prop('disabled',false); | |
| } else { | |
| let cat = dfm_showProgress(data.status); | |
| if (data.done == 1) { | |
| setTimeout(function(){$.post('/webGui/include/Control.php',{mode:'start'},function(queue){ | |
| switch (parseInt(queue)) { | |
| case 0: | |
| dfm_fileManager('stop'); | |
| dfm.window.dialog('destroy'); | |
| break; | |
| case 1: | |
| $.removeCookie('dfm_control.jobs'); | |
| case 2: | |
| dfm_openDialog(); | |
| break; | |
| } | |
| })}); | |
| } else if (data.done == 2) { | |
| nchan_filemanager.stop(); | |
| dfm.running = false; | |
| dfm.window.find('#dfm_target').prop('disabled',false).focus(); | |
| $('.ui-dfm .ui-dialog-buttonset button:eq(0)').prop('disabled',false); | |
| if (cat == 0) dfm.window.find('.dfm_text').html("No results found"); | |
| if ($('#user-notice:visible')) dfm_done(); | |
| } | |
| } | |
| }); | |
| </script> | |
| <!-- | |
| ########################## | |
| webGui/FeedbackButton.page | |
| ########################## | |
| --> | |
| <script> | |
| function FeedbackButton() { | |
| openChanges("feedback", "Feedback", "feedback"); | |
| } | |
| </script> | |
| <!-- | |
| ###################### | |
| webGui/InfoButton.page | |
| ###################### | |
| --> | |
| <script> | |
| function InfoButton() { | |
| openChanges("system_information", "System Information", "sysinfo"); | |
| } | |
| </script> | |
| <!-- | |
| ##################### | |
| webGui/LogButton.page | |
| ##################### | |
| --> | |
| <script> | |
| function LogButton() { | |
| openTerminal('syslog','syslog',''); | |
| } | |
| </script> | |
| <!-- | |
| ###################### | |
| webGui/HelpButton.page | |
| ###################### | |
| --> | |
| <script> | |
| function HelpButton() { | |
| if ($('.nav-item.HelpButton').toggleClass('active').hasClass('active')) { | |
| $('.inline_help').show('slow'); | |
| } else { | |
| $('.inline_help').hide('slow'); | |
| } | |
| } | |
| </script> | |
| <!-- | |
| ############################################## | |
| plugins/community.applications/CA_notices.page | |
| ############################################## | |
| --> | |
| <script> | |
| // set a cookie if the URL contains /Apps/ is CA in case the user instead of hitting "done" hits the back button. | |
| // Allows CA to restore its state in this situation. | |
| $(function() { | |
| // Set the cookie if the URL contains /Apps/ and it's not CA's settings page or the CA page itself. | |
| if ( window.location.href.includes("/Apps/") && ( ! window.location.href.endsWith("/Apps/") ) && ( ! window.location.href.endsWith("ca_settings") ) ) { | |
| $.cookie("ca_apps_referrer","true",{expires: 1,path:"/;SameSite=Lax"}); | |
| } else { | |
| // If we're not on CA itself then reset the cookie. If we're on CA do nothing. | |
| if ( (! window.location.href.includes("/Apps") ) || ( window.location.href.endsWith("ca_settings") ) ) { | |
| $.cookie("ca_apps_referrer","false",{expires: 1,path:"/;SameSite=Lax"}); | |
| } | |
| } | |
| }); | |
| </script> | |
| <script> | |
| var CA_BANNER_NOTICES = []; | |
| $(function() { | |
| $.post("/plugins/community.applications/scripts/notices.php",{action:"scan"},function(data) { | |
| console.groupCollapsed("Result: CA Background Scan"); | |
| console.log(data); | |
| console.groupEnd(); | |
| CA_BANNER_NOTICES = JSON.parse(data); | |
| $.each(CA_BANNER_NOTICES,function(i,el) { | |
| var dismiss = "<a class='bannerDismiss' onclick='ca_DismissNotice("+i+");'></a>"; | |
| CA_BANNER_NOTICES[i]['warning_index'] = addBannerWarning(el.Banner+" <a onclick='ca_Notices("+i+");' style='cursor:pointer;'>More Info</a>"+dismiss,true,true); | |
| }); | |
| }); | |
| }); | |
| function ca_Notices(index) { | |
| var title = CA_BANNER_NOTICES[index]['App']; | |
| if ( CA_BANNER_NOTICES[index]['Name'] ) { | |
| title = CA_BANNER_NOTICES[index]['Name']; | |
| } | |
| swal({ | |
| title: title, | |
| text: CA_BANNER_NOTICES[index]['PopUp'], | |
| type: "error", | |
| showCancelButton: false, | |
| showConfirmButton: true, | |
| html: true | |
| }); | |
| } | |
| function ca_DismissNotice(index) { | |
| swal({ | |
| title: "Are you sure?", | |
| text: "Are you sure you want to dismiss this warning?<br> ("+CA_BANNER_NOTICES[index]['Banner']+")", | |
| html: true, | |
| type: 'warning', | |
| showCancelButton: true, | |
| showConfirmButton: true, | |
| confirmButtonText: "Yes" | |
| },function(isConfirm) { | |
| if ( isConfirm ) { | |
| removeBannerWarning(CA_BANNER_NOTICES[index]['warning_index']); | |
| $.post("/plugins/community.applications/scripts/notices.php",{action:"dismiss",ID:CA_BANNER_NOTICES[index]['ID']}); | |
| } | |
| }); | |
| } | |
| </script> | |
| <!-- | |
| ################################################# | |
| plugins/dynamix.plugin.manager/PluginHelpers.page | |
| ################################################# | |
| --> | |
| <script> | |
| const ca_args = {}; | |
| function ca_refresh() { | |
| refresh(); | |
| } | |
| function ca_hidePluginUpdate(plugin,version,element) { | |
| $.cookie(plugin,version); | |
| $(element).hide(); | |
| } | |
| function ca_pluginUpdateInstall(plugin) { | |
| if (plugin == null) { | |
| openPlugin(ca_args.cmd,ca_args.title,'','ca_refresh'); | |
| return; | |
| } | |
| ca_args.cmd = 'plugin update '+plugin; | |
| ca_args.title = "Installing Update"; | |
| $.get('/plugins/dynamix.plugin.manager/include/ShowPlugins.php',{cmd:'alert'},function(data) { | |
| if (data==0) { | |
| // no alert message - proceed with update | |
| setTimeout(ca_pluginUpdateInstall); | |
| } else { | |
| // show alert message and ask for confirmation | |
| openAlert("showchanges /tmp/plugins/my_alerts.txt","Alert Message","ca_pluginUpdateInstall"); | |
| } | |
| }); | |
| } | |
| function caPluginUpdateCheck(plugin,options=[],callback) { | |
| var pluginFilename = plugin.substr(0, plugin.lastIndexOf(".")); | |
| console.time("checkPlugin "+plugin); | |
| console.log("checkPlugin "+plugin); | |
| // Remove support for positioning on specified element. Keep code in place for reference if necessary | |
| options.element = false; | |
| $.post("/plugins/dynamix.plugin.manager/scripts/PluginAPI.php",{action:'checkPlugin',options:{plugin:plugin,name:options.name}},function(caAPIresult) { | |
| console.groupCollapsed("Result checkPlugin "+plugin); | |
| console.log(caAPIresult); | |
| console.timeEnd("checkPlugin "+plugin); | |
| console.groupEnd(); | |
| var result = JSON.parse(caAPIresult); | |
| if ( options.debug == true ) result.updateAvailable = true; | |
| if ( ! options.element && ! options.dontShow ) { | |
| if ( result.updateAvailable ) { | |
| var HTML = result.updateMessage+"<span class='bannerInfo fa fa-info-circle big' title=\"View Release Notes\" onclick='openChanges(\"showchanges /tmp/plugins/"+pluginFilename+".txt\",\"Release Notes\")'></span><a class='ca_PluginUpdateInstall' onclick='ca_pluginUpdateInstall(\""+plugin+"\")'>"+result.linkMessage+"</a>"; | |
| addBannerWarning(HTML,false,options.noDismiss); | |
| } | |
| } else { | |
| if ( $.cookie(plugin) != result.version ) { | |
| if ( result.updateAvailable ) { | |
| var HTML = result.updateMessage+"<span class='bannerInfo fa fa-info-circle big' title=\"View Release Notes\" onclick='openChanges(\"showchanges /tmp/plugins/"+pluginFilename+".txt\",\"Release Notes\")'></span><a class='ca_PluginUpdateInstall' onclick='ca_pluginUpdateInstall(\""+plugin+"\")'>"+result.linkMessage+"</a>"; | |
| if ( ! options.noDismiss ) { | |
| HTML = HTML.concat("<span class='ca_PluginUpdateDismiss'><i class='fa fa-close' onclick='ca_hidePluginUpdate(\""+plugin+"\",\""+result.version+"\",\""+options.element+"\")'></i></span>"); | |
| } | |
| result.HTML = HTML; | |
| if ( ! options.dontShow ) { | |
| $(options.element).html(HTML); | |
| $(options.element).addClass("ca_element_notice"); | |
| } | |
| } | |
| } | |
| } | |
| if ( typeof options === "function" ) { | |
| callback = options; | |
| } | |
| if ( typeof callback === "function" ) { | |
| callback(JSON.stringify(result)); | |
| } | |
| }); | |
| } | |
| </script> | |
| <!-- | |
| ################################################ | |
| plugins/dynamix.docker.manager/AddContainer.page | |
| ################################################ | |
| --> | |
| <style id="unraid-theme-css-vars"> | |
| :root { | |
| --theme-dark-mode: 1; | |
| --theme-name: black; | |
| --header-gradient-start: var(--color-header-gradient-start, rgba(242, 242, 242, 0)); | |
| --header-gradient-end: var(--color-header-gradient-end, rgba(242, 242, 242, 1)); | |
| --color-header-gradient-start: var(--color-header-gradient-start, rgba(242, 242, 242, 0)); | |
| --color-header-gradient-end: var(--color-header-gradient-end, rgba(242, 242, 242, 1)); | |
| --banner-gradient: linear-gradient(90deg, var(--color-header-gradient-start, rgba(242, 242, 242, 0)) 0, var(--color-header-gradient-end, rgba(242, 242, 242, 1)) var(--banner-gradient-stop, 30%)); | |
| } | |
| </style> | |
| <script id="unraid-uui-src-register-ts" type="module" src="/plugins/dynamix.my.servers/unraid-components/uui/register.BY4eX8LA.js" data-unraid="1"></script> | |
| <link id="unraid-uui-style-css" rel="stylesheet" href="/plugins/dynamix.my.servers/unraid-components/uui/ui.C8ToJLhk.css" data-unraid="1"> | |
| <script id="unraid-standalone-Accordion-vue-CBWrtepo-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Accordion.vue-CBWrtepo.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-AccordionContent-vue-B4kirf9e-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/AccordionContent.vue-B4kirf9e.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ActivationSteps-vue-vue-type-script-setup-true-lang-CA6DIb5A-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ActivationSteps.vue_vue_type_script_setup_true_lang-CA6DIb5A.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ApiKeyAuthorize-standalone-DaNAwPfO-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ApiKeyAuthorize.standalone-DaNAwPfO.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ApiKeyCreate-vue-vue-type-script-setup-true-lang-YGUYaJWU-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ApiKeyCreate.vue_vue_type_script_setup_true_lang-YGUYaJWU.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ApiKeyPage-standalone-BFoSMc62-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ApiKeyPage.standalone-BFoSMc62.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ApiStatus-standalone-CZHWstxs-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ApiStatus.standalone-CZHWstxs.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ArrowDownTrayIcon-BqUfqT5L-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ArrowDownTrayIcon-BqUfqT5L.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ArrowTopRightOnSquareIcon-DHWWP9hf-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ArrowTopRightOnSquareIcon-DHWWP9hf.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Auth-standalone-D9HAaQak-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Auth.standalone-D9HAaQak.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Auth-standalone-vue-vue-type-script-setup-true-lang-Df5I0qn2-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Auth.standalone.vue_vue_type_script_setup_true_lang-Df5I0qn2.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Badge-vue-KqWKtyEY-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Badge.vue-KqWKtyEY.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-BaseLogViewer-BxJJOUIy-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/BaseLogViewer-BxJJOUIy.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-BrandButton-vue-E1T31Iln-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/BrandButton.vue-E1T31Iln.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Button-vue-CaLXUl4Q-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Button.vue-CaLXUl4Q.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-CallbackHandler-standalone-DGlwqpj0-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/CallbackHandler.standalone-DGlwqpj0.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ChangelogModal-vue-vue-type-script-setup-true-lang-CEjWod4B-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ChangelogModal.vue_vue_type_script_setup_true_lang-CEjWod4B.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-CheckIcon-C0DJtMEy-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/CheckIcon-C0DJtMEy.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-CheckUpdateResponseModal-vue-vue-type-script-setup-true-lang-D2eymufs-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/CheckUpdateResponseModal.vue_vue_type_script_setup_true_lang-D2eymufs.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ClipboardDocumentIcon-BDOFX04o-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ClipboardDocumentIcon-BDOFX04o.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-CogIcon--moAb3tE-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/CogIcon--moAb3tE.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Collection-BACZZDJd-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Collection-BACZZDJd.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ColorSwitcher-standalone-BPSDjyl5-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ColorSwitcher.standalone-BPSDjyl5.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ConnectSettings-standalone-D55Ex9fC-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ConnectSettings.standalone-D55Ex9fC.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-CriticalNotifications-standalone-dzE5c2gH-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/CriticalNotifications.standalone-dzE5c2gH.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-DetailTest-standalone-CrUygXeR-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/DetailTest.standalone-CrUygXeR.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-DevModalTest-standalone-CAOmdG52-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/DevModalTest.standalone-CAOmdG52.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-DevSettings-CTnT3sxA-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/DevSettings-CTnT3sxA.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-DevThemeSwitcher-standalone-BVekbhGL-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/DevThemeSwitcher.standalone-BVekbhGL.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Dialog-vue-0EeVrwN--js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Dialog.vue-0EeVrwN-.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-DialogDescription-vue-Cixriin8-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/DialogDescription.vue-Cixriin8.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-DialogFooter-vue-DEKl4sk2-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/DialogFooter.vue-DEKl4sk2.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-DialogTrigger-DWPWWumJ-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/DialogTrigger-DWPWWumJ.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-DockerContainerOverview-standalone-D-pPELmS-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/DockerContainerOverview.standalone-D_pPELmS.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-DowngradeOs-standalone-BWE0I6VO-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/DowngradeOs.standalone-BWE0I6VO.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-DropdownMenuItem-vue-B4V1V3hR-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/DropdownMenuItem.vue-B4V1V3hR.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ExclamationTriangleIcon-tmWYs6Zb-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ExclamationTriangleIcon-tmWYs6Zb.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-EyeIcon-DMx4nmCn-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/EyeIcon-DMx4nmCn.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-EyeIcon-DWu-jq5C-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/EyeIcon-DWu-jq5C.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-HeaderOsVersion-standalone-Bk4l8-87-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/HeaderOsVersion.standalone-Bk4l8_87.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Input-vue-DKbGhR-x-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Input.vue-DKbGhR-x.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Label-vue-CknDA31L-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Label.vue-CknDA31L.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-LinkIcon--0GmE0ba-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/LinkIcon-_0GmE0ba.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-LocaleSwitcher-D6uqJ-BJ-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/LocaleSwitcher-D6uqJ-BJ.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-LocaleSwitcher-vue-vue-type-script-setup-true-lang-yhQsg8vR-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/LocaleSwitcher.vue_vue_type_script_setup_true_lang-yhQsg8vR.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-LogViewer-standalone-Ds5-ijXC-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/LogViewer.standalone-Ds5-ijXC.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-LogViewerToolbar-vue-vue-type-script-setup-true-lang-DO68wX2N-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/LogViewerToolbar.vue_vue_type_script_setup_true_lang-DO68wX2N.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-MenuItem-DtvfnqfN-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/MenuItem-DtvfnqfN.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Modals-standalone-563GfcuK-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Modals.standalone-563GfcuK.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-PageContainer-vue-CmOVLK44-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/PageContainer.vue-CmOVLK44.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-PopperContent-BH7NeBfy-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/PopperContent-BH7NeBfy.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Registration-standalone-5SQu2M---js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Registration.standalone-5SQu2M--.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ResponsiveModalFooter-vue-Bb1CfuFk-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ResponsiveModalFooter.vue-Bb1CfuFk.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Select-vue-Bsx6FJew-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Select.vue-Bsx6FJew.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-SelectItem-vue-BoHpyMKj-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/SelectItem.vue-BoHpyMKj.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ServerStackIcon-COS1-JxB-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ServerStackIcon-COS1-JxB.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-SettingsGrid-vue-hTompefU-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/SettingsGrid.vue-hTompefU.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-SheetTitle-vue-BLzszo-o-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/SheetTitle.vue-BLzszo-o.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-SingleLogViewer-vue-vue-type-script-setup-true-lang-DEhO7dJf-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/SingleLogViewer.vue_vue_type_script_setup_true_lang-DEhO7dJf.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-SsoButton-standalone-B3L7skey-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/SsoButton.standalone-B3L7skey.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-StepperTrigger-vue-cFihtgic-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/StepperTrigger.vue-cFihtgic.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Switch-vue-w8n2jega-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Switch.vue-w8n2jega.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Tabs-KWalmfoN-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Tabs-KWalmfoN.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-TabsContent-vue-Di9k-QFe-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/TabsContent.vue-Di9k-QFe.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-Teleport-BvyaOros-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/Teleport-BvyaOros.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-TestThemeSwitcher-standalone-nJ5mHT9x-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/TestThemeSwitcher.standalone-nJ5mHT9x.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-TestUpdateModal-standalone-BWvV7yvR-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/TestUpdateModal.standalone-BWvV7yvR.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ThemeSwitcher-standalone-B-zTW1w6-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ThemeSwitcher.standalone-B_zTW1w6.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ThirdPartyDrivers-vue-vue-type-script-setup-true-lang-CwHHiAZu-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ThirdPartyDrivers.vue_vue_type_script_setup_true_lang-CwHHiAZu.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-TooltipProvider-vue-BDwvVQ77-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/TooltipProvider.vue-BDwvVQ77.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-UnraidToaster-DkP03xu--js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/UnraidToaster-DkP03xu-.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-UpdateExpiration-vue-vue-type-script-setup-true-lang-aspw7Bl2-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/UpdateExpiration.vue_vue_type_script_setup_true_lang-aspw7Bl2.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-UpdateOs-standalone-BiIv-oK6-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/UpdateOs.standalone-BiIv-oK6.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-UptimeExpire-vue-vue-type-script-setup-true-lang-BjhlZndW-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/UptimeExpire.vue_vue_type_script_setup_true_lang-BjhlZndW.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-UserProfile-standalone-Bs6VGdyt-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/UserProfile.standalone-Bs6VGdyt.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-VisuallyHidden-aHftkSBN-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/VisuallyHidden-aHftkSBN.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-WanIpCheck-standalone-CowmrXkp-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/WanIpCheck.standalone-CowmrXkp.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-WelcomeModal-standalone-CDloasRh-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/WelcomeModal.standalone-CDloasRh.js" data-unraid="1"></script> | |
| <script id="unraid-standalone--commonjsHelpers-DWwsNxpa-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/_commonjsHelpers-DWwsNxpa.js" data-unraid="1"></script> | |
| <script id="unraid-standalone--plugin-vue-export-helper-1tPrXgE0-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/_plugin-vue_export-helper-1tPrXgE0.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-activationCode-query-D4uWeD6B-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/activationCode.query-D4uWeD6B.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-activationCodeModal-Czvg1GWi-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/activationCodeModal-Czvg1GWi.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ar-CCs7lHqg-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ar-CCs7lHqg.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-auto-mount-Cag3wvcT-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/auto-mount-Cag3wvcT.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-bn-C2cBSRxf-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/bn-C2cBSRxf.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-browser-DAeeVtoC-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/browser-DAeeVtoC.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ca-C1TJVwK3-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ca-C1TJVwK3.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-createLucideIcon-B2CayXRj-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/createLucideIcon-B2CayXRj.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-cs-DMZG6k2d-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/cs-DMZG6k2d.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-da-CzJckekw-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/da-CzJckekw.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-dateTime-w4Dz--BY-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/dateTime-w4Dz_-BY.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-de-DuuofPDl-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/de-DuuofPDl.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-es-KqJsC-WH-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/es-KqJsC-WH.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-fr-DmtBk9Qm-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/fr-DmtBk9Qm.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-fragment-masking-BlFwCuXa-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/fragment-masking-BlFwCuXa.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-functions-L7NLyrRb-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/functions-L7NLyrRb.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-hi-Brht3xqc-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/hi-Brht3xqc.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-hr-ctX8ZC1x-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/hr-ctX8ZC1x.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-hu-D0imTyRO-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/hu-D0imTyRO.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-index-BrMsb7f5-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/index-BrMsb7f5.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-index-YxFMH1wt-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/index-YxFMH1wt.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-index-Zytn8sRw-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/index-Zytn8sRw.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-it-B3BxzJdm-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/it-B3BxzJdm.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ja-8ErzG4aG-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ja-8ErzG4aG.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-jsonforms-i18n-Bq0914DA-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/jsonforms-i18n-Bq0914DA.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ko-yv-db-4t-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ko-yv_db-4t.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-lv-CwQXFQUa-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/lv-CwQXFQUa.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-markdown-COSHG1tq-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/markdown-COSHG1tq.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-nl-D-0U-0Ug-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/nl-D_0U_0Ug.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-no-CSUdpcvb-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/no-CSUdpcvb.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-notification-subscription-BxPg--7f-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/notification.subscription-BxPg__7f.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-pl-CugezL1R-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/pl-CugezL1R.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-pt-CcfvQ0cb-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/pt-CcfvQ0cb.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-purchase-n5buiYn6-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/purchase-n5buiYn6.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ro-Bc-rmhJH-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ro-Bc_rmhJH.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-ru-Buwss5xv-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/ru-Buwss5xv.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-standalone-apps-CDzdW70U-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/standalone-apps-CDzdW70U.js" data-unraid="1"></script> | |
| <link id="unraid-standalone-standalone-apps-KNqL7aSw-css" rel="stylesheet" href="/plugins/dynamix.my.servers/unraid-components/standalone/standalone-apps-KNqL7aSw.css" data-unraid="1"> | |
| <script id="unraid-standalone-sv-Cl07dK-d-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/sv-Cl07dK-d.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-uk-xoRhrytU-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/uk-xoRhrytU.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-useArrowNavigation-m9a1sGcE-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/useArrowNavigation-m9a1sGcE.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-useClipboardWithToast-dnybZY5n-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/useClipboardWithToast-dnybZY5n.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-useDirection-B5CgVqfo-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/useDirection-B5CgVqfo.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-useFormControl-BGx4itTq-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/useFormControl-BGx4itTq.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-usePrimitiveElement-DEQUqneM-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/usePrimitiveElement-DEQUqneM.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-x-Bee61x86-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/x-Bee61x86.js" data-unraid="1"></script> | |
| <script id="unraid-standalone-zh-zk-9Fhtz-js" type="module" src="/plugins/dynamix.my.servers/unraid-components/standalone/zh-zk-9Fhtz.js" data-unraid="1"></script> | |
| <script> | |
| // Remove duplicate resource tags to prevent multiple loads | |
| (function() { | |
| var elements = document.querySelectorAll('[data-unraid="1"]'); | |
| var seen = {}; | |
| for (var i = 0; i < elements.length; i++) { | |
| var el = elements[i]; | |
| if (seen[el.id]) { | |
| el.remove(); | |
| } else { | |
| seen[el.id] = true; | |
| } | |
| } | |
| })(); | |
| </script></head> | |
| <body> | |
| <unraid-modals></unraid-modals> | |
| <unraid-modals></unraid-modals> <div id="header" class="image"> | |
| <unraid-header-os-version></unraid-header-os-version> | |
| <script> | |
| window.LOCALE = ""; | |
| </script> | |
| <unraid-user-profile server="{"array":{"state":"Started","progress":""},"apiKey":"","apiVersion":"4.10.0+86b6c4f","avatar":"","caseModel":"3u-disks","config":{"valid":true,"error":null},"connectPluginInstalled":"dynamix.unraid.net.plg","connectPluginVersion":"4.29.2","csrf":"3DF6513BAB63B5CF","dateTimeFormat":{"date":"%c","time":"%R"},"description":"Media server","deviceCount":"7","email":"ekbosley@gmail.com","expireTime":0,"extraOrigins":[],"flashProduct":"SanDisk_3.2Gen1","flashVendor":"USB","flashBackupActivated":"true","guid":"0781-5591-9155-81073130B2AE","hasRemoteApikey":true,"internalPort":"8443","keyfile":"iOugWFlr6nhSPjVYrGc5ODnR0m0fPnl34P9N3Dk3EmWJSIiXy5ZBuAJxoT-p9m9HISs1jalsVNCDX3M3dwoUmpZ5llS-3HI0dmAlP8dsWwlyKii_07agfixn9cv0_KbBzT87vFgzbZsvlSgtiftveBc4TfyVY0FXPbigb64FzIJw_JPiabEGvOgCfNWfJnB6IbKj1bd8ugmdW3NgWn3hp3bpC-emN9sZlQVXS33drN6VEQjbY3aaEYPrmzauQy5fnqbcr4j-SLvRWU6nClf9a_I3AYnlbfy13QFzWN-4BZ-NVkg8fvLI0EQbKnsuCsb5JulcdhISFcZd4aEKFYvmiQ","lanIp":"","locale":"en_US","model":"Custom","name":"Unraid","osVersion":"7.3.0-beta.0.5","osVersionBranch":"test","protocol":"https","rebootType":"","rebootVersion":"","regDevs":-1,"regGen":1,"regGuid":"0781-5591-9155-81073130B2AE","regTo":"Eli Bosley","regTm":1743025298000,"regTy":"Lifetime","regExp":"","registered":true,"registeredTime":"","site":"https:\/\/unraid.local:8443","ssoEnabled":true,"state":"LIFETIME","theme":{"banner":true,"bannerGradient":true,"bgColor":"","descriptionShow":true,"metaColor":"","name":"black","textColor":""},"ts":1767377629,"uptime":1766103037000,"username":"ekbosley@gmail.com","wanFQDN":"","updateOsNotificationsEnabled":true,"updateOsResponse":{"version":"7.3.0-beta.0.5","name":"Unraid 7.3.0-beta.0.5","date":"2025-12-05","date0":"2025-12-05","isNewer":false,"sha256":null,"changelog":null,"changelogPretty":null,"isEligible":true,"params":{"branch":"test","current_version":"7.3.0-beta.0.5"}}}"></unraid-user-profile> | |
| </div> | |
| <div id="menu"> | |
| <div class="nav-tile"> | |
| <div class="nav-item"> | |
| <a href="/Dashboard" onclick="initab('/Dashboard')"> | |
| Dashboard </a> | |
| </div> | |
| <div class="nav-item"> | |
| <a href="/Main" onclick="initab('/Main')"> | |
| Main </a> | |
| </div> | |
| <div class="nav-item"> | |
| <a href="/Shares" onclick="initab('/Shares')"> | |
| Shares </a> | |
| </div> | |
| <div class="nav-item"> | |
| <a href="/Users" onclick="initab('/Users')"> | |
| Users </a> | |
| </div> | |
| <div class="nav-item"> | |
| <a href="/Settings" onclick="initab('/Settings')"> | |
| Settings </a> | |
| </div> | |
| <div class="nav-item"> | |
| <a href="/Plugins" onclick="initab('/Plugins')"> | |
| Plugins </a> | |
| </div> | |
| <div class="nav-item"> | |
| <a href="/Docker" onclick="initab('/Docker')"> | |
| Docker </a> | |
| </div> | |
| <div class="nav-item"> | |
| <a href="/VMs" onclick="initab('/VMs')"> | |
| VMs </a> | |
| </div> | |
| <div class="nav-item active"> | |
| <a href="/Apps" onclick="initab('/Apps')"> | |
| Apps </a> | |
| </div> | |
| <div class="nav-item"> | |
| <a href="/Tools" onclick="initab('/Tools')"> | |
| Tools </a> | |
| </div> | |
| </div> | |
| <div class="nav-tile right"> | |
| <div class="nav-item LanguageButton util"> | |
| <a | |
| href="#" | |
| onclick="LanguageButton();return false;" | |
| title="Switch Language" | |
| > | |
| <b class='icon-u-switch system'></b> <span>Switch Language</span> | |
| </a> | |
| </div> | |
| <div class="nav-user"></div> | |
| <div class="nav-item gui_search util"> | |
| <a | |
| href="#" | |
| onclick="gui_search();return false;" | |
| title="Search" | |
| > | |
| <b class='icon-u-search system'></b> <span>Search</span> | |
| </a> | |
| </div> | |
| <div class="nav-item LogoutButton util"> | |
| <a | |
| href="#" | |
| onclick="LogoutButton();return false;" | |
| title="Logout" | |
| > | |
| <b class='icon-u-logout system'></b> <span>Logout</span> | |
| </a> | |
| </div> | |
| <div class="nav-item TerminalButton util"> | |
| <a | |
| href="#" | |
| onclick="TerminalButton();return false;" | |
| title="Terminal" | |
| > | |
| <b class='icon-u-terminal system'></b> <span>Terminal</span> | |
| </a> | |
| </div> | |
| <div class="nav-item BrowseButton util"> | |
| <a | |
| href="#" | |
| onclick="BrowseButton();return false;" | |
| title="File Manager" | |
| > | |
| <b class='icon-u-duplicate system'></b> <span>File Manager</span> | |
| </a> | |
| </div> | |
| <div class="nav-item FeedbackButton util"> | |
| <a | |
| href="#" | |
| onclick="FeedbackButton();return false;" | |
| title="Feedback" | |
| > | |
| <b class='icon-u-chat system'></b> <span>Feedback</span> | |
| </a> | |
| </div> | |
| <div class="nav-item InfoButton util"> | |
| <a | |
| href="#" | |
| onclick="InfoButton();return false;" | |
| title="Info" | |
| > | |
| <b class='icon-u-display system'></b> <span>Info</span> | |
| </a> | |
| </div> | |
| <div class="nav-item LogButton util"> | |
| <a | |
| href="#" | |
| onclick="LogButton();return false;" | |
| title="Log" | |
| > | |
| <b class='icon-u-log system'></b> <span>Log</span> | |
| </a> | |
| </div> | |
| <div class="nav-item HelpButton util"> | |
| <a | |
| href="#" | |
| onclick="HelpButton();return false;" | |
| title="Help" | |
| > | |
| <b class='icon-u-help system'></b> <span>Help</span> | |
| </a> | |
| </div> | |
| <div class="nav-user"></div> | |
| <div class="nav-user"></div> | |
| </div> | |
| </div> | |
| <div id="displaybox"> | |
| <div class="content"> | |
| <!-- | |
| ################################################ | |
| plugins/dynamix.docker.manager/AddContainer.page | |
| ################################################ | |
| --> | |
| <div class="title"> | |
| <span class='left inline-flex flex-row items-center gap-1'><i class='fa fa-th title'></i>Add Container</span> <span class="right inline-flex flex-row items-center gap-1"></span> | |
| </div> | |
| <p><!DOCTYPE HTML> | |
| <html lang="en"> | |
| <head> | |
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> | |
| <meta http-equiv="Content-Security-Policy" content="block-all-mixed-content"> | |
| <meta name="format-detection" content="telephone=no"> | |
| <meta name="viewport" content="width=1300"> | |
| <meta name="robots" content="noindex, nofollow"> | |
| <meta name="referrer" content="same-origin"> | |
| <style> | |
| /************************ | |
| / | |
| / Fonts | |
| / | |
| /************************/ | |
| @font-face{font-family:clear-sans;font-weight:normal;font-style:normal; src:url('/webGui/styles/clear-sans.woff?v=20220513') format('woff')} | |
| @font-face{font-family:clear-sans;font-weight:bold;font-style:normal; src:url('/webGui/styles/clear-sans-bold.woff?v=20220513') format('woff')} | |
| @font-face{font-family:clear-sans;font-weight:normal;font-style:italic; src:url('/webGui/styles/clear-sans-italic.woff?v=20220513') format('woff')} | |
| @font-face{font-family:clear-sans;font-weight:bold;font-style:italic; src:url('/webGui/styles/clear-sans-bold-italic.woff?v=20220513') format('woff')} | |
| @font-face{font-family:bitstream;font-weight:normal;font-style:normal; src:url('/webGui/styles/bitstream.woff?v=20220513') format('woff')} | |
| @font-face{font-family:bitstream;font-weight:bold;font-style:normal; src:url('/webGui/styles/bitstream-bold.woff?v=20220513') format('woff')} | |
| @font-face{font-family:bitstream;font-weight:normal;font-style:italic; src:url('/webGui/styles/bitstream-italic.woff?v=20220513') format('woff')} | |
| @font-face{font-family:bitstream;font-weight:bold;font-style:italic; src:url('/webGui/styles/bitstream-bold-italic.woff?v=20220513') format('woff')} | |
| html{font-family:clear-sans;height:100%} | |
| body{font-size:1.3rem;padding:0;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} | |
| .logLine{color:#f2f2f2;font-family:bitstream;font-size:1.2rem;line-height:1.6rem;margin:0 8px;padding:0;text-align:left} | |
| .logLine.spacing{margin:10px} | |
| input[type=button],input[type=reset],input[type=submit],button,button[type=button],a.button{font-family:clear-sans;font-size:1.1rem;text-transform:uppercase;margin:0;padding:9px 18px;text-decoration:none;white-space:nowrap;cursor:pointer;outline:none;border-radius:4px;border:0;color:#f15a2c;background:-webkit-gradient(linear,left top,right top,from(#e22828),to(#ff8c2f)) 0 0 no-repeat,-webkit-gradient(linear,left top,right top,from(#e22828),to(#ff8c2f)) 0 100% no-repeat,-webkit-gradient(linear,left bottom,left top,from(#e22828),to(#e22828)) 0 100% no-repeat,-webkit-gradient(linear,left bottom,left top,from(#ff8c2f),to(#ff8c2f)) 100% 100% no-repeat;background:linear-gradient(90deg,#e22828 0,#ff8c2f) 0 0 no-repeat,linear-gradient(90deg,#e22828 0,#ff8c2f) 0 100% no-repeat,linear-gradient(0deg,#e22828 0,#e22828) 0 100% no-repeat,linear-gradient(0deg,#ff8c2f 0,#ff8c2f) 100% 100% no-repeat;background-size:100% 2px,100% 2px,2px 100%,2px 100%} | |
| input:hover[type=button],input:hover[type=reset],input:hover[type=submit],button:hover,button:hover[type=button],a.button:hover{color:#f2f2f2;background:-webkit-gradient(linear,left top,right top,from(#e22828),to(#ff8c2f));background:linear-gradient(90deg,#e22828 0,#ff8c2f)} | |
| input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled],button[disabled],button[type=button][disabled],a.button[disabled] | |
| input:hover[type=button][disabled],input:hover[type=reset][disabled],input:hover[type=submit][disabled],button:hover[disabled],button:hover[type=button][disabled],a.button:hover[disabled] | |
| input:active[type=button][disabled],input:active[type=reset][disabled],input:active[type=submit][disabled],button:active[disabled],button:active[type=button][disabled],a.button:active[disabled] | |
| {opacity:0.5;cursor:default;color:#808080;background:-webkit-gradient(linear,left top,right top,from(#404040),to(#808080)) 0 0 no-repeat,-webkit-gradient(linear,left top,right top,from(#404040),to(#808080)) 0 100% no-repeat,-webkit-gradient(linear,left bottom,left top,from(#404040),to(#404040)) 0 100% no-repeat,-webkit-gradient(linear,left bottom,left top,from(#808080),to(#808080)) 100% 100% no-repeat;background:linear-gradient(90deg,#404040 0,#808080) 0 0 no-repeat,linear-gradient(90deg,#404040 0,#808080) 0 100% no-repeat,linear-gradient(0deg,#404040 0,#404040) 0 100% no-repeat,linear-gradient(0deg,#808080 0,#808080) 100% 100% no-repeat;background-size:100% 2px,100% 2px,2px 100%,2px 100%} | |
| p.centered{text-align:center} | |
| span.error{color:#D8000C;background-color:#FFBABA;display:block;width:100%} | |
| span.warn{color:#9F6000;background-color:#FEEFB3;display:block;width:100%} | |
| span.system{color:#00529B;background-color:#BDE5F8;display:block;width:100%} | |
| span.array{color:#4F8A10;background-color:#DFF2BF;display:block;width:100%} | |
| span.login{color:#D63301;background-color:#FFCCBA;display:block;width:100%} | |
| span.label{padding:4px 8px;margin-right:10px;border-radius:4px;display:inline;width:auto} | |
| legend{font-size:1.1rem;font-weight:bold} | |
| #content{margin:10;padding:0} | |
| </style> | |
| <script> | |
| /* | |
| This script block has the following license. | |
| Original: https://github.com/drudru/ansi_up Version: 5.0.1 | |
| Modified by: https://github.com/nysos3 for use in unRaid | |
| (The MIT License) | |
| Copyright (c) 2011 Dru Nelson | |
| Permission is hereby granted, free of charge, to any person obtaining | |
| a copy of this software and associated documentation files (the | |
| 'Software'), to deal in the Software without restriction, including | |
| without limitation the rights to use, copy, modify, merge, publish, | |
| distribute, sublicense, and/or sell copies of the Software, and to | |
| permit persons to whom the Software is furnished to do so, subject to | |
| the following conditions: | |
| The above copyright notice and this permission notice shall be | |
| included in all copies or substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, | |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |
| IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |
| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |
| TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |
| SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| */ | |
| var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { | |
| if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } | |
| return cooked; | |
| }; | |
| var PacketKind; | |
| (function (PacketKind) { | |
| PacketKind[PacketKind["EOS"] = 0] = "EOS"; | |
| PacketKind[PacketKind["Text"] = 1] = "Text"; | |
| PacketKind[PacketKind["Incomplete"] = 2] = "Incomplete"; | |
| PacketKind[PacketKind["ESC"] = 3] = "ESC"; | |
| PacketKind[PacketKind["Unknown"] = 4] = "Unknown"; | |
| PacketKind[PacketKind["SGR"] = 5] = "SGR"; | |
| PacketKind[PacketKind["OSCURL"] = 6] = "OSCURL"; | |
| })(PacketKind || (PacketKind = {})); | |
| var AnsiUp = (function() { | |
| function AnsiUp() { | |
| this.VERSION = "5.0.1"; | |
| this.setup_palettes(); | |
| this._use_classes = false; | |
| this.bold = false; | |
| this.fg = this.bg = null; | |
| this._buffer = ''; | |
| this._url_whitelist = { 'http': 1, 'https': 1 }; | |
| } | |
| Object.defineProperty(AnsiUp.prototype, "use_classes", { | |
| get: function() { | |
| return this._use_classes; | |
| }, | |
| set: function(arg) { | |
| this._use_classes = arg; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| Object.defineProperty(AnsiUp.prototype, "url_whitelist", { | |
| get: function() { | |
| return this._url_whitelist; | |
| }, | |
| set: function(arg) { | |
| this._url_whitelist = arg; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| AnsiUp.prototype.setup_palettes = function() { | |
| var _this = this; | |
| this.ansi_colors = [ | |
| [ | |
| { rgb: [0, 0, 0], class_name: "ansi-black" }, | |
| { rgb: [187, 0, 0], class_name: "ansi-red" }, | |
| { rgb: [0, 187, 0], class_name: "ansi-green" }, | |
| { rgb: [187, 187, 0], class_name: "ansi-yellow" }, | |
| { rgb: [0, 0, 187], class_name: "ansi-blue" }, | |
| { rgb: [187, 0, 187], class_name: "ansi-magenta" }, | |
| { rgb: [0, 187, 187], class_name: "ansi-cyan" }, | |
| { rgb: [255, 255, 255], class_name: "ansi-white" } | |
| ], | |
| [ | |
| { rgb: [85, 85, 85], class_name: "ansi-bright-black" }, | |
| { rgb: [255, 85, 85], class_name: "ansi-bright-red" }, | |
| { rgb: [0, 255, 0], class_name: "ansi-bright-green" }, | |
| { rgb: [255, 255, 85], class_name: "ansi-bright-yellow" }, | |
| { rgb: [85, 85, 255], class_name: "ansi-bright-blue" }, | |
| { rgb: [255, 85, 255], class_name: "ansi-bright-magenta" }, | |
| { rgb: [85, 255, 255], class_name: "ansi-bright-cyan" }, | |
| { rgb: [255, 255, 255], class_name: "ansi-bright-white" } | |
| ] | |
| ]; | |
| this.palette_256 = []; | |
| this.ansi_colors.forEach(function(palette) { | |
| palette.forEach(function(rec) { | |
| _this.palette_256.push(rec); | |
| }); | |
| }); | |
| var levels = [0, 95, 135, 175, 215, 255]; | |
| for (var r = 0; r < 6; ++r) { | |
| for (var g = 0; g < 6; ++g) { | |
| for (var b = 0; b < 6; ++b) { | |
| var col = { rgb: [levels[r], levels[g], levels[b]], class_name: 'truecolor' }; | |
| this.palette_256.push(col); | |
| } | |
| } | |
| } | |
| var grey_level = 8; | |
| for (var i = 0; i < 24; ++i, grey_level += 10) { | |
| var gry = { rgb: [grey_level, grey_level, grey_level], class_name: 'truecolor' }; | |
| this.palette_256.push(gry); | |
| } | |
| }; | |
| AnsiUp.prototype.escape_txt_for_html = function(txt) { | |
| return txt.replace(/[&<>"']/gm, function(str) { | |
| if (str === "&") | |
| return "&"; | |
| if (str === "<") | |
| return "<"; | |
| if (str === ">") | |
| return ">"; | |
| if (str === "\"") | |
| return """; | |
| if (str === "'") | |
| return "'"; | |
| }); | |
| }; | |
| AnsiUp.prototype.append_buffer = function(txt) { | |
| var str = this._buffer + txt; | |
| this._buffer = str; | |
| }; | |
| AnsiUp.prototype.get_next_packet = function() { | |
| var pkt = { | |
| kind: PacketKind.EOS, | |
| text: '', | |
| url: '' | |
| }; | |
| var len = this._buffer.length; | |
| if (len == 0) | |
| return pkt; | |
| var pos = this._buffer.indexOf("\x1B"); | |
| if (pos == -1) { | |
| pkt.kind = PacketKind.Text; | |
| pkt.text = this._buffer; | |
| this._buffer = ''; | |
| return pkt; | |
| } | |
| if (pos > 0) { | |
| pkt.kind = PacketKind.Text; | |
| pkt.text = this._buffer.slice(0, pos); | |
| this._buffer = this._buffer.slice(pos); | |
| return pkt; | |
| } | |
| if (pos == 0) { | |
| if (len == 1) { | |
| pkt.kind = PacketKind.Incomplete; | |
| return pkt; | |
| } | |
| var next_char = this._buffer.charAt(1); | |
| if ((next_char != '[') && (next_char != ']')) { | |
| pkt.kind = PacketKind.ESC; | |
| pkt.text = this._buffer.slice(0, 1); | |
| this._buffer = this._buffer.slice(1); | |
| return pkt; | |
| } | |
| if (next_char == '[') { | |
| if (!this._csi_regex) { | |
| this._csi_regex = rgx(__makeTemplateObject(["\n ^ # beginning of line\n #\n # First attempt\n (?: # legal sequence\n \u001B[ # CSI\n ([<-?]?) # private-mode char\n ([d;]*) # any digits or semicolons\n ([ -/]? # an intermediate modifier\n [@-~]) # the command\n )\n | # alternate (second attempt)\n (?: # illegal sequence\n \u001B[ # CSI\n [ -~]* # anything legal\n ([\0-\u001F:]) # anything illegal\n )\n "], ["\n ^ # beginning of line\n #\n # First attempt\n (?: # legal sequence\n \\x1b\\[ # CSI\n ([\\x3c-\\x3f]?) # private-mode char\n ([\\d;]*) # any digits or semicolons\n ([\\x20-\\x2f]? # an intermediate modifier\n [\\x40-\\x7e]) # the command\n )\n | # alternate (second attempt)\n (?: # illegal sequence\n \\x1b\\[ # CSI\n [\\x20-\\x7e]* # anything legal\n ([\\x00-\\x1f:]) # anything illegal\n )\n "])); | |
| } | |
| var match = this._buffer.match(this._csi_regex); | |
| if (match === null) { | |
| pkt.kind = PacketKind.Incomplete; | |
| return pkt; | |
| } | |
| if (match[4]) { | |
| pkt.kind = PacketKind.ESC; | |
| pkt.text = this._buffer.slice(0, 1); | |
| this._buffer = this._buffer.slice(1); | |
| return pkt; | |
| } | |
| if ((match[1] != '') || (match[3] != 'm')) | |
| pkt.kind = PacketKind.Unknown; | |
| else | |
| pkt.kind = PacketKind.SGR; | |
| pkt.text = match[2]; | |
| var rpos = match[0].length; | |
| this._buffer = this._buffer.slice(rpos); | |
| return pkt; | |
| } | |
| if (next_char == ']') { | |
| if (len < 4) { | |
| pkt.kind = PacketKind.Incomplete; | |
| return pkt; | |
| } | |
| if ((this._buffer.charAt(2) != '8') | |
| || (this._buffer.charAt(3) != ';')) { | |
| pkt.kind = PacketKind.ESC; | |
| pkt.text = this._buffer.slice(0, 1); | |
| this._buffer = this._buffer.slice(1); | |
| return pkt; | |
| } | |
| if (!this._osc_st) { | |
| this._osc_st = rgxG(__makeTemplateObject(["\n (?: # legal sequence\n (\u001B\\) # ESC | # alternate\n (\u0007) # BEL (what xterm did)\n )\n | # alternate (second attempt)\n ( # illegal sequence\n [\0-\u0006] # anything illegal\n | # alternate\n [\b-\u001A] # anything illegal\n | # alternate\n [\u001C-\u001F] # anything illegal\n )\n "], ["\n (?: # legal sequence\n (\\x1b\\\\) # ESC \\\n | # alternate\n (\\x07) # BEL (what xterm did)\n )\n | # alternate (second attempt)\n ( # illegal sequence\n [\\x00-\\x06] # anything illegal\n | # alternate\n [\\x08-\\x1a] # anything illegal\n | # alternate\n [\\x1c-\\x1f] # anything illegal\n )\n "])); | |
| } | |
| this._osc_st.lastIndex = 0; | |
| { | |
| var match_1 = this._osc_st.exec(this._buffer); | |
| if (match_1 === null) { | |
| pkt.kind = PacketKind.Incomplete; | |
| return pkt; | |
| } | |
| if (match_1[3]) { | |
| pkt.kind = PacketKind.ESC; | |
| pkt.text = this._buffer.slice(0, 1); | |
| this._buffer = this._buffer.slice(1); | |
| return pkt; | |
| } | |
| } | |
| { | |
| var match_2 = this._osc_st.exec(this._buffer); | |
| if (match_2 === null) { | |
| pkt.kind = PacketKind.Incomplete; | |
| return pkt; | |
| } | |
| if (match_2[3]) { | |
| pkt.kind = PacketKind.ESC; | |
| pkt.text = this._buffer.slice(0, 1); | |
| this._buffer = this._buffer.slice(1); | |
| return pkt; | |
| } | |
| } | |
| if (!this._osc_regex) { | |
| this._osc_regex = rgx(__makeTemplateObject(["\n ^ # beginning of line\n #\n \u001B]8; # OSC Hyperlink\n [ -:<-~]* # params (excluding ;)\n ; # end of params\n ([!-~]{0,512}) # URL capture\n (?: # ST\n (?:\u001B\\) # ESC | # alternate\n (?:\u0007) # BEL (what xterm did)\n )\n ([ -~]+) # TEXT capture\n \u001B]8;; # OSC Hyperlink End\n (?: # ST\n (?:\u001B\\) # ESC | # alternate\n (?:\u0007) # BEL (what xterm did)\n )\n "], ["\n ^ # beginning of line\n #\n \\x1b\\]8; # OSC Hyperlink\n [\\x20-\\x3a\\x3c-\\x7e]* # params (excluding ;)\n ; # end of params\n ([\\x21-\\x7e]{0,512}) # URL capture\n (?: # ST\n (?:\\x1b\\\\) # ESC \\\n | # alternate\n (?:\\x07) # BEL (what xterm did)\n )\n ([\\x20-\\x7e]+) # TEXT capture\n \\x1b\\]8;; # OSC Hyperlink End\n (?: # ST\n (?:\\x1b\\\\) # ESC \\\n | # alternate\n (?:\\x07) # BEL (what xterm did)\n )\n "])); | |
| } | |
| var match = this._buffer.match(this._osc_regex); | |
| if (match === null) { | |
| pkt.kind = PacketKind.ESC; | |
| pkt.text = this._buffer.slice(0, 1); | |
| this._buffer = this._buffer.slice(1); | |
| return pkt; | |
| } | |
| pkt.kind = PacketKind.OSCURL; | |
| pkt.url = match[1]; | |
| pkt.text = match[2]; | |
| var rpos = match[0].length; | |
| this._buffer = this._buffer.slice(rpos); | |
| return pkt; | |
| } | |
| } | |
| }; | |
| AnsiUp.prototype.ansi_to_html = function(txt) { | |
| this.append_buffer(txt); | |
| var blocks = []; | |
| while (true) { | |
| var packet = this.get_next_packet(); | |
| if ((packet.kind == PacketKind.EOS) | |
| || (packet.kind == PacketKind.Incomplete)) | |
| break; | |
| if ((packet.kind == PacketKind.ESC) | |
| || (packet.kind == PacketKind.Unknown)) | |
| continue; | |
| if (packet.kind == PacketKind.Text) | |
| blocks.push(this.transform_to_html(this.with_state(packet))); | |
| else if (packet.kind == PacketKind.SGR) | |
| this.process_ansi(packet); | |
| else if (packet.kind == PacketKind.OSCURL) | |
| blocks.push(this.process_hyperlink(packet)); | |
| } | |
| return blocks.join(""); | |
| }; | |
| AnsiUp.prototype.with_state = function(pkt) { | |
| return { bold: this.bold, fg: this.fg, bg: this.bg, text: pkt.text }; | |
| }; | |
| AnsiUp.prototype.process_ansi = function(pkt) { | |
| var sgr_cmds = pkt.text.split(';'); | |
| while (sgr_cmds.length > 0) { | |
| var sgr_cmd_str = sgr_cmds.shift(); | |
| var num = parseInt(sgr_cmd_str, 10); | |
| if (isNaN(num) || num === 0) { | |
| this.fg = this.bg = null; | |
| this.bold = false; | |
| } | |
| else if (num === 1) { | |
| this.bold = true; | |
| } | |
| else if (num === 22) { | |
| this.bold = false; | |
| } | |
| else if (num === 39) { | |
| this.fg = null; | |
| } | |
| else if (num === 49) { | |
| this.bg = null; | |
| } | |
| else if ((num >= 30) && (num < 38)) { | |
| this.fg = this.ansi_colors[0][(num - 30)]; | |
| } | |
| else if ((num >= 40) && (num < 48)) { | |
| this.bg = this.ansi_colors[0][(num - 40)]; | |
| } | |
| else if ((num >= 90) && (num < 98)) { | |
| this.fg = this.ansi_colors[1][(num - 90)]; | |
| } | |
| else if ((num >= 100) && (num < 108)) { | |
| this.bg = this.ansi_colors[1][(num - 100)]; | |
| } | |
| else if (num === 38 || num === 48) { | |
| if (sgr_cmds.length > 0) { | |
| var is_foreground = (num === 38); | |
| var mode_cmd = sgr_cmds.shift(); | |
| if (mode_cmd === '5' && sgr_cmds.length > 0) { | |
| var palette_index = parseInt(sgr_cmds.shift(), 10); | |
| if (palette_index >= 0 && palette_index <= 255) { | |
| if (is_foreground) | |
| this.fg = this.palette_256[palette_index]; | |
| else | |
| this.bg = this.palette_256[palette_index]; | |
| } | |
| } | |
| if (mode_cmd === '2' && sgr_cmds.length > 2) { | |
| var r = parseInt(sgr_cmds.shift(), 10); | |
| var g = parseInt(sgr_cmds.shift(), 10); | |
| var b = parseInt(sgr_cmds.shift(), 10); | |
| if ((r >= 0 && r <= 255) && (g >= 0 && g <= 255) && (b >= 0 && b <= 255)) { | |
| var c = { rgb: [r, g, b], class_name: 'truecolor' }; | |
| if (is_foreground) | |
| this.fg = c; | |
| else | |
| this.bg = c; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }; | |
| AnsiUp.prototype.transform_to_html = function(fragment) { | |
| var txt = fragment.text; | |
| if (txt.length === 0) | |
| return txt; | |
| // txt = this.escape_txt_for_html(txt); | |
| if (!fragment.bold && fragment.fg === null && fragment.bg === null) | |
| return txt; | |
| var styles = []; | |
| var classes = []; | |
| var fg = fragment.fg; | |
| var bg = fragment.bg; | |
| if (fragment.bold) | |
| styles.push('font-weight:bold'); | |
| if (!this._use_classes) { | |
| if (fg) | |
| styles.push("color:rgb(" + fg.rgb.join(',') + ")"); | |
| if (bg) | |
| styles.push("background-color:rgb(" + bg.rgb + ")"); | |
| } | |
| else { | |
| if (fg) { | |
| if (fg.class_name !== 'truecolor') { | |
| classes.push(fg.class_name + "-fg"); | |
| } | |
| else { | |
| styles.push("color:rgb(" + fg.rgb.join(',') + ")"); | |
| } | |
| } | |
| if (bg) { | |
| if (bg.class_name !== 'truecolor') { | |
| classes.push(bg.class_name + "-bg"); | |
| } | |
| else { | |
| styles.push("background-color:rgb(" + bg.rgb.join(',') + ")"); | |
| } | |
| } | |
| } | |
| var class_string = ''; | |
| var style_string = ''; | |
| if (classes.length) | |
| class_string = " class=\"" + classes.join(' ') + "\""; | |
| if (styles.length) | |
| style_string = " style=\"" + styles.join(';') + "\""; | |
| return "<span" + style_string + class_string + ">" + txt + "</span>"; | |
| }; | |
| ; | |
| AnsiUp.prototype.process_hyperlink = function(pkt) { | |
| var parts = pkt.url.split(':'); | |
| if (parts.length < 1) | |
| return ''; | |
| if (!this._url_whitelist[parts[0]]) | |
| return ''; | |
| // var result = "<a href=\"" + this.escape_txt_for_html(pkt.url) + "\">" + this.escape_txt_for_html(pkt.text) + "</a>"; | |
| var result = "<a href=\"" + this.escape_txt_for_html(pkt.url) + "\">" + pkt.text + "</a>"; | |
| return result; | |
| }; | |
| return AnsiUp; | |
| }()); | |
| function rgx(tmplObj) { | |
| var subst = []; | |
| for (var _i = 1; _i < arguments.length; _i++) { | |
| subst[_i - 1] = arguments[_i]; | |
| } | |
| var regexText = tmplObj.raw[0]; | |
| var wsrgx = /^\s+|\s+\n|\s*#[\s\S]*?\n|\n/gm; | |
| var txt2 = regexText.replace(wsrgx, ''); | |
| return new RegExp(txt2); | |
| } | |
| function rgxG(tmplObj) { | |
| var subst = []; | |
| for (var _i = 1; _i < arguments.length; _i++) { | |
| subst[_i - 1] = arguments[_i]; | |
| } | |
| var regexText = tmplObj.raw[0]; | |
| var wsrgx = /^\s+|\s+\n|\s*#[\s\S]*?\n|\n/gm; | |
| var txt2 = regexText.replace(wsrgx, ''); | |
| return new RegExp(txt2, 'g'); | |
| } | |
| </script> | |
| <script> | |
| var dots = []; | |
| var span = []; | |
| var ansi_up = new AnsiUp; | |
| function show_Wait(id) { | |
| span[id] = document.getElementById("wait" + id); | |
| dots[id] = setInterval(function() { | |
| if (((span[id].innerHTML+='.').match(/\./g)||[]).length > 9) { | |
| span[id].innerHTML = span[id].innerHTML.replace(/\.+$/,''); | |
| } | |
| }, 500); | |
| } | |
| function stop_Wait(id) { | |
| span[id].innerHTML = ''; | |
| clearInterval( dots[id] ); | |
| } | |
| function addLog(logLine) { | |
| var elms = document.getElementsByClassName('logLine'); | |
| logLine = ansi_up.ansi_to_html(logLine); | |
| if (elms.length) { | |
| var el = elms[elms.length-1]; | |
| el.innerHTML += logLine + "<br>"; | |
| } | |
| window.scrollTo(0, document.body.scrollHeight); | |
| } | |
| function loadLog(container, since) { | |
| var httpRequest = new XMLHttpRequest(); | |
| httpRequest.onreadystatechange = function() { | |
| if (httpRequest.readyState === 4 && httpRequest.status === 200) { | |
| parseScript(httpRequest.responseText); | |
| } | |
| }; | |
| httpRequest.open('GET', location.protocol+'//'+location.host+location.pathname+'?action=log&container='+encodeURIComponent(container)+'&since='+encodeURIComponent(since)); | |
| httpRequest.send(); | |
| } | |
| function parseScript(_source) { | |
| var source = _source; | |
| var scripts = []; | |
| while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) { | |
| var s = source.indexOf("<script"); | |
| var s_e = source.indexOf(">", s); | |
| var e = source.indexOf("</script", s); | |
| var e_e = source.indexOf(">", e); | |
| scripts.push(source.substring(s_e+1, e)); | |
| source = source.substring(0, s) + source.substring(e_e+1); | |
| } | |
| for (var i=0; i<scripts.length; i++) { | |
| try { | |
| eval(scripts[i]); | |
| } catch(ex) {} | |
| } | |
| return source; | |
| } | |
| function progress(id, prog) { | |
| var elms = document.getElementsByClassName(id+'_progress'); | |
| if (elms.length) { | |
| elms[elms.length-1].textContent = prog; | |
| } | |
| } | |
| function addToID(id, m) { | |
| var elms = document.getElementById(id); | |
| if (elms === null) { | |
| addLog('<span id=\"'+id+'\">IMAGE ID ['+id+']: <span class=\"content\">'+m+'</span><span class=\"'+id+'_progress\"></span>. </span>'); | |
| } else { | |
| var elms_content = elms.getElementsByClassName("content"); | |
| if (!elms_content.length || elms_content[elms_content.length-1].textContent != m) { | |
| elms.innerHTML += '<span class=\"content\">'+m+'</span><span class=\"'+id+'_progress\"></span>. '; | |
| } | |
| } | |
| } | |
| </script> | |
| </head> | |
| <body> | |
| <div id="content"><p class="logLine" id="logBody"></p></div> | |
| </body> | |
| </html> | |
| <p class="logLine" id="logBody"></p><script>addLog('<fieldset style="margin-top:1px;" class="CMD"><legend>Stopping container: firefox</legend><p class="logLine" id="logBody"></p><span id="wait853490789">Please wait </span></fieldset>');show_Wait(853490789);</script> | |
| <script>stop_Wait(853490789);addLog('<b>Successfully stopped container 'firefox'</b>');</script> | |
| <p class="logLine" id="logBody"></p><script>addLog('<fieldset style="margin-top:1px;" class="CMD"><legend>Removing container: firefox</legend><p class="logLine" id="logBody"></p><span id="wait1253193793">Please wait </span></fieldset>');show_Wait(1253193793);</script> | |
| <script>stop_Wait(1253193793);addLog('<b>Successfully removed container 'firefox'</b>');</script> | |
| <p class="logLine" id="logBody"></p><script>addLog('<fieldset style="margin-top:1px;" class="CMD"><legend>Command execution</legend>docker run<br> -d<br> --name='firefox'<br> --net='bridge'<br> --pids-limit 2048<br> -e TZ="America/New_York"<br> -e HOST_OS="Unraid"<br> -e HOST_HOSTNAME="Unraid"<br> -e HOST_CONTAINERNAME="firefox"<br> -e 'FIREFOX_CLI'='https://www.linuxserver.io/'<br> -e 'PUID'='99'<br> -e 'PGID'='100'<br> -e 'UMASK'='022'<br> -l net.unraid.docker.managed=dockerman<br> -l net.unraid.docker.webui='https://[IP]:[PORT:3001]'<br> -l net.unraid.docker.icon='https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/firefox-logo.png'<br> -p '3000:3000/tcp'<br> -p '3001:3001/tcp'<br> -v '/mnt/zpool/appdata/firefox':'/config':'rw'<br> --shm-size=1gb 'lscr.io/linuxserver/firefox' <br><span id="wait1643077438">Please wait </span><p class="logLine" id="logBody"></p></fieldset>');show_Wait(1643077438);</script><script>addLog("7e063ab938b2864fbd565d5129dda5d3d3d3cf5af6117f7f69ca36f56e0157a8");</script><script>stop_Wait(1643077438);</script><script>addLog('<br><b>The command finished successfully!</b>');</script><div style="text-align:center"><button type="button" onclick="openTerminal('docker','firefox','.log')">View Container Log</button> <button type="button" onclick="done()">Done</button></div><br> </div> | |
| </div> | |
| <footer id="footer"> | |
| <div class="footer-left"> | |
| <span id="statusraid"> | |
| <span id="statusbar" aria-live="polite"> | |
| <span class="green strong"> | |
| <i class="fa fa-play-circle"></i> Array Started </span> | |
| </span> | |
| </span> | |
| <span id="user-notice" class="red-text"></span> | |
| </div> | |
| <div class="footer-spacer"> </div> | |
| <div id="copyright" class="footer-right"> | |
| <unraid-theme-switcher | |
| current="black" | |
| themes='["azure","gray","black","white"]'> | |
| </unraid-theme-switcher> | |
| <span>Unraid® webGui ©2025, Lime Technology, Inc.</span> | |
| <a | |
| class="footer-link" | |
| href="https://docs.unraid.net/go/manual/" | |
| target="_blank" | |
| rel="noopener noreferrer" | |
| title="Online manual" | |
| > | |
| <i class="fa fa-book"></i> manual </a> | |
| <span id="wlan0" class="grey-text" onclick="wlanSettings()"> | |
| <i class="fa fa-wifi fa-fw"></i> | |
| </span> | |
| </div> | |
| </footer> | |
| <div class="upgrade_notice" style="display:none"></div> | |
| <a href="#" class="move_to_end" title="Move To End"><i class="fa fa-arrow-circle-down"></i></a> | |
| <a href="#" class="back_to_top" title="Back To Top"><i class="fa fa-arrow-circle-up"></i></a> | |
| <div class="spinner fixed"></div> | |
| <form name="rebootNow" method="POST" action="/webGui/include/Boot.php"><input type="hidden" name="cmd" value="reboot"></form> | |
| <iframe id="progressFrame" name="progressFrame" frameborder="0"></iframe> <script> | |
| function parseINI(msg) { | |
| var regex = { | |
| section: /^\s*\[\s*\"*([^\]]*)\s*\"*\]\s*$/, | |
| param: /^\s*([^=]+?)\s*=\s*\"*(.*?)\s*\"*$/, | |
| comment: /^\s*;.*$/ | |
| }; | |
| var value = {}; | |
| var lines = msg.split(/[\r\n]+/); | |
| var section = null; | |
| lines.forEach(function(line) { | |
| if (regex.comment.test(line)) { | |
| return; | |
| } else if (regex.param.test(line)) { | |
| var match = line.match(regex.param); | |
| if (section) { | |
| value[section][match[1]] = match[2]; | |
| } else { | |
| value[match[1]] = match[2]; | |
| } | |
| } else if (regex.section.test(line)) { | |
| var match = line.match(regex.section); | |
| value[match[1]] = {}; | |
| section = match[1]; | |
| } else if (line.length==0 && section) { | |
| section = null; | |
| }; | |
| }); | |
| return value; | |
| } | |
| // unraid animated logo | |
| var unraid_logo = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 133.52 76.97" class="unraid_mark"><defs><linearGradient id="unraid_logo" x1="23.76" y1="81.49" x2="109.76" y2="-4.51" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#e32929"/><stop offset="1" stop-color="#ff8d30"/></linearGradient></defs><path d="m70,19.24zm57,0l6.54,0l0,38.49l-6.54,0l0,-38.49z" fill="url(#unraid_logo)" class="unraid_mark_9"/><path d="m70,19.24zm47.65,11.9l-6.55,0l0,-23.79l6.55,0l0,23.79z" fill="url(#unraid_logo)" class="unraid_mark_8"/><path d="m70,19.24zm31.77,-4.54l-6.54,0l0,-14.7l6.54,0l0,14.7z" fill="url(#unraid_logo)" class="unraid_mark_7"/><path d="m70,19.24zm15.9,11.9l-6.54,0l0,-23.79l6.54,0l0,23.79z" fill="url(#unraid_logo)" class="unraid_mark_6"/><path d="m63.49,19.24l6.51,0l0,38.49l-6.51,0l0,-38.49z" fill="url(#unraid_logo)" class="unraid_mark_5"/><path d="m70,19.24zm-22.38,26.6l6.54,0l0,23.78l-6.54,0l0,-23.78z" fill="url(#unraid_logo)" class="unraid_mark_4"/><path d="m70,19.24zm-38.26,43.03l6.55,0l0,14.73l-6.55,0l0,-14.73z" fill="url(#unraid_logo)" class="unraid_mark_3"/><path d="m70,19.24zm-54.13,26.6l6.54,0l0,23.78l-6.54,0l0,-23.78z" fill="url(#unraid_logo)" class="unraid_mark_2"/><path d="m70,19.24zm-63.46,38.49l-6.54,0l0,-38.49l6.54,0l0,38.49z" fill="url(#unraid_logo)" class="unraid_mark_1"/></svg>'; | |
| var defaultPage = new NchanSubscriber('/sub/session,var,notify',{subscriber:'websocket', reconnectTimeout:5000}); | |
| defaultPage.on('message', function(msg,meta) { | |
| switch (meta.id.channel()) { | |
| case 0: | |
| // stale session, force login | |
| if (csrf_token != msg) location.replace('/'); | |
| break; | |
| case 1: | |
| // message field in footer | |
| var ini = parseINI(msg); | |
| switch (ini['fsState']) { | |
| case 'Stopped' : var status = "<span class='red strong'><i class='fa fa-stop-circle'></i> Array Stopped</span>"; break; | |
| case 'Started' : var status = "<span class='green strong'><i class='fa fa-play-circle'></i> Array Started</span>"; break; | |
| case 'Formatting': var status = "<span class='green strong'><i class='fa fa-play-circle'></i> Array Started</span>•<span class='orange strong tour'>Formatting device(s)</span>"; break; | |
| default : var status = "<span class='orange strong'><i class='fa fa-pause-circle'></i> "+_('Array '+ini['fsState'])+"</span>"; | |
| } | |
| if (ini['mdResyncPos'] > 0) { | |
| var resync = ini['mdResyncAction'].split(/\s+/); | |
| switch (resync[0]) { | |
| case 'recon': var action = resync[1]=='P' ? "Parity-Sync" : "Data-Rebuild"; break; | |
| case 'check': var action = resync.length>1 ? "Parity-Check" : "Read-Check"; break; | |
| case 'clear': var action = "Disk-Clear"; break; | |
| default : var action = ''; | |
| } | |
| action += " "+(ini['mdResyncPos']/(ini['mdResyncSize']/100+1)).toFixed(1)+" %"; | |
| status += "•<span class='orange strong tour'>"+action.replace('.','.'); | |
| if (ini['mdResyncDt']==0) status += " • Paused"; | |
| status += "</span>"; | |
| } | |
| if (ini['fsProgress']) status += "•<span class='blue strong tour'>"+_(ini['fsProgress'])+"</span>"; | |
| $('#statusbar').html(status); | |
| break; | |
| case 2: | |
| // notifications - moved to the Unraid API | |
| break; | |
| } | |
| }); | |
| function wlanSettings() { | |
| $.cookie('one','tab2'); | |
| window.location = '/Settings/NetworkSettings'; | |
| } | |
| var nchan_wlan0 = new NchanSubscriber('/sub/wlan0',{subscriber:'websocket', reconnectTimeout:5000}); | |
| nchan_wlan0.on('message', function(msg) { | |
| var wlan = JSON.parse(msg); | |
| $('#wlan0').removeClass().addClass(wlan.color).attr('title',wlan.title); | |
| }); | |
| nchan_wlan0.start(); | |
| var nchan_plugins = new NchanSubscriber('/sub/plugins',{subscriber:'websocket', reconnectTimeout:5000}); | |
| nchan_plugins.on('message', function(data) { | |
| if (!data || openDone(data)) return; | |
| var box = $('pre#swaltext'); | |
| const text = box.html().split('<br>'); | |
| if (data.slice(-1) == '\r') { | |
| text[text.length-1] = data.slice(0,-1); | |
| } else { | |
| text.push(data.slice(0,-1)); | |
| } | |
| box.html(text.join('<br>')).scrollTop(box[0].scrollHeight); | |
| }); | |
| var nchan_docker = new NchanSubscriber('/sub/docker',{subscriber:'websocket', reconnectTimeout:5000}); | |
| nchan_docker.on('message', function(data) { | |
| if (!data || openDone(data)) return; | |
| var box = $('pre#swaltext'); | |
| data = data.split('\0'); | |
| switch (data[0]) { | |
| case 'addLog': | |
| var rows = document.getElementsByClassName('logLine'); | |
| if (rows.length) { | |
| var row = rows[rows.length-1]; | |
| row.innerHTML += data[1]+'<br>'; | |
| } | |
| break; | |
| case 'progress': | |
| var rows = document.getElementsByClassName('progress-'+data[1]); | |
| if (rows.length) { | |
| rows[rows.length-1].textContent = data[2]; | |
| } | |
| break; | |
| case 'addToID': | |
| var rows = document.getElementById(data[1]); | |
| if (rows === null) { | |
| rows = document.getElementsByClassName('logLine'); | |
| if (rows.length) { | |
| var row = rows[rows.length-1]; | |
| row.innerHTML += '<span id="'+data[1]+'">IMAGE ID ['+data[1]+']: <span class="content">'+data[2]+'</span><span class="progress-'+data[1]+'"></span>.</span><br>'; | |
| } | |
| } else { | |
| var rows_content = rows.getElementsByClassName('content'); | |
| if (!rows_content.length || rows_content[rows_content.length-1].textContent != data[2]) { | |
| rows.innerHTML += '<span class="content">'+data[2]+'</span><span class="progress-'+data[1]+'"></span>.'; | |
| } | |
| } | |
| break; | |
| case 'show_Wait': | |
| progress_span[data[1]] = document.getElementById('wait-'+data[1]); | |
| progress_dots[data[1]] = setInterval(function(){if (((progress_span[data[1]].innerHTML += '.').match(/\./g)||[]).length > 9) progress_span[data[1]].innerHTML = progress_span[data[1]].innerHTML.replace(/\.+$/,'');},500); | |
| break; | |
| case 'stop_Wait': | |
| clearInterval(progress_dots[data[1]]); | |
| progress_span[data[1]].innerHTML = ''; | |
| break; | |
| default: | |
| box.html(box.html()+data[0]); | |
| break; | |
| } | |
| box.scrollTop(box[0].scrollHeight); | |
| }); | |
| var nchan_vmaction = new NchanSubscriber('/sub/vmaction',{subscriber:'websocket', reconnectTimeout:5000}); | |
| nchan_vmaction.on('message', function(data) { | |
| if (!data || openDone(data) || openError(data)) return; | |
| var box = $('pre#swaltext'); | |
| data = data.split('\0'); | |
| switch (data[0]) { | |
| case 'addLog': | |
| var rows = document.getElementsByClassName('logLine'); | |
| if (rows.length) { | |
| var row = rows[rows.length-1]; | |
| row.innerHTML += data[1]+'<br>'; | |
| } | |
| break; | |
| case 'progress': | |
| var rows = document.getElementsByClassName('progress-'+data[1]); | |
| if (rows.length) { | |
| rows[rows.length-1].textContent = data[2]; | |
| } | |
| break; | |
| case 'addToID': | |
| var rows = document.getElementById(data[1]); | |
| if (rows === null) { | |
| rows = document.getElementsByClassName('logLine'); | |
| if (rows.length) { | |
| var row = rows[rows.length-1]; | |
| row.innerHTML += '<span id="'+data[1]+'">'+data[1]+': <span class="content">'+data[2]+'</span><span class="progress-'+data[1]+'"></span>.</span><br>'; | |
| } | |
| } else { | |
| var rows_content = rows.getElementsByClassName('content'); | |
| if (!rows_content.length || rows_content[rows_content.length-1].textContent != data[2]) { | |
| rows.innerHTML += '<span class="content">'+data[2]+'</span><span class="progress-'+data[1]+'"></span>.'; | |
| } | |
| } | |
| break; | |
| case 'show_Wait': | |
| progress_span[data[1]] = document.getElementById('wait-'+data[1]); | |
| progress_dots[data[1]] = setInterval(function(){if (((progress_span[data[1]].innerHTML += '.').match(/\./g)||[]).length > 9) progress_span[data[1]].innerHTML = progress_span[data[1]].innerHTML.replace(/\.+$/,'');},500); | |
| break; | |
| case 'stop_Wait': | |
| clearInterval(progress_dots[data[1]]); | |
| progress_span[data[1]].innerHTML = ''; | |
| break; | |
| default: | |
| box.html(box.html()+data[0]); | |
| break; | |
| } | |
| box.scrollTop(box[0].scrollHeight); | |
| }); | |
| const scrollDuration = 500; | |
| $(window).scroll(function() { | |
| if ($(this).scrollTop() > 0) { | |
| $('.back_to_top').fadeIn(scrollDuration); | |
| } else { | |
| $('.back_to_top').fadeOut(scrollDuration); | |
| } | |
| }); | |
| $('.move_to_end').click(function(event) { | |
| event.preventDefault(); | |
| $('html,body').animate({scrollTop:$(document).height()},scrollDuration); | |
| return false; | |
| }); | |
| $('.back_to_top').click(function(event) { | |
| event.preventDefault(); | |
| $('html,body').animate({scrollTop:0},scrollDuration); | |
| return false; | |
| }); | |
| $.post('/webGui/include/Notify.php',{cmd:'init',csrf_token:csrf_token}); | |
| $(function() { | |
| defaultPage.start(); | |
| $('div.spinner.fixed').html(unraid_logo); | |
| setTimeout(function(){$('div.spinner').not('.fixed').each(function(){$(this).html(unraid_logo);});},500); // display animation if page loading takes longer than 0.5s | |
| shortcut.add('F1',function(){HelpButton();}); | |
| $('#licensetype').addClass('red-text'); | |
| $('input[value="Apply"],input[value="Apply"],input[name="cmdEditShare"],input[name="cmdUserEdit"]').prop('disabled',true); | |
| $('form').find('select,input[type=text],input[type=number],input[type=password],input[type=checkbox],input[type=radio],input[type=file],textarea').not('.lock').each(function(){$(this).on('input change',function() { | |
| var form = $(this).parentsUntil('form').parent(); | |
| form.find('input[value="Apply"],input[value="Apply"],input[name="cmdEditShare"],input[name="cmdUserEdit"]').not('input.lock').prop('disabled',false); | |
| form.find('input[value="Done"],input[value="Done"]').not('input.lock').val("Reset").prop('onclick',null).off('click').click(function(){formHasUnsavedChanges=false;refresh(form.offset().top);}); | |
| });}); | |
| // add leave confirmation when form has changed without applying (opt-in function) | |
| if ($('form.js-confirm-leave').length>0) { | |
| $('form.js-confirm-leave').on('change',function(e){formHasUnsavedChanges=true;}).on('submit',function(e){formHasUnsavedChanges=false;}); | |
| $(window).on('beforeunload',function(e){if (formHasUnsavedChanges) return '';}); // note: the browser creates its own popup window and warning message | |
| } | |
| // form parser: add escapeQuotes protection | |
| $('form').each(function(){ | |
| var action = $(this).prop('action').actionName(); | |
| if (action=='update.htm' || action=='update.php') { | |
| var onsubmit = $(this).attr('onsubmit')||''; | |
| $(this).attr('onsubmit','clearTimeout(timers.flashReport);escapeQuotes(this);'+onsubmit); | |
| } | |
| }); | |
| const top = parseInt($.cookie('top') || '0', 10); | |
| if (top > 0) { | |
| $('html, body').scrollTop(top); | |
| } | |
| $.removeCookie('top'); | |
| if ($.cookie('addAlert') != null) bannerAlert(addAlert.text,addAlert.cmd,addAlert.plg,addAlert.func); | |
| if (location.pathname.search(/\/(AddVM|UpdateVM|AddContainer|UpdateContainer)/)==-1) { | |
| $('blockquote.inline_help').each(function(i) { | |
| $(this).attr('id','helpinfo'+i); | |
| var pin = $(this).prev(); | |
| if (!pin.prop('nodeName')) pin = $(this).parent().prev(); | |
| while (pin.prop('nodeName') && pin.prop('nodeName').search(/(table|dl)/i)==-1) pin = pin.prev(); | |
| pin.find('tr:first,dt:last').each(function() { | |
| var node = $(this); | |
| var name = node.prop('nodeName').toLowerCase(); | |
| if (name=='dt') { | |
| while (!node.html() || node.html().search(/(<input|<select|nbsp;)/i)>=0 || name!='dt') { | |
| if (name=='dt' && node.is(':first-of-type')) break; | |
| node = node.prev(); | |
| name = node.prop('nodeName').toLowerCase(); | |
| } | |
| node.css('cursor','help').click(function(){$('#helpinfo'+i).toggle('slow');}); | |
| } else { | |
| if (node.html() && (name!='tr' || node.children('td:first').html())) node.css('cursor','help').click(function(){$('#helpinfo'+i).toggle('slow');}); | |
| } | |
| }); | |
| }); | |
| } | |
| $('form').append($('<input>').attr({type:'hidden', name:'csrf_token', value:csrf_token})); | |
| setInterval(function(){if ($(document).height() > $(window).height()) $('.move_to_end').fadeIn(scrollDuration); else $('.move_to_end').fadeOut(scrollDuration);},250); | |
| }); | |
| var gui_pages_available = []; | |
| gui_pages_available.push('AB.Log'); gui_pages_available.push('AB.Main'); gui_pages_available.push('AB.Restore'); gui_pages_available.push('AB.Settings'); gui_pages_available.push('AutoUpdateApps'); gui_pages_available.push('AutoUpdate'); gui_pages_available.push('dockerUpdateApps'); gui_pages_available.push('Apps'); gui_pages_available.push('CA_notices'); gui_pages_available.push('ca_settings'); gui_pages_available.push('About'); gui_pages_available.push('UPSdetails'); gui_pages_available.push('UPSsettings'); gui_pages_available.push('Apps'); gui_pages_available.push('ArrayDevices'); gui_pages_available.push('ArrayOperation'); gui_pages_available.push('BootDevice'); gui_pages_available.push('BrowseButton'); gui_pages_available.push('Browse'); gui_pages_available.push('CacheDevices'); gui_pages_available.push('Confirmations'); gui_pages_available.push('Console'); gui_pages_available.push('CPUisol'); gui_pages_available.push('CPUpin'); gui_pages_available.push('CPUset'); gui_pages_available.push('CPUvms'); gui_pages_available.push('Credits'); gui_pages_available.push('Dashboard'); gui_pages_available.push('DashStats'); gui_pages_available.push('DateTime'); gui_pages_available.push('DeviceAttributes'); gui_pages_available.push('DeviceCapabilities'); gui_pages_available.push('DeviceIdentify'); gui_pages_available.push('DeviceInfo'); gui_pages_available.push('Device'); gui_pages_available.push('Diagnostics'); gui_pages_available.push('DiskList'); gui_pages_available.push('Disk'); gui_pages_available.push('DiskSettings'); gui_pages_available.push('DisplaySettings'); gui_pages_available.push('AddContainer'); gui_pages_available.push('DockerContainers'); gui_pages_available.push('Docker'); gui_pages_available.push('DockerSettings'); gui_pages_available.push('UpdateContainer'); gui_pages_available.push('Eth0'); gui_pages_available.push('EthX'); gui_pages_available.push('Favorites'); gui_pages_available.push('FeedbackButton'); gui_pages_available.push('FlashInfo'); gui_pages_available.push('Flash'); gui_pages_available.push('FTP'); gui_pages_available.push('Grub'); gui_pages_available.push('gui_search'); gui_pages_available.push('HardwareProfile'); gui_pages_available.push('HelpButton'); gui_pages_available.push('Identification'); gui_pages_available.push('InfoButton'); gui_pages_available.push('InstallKey'); gui_pages_available.push('LanguageButton'); gui_pages_available.push('Language'); gui_pages_available.push('LogButton'); gui_pages_available.push('LogoutButton'); gui_pages_available.push('LogViewer'); gui_pages_available.push('Main'); gui_pages_available.push('ManagementAccess'); gui_pages_available.push('MoverSettings'); gui_pages_available.push('MyFavorites'); gui_pages_available.push('ApiKeyAuthorize'); gui_pages_available.push('ApiKeys'); gui_pages_available.push('ApiStatus'); gui_pages_available.push('Connect'); gui_pages_available.push('LogViewer'); gui_pages_available.push('Registration'); gui_pages_available.push('NetworkExtra'); gui_pages_available.push('NetworkRules'); gui_pages_available.push('NetworkServices'); gui_pages_available.push('NetworkSettings'); gui_pages_available.push('NewConfig'); gui_pages_available.push('New'); gui_pages_available.push('NewPerms'); gui_pages_available.push('NFS'); gui_pages_available.push('NotificationAgents'); gui_pages_available.push('Notifications'); gui_pages_available.push('OpenDevices'); gui_pages_available.push('OtherSettings'); gui_pages_available.push('OutgoingProxy'); gui_pages_available.push('PageMap'); gui_pages_available.push('ParityCheck'); gui_pages_available.push('PHPsettings'); gui_pages_available.push('Downgrade'); gui_pages_available.push('PluginHelpers'); gui_pages_available.push('PluginInstall'); gui_pages_available.push('PluginsError'); gui_pages_available.push('Plugins'); gui_pages_available.push('PluginsStale'); gui_pages_available.push('Update'); gui_pages_available.push('PowerMode'); gui_pages_available.push('Processes'); gui_pages_available.push('RoutingTable'); gui_pages_available.push('Scheduler'); gui_pages_available.push('SecurityNFS'); gui_pages_available.push('SecuritySMB'); gui_pages_available.push('Selftest'); gui_pages_available.push('Settings'); gui_pages_available.push('ShareEdit'); gui_pages_available.push('ShareList'); gui_pages_available.push('Share'); gui_pages_available.push('ShareSettings'); gui_pages_available.push('Shares'); gui_pages_available.push('SMBActiveDirectory'); gui_pages_available.push('SMBExtras'); gui_pages_available.push('SMB'); gui_pages_available.push('SMBsettings'); gui_pages_available.push('SMBWorkGroup'); gui_pages_available.push('SmtpSettings'); gui_pages_available.push('SysDevs'); gui_pages_available.push('SysDrivers'); gui_pages_available.push('Syslinux'); gui_pages_available.push('Syslog'); gui_pages_available.push('SyslogSettings'); gui_pages_available.push('TempButton'); gui_pages_available.push('TempSettings'); gui_pages_available.push('TerminalButton'); gui_pages_available.push('Terminal'); gui_pages_available.push('Tools'); gui_pages_available.push('TrimSettings'); gui_pages_available.push('UNRAID-OS'); gui_pages_available.push('UserAdd'); gui_pages_available.push('UserEdit'); gui_pages_available.push('UserList'); gui_pages_available.push('UserPreferences'); gui_pages_available.push('Users'); gui_pages_available.push('Utilities'); gui_pages_available.push('Vars'); gui_pages_available.push('AddVM'); gui_pages_available.push('UpdateVM'); gui_pages_available.push('VMMachines'); gui_pages_available.push('VMSettings'); gui_pages_available.push('VMs'); gui_pages_available.push('VMTemplates'); gui_pages_available.push('VMUsageStats'); gui_pages_available.push('VPNmanager'); gui_pages_available.push('WebGui'); gui_pages_available.push('WG0'); gui_pages_available.push('WGX'); gui_pages_available.push('Wireless'); gui_pages_available.push('DockerSafeNewPerms'); gui_pages_available.push('FixProblems'); gui_pages_available.push('UpdateAssistant'); gui_pages_available.push('Folder'); gui_pages_available.push('folder.view2.Dashboard'); gui_pages_available.push('folder.view2.Docker'); gui_pages_available.push('FolderView2'); gui_pages_available.push('folder.view2.VMs'); gui_pages_available.push('Tailscale-1-Settings'); gui_pages_available.push('Tailscale-2-Status'); gui_pages_available.push('Tailscale-3-Lock'); gui_pages_available.push('Tailscale-4-Info'); gui_pages_available.push('Tailscale_dashboard'); gui_pages_available.push('Tailscale'); gui_pages_available.push('TipsAndTweaks'); gui_pages_available.push('Tips'); gui_pages_available.push('Tweaks'); gui_pages_available.push('EULA'); gui_pages_available.push('Userscripts'); | |
| function isValidURL(url) { | |
| try { | |
| var ret = new URL(url); | |
| return ret; | |
| } catch (err) { | |
| return false; | |
| } | |
| } | |
| $('body').on('click','a,.ca_href', function(e) { | |
| if ($(this).hasClass('ca_href')) { | |
| var ca_href = true; | |
| var href=$(this).attr('data-href'); | |
| var target=$(this).attr('data-target'); | |
| } else { | |
| var ca_href = false; | |
| var href = $(this).attr('href'); | |
| var target = $(this).attr('target'); | |
| } | |
| if (href) { | |
| href = href.trim(); | |
| // Sanitize href to prevent XSS | |
| href = href.replace(/[<>"]/g, ''); | |
| if (href.match('https?://[^\.]*.(my)?unraid.net/') || href.startsWith('https://unraid.net/') || href == 'https://unraid.net' || href.startsWith('http://lime-technology.com')) { | |
| if (ca_href) window.open(href,target); | |
| return; | |
| } | |
| if (href !== '#' && !href.startsWith('javascript') && !href.startsWith('blob:')) { | |
| var dom = isValidURL(href); | |
| if (dom == false) { | |
| if (href.startsWith('/')) return; // all internal links start with "/" | |
| var baseURLpage = href.split('/'); | |
| if (gui_pages_available.includes(baseURLpage[0])) return; | |
| } | |
| if ($(this).hasClass('localURL')) return; | |
| try { | |
| var domainsAllowed = JSON.parse($.cookie('allowedDomains')); | |
| } catch(e) { | |
| var domainsAllowed = new Object(); | |
| } | |
| $.cookie('allowedDomains',JSON.stringify(domainsAllowed),{expires:3650}); // rewrite cookie to further extend expiration by 400 days | |
| if (domainsAllowed[dom.hostname]) return; | |
| e.preventDefault(); | |
| $('.sweet-alert').removeClass('nchan'); // Prevent GUI issues if clicking external link from a changelog | |
| swal({ | |
| title: "External Link", | |
| text: "<span title='"+href+"'>Clicking OK will take you to a 3rd party website not associated with Lime Technology<br><br><b>"+href+"<br><br><input id='Link_Always_Allow' type='checkbox'></input>Always Allow "+dom.hostname+"</span>", | |
| html: true, | |
| animation: 'none', | |
| type: 'warning', | |
| showCancelButton: true, | |
| showConfirmButton: true, | |
| cancelButtonText: "Cancel", | |
| confirmButtonText: "OK" | |
| },function(isConfirm) { | |
| if (isConfirm) { | |
| if ($('#Link_Always_Allow').is(':checked')) { | |
| domainsAllowed[dom.hostname] = true; | |
| $.cookie('allowedDomains',JSON.stringify(domainsAllowed),{expires:3650}); | |
| } | |
| var popupOpen = window.open(href,target); | |
| if (!popupOpen || popupOpen.closed || typeof popupOpen == 'undefined') { | |
| var popupWarning = addBannerWarning("Popup Blocked"); | |
| setTimeout(function(){removeBannerWarning(popupWarning);},10000); | |
| } | |
| } | |
| }); | |
| } | |
| } | |
| }); | |
| /** | |
| * Calculates and sets the height of a target element to fill the available viewport space. | |
| * | |
| * This function dynamically resizes an element to occupy the remaining vertical space | |
| * after accounting for other page elements like headers, footers, controls, and their | |
| * margins/padding. Useful for creating full-height scrollable content areas. | |
| * | |
| * The function includes default elements that are commonly present on pages: | |
| * - elementsForHeight: '#header', '#menu', '#footer' (plus any additional provided) | |
| * - elementsForSpacing: '.displaybox' (plus any additional provided) | |
| * | |
| * @param {Object} params - Configuration object for height calculation | |
| * @param {string} [params.targetElementSelector='.js-fill-available-height'] - CSS selector for the element to resize | |
| * @param {string[]} [params.elementSelectorsForHeight=[]] - Additional CSS selectors for elements | |
| * whose full height (including margins) should be subtracted from available space. | |
| * These are added to the default selectors: '#header', '#menu', '#footer' | |
| * @param {string[]} [params.elementSelectorsForSpacing=[]] - Additional CSS selectors for elements | |
| * whose spacing (margins and padding only) should be subtracted from available space. | |
| * These are added to the default selector: '.displaybox' | |
| * @param {number} [params.minHeight=330] - Minimum height in pixels for the target element | |
| * @param {number} [params.manualSpacingOffset=10] - Additional pixels to subtract for manual spacing | |
| * | |
| * @example | |
| * // Use with default parameters - targets '.js-fill-available-height' | |
| * fillAvailableHeight(); | |
| * | |
| * @example | |
| * // Custom configuration with additional elements | |
| * // MUST BE USED IN JQUERY ON READY | |
| * $(function() { // or $(document).ready(function() { | |
| * fillAvailableHeight({ | |
| * targetElementSelector: '.my-content', | |
| * elementSelectorsForHeight: ['.my-controls', '.my-actions'], | |
| * elementSelectorsForSpacing: ['.my-content'], | |
| * minHeight: 500, | |
| * manualSpacingOffset: 20 | |
| * }); | |
| * }); | |
| */ | |
| function fillAvailableHeight(params = { // default params | |
| targetElementSelector: '.js-fill-available-height', | |
| elementSelectorsForHeight: [], | |
| elementSelectorsForSpacing: [], | |
| minHeight: 330, | |
| manualSpacingOffset: 10, | |
| }) { | |
| const minHeight = params.minHeight || 330; | |
| // default elementsForHeight | |
| const elementsForHeight = [ | |
| '#header', | |
| '#menu', | |
| '#footer', | |
| '.title', | |
| ...(params.elementSelectorsForHeight ? params.elementSelectorsForHeight : []), | |
| ]; | |
| // elements with a height and margin we want to subtract from the target height | |
| let targetHeight = window.innerHeight - elementsForHeight.reduce((acc, selector) => { | |
| const element = document.querySelector(selector); | |
| if (!element) { | |
| return acc; | |
| } | |
| const computedStyle = getComputedStyle(element); | |
| const height = element.offsetHeight; | |
| const marginTop = parseFloat(computedStyle.marginTop) || 0; | |
| const marginBottom = parseFloat(computedStyle.marginBottom) || 0; | |
| // we don't need to calculate padding because it's already included in the height | |
| const totalForElement = height + marginTop + marginBottom; | |
| return acc + totalForElement; | |
| }, 0); | |
| // elements with spacing that we want to subtract from the target height, but not their actual height. | |
| const elementsForSpacing = [ | |
| '#displaybox', | |
| ...(params.targetElementSelector ? [params.targetElementSelector] : []), | |
| ...(params.elementSelectorsForSpacing ? params.elementSelectorsForSpacing : []), | |
| ]; | |
| targetHeight -= elementsForSpacing.reduce((acc, selector) => { | |
| const element = document.querySelector(selector); | |
| if (!element) { | |
| return acc; | |
| } | |
| const computedStyle = getComputedStyle(element); | |
| const marginTop = parseFloat(computedStyle.marginTop) || 0; | |
| const marginBottom = selector !== '#displaybox' ? parseFloat(computedStyle.marginBottom) || 0 : 0; | |
| const paddingTop = parseFloat(computedStyle.paddingTop) || 0; | |
| const paddingBottom = selector !== '#displaybox' ? parseFloat(computedStyle.paddingBottom) || 0 : 0; | |
| // we don't want to subtract paddingBottom or marginBottom for #displaybox b/c it adds unnecessary spacing in the calculations | |
| // b/c the paddingBottom is accounting for the fixed footer. | |
| const totalForElement = marginTop + marginBottom + paddingTop + paddingBottom; | |
| return acc + totalForElement; | |
| }, 0); | |
| // subtract addtional spacing from the target height to provide spacing between the actions & the footer | |
| targetHeight -= params.manualSpacingOffset || 10; | |
| const finalHeight = Math.max(targetHeight, minHeight); | |
| $(params.targetElementSelector).height(finalHeight); | |
| // Set up resize listener to call itself with same params | |
| // Remove existing listener first to avoid duplicates | |
| if (window.fillAvailableHeightResizeHandler) { | |
| window.removeEventListener('resize', window.fillAvailableHeightResizeHandler); | |
| } | |
| // Create debounced handler that calls this function with same params | |
| window.fillAvailableHeightResizeHandler = debounce(function() { | |
| fillAvailableHeight(params); | |
| }, 150); | |
| // Add the new listener | |
| window.addEventListener('resize', window.fillAvailableHeightResizeHandler); | |
| } | |
| /** | |
| * For every a.info element, we see if it has an inner span element. | |
| * While the CSS will determine visibility, we still need to use JS to set the position of the "tooltip" span. | |
| * Using the a.info element's offset position, we can calculate the top and left position needed for the span. | |
| */ | |
| $(document).on('mouseenter', 'a.info', function() { | |
| const tooltip = $(this).find('span'); | |
| if (tooltip.length) { | |
| const aInfoPosition = $(this).offset(); | |
| const scrollTop = $(window).scrollTop(); | |
| const scrollLeft = $(window).scrollLeft(); | |
| const addtionalOffset = 16; | |
| const top = aInfoPosition.top - scrollTop + addtionalOffset; | |
| const left = aInfoPosition.left - scrollLeft + addtionalOffset; | |
| tooltip.css({ top, left }); | |
| } | |
| }); | |
| </script> | |
| <uui-toaster rich-colors close-button position="top-right"></uui-toaster></body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment