Git Product home page Git Product logo

webgui's Introduction

Unraid webgui repo

Structure

The emhttp, etc, sbin, and src dirs in this repo are extracted to the /usr/local/ directory when an Unraid release is built.

Contributions

Please be aware that there is a fairly high barrier to entry when working on the Unraid webgui. It has grown organically over the years and you will need to do quite a bit of reverse engineering to understand it.

If you choose to proceed, clone this repo locally, test edits by copying the changes to your server, then submit a PR to https://github.com/unraid/webgui when fully tested.

Be sure to describe (in the Unraid forum, a GitHub issue, or the GitHub PR) the problem/feature you are working on and explain how the proposed change solves it.

We recommend using VS Code with the following plugins:

webgui's People

Contributors

arifer612 avatar bergware avatar commifreak avatar djerfy avatar dlandon avatar dorgan avatar eschultz avatar f4il3d avatar gfjardim avatar iarp avatar ich777 avatar itimpi avatar itsalljustdata avatar jski avatar leseratte10 avatar limetech avatar ljm42 avatar ludoux avatar mtongnz avatar nysos3 avatar omgimalexis avatar realies avatar rhurling avatar rystaf avatar serisman avatar shayne avatar simonfair avatar squidly271 avatar studycwq avatar zackspear avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

webgui's Issues

Updates for multi-instance containers break

When updating a single container instance when there is multiple container instances based off the same image, the remaining instances become in a "not available" state which requires a forced update for every remaining instance. This should not happen and instead of "not available" the webGui should be displaying the standard update link.

Dynamix webGui v2017.05.26 -- parent directory icon

when browsing disk/share, the 'parent directory' blends in with the rest of the folders.. it should have a return icon not a folder icon
img

example of what you normally see:
img2

also the table is not very responsive in design..

Indicate updated template version

Updating Docker containers might make them break if using an obsolete template. Perhaps indicate somewhere whenever a used template has a newer version?

New Permissions tool should offer option to operate on user shares

The tool was originally created as part of upgrade from unRAID OS version 4.7 and earlier. Since then the tool has been useful for other purposes where somehow ownership/permissions has been messed up.

This enhancement adds another dropdown that lets user select any of the current user shares.

Disks mounted after Docker service start are inaccessible by the containers

This is a well know behaviour of Docker. Because the daemon is started using unshare, the mounts namespace is read-only to the child containers and disks mounted after the daemon start are invisible to them.

My proposal is to change unshare from unshare mounts namespace -m to --propagation slave. Then, we have to share the /mnt directory before emhttp starts by adding this command - /sbin/mount --bind /mnt /mnt && /sbin/mount --make-rshared /mnt - to /etc/rc.d/rc.local file.

After that, all disks mounted under /mnt/ will be shared by default, so we don't need to share individual directories.

The proposed rc.docker file:

#!/bin/sh

# Short-Description:  Create lightweight, portable, self-sufficient containers.
# Description:
#  Docker is an open-source project to easily create lightweight, portable,
#  self-sufficient containers from any application. The same container that a
#  developer builds and tests on a laptop can run at scale, in production, on
#  VMs, bare metal, OpenStack clusters, public clouds and more.

# modified for unRAID

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

BASE=docker

UNSHARE=/usr/bin/unshare
DOCKER=/usr/bin/$BASE
DOCKER_PIDFILE=/var/run/$BASE.pid
DOCKER_LOG=/var/log/docker.log

## Set defaults used by the docker daemon
## These are flags passed after `docker daemon`
DOCKER_OPTS="--storage-driver=btrfs"

# Docker settings for unRAID
DOCKER_IMAGE_FILE=
DOCKER_IMAGE_SIZE=10
DOCKER_ENABLED="no"

if [ -f /boot/config/docker.cfg ]; then
  . /boot/config/docker.cfg
else
  echo "# Generated settings:" >> /boot/config/docker.cfg
  echo "DOCKER_OPTS=\"$DOCKER_OPTS\"" >> /boot/config/docker.cfg
  echo "DOCKER_IMAGE_FILE=\"$DOCKER_IMAGE_FILE\"" >> /boot/config/docker.cfg
  echo "DOCKER_IMAGE_SIZE=\"$DOCKER_IMAGE_SIZE\"" >> /boot/config/docker.cfg
  echo "DOCKER_ENABLED=\"$DOCKER_ENABLED\"" >> /boot/config/docker.cfg
