diff options
author | nachoparker <nacho@ownyourbits.com> | 2018-04-03 14:08:20 +0300 |
---|---|---|
committer | nachoparker <nacho@ownyourbits.com> | 2018-04-03 14:58:47 +0300 |
commit | fa1ec759f5ae2ecd7d29eee0f963e449729a897d (patch) | |
tree | 0f6f503d84df6b33529199021ea1982619fa34bb | |
parent | b94bcb42134b12f936e8067959672cba6632efe4 (diff) |
ncp-web: implement dashboardv0.53.10
-rw-r--r--[-rwxr-xr-x] | bin/ncp-diag | 13 | ||||
-rwxr-xr-x | bin/ncp-report | 2 | ||||
-rw-r--r-- | bin/ncp-suggestions | 38 | ||||
-rw-r--r-- | changelog.md | 8 | ||||
-rw-r--r-- | etc/nextcloudpi-config.d/nc-info.sh | 35 | ||||
-rw-r--r-- | ncp-web/img/dashboard.svg | 65 | ||||
-rw-r--r-- | ncp-web/index.php | 51 | ||||
-rw-r--r-- | ncp-web/ncp-launcher.php | 69 | ||||
-rw-r--r-- | ncp-web/ncp.css | 47 | ||||
-rw-r--r-- | ncp-web/ncp.js | 36 |
10 files changed, 282 insertions, 82 deletions
diff --git a/bin/ncp-diag b/bin/ncp-diag index e58afe72..e3f3b99b 100755..100644 --- a/bin/ncp-diag +++ b/bin/ncp-diag @@ -32,10 +32,12 @@ echo "datadir|$DATADIR$DIRINFO" echo "data disk usage|$( df -h "$DATADIR" | tail -1 | awk '{ print $3"/"$2 }')" } echo "rootfs usage|$( df -h / | tail -1 | awk '{ print $3"/"$2 }')" -echo "swapfile|$( swapon | tail -1 | awk '{ print $1 }' )" +SWP="$( swapon | tail -1 | awk '{ print $1 }' )" +[[ "$SWP" == "" ]] && SWP="none" +echo "swapfile|$SWP" # Nextcloud -VERSION="$( sudo -u www-data php /var/www/nextcloud/occ status | grep "version:" | awk '{ print $3 }' )" +VERSION="$( php /var/www/nextcloud/occ status | grep "version:" | awk '{ print $3 }' )" if [[ "$VERSION" != "" ]]; then echo "Nextcloud check|ok" echo "Nextcloud version|$VERSION" @@ -75,13 +77,10 @@ echo "gateway|$GW" echo "interface|$IFACE" # Certificates -LEOUT="$( /etc/letsencrypt/letsencrypt-auto certificates 2>/dev/null )" -CERTS="$( echo -e "$LEOUT" | grep "Domains:" | awk '{ print $2 }' | tr '\n' ' ' )" -CDUE="$( echo -e "$LEOUT" | grep "VALID:" | grep -oP "\d+ days" | tr '\n' ' ' )" +CERTS="$( grep "SSLCertificateFile /etc/letsencrypt/live/" /etc/apache2/sites-available/nextcloud.conf \ + | sed 's|.*SSLCertificateFile /etc/letsencrypt/live/||;s|/fullchain.pem||' )" [[ "$CERTS" == "" ]] && CERTS=none -[[ "$CDUE" == "" ]] && CDUE=none echo "certificates|$CERTS" -echo "certs due|$CDUE" RESOLV="$( ping -c 1 "$CERTS" 2>/dev/null | head -1 | grep -oP '\d{1,3}(.\d{1,3}){3}' )" echo "NAT loopback|$( [[ "$RESOLV" == "$IP" ]] && echo yes || echo no )" diff --git a/bin/ncp-report b/bin/ncp-report index 5b11ee0f..0556423b 100755 --- a/bin/ncp-report +++ b/bin/ncp-report @@ -39,7 +39,7 @@ echo "<--! Paste this in GitHub report -->" ## open_summary "NextCloudPi diagnostics" -ncp-diag | column -t -s'|' +bash /usr/local/bin/ncp-diag | column -t -s'|' close_summary ## diff --git a/bin/ncp-suggestions b/bin/ncp-suggestions new file mode 100644 index 00000000..0b7b0da3 --- /dev/null +++ b/bin/ncp-suggestions @@ -0,0 +1,38 @@ +#!/bin/bash + +# +# NextCloudPi configuration suggestions +# +# Copyleft 2018 by Ignacio Nunez Hernanz <nacho _a_t_ ownyourbits _d_o_t_ com> +# GPL licensed (see end of file) * Use at your own risk! +# +# Usage: +# sudo ncp-suggestions "$( ncp-diag )" +# +# More at https://ownyourbits.com +# + +OUT="$@" + +DNSMASQ_ON="$( grep "^ACTIVE_=" /usr/local/etc/nextcloudpi-config.d/dnsmasq.sh | cut -d'=' -f2 )" + +grep -q "distribution|.*bian GNU/Linux 9" <<<"$OUT" || \ + echo -e "You are using an unsupported distro release. Please upgrade to latest Debian/Raspbian" + +[[ $DNSMASQ_ON != "yes" ]] && \ + grep -q "NAT loopback|no" <<<"$OUT" && \ + echo -e "\nYou should enable dnsmasq to use your domain inside home" + +grep -q "certificates|none" <<<"$OUT" && \ + echo -e "\nYou should run Lets Encrypt for trusted encrypted access" + +grep -q "port check .*|closed" <<<"$OUT" && \ + echo -e "\nYou should open your ports for Lets Encrypt and external access" + +grep -q "USB devices|none" <<<"$OUT" || { + grep -q "data in SD|yes" <<<"$OUT" && \ + echo -e "\nYou should use nc-datadir to move your files to your plugged in USB drive" + + grep -q "automount|no" <<<"$OUT" && \ + echo -e "\nYou should enable automount to use your plugged in USB drive" +} diff --git a/changelog.md b/changelog.md index 4dbc2e06..e8a0b4f7 100644 --- a/changelog.md +++ b/changelog.md @@ -1,7 +1,11 @@ -[v0.53.8](https://github.com/nextcloud/nextcloudpi/commit/cc733af) (2018-04-02) ncp-web: fix update notification +[v0.53.10](https://github.com/nextcloud/nextcloudpi/commit/dce58cc) (2018-04-03) ncp-web: implement dashboard -[v0.53.7](https://github.com/nextcloud/nextcloudpi/commit/d4ca26a) (2018-03-29) ncp-web: use random passwords for NC and ncp-web +[v0.53.9](https://github.com/nextcloud/nextcloudpi/commit/486d6ef) (2018-04-02) SSH: stop service upon activation + +[v0.53.8 ](https://github.com/nextcloud/nextcloudpi/commit/afd2c8e) (2018-04-02) ncp-web: fix update notification + +[v0.53.7 ](https://github.com/nextcloud/nextcloudpi/commit/d4ca26a) (2018-03-29) ncp-web: use random passwords for NC and ncp-web [v0.53.6 ](https://github.com/nextcloud/nextcloudpi/commit/151160b) (2018-03-27) samba: dont force NAME_REGEX for username diff --git a/etc/nextcloudpi-config.d/nc-info.sh b/etc/nextcloudpi-config.d/nc-info.sh index 8ff1bc69..33ffb05b 100644 --- a/etc/nextcloudpi-config.d/nc-info.sh +++ b/etc/nextcloudpi-config.d/nc-info.sh @@ -7,7 +7,7 @@ # # Usage: # -# ./installer.sh nc-diag.sh <IP> (<img>) +# ./installer.sh nc-info.sh <IP> (<img>) # # See installer.sh instructions for details # More at: https://ownyourbits.com @@ -17,36 +17,16 @@ DESCRIPTION="Print NextCloudPi system info" configure() { - # info - - local OUT="$( ncp-diag )" echo "Gathering information..." + local OUT="$( bash /usr/local/bin/ncp-diag )" + + # info echo "$OUT" | column -t -s'|' # suggestions - - DNSMASQ_ON="$( grep "^ACTIVE_=" /usr/local/etc/nextcloudpi-config.d/dnsmasq.sh | cut -d'=' -f2 )" - - grep -q "distribution|.*bian GNU/Linux 9" <<<"$OUT" || \ - echo -e "\nYou are using an unsupported distro release. Please upgrade to latest Debian/Raspbian" - - [[ $DNSMASQ_ON != "yes" ]] && \ - grep -q "NAT loopback|no" <<<"$OUT" && \ - echo -e "\nYou should enable dnsmasq to use your domain inside home" - - grep -q "certificates|none" <<<"$OUT" && \ - echo -e "\nYou should run Lets Encrypt for trusted encrypted access" - - grep -q "port check .*|closed" <<<"$OUT" && \ - echo -e "\nYou should open your ports for Lets Encrypt and external access" - - grep -q "USB devices|none" <<<"$OUT" || { - grep -q "data in SD|yes" <<<"$OUT" && \ - echo -e "\nYou should use nc-datadir to move your files to your plugged in USB drive" - - grep -q "automount|no" <<<"$OUT" && \ - echo -e "\nYou should enable automount to uyyse your plugged in USB drive" - } + echo + bash /usr/local/bin/ncp-suggestions "$OUT" + return 0 } @@ -68,4 +48,3 @@ install() { :; } # along with this script; if not, write to the # Free Software Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307 USA - diff --git a/ncp-web/img/dashboard.svg b/ncp-web/img/dashboard.svg new file mode 100644 index 00000000..294f2018 --- /dev/null +++ b/ncp-web/img/dashboard.svg @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="11.858879" + width="12.743636" + version="1.0" + viewBox="0 0 12.743636 11.858879" + id="svg6" + sodipodi:docname="app-dark.svg" + inkscape:version="0.92.2 2405546, 2018-03-11"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="740" + inkscape:window-height="480" + id="namedview8" + showgrid="false" + inkscape:zoom="7.375" + inkscape:cx="14.032185" + inkscape:cy="11.980041" + inkscape:window-x="534" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="svg6" /> + <rect + ry="1.9665999" + height="31.997" + width="31.997" + display="none" + y="-16.117743" + x="-1.967815" + id="rect2" + style="display:none;fill:#cccccc" /> + <path + d="m 0.9210639,6.4191634 h 2.171293 L 5.0996871,2.3379828 7.7014791,9.71018 9.6253517,6.4209341 11.822572,6.4190841" + stroke-miterlimit="100" + id="path4" + style="fill:#ffffff;stroke:#ffffff;stroke-width:1.81625974;stroke-linecap:round;stroke-miterlimit:100;stroke-opacity:1" + inkscape:connector-curvature="0" /> +</svg> diff --git a/ncp-web/index.php b/ncp-web/index.php index aa6ed315..2f1696ff 100644 --- a/ncp-web/index.php +++ b/ncp-web/index.php @@ -111,6 +111,11 @@ HTML; </a> </div> <div id="header-right"> + <div id="dashboard-btn"> + <div id="expand"> + <div class="icon-dashboard"></div> + </div> + </div> <?php if ( file_exists( 'wizard' ) ) echo <<<HTML @@ -139,7 +144,7 @@ HTML; <?php // fill options with contents from directory - $files = array_diff(scandir($modules_path), array('.', '..', 'nc-wifi.sh', 'l10n')); + $files = array_diff(scandir($modules_path), array('.', '..', 'nc-wifi.sh', 'nc-info.sh', 'l10n')); foreach ($files as $file) { $script = pathinfo($file, PATHINFO_FILENAME); @@ -169,24 +174,33 @@ HTML; <div id="app-content"> <div id="app-navigation-toggle" class="icon-menu hidden"></div> - <h2 id="config-box-title"><?php echo $l->__("Configure NextCloudPi features"); ?></h2> - <a href="#" target="_blank"> - <div id="config-extra-info" class="icon-info"></div> - </a> - <div id="config-box-info"></div> - <br/> - <div id="config-box-wrapper" class="hidden"> - <form> - <div id="config-box"></div> - <div id="config-button-wrapper"> - <button id="config-button"><?php echo $l->__("Run"); ?></button> - <img id="loading-gif" src="img/loading-small.gif"> - <div id="circle-retstatus" class="icon-red-circle"></div> - </div> - </form> - <textarea readonly id="details-box" rows="12"></textarea> + + <div id="config-wrapper" class="hidden"> + <h2 id="config-box-title" class="text-title"><?php echo $l->__("System Info"); ?></h2> + <div id="config-box-info-txt"></div> + <a href="#" target="_blank"> + <div id="config-extra-info" class="icon-info"></div> + </a> + <br/> + <div id="config-box-wrapper" class="table-wrapper"> + <form> + <div id="config-box"></div> + <div id="config-button-wrapper"> + <button id="config-button"><?php echo $l->__("Run"); ?></button> + <img id="loading-gif" src="img/loading-small.gif"> + <div id="circle-retstatus" class="icon-red-circle"></div> + </div> + </form> + <textarea readonly id="details-box" class="outputbox" rows="12"></textarea> + </div> </div> + <div id="dashboard-wrapper"> + <h2 class="text-title"><?php echo $l->__("System Info"); ?></h2> + <div id="dashboard-suggestions" class="table-wrapper"></div> + <div id="dashboard-table" class="outputbox table-wrapper"></div> + </div> + <div id="loading-info-gif"> <img src="img/loading-small.gif"> </div> </div> <div id="poweroff-dialog" class='dialog primary hidden'> @@ -200,7 +214,8 @@ HTML; <?php include('csrf.php'); - echo '<input type="hidden" id="csrf-token" name="csrf-token" value="' . getCSRFToken() . '"/>'; + echo '<input type="hidden" id="csrf-token" name="csrf-token" value="' . getCSRFToken() . '"/>'; + echo '<input type="hidden" id="csrf-token-dash" name="csrf-token-dash" value="' . getCSRFToken() . '"/>'; ?> <script src="minified.js"></script> <script src="ncp.js"></script> diff --git a/ncp-web/ncp-launcher.php b/ncp-web/ncp-launcher.php index 004432d0..dca17592 100644 --- a/ncp-web/ncp-launcher.php +++ b/ncp-web/ncp-launcher.php @@ -38,8 +38,7 @@ if ( $_POST['action'] == "cfgreq" ) $fh = fopen( $path . $_POST['ref'] . '.sh' ,'r') or exit( '{ "output": "' . $file . ' read error" }' ); - // Get new token - echo '{ "token": "' . getCSRFToken() . '",'; + echo '{ "token": "' . getCSRFToken() . '",'; // Get new token echo ' "output": '; $output = "<table>"; @@ -52,10 +51,10 @@ if ( $_POST['action'] == "cfgreq" ) $checked = ""; if ( $matches[2] == "yes" ) $checked = "checked"; - $output = $output . "<tr>"; - $output = $output . "<td><label for=\"$matches[1]\">". $l->__($matches[1], $_POST['ref']) ."</label></td>"; - $output = $output . "<td><input type=\"checkbox\" id=\"$matches[1]\" name=\"$matches[1]\" value=\"$matches[2]\" $checked></td>"; - $output = $output . "</tr>"; + $output .= "<tr>"; + $output .= "<td><label for=\"$matches[1]\">". $l->__($matches[1], $_POST['ref']) ."</label></td>"; + $output .= "<td><input type=\"checkbox\" id=\"$matches[1]\" name=\"$matches[1]\" value=\"$matches[2]\" $checked></td>"; + $output .= "</tr>"; } // drop down menu else if(preg_match('/^(\w+)_=\[(([_\w]+,)*[_\w]+)\]$/', $line, $matches)) @@ -78,14 +77,14 @@ if ( $_POST['action'] == "cfgreq" ) // text field else if ( preg_match('/^(\w+)_=(.*)$/', $line, $matches) ) { - $output = $output . "<tr>"; - $output = $output . "<td><label for=\"$matches[1]\">". $l->__($matches[1], $_POST['ref']) ."</label></td>"; - $output = $output . "<td><input type=\"text\" name=\"$matches[1]\" id=\"$matches[1]\" value=\"$matches[2]\" size=\"40\"></td>"; - $output = $output . "</tr>"; + $output .= "<tr>"; + $output .= "<td><label for=\"$matches[1]\">". $l->__($matches[1], $_POST['ref']) ."</label></td>"; + $output .= "<td><input type=\"text\" name=\"$matches[1]\" id=\"$matches[1]\" value=\"$matches[2]\" size=\"40\"></td>"; + $output .= "</tr>"; } } - $output = $output . "</table>"; + $output .= "</table>"; fclose($fh); echo json_encode( $output ) . ' }'; // close JSON @@ -129,9 +128,8 @@ else if ( $_POST['action'] == "launch" && $_POST['config'] ) file_put_contents($file, $code ) or exit( '{ "output": "' . $file . ' write error" }' ); - // Get new token - echo '{ "token": "' . getCSRFToken() . '",'; - echo ' "ref": "' . $_POST['ref'] . '",'; + echo '{ "token": "' . getCSRFToken() . '",'; // Get new token + echo ' "ref": "' . $_POST['ref'] . '",'; echo ' "output": "" , '; echo ' "ret": '; @@ -154,6 +152,49 @@ else { shell_exec('bash -c "( sleep 2 && sudo reboot ) 2>/dev/null >/dev/null &"'); } + else if ( $_POST['action'] == "info" ) + { + exec( 'bash /usr/local/bin/ncp-diag', $output, $ret ); + + // info table + $table = '<table id="dashtable">'; + foreach( $output as $line ) + { + $table .= "<tr>"; + $fields = explode( "|", $line ); + $table .= "<td>$fields[0]</td>"; + + $class = ""; + if ( strpos( $fields[1], "up" ) !== false + || strpos( $fields[1], "ok" ) !== false + || strpos( $fields[1], "open" ) !== false ) + $class = 'class="ok-field"'; + if ( strpos( $fields[1], "down" ) !== false + || strpos( $fields[1], "error" ) !== false ) + $class = 'class="error-field"'; + + $table .= "<td $class>$fields[1]</td>"; + $table .= "</tr>"; + } + $table .= "</table>"; + + // suggestions + $suggestions = ""; + if ( $ret == 0 ) + { + exec( "bash /usr/local/bin/ncp-suggestions \"" . implode( "\n", $output ) . '"', $out, $ret ); + foreach( $out as $line ) + if ( $line != "" ) + $suggestions .= "<p class=\"warn-field\">‣ $line</p>"; + } + + // return JSON + echo '{ "token": "' . getCSRFToken() . '",'; // Get new token + echo ' "ref": " ' . $_POST['ref'] . '",'; + echo ' "table": ' . json_encode( $table ) . ' , '; + echo ' "suggestions": ' . json_encode( $suggestions ) . ' , '; + echo ' "ret": "' . $ret . '" }'; + } } // License diff --git a/ncp-web/ncp.css b/ncp-web/ncp.css index 447a9c47..30cf2acb 100644 --- a/ncp-web/ncp.css +++ b/ncp-web/ncp.css @@ -1049,22 +1049,22 @@ select { border-style:solid } -#config-box-wrapper { +.table-wrapper { width: 80%; max-width: 450px; margin-left: auto; margin-right: auto; } -#config-box-wrapper table { +.table-wrapper table { width: 100%; } -#config-box-wrapper input[type='text'] { +.table-wrapper input[type='text'] { width: 100%; } -#details-box { +.outputbox { width: 100%; } @@ -1072,11 +1072,18 @@ select { display: none; } -#config-box-title { +#loading-info-gif { + display: flex; + justify-content: center; + align-items: center; + margin-top: 96px; +} + +.text-title { text-align: center; } -#config-box-info { +#config-box-info-txt { white-space: pre-wrap; text-align: center; } @@ -1126,6 +1133,9 @@ select { .icon-reboot-white { background-image: url('img/reboot.svg'); } +.icon-dashboard { + background-image: url('img/dashboard.svg'); +} .icon-wizard-white { background-image: url('img/wizard.svg'); @@ -1259,3 +1269,28 @@ a#versionlink:hover { height: 100%; z-index: 2500; } + +.ok-field{ + color: green; +} + +.error-field{ + color: red; +} + +.warn-field{ + color: gray; +} + +#dashtable tr { + height: 25px; + border-bottom: 1px solid #ebebeb; +} + +#dashtable td { + border-bottom: 1px solid #ebebeb; +} + +#dashboard-suggestions { + margin-bottom: 1em; +} diff --git a/ncp-web/ncp.js b/ncp-web/ncp.js index cd28779d..2e7b3690 100644 --- a/ncp-web/ncp.js +++ b/ncp-web/ncp.js @@ -22,10 +22,14 @@ function cfgreqReceive( result ) var ret = $.parseJSON( result ); if ( ret.token ) $('#csrf-token').set( { value: ret.token } ); + + $('#details-box' ).hide(); + $('#dashboard-wrapper').hide(); $('#circle-retstatus').hide(); $('#config-box').ht( ret.output ); - $('#config-box-title').fill( $( '#' + selectedID + '-desc' ).get( '.value' ) ); - $('#config-box-info' ).fill( $( '#' + selectedID + '-info' ).get( '.value' ) ); + $('#config-box-title' ).fill( $( '#' + selectedID + '-desc' ).get( '.value' ) ); + $('#config-box-info-txt' ).fill( $( '#' + selectedID + '-info' ).get( '.value' ) ); + $('#config-wrapper').show(); $('#config-box-wrapper').show(); $('#config-extra-info').set( { $display: 'inline-block' } ); $('#config-extra-info').up().set( '@href', 'https://github.com/nextcloud/nextcloudpi/wiki/Configuration-Reference#' + selectedID ); @@ -81,9 +85,6 @@ $(function() confLock = false; }).error( errorMsg ); - - //clear details box - $('#details-box').hide( '' ); }); // Launch selected script @@ -300,7 +301,30 @@ $(function() // click to nextcloud button $('#nextcloudpi').set( '@href', window.location.protocol + '//' + window.location.hostname ); -}); + + // load dashboard info + $.request('post', 'ncp-launcher.php', { action: 'info', + csrf_token: $( '#csrf-token-dash' ).get( '.value' ) }).then( + + function success( result ) + { + var ret = $.parseJSON( result ); + if ( ret.token ) + $('#csrf-token').set( { value: ret.token } ); + $('#loading-info-gif').hide(); + $('#dashboard-table').ht( ret.table ); + $('#dashboard-suggestions').ht( ret.suggestions ); + } ).error( errorMsg ); + + // dashboard button + $( '#dashboard-btn' ).on('click', function(e) + { + $( '#config-wrapper' ).hide(); + $( '#dashboard-wrapper' ).show(); + $( '#' + selectedID ).set('-active'); + selectedID = null; + } ); +} ); // License // |