diff --git a/mig/cgi-bin/shell.py b/mig/cgi-bin/shell.py deleted file mode 100755 index 88e427135..000000000 --- a/mig/cgi-bin/shell.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# shell - [insert a few words of module description on this line] -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -from __future__ import absolute_import -import cgi -import cgitb -# cgitb.enable() - -from mig.shared.functionality.shell import main -from mig.shared.cgiscriptstub import run_cgi_script - -run_cgi_script(main) diff --git a/mig/images/bluesky.css b/mig/images/bluesky.css index 93bad61b9..7f2565df0 100644 --- a/mig/images/bluesky.css +++ b/mig/images/bluesky.css @@ -4,7 +4,7 @@ # --- BEGIN_HEADER --- # # bluesky - alternative style for all pages -# Copyright (C) 2003-2014 The MiG Project lead by Brian Vinter +# Copyright (C) 2003-2026 The MiG Project by the Science HPC Center at UCPH # # This file is part of MiG. # @@ -98,7 +98,7 @@ div.container { /* No footer overlap with menu here */ min-height: 0px; } -/* override block layout for maximized areas like wshell */ +/* override block layout for maximized areas without menu */ #nomenu { margin: 4px; } @@ -158,9 +158,6 @@ div.container { .navmenu ul li.settings a { background-image: url('/images/icons/wrench.png'); } -.navmenu ul li.shell a { - background-image: url('/images/icons/application_osx_terminal.png'); -} .navmenu ul li.people a { background-image: url('/images/icons/personal.png'); } diff --git a/mig/images/css/shell.css b/mig/images/css/shell.css deleted file mode 100644 index b82ff1d68..000000000 --- a/mig/images/css/shell.css +++ /dev/null @@ -1,29 +0,0 @@ -#shell {height: 450px; width: 100%; background: #fff; margin: 0px; #padding: 0px; overflow: scroll; } -#divShellOutput {margin-left: 2px; margin-top: 0px; } -#divShellInput {margin-left: 2px; margin-top: 0px; } -#divShellOutput table{padding: 0px; vertical-align: top; border-style: none; border-collapse:collapse; background-color:Transparent; } -.tableShellInput {padding: 0px; width : 100%; vertical-align: top; border-style: none; border-collapse:collapse; background-color:Transparent; } -.trShellInput {padding:0px; width: 100%; vertical-align: top; } -.tdShellCommand {padding:0px; vertical-align: middle; width: 100%; } -.tdShellPrompt {padding: 0px; vertical-align: middle;color:#666; white-space: nowrap; } -.inputShellCommand { font-family:Verdana, verdana, Times New Roman;vertical-align: middle; width: 100%;border-style:none; overflow: hidden; white-space: nowrap; } -/* -html { height: 100%; } -body { background: #fff; font-size: 12px; font-family: Tahoma, Geneva, sans-serif; height: 99%; margin:0px; padding: 0px; } -form { padding: 0px; margin: 0px; } -pre { font-size: 12px; } -br { clear: both; } -:focus { outline: 0; } -input{ border: none; border: 0px; font-size: 12px; font-family: Tahoma, Geneva, sans-serif; padding: 0px; margin:0px; width:100%; } -table{ width:100%; vertical-align:top; } -td.commandline { width:100%; } -#input { margin-left: 8px; color: #666; overflow: hidden; } -#output{ margin-left: 8px; margin-top: 8px; } -.less { color: #666; } -.info { color: #090; } -table { padding: 0px; margin: 0px; border-collapse: collapse; border-spacing: 0px; } -td { padding: 0px; margin: 0px; vertical-align: top; font-size: 12px; font-family: Tahoma, Geneva, sans-serif; } -.help td { padding-right: 25px; font-size: 12px; } -div#prompt { display: inline; white-space:nowrap; padding:0px; margin:0px; } -img { border: none; } -*/ diff --git a/mig/images/default.css b/mig/images/default.css index 0b85c2486..787875b9a 100644 --- a/mig/images/default.css +++ b/mig/images/default.css @@ -4,7 +4,7 @@ # --- BEGIN_HEADER --- # # default - default style settings for all pages -# Copyright (C) 2003-2021 The MiG Project lead by Brian Vinter +# Copyright (C) 2003-2026 The MiG Project by the Science HPC Center at UCPH # # This file is part of MiG. # @@ -339,7 +339,7 @@ table.peers { min-height: 500px; } -/* override block layout for maximized areas like wshell */ +/* override block layout for maximized areas without menu */ .nomenu #content, .nomenu .contentblock { margin: 4px; } @@ -436,9 +436,6 @@ table.peers { .navmenu ul li.settings a, #legacy-ui-body .app-grid .fas.settings { background-image: url('/images/icons/user.png'); } -.navmenu ul li.shell a, #legacy-ui-body .app-grid .fas.shell { - background-image: url('/images/icons/application_osx_terminal.png'); -} .navmenu ul li.people a, #legacy-ui-body .app-grid .fas.people { background-image: url('/images/icons/group.png'); } diff --git a/mig/images/js/ajax.js b/mig/images/js/ajax.js deleted file mode 100644 index c2c037194..000000000 --- a/mig/images/js/ajax.js +++ /dev/null @@ -1,366 +0,0 @@ -/* -MiG Advanced Shell -Nov, 2009 by Yang Zhao (student@live.cn) -License: GPL v2 -This is a subproject affiliated to Minimium Intrusion Grid (MiG) directed by Prof. Brian Vinter. -The purpose is to improve web UI and provide a managerial shortcut for trivial operations. -*/ -XMLService=function (selfname) -{ - this.selfname=selfname; - this.xmldoc=null; - this.xmlparser=null; -} -XMLService.prototype.Init=function () -{ - this.CreateParser(); -} -XMLService.prototype.CreateParser=function () -{ - if ( window.ActiveXObject ) { - // IE style browser - var ProgIDs=["Msxml2.DOMDocument.6.0","Msxml2.DOMDocument.3.0"]; - for(var i=0;i', false); - var node1=this.xmldoc.createElement("methodName"); - var node2=this.xmldoc.createTextNode(methodname); - node1.appendChild(node2); - var node3=this.xmldoc.createElement("params"); - if(arguments==null) - { - var empty=this.xmldoc.createTextNode(''); - node3.appendChild(empty); - }else - { - for(var i=0;i"; - } -} -XMLService.prototype.UnpackMessage=function (xml) -{ - var a; - var r=this.LoadXMLText(xml,false); - if(typeof r!='undefined'){return r;} - var root=this.xmldoc.documentElement; - a=this.UnpackAny(root.getElementsByTagName('value')[0]); - return a; -} - -XMLService.prototype.UnpackAny=function (any) -{ - switch(any.nodeName) - { - case "value": - return this.UnpackAny(any.childNodes[0]); - case "string": - return this.UnpackString(any); - case "double": - case "int": - case "i4": - return this.UnpackNumber(any); - case "boolean": - case "bool": - return this.UnpackBoolean(any); - case "dateTime.iso8601": - return this.UnpackDate(any); - case "array": - return this.UnpackArray(any); - case "struct": - return this.UnpackObject(any); - } -} - -XMLService.prototype.PackAny=function (any, info) -{ - if(any instanceof String||typeof any == "string") - return this.PackString(any); - if(any instanceof Boolean||typeof any =="boolean") - return this.PackBoolean(any); - if(any instanceof Number||typeof any =="number") - return this.PackNumber(any, info); - if(any instanceof Date) - return this.PackDate(any); - if(any===null) - return this.PackNull(any); - if(any instanceof Array) - return this.PackArray(any); - if(any instanceof Object) - return this.PackObject(any); -} - -XMLService.prototype.PackNull=function (n) -{ - return this.xmldoc.createTextNode(''); -} - -XMLService.prototype.PackNumber=function(n, isDouble) -{ - if ( n % 1 != 0 || isDouble==true) - { - var node=this.xmldoc.createElement("double"); - var text=this.xmldoc.createTextNode(n); - node.appendChild(text); - return node; - } - else - { - var node=this.xmldoc.createElement("int"); - var text=this.xmldoc.createTextNode(n); - node.appendChild(text); - return node; - } -} -XMLService.prototype.UnpackNumber=function (node) -{ - var obj=new Number(); - switch(node.nodeName) - { - case "double": - obj=parseFloat(this.NodeText(node)); - case "i4": - case "int": - obj=parseInt(this.NodeText(node)); - } - return obj; -} -XMLService.prototype.PackDate=function (d) -{ - month=d.getMonth(); - day=d.getDay(); - hours=d.getHours(); - minutes=d.getMinutes(); - seconds=d.getSeconds(); - var node=this.xmldoc.createElement("dateTime.iso8601"); - var text=d.getFullYear()+(month<10?'0'+month:month)+(day<10?'0'+day:day)+'T'+(hours<10?'0'+hours:hours)+(minutes<10?'0'+minutes:minutes)+(seconds<10?'0'+seconds:seconds); - node.appendChild(text); - return node; -} -XMLService.prototype.UnpackDate=function (node) -{ - var txt=this.NodeText(node); - var re=/^(\d{4})(\d{2})(\d{2})T(\d+):(\d+):(\d+)$/; - var array=txt.match(re); - var d=new Date(); - d.setFullYear(array[1],array[2],array[3]); - d.setHours(array[4],array[5],array[6]); - return d; -} -XMLService.prototype.PackString=function (s) -{ - var node=this.xmldoc.createElement("string"); - var text=this.xmldoc.createTextNode(s); - node.appendChild(text); - return node; -} -XMLService.prototype.UnpackString=function (node) -{ - if(node.hasChildNodes()) - return this.NodeText(node); - else - return ''; -} -XMLService.prototype.PackBoolean=function (b) -{ - var node=this.xmldoc.createElement("boolean"); - var text=this.xmldoc.createTextNode(b); - node.appendChild(text); - return node; -} -XMLService.prototype.UnpackBoolean=function (node) -{ - return this.NodeText(node).toLowerCase()=='true'?true:false; -} -XMLService.prototype.PackArray=function (a) -{ - var node=this.xmldoc.createElement("array"); - var data=this.xmldoc.createElement("data"); - var value; - for ( var i = 0; i < a.length; i++ ) - { - value=this.xmldoc.createElement("value"); - text=this.PackAny(a[i], false); - value.appendChild(text); - data.appendChild(value); - } - node.appendChild(data); - return node; -} -XMLService.prototype.UnpackArray=function (node) -{ - var a=new Array(); - for(var i=0;i"; - str+=""; - str+=""; - o.innerHTML=str; - return o; -} diff --git a/mig/images/js/intellisense.js b/mig/images/js/intellisense.js deleted file mode 100644 index 6b0dff5b2..000000000 --- a/mig/images/js/intellisense.js +++ /dev/null @@ -1,70 +0,0 @@ -/* -MiG Advanced Shell -Nov, 2009 by Yang Zhao (student@live.cn) -License: GPL v2 -This is a subproject affiliated to Minimium Intrusion Grid (MiG) directed by Prof. Brian Vinter. -The purpose is to improve web UI and provide a managerial shortcut for trivial operations. -*/ -Intellisense=function(selfname) -{ - /* nothing */ -} -Intellisense.prototype.Init=function() -{ - //to store recent executed commands - this.history=[]; - //a scrolling scope of history - this.scroll=[]; - //pointer to the scroll - this.scrollindex=-1; -} - -Intellisense.prototype.HistoryUpdate=function(str, histlen) -{ - if(str.match(/^\s*$/)==null) - { - this.history.push(str); - if(this.history.length>histlen) - this.history.shift(); - } -} -Intellisense.prototype.OnIntellisense=function(str) -{ - this.scroll=[]; - this.scrollindex=-1; - var re=new RegExp('^'+str); - var TextInArray=function(str,a) - { - for(var i=0;ithis.scroll.length-1) - this.scrollindex=0; - return this.scroll[this.scrollindex]; - }else if(code==38) - { - this.scrollindex=this.scrollindex-1; - if(this.scrollindex<0) - this.scrollindex=this.scroll.length-1; - return this.scroll[this.scrollindex]; - } - return null; -} diff --git a/mig/images/js/lib.js b/mig/images/js/lib.js deleted file mode 100644 index 6dd966be0..000000000 --- a/mig/images/js/lib.js +++ /dev/null @@ -1,426 +0,0 @@ -/* -MiG Advanced Shell -Nov, 2009 by Yang Zhao (student@live.cn) -License: GPL v2 -This is a subproject affiliated to Minimium Intrusion Grid (MiG) directed by Prof. Brian Vinter. -The purpose is to improve web UI and provide a managerial shortcut for trivial operations. -*/ -Lib=function (selfname, gui, ajax, output, intellisense, status) -{ - this.selfname=selfname; - this.gui=gui; - this.ajax=ajax; - this.output=output; - this.intellisense=intellisense; - this.status=status; -} -Lib.prototype.Init=function () -{ - this.gui.Init(this); - this.ajax.Init(); - this.output.Init(this.gui); - this.intellisense.Init(); - this.status.Init(); - - //field identifier for the essential parameter - this.required='MUST_BE_SET_AND_NO_DEFAULT_VALUE'; - //field identifier for optional parameter flags - this.flags='flags'; - //priority in command match. Set 1 if to match remote methods first. - this.priority=1; - //methods repository - this.methods=[ - /* Entry Format: [ method names (standard one first), - argument/default list, - 0(local) or 1(remote) ] - Semantics for an entry: when one of the names is entered on the cmd line, - 1. check arguments, reject if something wrong with arg.s - 2. if local: call a local method "Shell" where is - the first method names, with first letter capitalized - if remote: call the method (same name, from registering it - with Probe) via XMLRPC - */ - [['help','man'], "{'method': ['']}", 0], - [['clear'], "", 0], - [['list'], "{'type': ['']}", 0], - [['cd'], "{'path': ['']}", 0], - [['upload'],"",0], - [['exit','quit','logout'],"",0] - ]; - //get all remote methods - this.methods=this.Probe(this.methods); - //get current user info - this.status.user=this.GetUserDN(); -} -Lib.prototype.Open=function() -{ - this.gui.Output("Grid - Advanced Shell Interface"); - this.gui.Output(Date()); - this.gui.SetPrompt(this.status.GetPrompt()); -} -Lib.prototype.Output=function(obj) -{ - this.gui.Output(ShowObject(obj)); -} -Lib.prototype.HookKey=function (e) -{ - var e=e?e:(window.e?window.e:null); - var code=e.keyCode?e.keyCode:(e.which?e.which:e.charCode); - switch(code) - { - case 13: //Enter - this.gui.UpdatePrompt(); - this.OnCommand(); - this.gui.PageScroll(); - this.gui.SetCommand(''); - this.gui.FocusInput(); - break; - case 9: //Tab - case 38: //Up - case 40: //Down - window.event?e.returnValue=false:e.preventDefault(); - var history; - if(this.status.lastkeycode!=9&&this.status.lastkeycode!=38&&this.status.lastkeycode!=40) - { - history=this.intellisense.OnIntellisense(this.gui.GetCommand()); - } - else - { - history=this.intellisense.GetIntellisense(code); - } - if(history!=null) - this.gui.SetCommand(history); - break; - } - this.status.lastkeycode=code; -} -Lib.prototype.OnMouseUp=function() -{ - var userselection; - if ( window.document.selection ) { - /* IE style browser */ - userselection = window.document.selection.createRange(); - } - else if ( window.document.getSelection ) { - userselection=window.document.getSelection(); - } - else return; - if(userselection!='') - this.status.clipboard=userselection; - //this.gui.FocusInput(); -} -Lib.prototype.ShellUpload=function() -{ - this.gui.Output(this.gui.CreateUpload(this.status.DirToString(this.status.dir))); -} -Lib.prototype.ShellCd=function(param) -{ - this.Output(param); - var c=this.ajax.Invoke('ls', [param]); - if (/\*/.test(param.path[0])) { - this.gui.Output('cd: Wildcards not supported!'); - return; - } - if(c[1][0]!=0) - { - this.gui.Output('Directory not found!'); - return; - } - else - { - this.status.GetDir(param.path[0],true, true); - this.gui.SetPrompt(this.status.GetPrompt()); - return; - } -} -Lib.prototype.ShellHelp=function(param) -{ - if(!param.hasOwnProperty('method')) - { - this.gui.Output('Advanced Grid Shell - Help'); - this.gui.Output('list [console|remote] - to show all/console/remote commands.'); - this.gui.Output('help - to show help of a certain command.'); - this.gui.Output('Note: this shell does not support pipes or redirection\n'); - this.gui.Output('----------'); - } - else - { - if(this.MethodExist(param.method, this.methods)) - this.gui.Output(this.MethodHelp(this.GetMethod(param.method, this.methods), this.required, this.flags)); - else - this.gui.Output('Unsupported command or invalid input!'); - } -} -Lib.prototype.ShellClear=function() -{ - this.gui.Clear(); -} -Lib.prototype.ShellList=function(param) -{ - if(!param)param=new Object(); - show=function(methodnames, head, lib) - { - lib.gui.Output('----------'+head+'------------'); - for(i in methodnames) - lib.Output(methodnames[i]); - } - if(param.hasOwnProperty('type')) - { - var ml=this.ListMethod(this.methods); - if(param.type=='console') - show(ml[0], 'Console Methods', this); - else if(param.type=='remote') - show(ml[1], 'Remote Methods', this); - else - this.ShellList(); - } - else - { - this.ShellList({type: 'console'}); - this.ShellList({type: 'remote'}); - } -} - -Lib.prototype.ShellExit=function () { - - window.close(); - // and if we survive it, go to dashboard - window.location='/'; -} - -Lib.prototype.GetUserDN=function () -{ - var str=this.ajax.Invoke('my_id', null); - var re=new RegExp('/CN=(.[^/]*)'); - var tmp=str.match(re); - if(tmp[1]=='undefined') - return 'unknown'; - else - return tmp[1]; -} - -Lib.prototype.AddMethod=function(names, signature, islocal, methodlist) -{ - methodlist.push([names, signature, islocal]); -} -Lib.prototype.MethodExist=function(name, methodlist) -{ - for(var i=0;i1) //unique value render - { - var s1=flags.replace(/(.).*\1/g,"$1"); - var re=new RegExp('['+s1+']','g'); - var s2=flags.replace(re,""); - flags=s1+s2; - } - return [args, options, flags]; - } - else - return requiredfields.length; - } - /*For required fields*/ - if(tokens[0].match(/^-.*$/)==null) - { - if(requiredfields.length>0) - { - this.AddValue(args, requiredfields.shift(), tokens[0], status); - } - else - { - for(var i=0;i'); - j++; - } - } - for(var i=0;i'); - j++; - } - } - this.gui.Output(table); - break; - case 'file_output': - for(var i=0;i'); - this.gui.FillTable(table, i, 2, '<'+obj.filewcs[i].words+' words>'); - this.gui.FillTable(table, i, 3, '<'+obj.filewcs[i].lines+' lines>'); - } - this.gui.Output(table); - break; - case 'file_not_found': - this.gui.Output('File: '+obj.name+' not found!'); - break; - case 'job_list': - var jobs=obj.jobs; - var table=this.gui.CreateTable(jobs.length, 3)//job_id, status, time_stamp - for(var i=0;i'; -} -//get a dir out after pushing in a dir -//path: dir string to put in -//update: true if you want it to has side-effect on the current dir in the status -//absolute(explict): true if it's an absolute path string -Status.prototype.GetDir=function(path, update, absolute) -{ - if(absolute!=true) - absolute=this.IsAbsolute(path); - if(update==true) - { - if(absolute==true) - { - this.dir=this.StringToDir(path); - this.dir.unshift('/'); - return this.dir; - }else - return this.JoinDir(this.dir, this.StringToDir(path)); - }else - { - if(absolute==true) - { - if(path=='/') - return ['/']; - return this.StringToDir(path); - }else - { - return this.JoinDir(this.CloneDir(), this.StringToDir(path)); - } - } -} -//return string by joinning dir parts -Status.prototype.DirToString=function(dir) -{ - return dir.length>1?dir.join('/').slice(1):dir[0]; -} -//return dir by splitting path string -Status.prototype.StringToDir=function(str) -{ - var r= str.split(/[\/]+/); - if(r[r.length-1]=='') - r.pop(); - return r; -} -Status.prototype.IsAbsolute=function(path) -{ - if(path[0]=='/') - return true; - else - return false; -} -//the conjunction of dirs -Status.prototype.JoinDir=function(dir, newdir) -{ - if(newdir.length==0) - return dir; - var x=newdir[0]; - switch(x) - { - case '.': - newdir.shift(); - return this.JoinDir(dir, newdir); - case '..': - if(dir.length>1) - dir.pop(); - newdir.shift(); - return this.JoinDir(dir, newdir); - default: - dir.push(newdir.shift()); - return this.JoinDir(dir, newdir); - } -} diff --git a/mig/images/js/toolkits.js b/mig/images/js/toolkits.js deleted file mode 100644 index 4ae3f4e0c..000000000 --- a/mig/images/js/toolkits.js +++ /dev/null @@ -1,100 +0,0 @@ -/* -MiG Advanced Shell -Nov, 2009 by Yang Zhao (student@live.cn) -License: GPL v2 -This is a subproject affiliated to Minimium Intrusion Grid (MiG) directed by Prof. Brian Vinter. -The purpose is to improve web UI and provide a managerial shortcut for trivial operations. -*/ - -function Type(obj) -{ - if(typeof obj=='string'||obj instanceof String) - return 'STRING'; - else if(typeof obj=='number'||obj instanceof Number) - return 'NUMBER'; - else if(typeof obj=='boolean'||obj instanceof Boolean) - return 'BOOLEAN'; - else if(obj instanceof Date) - return 'DATE'; - else if(obj instanceof Array) - return 'ARRAY'; - else if(obj===null) - return 'NULL'; - else if(typeof obj=='object') - return 'STRUCT'; -} -function ShowObject(obj) -{ - var str=''; - switch(Type(obj)) - { - case "STRING": - str+=('"'+obj+'"'); - return str; - case "NUMBER": - case "BOOLEAN": - str+=obj; - return str; - case "ARRAY": - str+='['; - var flag=false; - for(var i=0;i -#content { margin: 10px } -''' - # Please have href points to the CSS file and have basedir changed to the - # directory where JavaScripts are placed. - title_entry['script']['advanced'] += ''' - -''' - title_entry['script']['init'] = ''' - var basedir="/images/js/"; - - var shell; - var interval; - // scripts have to be loaded in sequence, thereby this recursion. - var scripts=["toolkits.js","gui.js","ajax.js","intellisense.js", - "output.js","status.js","lib.js","shell.js"]; - function loadAll(s_i) { - if(s_i<1) - { - shell=new Shell('shell', 'shell', 'xmlrpcinterface.py'); - shell.Init(); - return; - } - var script=document.createElement('script'); - script.setAttribute('type','text/javascript'); - script.setAttribute('src',basedir + scripts[ scripts.length - s_i ]); - document.getElementsByTagName('head')[0].appendChild(script); - - if ( script.readyState ) { - // IE style browser - script.onreadystatechange= function () { - if(this.readyState=='loaded'||this.readyState=='complete') - loadAll( s_i-1 ); - } - } else { - // other browser, should support onload - script.onload=function() - { - loadAll( s_i-1 ); - } - } - return; - } -''' - title_entry['script']['body'] = ' onload="loadAll(scripts.length);"' - - output_objects.append({'object_type': 'header', 'text': 'Advanced Shell' - }) - output_objects.append({'object_type': 'html_form', - 'text': '
'}) - - return (output_objects, status) diff --git a/mig/shared/htmlgen.py b/mig/shared/htmlgen.py index 4bd1cdb8a..04248bd68 100644 --- a/mig/shared/htmlgen.py +++ b/mig/shared/htmlgen.py @@ -103,17 +103,6 @@ menu_items['peers'] = {'class': 'peers fas fa-address-card', 'url': 'peers.py', 'title': 'Peers', 'hover': 'Vouch for collaboration partner or course participant accounts'} -menu_items['shell'] = {'class': 'shell fas fa-keyboard', 'url': 'shell.py', 'title': 'Shell', - 'legacy_only': True, 'hover': - 'A command line interface, based on javascript and xmlrpc'} -menu_items['wshell'] = {'class': 'shell fas fa-keyboard-alt', - 'url': 'javascript:\ - window.open(\'shell.py?menu=no\',\'shellwindow\',\ - \'dependent=yes,menubar=no,status=no,toolbar=no,\ - height=650px,width=800px\');\ - window.reload();', - 'legacy_only': True, 'title': 'Shell', - 'hover': 'A command line interface, based on javascript and xmlrpc. Opens in a new window'} menu_items['statistics'] = {'class': 'statistics fas fa-poll', 'url': 'showstats.py', 'legacy_only': True, 'title': 'Statistics', 'hover': 'Usage overview for resources and users on this server'} diff --git a/tests/data/MiGserver--customised-include_sections.conf b/tests/data/MiGserver--customised-include_sections.conf index 8ddbb1565..d814de521 100644 --- a/tests/data/MiGserver--customised-include_sections.conf +++ b/tests/data/MiGserver--customised-include_sections.conf @@ -534,10 +534,10 @@ extra_userpage_styles = # Selectable base menus (simple, default or advanced to match X_menu options below) base_menu = default # Default sorted menu items to include -#valid menu items are: home dashboard submitjob files jobs vgrids resources downloads runtimeenvs archives settings shell wshell statistics docs people migadmin transfers sharelinks crontab seafile jupyter peers logout close +#valid menu items are: home dashboard submitjob files jobs vgrids resources downloads runtimeenvs archives settings statistics docs people migadmin transfers sharelinks crontab seafile jupyter peers logout close default_menu = home files submitjob jobs vgrids resources runtimeenvs people settings downloads transfers sharelinks crontab docs logout #simple_menu = home files vgrids settings logout -#advanced_menu = home files submitjob jobs vgrids resources runtimeenvs people settings downloads archives transfers sharelinks crontab shell docs logout +#advanced_menu = home files submitjob jobs vgrids resources runtimeenvs people settings downloads archives transfers sharelinks crontab docs logout # Additional sorted user selectable menu entries user_menu = # Selectable VGrid component links (default or advanced to match X_vgrid_links options below) diff --git a/tests/data/MiGserver--customised.conf b/tests/data/MiGserver--customised.conf index 58a72abd0..67aa5fbea 100644 --- a/tests/data/MiGserver--customised.conf +++ b/tests/data/MiGserver--customised.conf @@ -534,10 +534,10 @@ extra_userpage_styles = # Selectable base menus (simple, default or advanced to match X_menu options below) base_menu = default # Default sorted menu items to include -#valid menu items are: home dashboard submitjob files jobs vgrids resources downloads runtimeenvs archives settings shell wshell statistics docs people migadmin transfers sharelinks crontab seafile jupyter peers logout close +#valid menu items are: home dashboard submitjob files jobs vgrids resources downloads runtimeenvs archives settings statistics docs people migadmin transfers sharelinks crontab seafile jupyter peers logout close default_menu = home files submitjob jobs vgrids resources runtimeenvs people settings downloads transfers sharelinks crontab docs logout #simple_menu = home files vgrids settings logout -#advanced_menu = home files submitjob jobs vgrids resources runtimeenvs people settings downloads archives transfers sharelinks crontab shell docs logout +#advanced_menu = home files submitjob jobs vgrids resources runtimeenvs people settings downloads archives transfers sharelinks crontab docs logout # Additional sorted user selectable menu entries user_menu = # Selectable VGrid component links (default or advanced to match X_vgrid_links options below) diff --git a/tests/fixture/confs-stdlocal/MiGserver.conf b/tests/fixture/confs-stdlocal/MiGserver.conf index 1ba52ee6f..c1d41b4ee 100644 --- a/tests/fixture/confs-stdlocal/MiGserver.conf +++ b/tests/fixture/confs-stdlocal/MiGserver.conf @@ -538,10 +538,10 @@ extra_userpage_styles = # Selectable base menus (simple, default or advanced to match X_menu options below) base_menu = default # Default sorted menu items to include -#valid menu items are: home dashboard submitjob files jobs vgrids resources downloads runtimeenvs archives settings shell wshell statistics docs people migadmin transfers sharelinks crontab seafile jupyter peers logout close +#valid menu items are: home dashboard submitjob files jobs vgrids resources downloads runtimeenvs archives settings statistics docs people migadmin transfers sharelinks crontab seafile jupyter peers logout close default_menu = home files submitjob jobs vgrids resources runtimeenvs people settings downloads transfers sharelinks crontab docs logout #simple_menu = home files vgrids settings logout -#advanced_menu = home files submitjob jobs vgrids resources runtimeenvs people settings downloads archives transfers sharelinks crontab shell docs logout +#advanced_menu = home files submitjob jobs vgrids resources runtimeenvs people settings downloads archives transfers sharelinks crontab docs logout # Additional sorted user selectable menu entries user_menu = # Selectable VGrid component links (default or advanced to match X_vgrid_links options below)