fi

# Less verbose logging by default
DOCKER_OPTS="--log-level=error $DOCKER_OPTS"

export DOCKER_RAMDISK=true

# Check docker is present
if [ ! -x $DOCKER ]; then
    echo "$DOCKER not present or not executable"
    exit 1
fi

# Verify if docker daemon running
is_docker_running(){
  [ ! -S /var/run/docker.sock ] && return 1
  if [[ $(docker info 2>&1) =~ "Cannot connect to the Docker daemon" ]]; then return 1; else return 0; fi
}

# Wait 10s to daemon start
wait_daemon(){
  for n in $(seq 10); do
    if is_docker_running; then return 0; else sleep 1; fi
  done
  return 1
}

# Containers Management
# All existing containers
all_containers(){
  while IFS=$'\n' read -ra LINES; do
    for LINE in "${LINES[@]}"; do
      IFS="  " read -ra VALUES <<< "$LINES"
      echo -e "${VALUES[@]:(-1)}\n"
    done
  done <<< "$(docker ps -a 2>/dev/null | grep -v CONTAINER)"
}

# Running containers
running_containers(){
  while IFS=$'\n' read -ra LINES; do
    for LINE in "${LINES[@]}"; do
      IFS="  " read -ra VALUES <<< "$LINES"
      echo -e "${VALUES[@]:(-1)}\n"
    done
  done <<< "$(docker ps 2>/dev/null | grep -v CONTAINER)"
}

# Is container running?
is_container_running(){
  local CONTAINER
  for CONTAINER in $(running_containers); do
    if [[ $CONTAINER == $1 ]]; then
      return 0
    fi
  done
  return 1
}

# Does the container exist?
container_exist(){
  local CONTAINER
  for CONTAINER in $(all_containers); do
    if [[ $CONTAINER == $1 ]]; then
      return 0
    fi
  done
  return 1
}

do_container_paths() {
  local container=$1
  # Deal with host directories
  for hostpath in $(docker inspect --format "{{ range .Mounts }} \"{{ .Source }}\" {{ end }}" "$container"); do
    hostpath=$(echo $hostpath|tr -d '"')
    # Make sure hostpath exist
    if [ ! -e "$hostpath" ]; then
      mkdir -p "$hostpath"
    fi
  done
}

# Start containers
start_containers(){
  local CONTAINER
  CMD="docker start"
  wait_daemon
  if ! is_docker_running; then return 1; fi
  if [ -f /var/lib/docker/unraid-autostart ]; then
    while read CONTAINER; do
      if container_exist $CONTAINER && ! is_container_running $CONTAINER; then 
        do_container_paths $CONTAINER
        OUT=$(eval "$CMD $CONTAINER" 2>&1)
        if  [[ $OUT =~ "Error:" ]]; then
          echo -n $CONTAINER": "$OUT
        else
          echo "$CONTAINER: started succesfully!"
        fi
      fi
    done </var/lib/docker/unraid-autostart
  fi
}

docker_start() {
  if is_docker_running; then
    echo "$DOCKER is already running"
    return 1
  fi
  if [ "$DOCKER_ENABLED" != "yes" ]; then
    echo "$DOCKER is not enabled"
    exit 1
  fi
  if ! mountpoint /var/lib/docker &> /dev/null ; then
    echo "no image mounted at /var/lib/docker"
    exit 1
  fi
  echo "starting $BASE ..."
  if [ -x ${DOCKER} ]; then
    # If there is an old PID file (no docker running), clean it up:
    if [ -r ${DOCKER_PIDFILE} ]; then
      if ! ps axc | grep docker 1> /dev/null 2> /dev/null ; then
        echo "Cleaning up old ${DOCKER_PIDFILE}."
        rm -f ${DOCKER_PIDFILE}
      fi
    fi
    nohup "${UNSHARE}" --propagation slave -- ${DOCKER} daemon -p ${DOCKER_PIDFILE} ${DOCKER_OPTS} >> ${DOCKER_LOG} 2>&1 &
  fi
}

# Stop docker:
docker_stop() {
  echo "stopping $BASE ..."
  # If there is no PID file, ignore this request...
  if [ -r ${DOCKER_PIDFILE} ]; then
    RUNNING=$(docker ps -q)
    if [[ $RUNNING ]]; then
      docker stop $RUNNING
    fi
    kill $(cat ${DOCKER_PIDFILE})
    # must ensure daemon has stopped before unmounting image volume
    sleep 1
    for i in {1..14}; do
      if [ -r ${DOCKER_PIDFILE} ]; then
        echo "waiting for docker to die..."
        sleep 1
      fi
    done
    if [ -r ${DOCKER_PIDFILE} ]; then
      echo "docker will not die!"
      exit 1
    fi
  fi
  # tear down the bridge
  ifconfig docker0 down 2> /dev/null
  brctl delbr docker0 2> /dev/null
}

# Restart docker:
docker_restart() {
    docker_stop
    sleep 1
    docker_start
    start_containers
}

case "$1" in
'start')
  docker_start
  start_containers
  ;;
'stop')
  docker_stop
  ;;
'restart')
  docker_restart
  ;;
'status')
  if [ -f ${DOCKER_PIDFILE} ] && ps -o cmd $(cat ${DOCKER_PIDFILE}) | grep -q $BASE ; then
      echo "status of $BASE: running"
      echo "running containers:" $(running_containers)
  else
      echo "status of $BASE: stopped"
      exit 1
  fi
  ;;
*)
  echo "usage $0 start|stop|restart|status"
esac

exit 0

Please note that I already added a do_container_paths function to deal with the deprecation of directory creation by the daemon.

The option to map a shared volume is already pushed in a PR.

Thanks for your consideration.

MD5's of bz* files

Not webUI related per se, but going forward on unRaid releases can a md5 / sha256 file be included containing the checksums of the bz* files. Working on a new test for FCP to check the actual integrity of the files on the flash, and those are conspicuously missing.

Grave accent in variables breaks Docker management

Using the grave accent (`) character in variable field for containers breaks command execution.

Researching what characters are to be escaped and how exec statements should be filtered might be the way forward for exec statements containing user input.

Detaching the user interface from the back-end

The current web system is processing data inline within the graphical user interface, meaning that if an element in the middle of the page contains particular data that takes some time to be processed, or the returning command is taking some time to respond, the complete render of the web page will be delayed by that amount of time.

The current approach is not a good practice when having to wait for multiple or time-consuming commands to return their value, which is the cause of loading delays that we have all seen.

Should there be a roadmap for separating the concerns of front and back-ends for future iterations of unRAID? Unifying back-end functionality in classes and modules instead of relying on separate script files as it is right now as well as consuming the back end with a modern front-end framework instead of parsing inline will improve the speed, performance, responsiveness, and development of the web system.

Add TravisCI/AppVeyor merge checks

One way of improving the quality of code is to use tools for continuous integration. They would make sure that code is written consistently, follows best practices and that it works. Please consider adding TravisCI, AppVeyor or why not both as pull request checking tools to improve the codebase quality.

robots.txt

To keep Unraid servers from being indexed by search engines, please consider adding a robots.txt in /usr/local/emhttp that contains:

User-agent: *
Disallow: /

and then adding this to rc.nginx to serve the file without requiring authentication:

#
# robots.txt available without authentication
#
location = /robots.txt {
    auth_basic off;
    allow all;
}

Optimising the layout for mobile devices

The current web system does not scale well when used with mobile/tablet devices. Is the main web developer interested in planning a roadmap for a mobile-friendly responsive approach?

Ampersand in WebUI not rendered properly

When having a URL value containing an ampersand in the WebUI field of a Docker template it is rendered as &amp; instead of & in at the href of the WebUI drop-down menu item which breaks links.

Formation of certain file names in diagnosics.zip file confuses win10

If a file name contains a colon, for example:

smart/SanDisk_Cruzer_Fit_4C530013101116118182-0:0-20161008-1006.txt

Windows will not be able to open this file. This causes the "right-click/Extract" context menu to fail as well.

The name of these smart files is taken from /dev/disk/by-id. For some reason, udev appends "-0:0" for usb bus type. This is the core issue. Not sure best way to solve this yet.

Button order wrong on new "Proceed?" dialog boxes

LOL took me a while to notice wth was wrong, but here it is: the "Cancel" and "Ok" buttons are in the wrong order! That is, the "Ok" button should be on the left and the "Cancel" button should be on the right in all these confirmation dialogs.

Apps/Docker icon animations timing issue

I am a big fan of the starting/stopping animations that have been added to the running APP on unRAID. However, I notice one small bug, which I am sure is not by design.

If you have two running docker containers for example, both will show the green "play" icon. If you were to stop one of the two containers, it will go into a rotating red "arrows" animation. Wile that is running, if you are to stop another running container, the second container also start to play the "arrows" animation. The moment the first container fully stops, and the view refreshes to the red "stop" icon, it's also refreshing the still active "arrows" on the other still stopping container, which then shows as the green "play" icon. Then abruptly changes to "stop".

duplicate nav-item id's

The HTML of the menu looks like this:

<div id="menu">
  <div id="nav-left">
    <div id="nav-item">..</div>
    <div id="nav-item">..</div>
    <div id="nav-item">..</div>
  </div>
</div>

HTML id's are supposed to be unique, wouldn't the nav-item's be better as classes rather than ids?

UI: Docker CPU Usage Scaling Issue

I am running a server with 2 CPUs, 10 cores/20 threads each. When viewing the new CPU usage bar for the docker containers, it quite often extends beyond its boundary.

dockercpuusage

It's obviously nothing major, just wanted to bring it up in case no one was aware of it

Time to have dynamix enforce icon sizes?

Dynamix is inconsistent in places where in some spots (plugins tab), the icons are resized to 48px, but other areas (settings tab) there is no forced sizing, and its up to the author of the plugin to resize the settings icon chosen appropriately. Everywhere in the GUI where icons are expected to be a certain size, the size should be enforced by dynamix and not by the add-on authors.

While the current system does work, a ton of the icons for plugins in CA look terrible because the author is simply reusing the 48px low res icon from the GUI.

Docker variable plus character bug

When having a plus character within a Docker configuration variable, it gets saved correctly within the XML file, but when starting the container, it gets replaced with a single white space.

Task scheduler for internal operations

Certain back-end operations take up significant time to execute which affects user experience (reference: #290 (comment)).

Perhaps there can to be an internal task scheduler for certain operations that happen without the user requesting them during page load time? That way webGui could consume recent updates instead of being the initiator for their generation.

UserAdd/UserEdit funny business

First we should combine these two somehow to make life simpler, because for one thing, the help text that is present in UserAdd.page is missing from UserEdit.page, such as max length of Description, password, etc.

Re: password - there is max length of 40 specified for this field, but linux and I presume browser login dialog boxes have no such limitation. A user got into a situation where they set an invalid (to them) password as follows:

The have a very long password string, longer than 40 chars in a file somewhere and they selected/copied to clipboard. Next they pasted into password field when creating new password for a user. But webgui is happy to take all chars but only "keeps" the first 40, user does not know that password got truncated. Later they login via browser login dialog, paste same password, and there is a mismatch. :(

6.5.3 -- webui // case

Minor case issue on Update all Plugins in the top right on the Plugins page.
It looks like All should capitalized? so it matches the title in the modal?
unraid

CreateDocker warning

Creating a new container using the simple UI view produces:
Warning: count(): Parameter must be an array or an object that implements Countable in /usr/local/emhttp/plugins/dynamix.docker.manager/include/CreateDocker.php on line 222

6.5-wip?

Following the current conventions, shouldn't the actively maintained branch be called 6.5-wip?

unRaid versioning

FYI, unRaid now has a version of 6.4.0_rc10b while the previous standard you've been using should have been 6.4.0-rc10b

Luckily, PHP version_compare still understands that _rc10b is a later version than -rc9f, but any bash scripts etc might fail when checking for versions.

Be consistent

Docker and VMs missing from menu bar

Used to be if Docker is enabled then 'Docker' showed up on menu bar whether array was started or not, and if user clicked Docker menu item with array Stopped, page would say "Array must be started to view Docker containers" (or some such text). Current behavior is that if array is Stopped, Docker does not show up at all on menu bar whether it's enabled or not. This is wrong.

Ditto above paragraph for VMs.

Unassigned devices does not consider removable storage

Just noticed a bug in the webGui where after attaching a USB storage device it shows up in the unassigned devices block but after its removal from the system it continues to stay there. Potential solutions other than rebooting the system?

mdState is STARTED when in maintenance mode.

While technically the array is started in maintenance mode, I would have expected the mdState in var.ini holds a different value than STARTED. Not sure if its an oversight or by design.

need unRAID icon in dynamix.vm.manager

Minor request... Would you please add an unRAID icon to the webgui/plugins/dynamix.vm.manager/templates/images/ folder? This will allow us to assign an appropriate icon to an unRAID VM. Thanks!

Update tooltipster to 4.2.3+

6.3.3 includes tooltipster 4.1.7 On certain mobile devices, CA's updated UI which is leveraging triggeropen:click:true for interactive popups, the popup never appears.

When utilizing tooltipster 4.2.3 (latest), the mobile devices will display the pop ups with no issues.

Array status icon on rc16b

screen shot 2017-12-17 at 02 59 02

It is inappropriate to have a battery icon indicating disk array status since there is UPS functionality in unRAID that involves a battery and both are irrelevant to each other. Please use something else that signifies hard disks or a disk array.

Addition of EDAC state information

In addition to #176 and with addition of the CONFIG_EDAC* modules in unRAID 6.4.0-rc10b it would be useful to display the EDAC state within the System Information dialog. Although this could be extracted from the syslog, would the use of edac-util be more suitable considering further features integration such as reporting of uncorrected or corrected errors recorded by EDAC?

reboot visual confusion

When Reboot is clicked, nothing seems to happen for a couple seconds and then we see a "REBOOT" page which is actually /reboot.htm with a count-up timer. Then eventually server does reboot and the Main page is displayed again. But in this case there are no device lines populated unless a manual refresh is done. Maybe would be better to confine the reboot progress in the same notification window for one thing?

Single branch 'master'

Currently there are two branches for 6.5. Can this be reduced to a single 'master' branch?

Time to deprecate ReiserFS

With the seemingly never ending problems with supporting reiserFS, maybe its time to actually deprecate it. A start would be to completely remove reiser from the default disk and individual disk FS choices. Still keep the options to mount a reiser formatted disk.

Unclean shutdown counter

Can we get emhttp to keep track of the number of unclean shutdowns detected (and the date of the last detection), and have it stored in /boot/config or something so it can be included in the diagnostics . Non-resettable from the GUI, unless a New Config is issued. Logical place for the code is in emhttp, so no PR from me here.

Might help in determining certain corruption issues, how stable the user's system actually is, etc.

Heads up: we're going to merge 6.4-wip back into master

Since development workflow has changed we are going merge 6.4-wip branch back into master and then delete the 6.2, 6.3, and 6.4-wip branches. The two PR's sitting there for 6.4-wip are going to be lost, but:

"Add VM template for unRAID" is on our road map and noted for a future release, and
"Array status statistics panel space optimisation" is something we won't merge in current form anyway.

We plan to do this on Tuesday 13 March 2018.

Fetch container status via json pulls instead of page refresh

When starting/stopping multiple containers it is not practical to have the delay that the page reload causes. Sometimes a container starts after the page has been reloaded, which requires another reload to see the expected status. Please inform the front-end of the containers' status via periodic json updates instead of reloading the page.

6.5.2-rc2?

Noticed the 6.5.2-rc2 tag in the repository while no 6.5.1-rc2, which is the current next release.

Time to add SweetAlert2?

Hi guys. The first generation of SweetAlert is unmaintained, and it's fork, called SweetAlert2 has loads of new goodies, like chaining modals, loads of input types, etc...

I think it's doable to add the fork without removing the original one, giving time to authors to migrate to the new version. What do you think?

Expanding average cpu load information capacity

Data from the cpuload web socket can be sampled in a dynamically updating dynagraph with history for the last 60 seconds.

Adding this feature will improve the layout functionality by providing some historical overview of the cpu load. It will require a buffer to store the information prior the user opening the page. Further interest could bring individual per-core data as it is in modern hardware activity monitors.

Special characters in container configs doesn't work as expected

After installing a mariadb instance with special characters (ampersand) in the root password field I've noticed the Warning: SimpleXMLElement::addChild(): unterminated entity reference ... in /usr/local/emhttp/plugins/dynamix.docker.manager/include/CreateDocker.php on line 219.

On my installation (6.4.0-rc9f) this is the line $config = $xml->addChild('Config', $post['confValue'][$i]);

Looking in the XML template created, the ampersand has been converted to &amp; which is something you do not want for a password field. Escaping instead of converting to safe html characters should be the way to go in terms of preserving the data. It is then up to the rendering component of the webGui to do its job to the display data safely.

Since escaping < and > is not possible between opening and closing XML tags, please consider switching to JSON, where escaping of quotes is possible with \ or SQLite where no escaping should be required.

PS: The escaped password value that was generated within the XML does not show up when updating the container, instead the default value populates the input.

Calls to CSS/JS should be wrapped with autov()

The following files contain references to CSS/JS files that should be wrapped with autov( ) to prevent caching issues:

https://github.com/limetech/webgui/blob/master/plugins/dynamix.plugin.manager/Plugins.page#L26
<link type="text/css" rel="stylesheet" href="/webGui/styles/jquery.filetree.css">

https://github.com/limetech/webgui/blob/master/plugins/dynamix.vm.manager/templates/Custom.form.php
https://github.com/limetech/webgui/blob/master/plugins/dynamix.vm.manager/templates/LibreELEC.form.php
https://github.com/limetech/webgui/blob/master/plugins/dynamix.vm.manager/templates/OpenELEC.form.php
https://github.com/limetech/webgui/blob/master/plugins/dynamix.vm.manager/templates/XML_Expert.form.php

<link rel="stylesheet" href="/plugins/dynamix.vm.manager/scripts/codemirror/lib/codemirror.css">
<link rel="stylesheet" href="/plugins/dynamix.vm.manager/scripts/codemirror/addon/hint/show-hint.css">
<script src="/plugins/dynamix.vm.manager/scripts/codemirror/lib/codemirror.js"></script>
<script src="/plugins/dynamix.vm.manager/scripts/codemirror/addon/display/placeholder.js"></script>
<script src="/plugins/dynamix.vm.manager/scripts/codemirror/addon/fold/foldcode.js"></script>
<script src="/plugins/dynamix.vm.manager/scripts/codemirror/addon/hint/show-hint.js"></script>
<script src="/plugins/dynamix.vm.manager/scripts/codemirror/addon/hint/xml-hint.js"></script>
<script src="/plugins/dynamix.vm.manager/scripts/codemirror/addon/hint/libvirt-schema.js"></script>
<script src="/plugins/dynamix.vm.manager/scripts/codemirror/mode/xml/xml.js"></script>

https://github.com/limetech/webgui/blob/master/plugins/dynamix.vm.manager/vnc.html

<link rel="stylesheet" href="novnc/app/styles/base.css" />
<script type="text/javascript" src="novnc/app/error-handler.js"></script>
<script src="novnc/vendor/promise.js"></script>

https://github.com/limetech/webgui/blob/master/plugins/dynamix/DisplaySettings.page#L29
<script src="/webGui/javascript/jquery.filedrop.js"></script>

https://github.com/limetech/webgui/blob/master/plugins/dynamix/DashboardApps.page#L10-L11

<link type="text/css" rel="stylesheet" href="/webGui/styles/jquery.ui.css">
<link type="text/css" rel="stylesheet" href="/webGui/styles/jquery.switchbutton.css">

https://github.com/limetech/webgui/blob/master/plugins/dynamix/UserAdd.page#L36
<script src="/webGui/javascript/jquery.filedrop.js"></script>

https://github.com/limetech/webgui/blob/master/plugins/dynamix/UserEdit.page#L43
<script src="/webGui/javascript/jquery.filedrop.js"></script>

https://github.com/limetech/webgui/blob/master/plugins/dynamix/Syslinux.page#L36
<link type="text/css" rel="stylesheet" href="/webGui/styles/jquery.switchbutton.css">

https://github.com/limetech/webgui/blob/master/plugins/dynamix/include/Boot.php#L19

<link type="text/css" rel="stylesheet" href="/webGui/styles/default-fonts.css">
<script src="/webGui/javascript/dynamix.js"></script>

https://github.com/limetech/webgui/blob/master/plugins/dynamix/include/Feedback.php#L78
<script type="text/javascript" src="/webGui/javascript/dynamix.js"></script>

https://github.com/limetech/webgui/blob/master/plugins/dynamix/include/ReplaceKey.php#L21
<script src="/webGui/javascript/dynamix.js"></script>

https://github.com/limetech/webgui/blob/master/plugins/dynamix/include/TrialRequest.php#L20
<script src="/webGui/javascript/dynamix.js"></script>

Additionally, this line has a typo, where an extra ">" is inside the call to autov:

https://github.com/limetech/webgui/blob/master/plugins/dynamix/include/CryptoBenchmark.php#L31
<link type="text/css" rel="stylesheet" href="<?autov("/webGui/styles/font-awesome.css">)?>">

Once all the CSS/JS files are wrapped with calls to autov, it would be ideal to modify the nginx config to enable gzip and set a long cache duration on these directories:

  /webGui/javascript/
  /webGui/styles/

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.