From 43698f0f66d067b5413fcea1141984477c8ce906 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Sat, 28 Aug 2021 20:11:24 +0100 Subject: [PATCH 01/29] Replace tab with space --- scmerlin_www.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scmerlin_www.js b/scmerlin_www.js index dc0fcfb..cfa5543 100644 --- a/scmerlin_www.js +++ b/scmerlin_www.js @@ -145,7 +145,7 @@ function service_status(servicename){ $j.ajax({ url: '/ext/scmerlin/detect_service.js', dataType: 'script', - error: function(xhr){ + error: function(xhr){ setTimeout(service_status,1000,servicename); }, success: function(){ From 11dc5c39d65051fa92263aca97ebe24acd6a97d5 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Sun, 2 Jan 2022 10:48:09 +0000 Subject: [PATCH 02/29] Version bump --- README.md | 4 ++-- scmerlin.sh | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1a85544..4d3590b 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ [![Codacy Badge](https://api.codacy.com/project/badge/Grade/bfd397624cdf4803a465d4ae1530e7fe)](https://www.codacy.com/app/jackyaz/scMerlin?utm_source=github.com&utm_medium=referral&utm_content=jackyaz/scMerlin&utm_campaign=Badge_Grade) ![Shellcheck](https://github.com/jackyaz/scMerlin/actions/workflows/shellcheck.yml/badge.svg) -## v2.4.0 -### Updated on 2021-08-08 +## v2.4.1 +### Updated on 2022-01-02 ## About scMerlin allows you to easily control the most common services/scripts on your router. scMerlin also augments your router's WebUI with a Sitemap and dynamic submenus for the main left menu of Asuswrt-Merlin. diff --git a/scmerlin.sh b/scmerlin.sh index 73265a8..0beb645 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -24,9 +24,9 @@ ### Start of script variables ### readonly SCRIPT_NAME="scMerlin" readonly SCRIPT_NAME_LOWER="$(echo "$SCRIPT_NAME" | tr 'A-Z' 'a-z' | sed 's/d//')" -readonly SCM_VERSION="v2.4.0" -readonly SCRIPT_VERSION="v2.4.0" -SCRIPT_BRANCH="master" +readonly SCM_VERSION="v2.4.1" +readonly SCRIPT_VERSION="v2.4.1" +SCRIPT_BRANCH="develop" SCRIPT_REPO="https://raw.githubusercontent.com/jackyaz/$SCRIPT_NAME/$SCRIPT_BRANCH" readonly SCRIPT_DIR="/jffs/addons/$SCRIPT_NAME_LOWER.d" readonly SCRIPT_WEBPAGE_DIR="$(readlink /www/user)" From e221ca263e4f8c8c3bb297bf9ae6a1b2da4b7e50 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Sun, 2 Jan 2022 10:48:39 +0000 Subject: [PATCH 03/29] Use visibility in CSS for dropdowns instead of display Fix bouncing on homepage with Addons dropdown --- scmerlin.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scmerlin.sh b/scmerlin.sh index 0beb645..677709a 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -485,12 +485,12 @@ Mount_WebUI(){ echo ".menu_Addons { background: url(ext/shared-jy/addons.png); }" >> /tmp/index_style.css fi - if ! grep -q '.dropdown-content' /tmp/index_style.css ; then + if ! grep -q '.dropdown-content {visibility: visible;}' /tmp/index_style.css ; then { - echo ".dropdown-content {top: 0px; left: 185px; display: none; position: absolute; background-color: #3a4042; min-width: 165px; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); z-index: 1000;}" + echo ".dropdown-content {top: 0px; left: 185px; visibility: hidden; position: absolute; background-color: #3a4042; min-width: 165px; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); z-index: 1000;}" echo ".dropdown-content a {padding: 6px 8px; text-decoration: none; display: block; height: 100%; min-height: 20px; max-height: 40px; font-weight: bold; text-shadow: 1px 1px 0px black; font-family: Verdana, MS UI Gothic, MS P Gothic, Microsoft Yahei UI, sans-serif; font-size: 12px; border: 1px solid #6B7071;}" echo ".dropdown-content a:hover {background-color: #77a5c6;}" - echo ".dropdown:hover .dropdown-content {display: block;}" + echo ".dropdown:hover .dropdown-content {visibility: visible;}" } >> /tmp/index_style.css fi From 59dd50ccad6d306672fe1928c9f26e60685297f6 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Sun, 2 Jan 2022 10:55:02 +0000 Subject: [PATCH 04/29] Make a change to ASP to trigger WebUI re-mount in update for new CSS --- scmerlin_www.asp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scmerlin_www.asp b/scmerlin_www.asp index 899b967..f963b06 100644 --- a/scmerlin_www.asp +++ b/scmerlin_www.asp @@ -39,7 +39,7 @@ function LoadCustomSettings(){ } } -/* Taken from firmware WebUI, Tools_SysInfo.asp */ +/* Taken from firmware WebUI, Tools_SysInfo.asp */ function update_sysinfo(e){ $j.ajax({ url: '/ajax_sysinfo.asp', From 09c369b9ef8f8218bddbaaeb5db1554ce01d3d80 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Sun, 2 Jan 2022 11:18:27 +0000 Subject: [PATCH 05/29] Make sure we delete old dropdown-content CSS --- scmerlin.sh | 4 ++++ scmerlin_www.asp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/scmerlin.sh b/scmerlin.sh index 677709a..52fd7c5 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -485,6 +485,10 @@ Mount_WebUI(){ echo ".menu_Addons { background: url(ext/shared-jy/addons.png); }" >> /tmp/index_style.css fi + if grep -q '.dropdown-content {display: block;}' /tmp/index_style.css ; then + sed -i '/dropdown-content/d' /tmp/index_style.css + fi + if ! grep -q '.dropdown-content {visibility: visible;}' /tmp/index_style.css ; then { echo ".dropdown-content {top: 0px; left: 185px; visibility: hidden; position: absolute; background-color: #3a4042; min-width: 165px; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); z-index: 1000;}" diff --git a/scmerlin_www.asp b/scmerlin_www.asp index f963b06..6e9beb0 100644 --- a/scmerlin_www.asp +++ b/scmerlin_www.asp @@ -117,7 +117,7 @@ function update_temperatures(){ }); } var nvramtotal = <% sysinfo("nvram.total"); %> / 1024; -/* End firmware functions */ +/* End firmware functions */ var tout,arrayproclistlines=[],sortnameproc="CPU%",sortdirproc="desc",arraycronjobs=[],sortnamecron="Name",sortdircron="asc";Chart.defaults.global.defaultFontColor="#CCC",Chart.Tooltip.positioners.cursor=function(a,b){return b};var $j=jQuery.noConflict();function SetCurrentPage(){document.form.next_page.value=window.location.pathname.substring(1),document.form.current_page.value=window.location.pathname.substring(1)}var srvnamelist=["dnsmasq","wan","httpd","wireless","vsftpd","samba","ddns","ntpd/chronyd"],srvdesclist=["DNS/DHCP Server","Internet Connection","Web Interface","WiFi","FTP Server","Samba","DDNS client","Timeserver"],srvnamevisiblelist=[!0,!1,!0,!1,!0,!1,!1,!0],sortedAddonPages=[];function initial(){SetCurrentPage(),LoadCustomSettings(),show_menu(),Draw_Chart_NoData("nvramUsage","Data loading..."),Draw_Chart_NoData("jffsUsage","Data loading..."),Draw_Chart_NoData("MemoryUsage","Data loading..."),Draw_Chart_NoData("SwapUsage","No swap file configured"),$j("#sortTableCron").empty(),$j("#sortTableCron").append(BuildSortTableHtmlNoData()),$j("#sortTableProcesses").empty(),$j("#sortTableProcesses").append(BuildSortTableHtmlNoData());for(var a="",b=1;3>b;b++)a+=BuildVPNServerTable(b);$j("#table_config").after(a);for(var c="",b=1;6>b;b++)c+=BuildVPNClientTable(b);$j("#table_config").after(c);for(var d="",b=0;b";return a+="",a+="",a+="Data loading...",a+="",a+="",a+="",a}function BuildSortTableHtml(a){var b="";if("sortTableProcesses"==a){b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="";for(var c=0;c",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+=""}else if("sortTableCron"==a){b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="";for(var c=0;c",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+=""}return b+="",b+="
PIDPPIDUSERSTATVSZVSZ%CPUCPU%COMMAND
"+arrayproclistlines[c].PID+""+arrayproclistlines[c].PPID+""+arrayproclistlines[c].USER+""+arrayproclistlines[c].STAT+""+arrayproclistlines[c].VSZ+""+arrayproclistlines[c].VSZP+""+arrayproclistlines[c].CPU+""+arrayproclistlines[c].CPUP+""+arrayproclistlines[c].COMMAND+"
NameMinHourDayMMonthDayWCommand
"+arraycronjobs[c].Name+""+arraycronjobs[c].Min+""+arraycronjobs[c].Hour+""+arraycronjobs[c].DayM+""+arraycronjobs[c].Month+""+arraycronjobs[c].DayW+""+arraycronjobs[c].Command+"
",b}function get_ntpwatchdogenabled_file(){$j.ajax({url:"/ext/scmerlin/watchdogenabled.htm",dataType:"text",error:function(){document.form.scmerlin_ntpwatchdog.value="disable"},success:function(){document.form.scmerlin_ntpwatchdog.value="enable"}})}function load_addonpages(){$j.ajax({url:"/ext/scmerlin/addonwebpages.htm",dataType:"text",error:function(){setTimeout(load_addonpages,1e3)},success:function(a){var b=a.split("\n");b=b.filter(Boolean);for(var c=0;c (a."+sortfield+".toLowerCase() > b."+sortfield+".toLowerCase()) ? 1 : ((b."+sortfield+".toLowerCase() > a."+sortfield+".toLowerCase()) ? -1 : 0));"),window[sortdir]="asc"):-1==sorttext.indexOf("\u2193")?(eval(arrayid+" = "+arrayid+".sort((a,b) => (a."+sortfield+".toLowerCase() < b."+sortfield+".toLowerCase()) ? 1 : ((b."+sortfield+".toLowerCase() < a."+sortfield+".toLowerCase()) ? -1 : 0));"),window[sortdir]="desc"):(eval(arrayid+" = "+arrayid+".sort((a,b) => (a."+sortfield+".toLowerCase() > b."+sortfield+".toLowerCase()) ? 1 : ((b."+sortfield+".toLowerCase() > a."+sortfield+".toLowerCase()) ? -1 : 0));"),window[sortdir]="asc"):"number"==sorttype&&(-1==sorttext.indexOf("\u2193")&&-1==sorttext.indexOf("\u2191")?(eval(arrayid+" = "+arrayid+".sort((a,b) => parseFloat(getNum(a."+sortfield+".replace(\"m\",\"000\"))) - parseFloat(getNum(b."+sortfield+".replace(\"m\",\"000\"))));"),window[sortdir]="asc"):-1==sorttext.indexOf("\u2193")?(eval(arrayid+" = "+arrayid+".sort((a,b) => parseFloat(getNum(b."+sortfield+".replace(\"m\",\"000\"))) - parseFloat(getNum(a."+sortfield+".replace(\"m\",\"000\"))));"),window[sortdir]="desc"):(eval(arrayid+" = "+arrayid+".sort((a,b) => parseFloat(getNum(a."+sortfield+".replace(\"m\",\"000\"))) - parseFloat(getNum(b."+sortfield+".replace(\"m\",\"000\"))));"),window[sortdir]="asc")),$j("#"+tableid).empty(),$j("#"+tableid).append(BuildSortTableHtml(tableid)),$j("#"+tableid).find(".sortable").each(function(a,b){b.innerHTML==window[sortname]&&("asc"==window[sortdir]?b.innerHTML=window[sortname]+" \u2191":b.innerHTML=window[sortname]+" \u2193")})}function getNum(a){if(isNaN(a)){if("*"==a)return-10;if(-1!=a.indexOf("*/"))return-5;if(-1!=a.indexOf("/"))return a.split("/")[0];if("Sun"==a)return 0;if("Mon"==a)return 1;if("Tue"==a)return 2;if("Wed"==a)return 3;if("Thu"==a)return 4;if("Fri"==a)return 5;if("Sat"==a)return 6}return a}function ToggleRefresh(){!0==$j("#auto_refresh").prop("checked")?get_proclist_file():clearTimeout(tout)}function BuildAddonPageTable(a,b,c){var d="";if(0==c&&(d+="
 
",d+="",d+="",d+="",d+=""),(0==c||0==c%4)&&(d+=""),d+="",0"),c==sortedAddonPages.length-1){if(0!=sortedAddonPages.length%4){for(var e=4-sortedAddonPages.length%4,f=0;f";d+=""}d+="
WebUI Addons (click to expand/collapse)
"+a+"
"+b.substring(b.lastIndexOf("/")+1)+"
"}return d}function BuildServiceTable(a,b,c,d){var e="";return 0==d&&(e+="
 
",e+="",e+="",e+="",e+=""),(0==d||0==d%2)&&(e+=""),e+=c?"":"",a=a.replace("/",""),e+="",0"),d==srvnamelist.length-1&&(e+="
Services (click to expand/collapse)
"+b+" ("+a+")"+b+"",e+="",e+="Done",e+="Invalid - service disabled",e+="",e+="
"),e}function BuildVPNClientTable(loopindex){var vpnclientshtml="",vpnclientname="vpnclient"+loopindex,vpnclientdesc=eval("document.form.vpnc"+loopindex+"_desc").value;return 1==loopindex&&(vpnclientshtml+="
 
",vpnclientshtml+="",vpnclientshtml+="",vpnclientshtml+="",vpnclientshtml+=""),(1==loopindex||0==(loopindex+1)%2)&&(vpnclientshtml+=""),vpnclientshtml+="",vpnclientshtml+="",5==loopindex&&(vpnclientshtml+=""),1"),5==loopindex&&(vpnclientshtml+="
VPN Clients (click to expand/collapse)
VPN Client "+loopindex,vpnclientshtml+="
("+vpnclientdesc+")
",vpnclientshtml+="",vpnclientshtml+="Done",vpnclientshtml+="Invalid - VPN Client disabled",vpnclientshtml+="",vpnclientshtml+="
"),vpnclientshtml}function BuildVPNServerTable(a){var b="",c="vpnserver"+a;return 1==a&&(b+="
 
",b+="",b+="",b+="",b+="",b+=""),b+="",b+="",2==a&&(b+="",b+="
VPN Servers (click to expand/collapse)
VPN Server "+a+"",b+="",b+="Done",b+="Invalid - VPN Server disabled",b+="",b+="
"),b}function round(a,b){return+(Math.round(a+"e"+b)+"e-"+b)}function Draw_Chart_NoData(a,b){document.getElementById("canvasChart"+a).width="265",document.getElementById("canvasChart"+a).height="250",document.getElementById("canvasChart"+a).style.width="265px",document.getElementById("canvasChart"+a).style.height="250px";var c=document.getElementById("canvasChart"+a).getContext("2d");c.save(),c.textAlign="center",c.textBaseline="middle",c.font="normal normal bolder 22px Arial",c.fillStyle="white",c.fillText(b,135,125),c.restore()}function Draw_Chart(a){var b=[],c=[],d=[],e="",f="";if("MemoryUsage"==a)b=[1*mem_stats_arr[0]-1*mem_stats_arr[1]-1*mem_stats_arr[2]-1*mem_stats_arr[3],mem_stats_arr[1],mem_stats_arr[2],mem_stats_arr[3]],c=["Used","Free","Buffers","Cache"],d=["#5eaec0","#12cf80","#ceca09","#9d12c4"],e="Memory Usage",f="MB";else if("SwapUsage"==a)b=[mem_stats_arr[4],1*mem_stats_arr[5]-1*mem_stats_arr[4]],c=["Used","Free"],d=["#135fee","#1aa658"],e="Swap Usage",f="MB";else if("nvramUsage"==a)b=[round(mem_stats_arr[6]/1024,2).toFixed(2),round(1*nvramtotal-1*mem_stats_arr[6]/1024,2).toFixed(2)],c=["Used","Free"],d=["#5eaec0","#12cf80"],e="NVRAM Usage",f="KB";else if("jffsUsage"==a){var g=mem_stats_arr[7].split(" ");b=[1*g[0],1*g[2]-1*g[0]],c=["Used","Free"],d=["#135fee","#1aa658"],e="JFFS Usage",f="MB"}var h=window["Chart"+a];h!=null&&h.destroy();var i=document.getElementById("canvasChart"+a).getContext("2d"),j={segmentShowStroke:!1,segmentStrokeColor:"#000",maintainAspectRatio:!1,animation:{duration:0},hover:{animationDuration:0},responsiveAnimationDuration:0,legend:{onClick:null,display:!0,position:"left",labels:{fontColor:"#ffffff"}},title:{display:!0,text:e,position:"top"},tooltips:{callbacks:{title:function(a,b){return b.labels[a[0].index]},label:function(a,b){return round(b.datasets[a.datasetIndex].data[a.index],2).toFixed(2)+" "+f}},mode:"point",position:"cursor",intersect:!0},scales:{xAxes:[{display:!1,gridLines:{display:!1},scaleLabel:{display:!1},ticks:{display:!1}}],yAxes:[{display:!1,gridLines:{display:!1},scaleLabel:{display:!1},ticks:{display:!1}}]}},k={labels:c,datasets:[{data:b,borderWidth:1,backgroundColor:d,borderColor:"#000000"}]};h=new Chart(i,{type:"pie",options:j,data:k}),window["Chart"+a]=h}function SaveConfig(){document.form.action_script.value="start_scmerlinconfig"+document.form.scmerlin_ntpwatchdog.value,document.form.action_wait.value=10,$j("#auto_refresh").prop("checked",!1),clearTimeout(tout),showLoading(),document.form.submit()} From 02f59db7f7b536307c07c699811f8dfdc8a09959 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Sun, 2 Jan 2022 11:40:10 +0000 Subject: [PATCH 06/29] Use Process_Upgrade to mnake sure CSS updates at CLI update --- scmerlin.sh | 7 +++---- scmerlin_www.asp | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/scmerlin.sh b/scmerlin.sh index 52fd7c5..960b3b5 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -791,7 +791,7 @@ Process_Upgrade(){ fi if [ "$(uname -o)" = "ASUSWRT-Merlin" ]; then - if grep '.dropdown-content' /tmp/index_style.css | grep -q 'z-index: 1;'; then + if grep '.dropdown-content' /tmp/index_style.css | grep -q '{display: block;}'; then umount /www/index_style.css 2>/dev/null cp -f /www/index_style.css /tmp/ @@ -799,16 +799,15 @@ Process_Upgrade(){ echo ".menu_Addons { background: url(ext/shared-jy/addons.png); }" >> /tmp/index_style.css { - echo ".dropdown-content {top: 0px; left: 185px; display: none; position: absolute; background-color: #3a4042; min-width: 165px; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); z-index: 1000;}" + echo ".dropdown-content {top: 0px; left: 185px; visibility: hidden; position: absolute; background-color: #3a4042; min-width: 165px; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); z-index: 1000;}" echo ".dropdown-content a {padding: 6px 8px; text-decoration: none; display: block; height: 100%; min-height: 20px; max-height: 40px; font-weight: bold; text-shadow: 1px 1px 0px black; font-family: Verdana, MS UI Gothic, MS P Gothic, Microsoft Yahei UI, sans-serif; font-size: 12px; border: 1px solid #6B7071;}" echo ".dropdown-content a:hover {background-color: #77a5c6;}" - echo ".dropdown:hover .dropdown-content {display: block;}" + echo ".dropdown:hover .dropdown-content {visibility: visible;}" } >> /tmp/index_style.css mount -o bind /tmp/index_style.css /www/index_style.css fi fi - } Shortcut_Script(){ diff --git a/scmerlin_www.asp b/scmerlin_www.asp index 6e9beb0..899b967 100644 --- a/scmerlin_www.asp +++ b/scmerlin_www.asp @@ -39,7 +39,7 @@ function LoadCustomSettings(){ } } -/* Taken from firmware WebUI, Tools_SysInfo.asp */ +/* Taken from firmware WebUI, Tools_SysInfo.asp */ function update_sysinfo(e){ $j.ajax({ url: '/ajax_sysinfo.asp', @@ -117,7 +117,7 @@ function update_temperatures(){ }); } var nvramtotal = <% sysinfo("nvram.total"); %> / 1024; -/* End firmware functions */ +/* End firmware functions */ var tout,arrayproclistlines=[],sortnameproc="CPU%",sortdirproc="desc",arraycronjobs=[],sortnamecron="Name",sortdircron="asc";Chart.defaults.global.defaultFontColor="#CCC",Chart.Tooltip.positioners.cursor=function(a,b){return b};var $j=jQuery.noConflict();function SetCurrentPage(){document.form.next_page.value=window.location.pathname.substring(1),document.form.current_page.value=window.location.pathname.substring(1)}var srvnamelist=["dnsmasq","wan","httpd","wireless","vsftpd","samba","ddns","ntpd/chronyd"],srvdesclist=["DNS/DHCP Server","Internet Connection","Web Interface","WiFi","FTP Server","Samba","DDNS client","Timeserver"],srvnamevisiblelist=[!0,!1,!0,!1,!0,!1,!1,!0],sortedAddonPages=[];function initial(){SetCurrentPage(),LoadCustomSettings(),show_menu(),Draw_Chart_NoData("nvramUsage","Data loading..."),Draw_Chart_NoData("jffsUsage","Data loading..."),Draw_Chart_NoData("MemoryUsage","Data loading..."),Draw_Chart_NoData("SwapUsage","No swap file configured"),$j("#sortTableCron").empty(),$j("#sortTableCron").append(BuildSortTableHtmlNoData()),$j("#sortTableProcesses").empty(),$j("#sortTableProcesses").append(BuildSortTableHtmlNoData());for(var a="",b=1;3>b;b++)a+=BuildVPNServerTable(b);$j("#table_config").after(a);for(var c="",b=1;6>b;b++)c+=BuildVPNClientTable(b);$j("#table_config").after(c);for(var d="",b=0;b";return a+="",a+="",a+="Data loading...",a+="",a+="",a+="",a}function BuildSortTableHtml(a){var b="";if("sortTableProcesses"==a){b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="";for(var c=0;c",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+=""}else if("sortTableCron"==a){b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+="";for(var c=0;c",b+="",b+="",b+="",b+="",b+="",b+="",b+="",b+=""}return b+="",b+="
PIDPPIDUSERSTATVSZVSZ%CPUCPU%COMMAND
"+arrayproclistlines[c].PID+""+arrayproclistlines[c].PPID+""+arrayproclistlines[c].USER+""+arrayproclistlines[c].STAT+""+arrayproclistlines[c].VSZ+""+arrayproclistlines[c].VSZP+""+arrayproclistlines[c].CPU+""+arrayproclistlines[c].CPUP+""+arrayproclistlines[c].COMMAND+"
NameMinHourDayMMonthDayWCommand
"+arraycronjobs[c].Name+""+arraycronjobs[c].Min+""+arraycronjobs[c].Hour+""+arraycronjobs[c].DayM+""+arraycronjobs[c].Month+""+arraycronjobs[c].DayW+""+arraycronjobs[c].Command+"
",b}function get_ntpwatchdogenabled_file(){$j.ajax({url:"/ext/scmerlin/watchdogenabled.htm",dataType:"text",error:function(){document.form.scmerlin_ntpwatchdog.value="disable"},success:function(){document.form.scmerlin_ntpwatchdog.value="enable"}})}function load_addonpages(){$j.ajax({url:"/ext/scmerlin/addonwebpages.htm",dataType:"text",error:function(){setTimeout(load_addonpages,1e3)},success:function(a){var b=a.split("\n");b=b.filter(Boolean);for(var c=0;c (a."+sortfield+".toLowerCase() > b."+sortfield+".toLowerCase()) ? 1 : ((b."+sortfield+".toLowerCase() > a."+sortfield+".toLowerCase()) ? -1 : 0));"),window[sortdir]="asc"):-1==sorttext.indexOf("\u2193")?(eval(arrayid+" = "+arrayid+".sort((a,b) => (a."+sortfield+".toLowerCase() < b."+sortfield+".toLowerCase()) ? 1 : ((b."+sortfield+".toLowerCase() < a."+sortfield+".toLowerCase()) ? -1 : 0));"),window[sortdir]="desc"):(eval(arrayid+" = "+arrayid+".sort((a,b) => (a."+sortfield+".toLowerCase() > b."+sortfield+".toLowerCase()) ? 1 : ((b."+sortfield+".toLowerCase() > a."+sortfield+".toLowerCase()) ? -1 : 0));"),window[sortdir]="asc"):"number"==sorttype&&(-1==sorttext.indexOf("\u2193")&&-1==sorttext.indexOf("\u2191")?(eval(arrayid+" = "+arrayid+".sort((a,b) => parseFloat(getNum(a."+sortfield+".replace(\"m\",\"000\"))) - parseFloat(getNum(b."+sortfield+".replace(\"m\",\"000\"))));"),window[sortdir]="asc"):-1==sorttext.indexOf("\u2193")?(eval(arrayid+" = "+arrayid+".sort((a,b) => parseFloat(getNum(b."+sortfield+".replace(\"m\",\"000\"))) - parseFloat(getNum(a."+sortfield+".replace(\"m\",\"000\"))));"),window[sortdir]="desc"):(eval(arrayid+" = "+arrayid+".sort((a,b) => parseFloat(getNum(a."+sortfield+".replace(\"m\",\"000\"))) - parseFloat(getNum(b."+sortfield+".replace(\"m\",\"000\"))));"),window[sortdir]="asc")),$j("#"+tableid).empty(),$j("#"+tableid).append(BuildSortTableHtml(tableid)),$j("#"+tableid).find(".sortable").each(function(a,b){b.innerHTML==window[sortname]&&("asc"==window[sortdir]?b.innerHTML=window[sortname]+" \u2191":b.innerHTML=window[sortname]+" \u2193")})}function getNum(a){if(isNaN(a)){if("*"==a)return-10;if(-1!=a.indexOf("*/"))return-5;if(-1!=a.indexOf("/"))return a.split("/")[0];if("Sun"==a)return 0;if("Mon"==a)return 1;if("Tue"==a)return 2;if("Wed"==a)return 3;if("Thu"==a)return 4;if("Fri"==a)return 5;if("Sat"==a)return 6}return a}function ToggleRefresh(){!0==$j("#auto_refresh").prop("checked")?get_proclist_file():clearTimeout(tout)}function BuildAddonPageTable(a,b,c){var d="";if(0==c&&(d+="
 
",d+="",d+="",d+="",d+=""),(0==c||0==c%4)&&(d+=""),d+="",0"),c==sortedAddonPages.length-1){if(0!=sortedAddonPages.length%4){for(var e=4-sortedAddonPages.length%4,f=0;f";d+=""}d+="
WebUI Addons (click to expand/collapse)
"+a+"
"+b.substring(b.lastIndexOf("/")+1)+"
"}return d}function BuildServiceTable(a,b,c,d){var e="";return 0==d&&(e+="
 
",e+="",e+="",e+="",e+=""),(0==d||0==d%2)&&(e+=""),e+=c?"":"",a=a.replace("/",""),e+="",0"),d==srvnamelist.length-1&&(e+="
Services (click to expand/collapse)
"+b+" ("+a+")"+b+"",e+="",e+="Done",e+="Invalid - service disabled",e+="",e+="
"),e}function BuildVPNClientTable(loopindex){var vpnclientshtml="",vpnclientname="vpnclient"+loopindex,vpnclientdesc=eval("document.form.vpnc"+loopindex+"_desc").value;return 1==loopindex&&(vpnclientshtml+="
 
",vpnclientshtml+="",vpnclientshtml+="",vpnclientshtml+="",vpnclientshtml+=""),(1==loopindex||0==(loopindex+1)%2)&&(vpnclientshtml+=""),vpnclientshtml+="",vpnclientshtml+="",5==loopindex&&(vpnclientshtml+=""),1"),5==loopindex&&(vpnclientshtml+="
VPN Clients (click to expand/collapse)
VPN Client "+loopindex,vpnclientshtml+="
("+vpnclientdesc+")
",vpnclientshtml+="",vpnclientshtml+="Done",vpnclientshtml+="Invalid - VPN Client disabled",vpnclientshtml+="",vpnclientshtml+="
"),vpnclientshtml}function BuildVPNServerTable(a){var b="",c="vpnserver"+a;return 1==a&&(b+="
 
",b+="",b+="",b+="",b+="",b+=""),b+="",b+="",2==a&&(b+="",b+="
VPN Servers (click to expand/collapse)
VPN Server "+a+"",b+="",b+="Done",b+="Invalid - VPN Server disabled",b+="",b+="
"),b}function round(a,b){return+(Math.round(a+"e"+b)+"e-"+b)}function Draw_Chart_NoData(a,b){document.getElementById("canvasChart"+a).width="265",document.getElementById("canvasChart"+a).height="250",document.getElementById("canvasChart"+a).style.width="265px",document.getElementById("canvasChart"+a).style.height="250px";var c=document.getElementById("canvasChart"+a).getContext("2d");c.save(),c.textAlign="center",c.textBaseline="middle",c.font="normal normal bolder 22px Arial",c.fillStyle="white",c.fillText(b,135,125),c.restore()}function Draw_Chart(a){var b=[],c=[],d=[],e="",f="";if("MemoryUsage"==a)b=[1*mem_stats_arr[0]-1*mem_stats_arr[1]-1*mem_stats_arr[2]-1*mem_stats_arr[3],mem_stats_arr[1],mem_stats_arr[2],mem_stats_arr[3]],c=["Used","Free","Buffers","Cache"],d=["#5eaec0","#12cf80","#ceca09","#9d12c4"],e="Memory Usage",f="MB";else if("SwapUsage"==a)b=[mem_stats_arr[4],1*mem_stats_arr[5]-1*mem_stats_arr[4]],c=["Used","Free"],d=["#135fee","#1aa658"],e="Swap Usage",f="MB";else if("nvramUsage"==a)b=[round(mem_stats_arr[6]/1024,2).toFixed(2),round(1*nvramtotal-1*mem_stats_arr[6]/1024,2).toFixed(2)],c=["Used","Free"],d=["#5eaec0","#12cf80"],e="NVRAM Usage",f="KB";else if("jffsUsage"==a){var g=mem_stats_arr[7].split(" ");b=[1*g[0],1*g[2]-1*g[0]],c=["Used","Free"],d=["#135fee","#1aa658"],e="JFFS Usage",f="MB"}var h=window["Chart"+a];h!=null&&h.destroy();var i=document.getElementById("canvasChart"+a).getContext("2d"),j={segmentShowStroke:!1,segmentStrokeColor:"#000",maintainAspectRatio:!1,animation:{duration:0},hover:{animationDuration:0},responsiveAnimationDuration:0,legend:{onClick:null,display:!0,position:"left",labels:{fontColor:"#ffffff"}},title:{display:!0,text:e,position:"top"},tooltips:{callbacks:{title:function(a,b){return b.labels[a[0].index]},label:function(a,b){return round(b.datasets[a.datasetIndex].data[a.index],2).toFixed(2)+" "+f}},mode:"point",position:"cursor",intersect:!0},scales:{xAxes:[{display:!1,gridLines:{display:!1},scaleLabel:{display:!1},ticks:{display:!1}}],yAxes:[{display:!1,gridLines:{display:!1},scaleLabel:{display:!1},ticks:{display:!1}}]}},k={labels:c,datasets:[{data:b,borderWidth:1,backgroundColor:d,borderColor:"#000000"}]};h=new Chart(i,{type:"pie",options:j,data:k}),window["Chart"+a]=h}function SaveConfig(){document.form.action_script.value="start_scmerlinconfig"+document.form.scmerlin_ntpwatchdog.value,document.form.action_wait.value=10,$j("#auto_refresh").prop("checked",!1),clearTimeout(tout),showLoading(),document.form.submit()} From 70c0d555f180941535ae1c2190edea6c889a1a47 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Tue, 4 Jan 2022 09:54:00 +0000 Subject: [PATCH 07/29] Shellcheck ignores --- S99tailtop | 1 + tailtop | 1 + tailtopd | 1 + 3 files changed, 3 insertions(+) diff --git a/S99tailtop b/S99tailtop index 942d338..bb87397 100644 --- a/S99tailtop +++ b/S99tailtop @@ -1,4 +1,5 @@ #!/bin/sh +# shellcheck disable=SC1091 # shellcheck disable=SC2034 if [ "$1" = "restart" ] || [ "$1" = "stop" ] || [ "$1" = "kill" ]; then diff --git a/tailtop b/tailtop index e2a7194..fd5d0ab 100644 --- a/tailtop +++ b/tailtop @@ -1,5 +1,6 @@ #!/bin/sh # shellcheck disable=SC2039 +# shellcheck disable=SC3048 trap '' SIGHUP renice 15 $$ while true; do diff --git a/tailtopd b/tailtopd index 622193d..611f3a9 100644 --- a/tailtopd +++ b/tailtopd @@ -1,5 +1,6 @@ #!/bin/sh # shellcheck disable=SC2039 +# shellcheck disable=SC3048 trap '' SIGHUP /jffs/addons/scmerlin.d/tailtop & From acbf8b75d4ec0c703e63f8ae99b37f1208837a4e Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Wed, 5 Jan 2022 18:11:20 +0000 Subject: [PATCH 08/29] Remove unused fields in Sitemap --- sitemap.asp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sitemap.asp b/sitemap.asp index bc9a9cc..8e3091a 100644 --- a/sitemap.asp +++ b/sitemap.asp @@ -58,11 +58,6 @@ function LoadSiteMap(){ "> "> -"> -"> -"> -"> -"> From 033e65d688285ce188ca01383f49f840207d6d00 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Wed, 5 Jan 2022 18:12:01 +0000 Subject: [PATCH 09/29] Update README --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b191f36..8f307fc 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ![Shellcheck](https://github.com/jackyaz/scMerlin/actions/workflows/shellcheck.yml/badge.svg) ## v2.4.1 -### Updated on 2022-01-02 +### Updated on 2022-01-05 ## About scMerlin allows you to easily control the most common services/scripts on your router. scMerlin also augments your router's WebUI with a Sitemap and dynamic submenus for the main left menu of Asuswrt-Merlin. @@ -19,7 +19,7 @@ Love the script and want to support future development? Any and all donations gr Using your preferred SSH client/terminal, copy and paste the following command, then press Enter: ```sh -/usr/sbin/curl --retry 3 "https://raw.githubusercontent.com/jackyaz/scmerlin/master/scmerlin.sh" -o "/jffs/scripts/scmerlin" && chmod 0755 /jffs/scripts/scmerlin && /jffs/scripts/scmerlin install +/usr/sbin/curl -fsL --retry 3 "https://jackyaz.io/scmerlin/master/install/scmerlin.sh" -o "/jffs/scripts/scmerlin" && chmod 0755 /jffs/scripts/scmerlin && /jffs/scripts/scmerlin install ``` ## Supported firmware versions @@ -48,3 +48,8 @@ If this does not work, you will need to use the full path: ## Help Please post about any issues and problems here: [Asuswrt-Merlin AddOns on SNBForums](https://www.snbforums.com/forums/asuswrt-merlin-addons.60/?prefix_id=23) + +### Scarf Gateway +Installs and updates for this addon are redirected via the [Scarf Gateway](https://about.scarf.sh/scarf-gateway) by [Scarf](https://about.scarf.sh/about). This allows me to gather data on the number of new installations of my addons, how often users check for updates and more. This is purely for my use to actually see some usage data from my addons so that I can see the value provided by my continued work. It does not mean I am going to start charging to use my addons. My addons have been, are, and will always be completely free to use. + +Please refer to Scarf's [Privacy Policy](https://about.scarf.sh/privacy) for more information about the data that is collected and how it is processed. From e9fecf39694ac3c8fe5fafb6784b915a480b8bf6 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Wed, 5 Jan 2022 19:25:22 +0000 Subject: [PATCH 10/29] Add files for tailtaintdns Service to watch logs for dnsmasq tainted and restart it --- S95tailtaintdns | 19 +++++++++++++++++++ tailtaintdns | 18 ++++++++++++++++++ tailtaintdnsd | 17 +++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 S95tailtaintdns create mode 100644 tailtaintdns create mode 100644 tailtaintdnsd diff --git a/S95tailtaintdns b/S95tailtaintdns new file mode 100644 index 0000000..92dd569 --- /dev/null +++ b/S95tailtaintdns @@ -0,0 +1,19 @@ +#!/bin/sh +# shellcheck disable=SC1091 +# shellcheck disable=SC2034 + +if [ "$1" = "restart" ] || [ "$1" = "stop" ] || [ "$1" = "kill" ]; then + killall -q tailtaintdnsd + killall -q tailtaintdns +fi + +ENABLED=yes +PROCS=/jffs/addons/scmerlin.d/tailtaintdnsd +ARGS="" +PREARGS="" +PRECMD="" +POSTCMD="" +DESC=$PROCS +PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + +. /jffs/addons/scmerlin.d/sc.func diff --git a/tailtaintdns b/tailtaintdns new file mode 100644 index 0000000..3865157 --- /dev/null +++ b/tailtaintdns @@ -0,0 +1,18 @@ +#!/bin/sh +# shellcheck disable=SC2039 +# shellcheck disable=SC3048 +trap '' SIGHUP + +tailfile="/tmp/syslog.log" + +if [ "$(pidof syslog-ng | wc -w)" -gt 0 ]; then + tailfile="/opt/var/log/messages" +fi + +renice 15 $$ +tail -F "$tailfile" | \ +while read -r line; do \ +if echo "$line" | grep -q "Comm: dnsmasq Tainted:"; then logger "dnsmasq tainted detected, restarting dnsmasq"; service restart_dnsmasq; fi \ +done + +renice 0 $$ diff --git a/tailtaintdnsd b/tailtaintdnsd new file mode 100644 index 0000000..3cbf72d --- /dev/null +++ b/tailtaintdnsd @@ -0,0 +1,17 @@ +#!/bin/sh +# shellcheck disable=SC2039 +# shellcheck disable=SC3048 +trap '' SIGHUP + +/jffs/addons/scmerlin.d/tailtaintdns & + +while true; do + sleep 5 + if [ "$(pidof tailtaintdns | wc -w)" -lt 1 ]; then + logger "tailtaintdns dead, restarting..." + killall -q tailtaintdns + sleep 5 + /jffs/addons/scmerlin.d/tailtaintdns & + logger "tailtaintdns restarted" + fi +done From e63753420013449b96d13586231eec99f6f2f8fb Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Wed, 5 Jan 2022 19:42:45 +0000 Subject: [PATCH 11/29] Update URLs for Scarf --- scmerlin.sh | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/scmerlin.sh b/scmerlin.sh index 960b3b5..5e8e636 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -27,12 +27,12 @@ readonly SCRIPT_NAME_LOWER="$(echo "$SCRIPT_NAME" | tr 'A-Z' 'a-z' | sed 's/d//' readonly SCM_VERSION="v2.4.1" readonly SCRIPT_VERSION="v2.4.1" SCRIPT_BRANCH="develop" -SCRIPT_REPO="https://raw.githubusercontent.com/jackyaz/$SCRIPT_NAME/$SCRIPT_BRANCH" +SCRIPT_REPO="https://jackyaz.io/$SCRIPT_NAME/$SCRIPT_BRANCH" readonly SCRIPT_DIR="/jffs/addons/$SCRIPT_NAME_LOWER.d" readonly SCRIPT_WEBPAGE_DIR="$(readlink /www/user)" readonly SCRIPT_WEB_DIR="$SCRIPT_WEBPAGE_DIR/$SCRIPT_NAME_LOWER" readonly SHARED_DIR="/jffs/addons/shared-jy" -readonly SHARED_REPO="https://raw.githubusercontent.com/jackyaz/shared-jy/master" +readonly SHARED_REPO="https://jackyaz.io/shared-jy/master" readonly SHARED_WEB_DIR="$SCRIPT_WEBPAGE_DIR/shared-jy" readonly NTP_WATCHDOG_FILE="$SCRIPT_DIR/.watchdogenabled" [ -z "$(nvram get odmpid)" ] && ROUTER_MODEL=$(nvram get productid) || ROUTER_MODEL=$(nvram get odmpid) @@ -131,15 +131,15 @@ Update_Check(){ echo 'var updatestatus = "InProgress";' > "$SCRIPT_WEB_DIR/detect_update.js" doupdate="false" localver=$(grep "SCRIPT_VERSION=" "/jffs/scripts/$SCRIPT_NAME_LOWER" | grep -m1 -oE 'v[0-9]{1,2}([.][0-9]{1,2})([.][0-9]{1,2})') - /usr/sbin/curl -fsL --retry 3 "$SCRIPT_REPO/$SCRIPT_NAME_LOWER.sh" | grep -qF "jackyaz" || { Print_Output true "404 error detected - stopping update" "$ERR"; return 1; } - serverver=$(/usr/sbin/curl -fsL --retry 3 "$SCRIPT_REPO/$SCRIPT_NAME_LOWER.sh" | grep "SCRIPT_VERSION=" | grep -m1 -oE 'v[0-9]{1,2}([.][0-9]{1,2})([.][0-9]{1,2})') + /usr/sbin/curl -fsL --retry 3 "$SCRIPT_REPO/404/$SCRIPT_NAME_LOWER.sh" | grep -qF "jackyaz" || { Print_Output true "404 error detected - stopping update" "$ERR"; return 1; } + serverver=$(/usr/sbin/curl -fsL --retry 3 "$SCRIPT_REPO/version/$SCRIPT_NAME_LOWER.sh" | grep "SCRIPT_VERSION=" | grep -m1 -oE 'v[0-9]{1,2}([.][0-9]{1,2})([.][0-9]{1,2})') if [ "$localver" != "$serverver" ]; then doupdate="version" Set_Version_Custom_Settings server "$serverver" echo 'var updatestatus = "'"$serverver"'";' > "$SCRIPT_WEB_DIR/detect_update.js" else localmd5="$(md5sum "/jffs/scripts/$SCRIPT_NAME_LOWER" | awk '{print $1}')" - remotemd5="$(curl -fsL --retry 3 "$SCRIPT_REPO/$SCRIPT_NAME_LOWER.sh" | md5sum | awk '{print $1}')" + remotemd5="$(curl -fsL --retry 3 "$SCRIPT_REPO/md5/$SCRIPT_NAME_LOWER.sh" | md5sum | awk '{print $1}')" if [ "$localmd5" != "$remotemd5" ]; then doupdate="md5" Set_Version_Custom_Settings server "$serverver-hotfix" @@ -178,7 +178,7 @@ Update_Version(){ Update_File tailtopd Update_File sc.func Update_File S99tailtop - /usr/sbin/curl -fsL --retry 3 "$SCRIPT_REPO/$SCRIPT_NAME_LOWER.sh" -o "/jffs/scripts/$SCRIPT_NAME_LOWER" && Print_Output true "$SCRIPT_NAME successfully updated" + Download_File "$SCRIPT_REPO/update/$SCRIPT_NAME_LOWER.sh" "/jffs/scripts/$SCRIPT_NAME_LOWER" && Print_Output true "$SCRIPT_NAME successfully updated" chmod 0755 "/jffs/scripts/$SCRIPT_NAME_LOWER" Set_Version_Custom_Settings local "$serverver" Set_Version_Custom_Settings server "$serverver" @@ -200,7 +200,7 @@ Update_Version(){ fi if [ "$1" = "force" ]; then - serverver=$(/usr/sbin/curl -fsL --retry 3 "$SCRIPT_REPO/$SCRIPT_NAME_LOWER.sh" | grep "SCRIPT_VERSION=" | grep -m1 -oE 'v[0-9]{1,2}([.][0-9]{1,2})([.][0-9]{1,2})') + serverver=$(/usr/sbin/curl -fsL --retry 3 "$SCRIPT_REPO/version/$SCRIPT_NAME_LOWER.sh" | grep "SCRIPT_VERSION=" | grep -m1 -oE 'v[0-9]{1,2}([.][0-9]{1,2})([.][0-9]{1,2})') Print_Output true "Downloading latest version ($serverver) of $SCRIPT_NAME" "$PASS" Update_File shared-jy.tar.gz Update_File scmerlin_www.asp @@ -209,7 +209,7 @@ Update_Version(){ Update_File tailtopd Update_File sc.func Update_File S99tailtop - /usr/sbin/curl -fsL --retry 3 "$SCRIPT_REPO/$SCRIPT_NAME_LOWER.sh" -o "/jffs/scripts/$SCRIPT_NAME_LOWER" && Print_Output true "$SCRIPT_NAME successfully updated" + Download_File "$SCRIPT_REPO/update/$SCRIPT_NAME_LOWER.sh" "/jffs/scripts/$SCRIPT_NAME_LOWER" && Print_Output true "$SCRIPT_NAME successfully updated" chmod 0755 "/jffs/scripts/$SCRIPT_NAME_LOWER" Set_Version_Custom_Settings local "$serverver" Set_Version_Custom_Settings server "$serverver" @@ -227,14 +227,14 @@ Update_Version(){ Update_File(){ if [ "$1" = "scmerlin_www.asp" ] || [ "$1" = "sitemap.asp" ] ; then tmpfile="/tmp/$1" - Download_File "$SCRIPT_REPO/$1" "$tmpfile" + Download_File "$SCRIPT_REPO/files/$1" "$tmpfile" if ! diff -q "$tmpfile" "$SCRIPT_DIR/$1" >/dev/null 2>&1; then if [ -f "$SCRIPT_DIR/$1" ]; then Get_WebUI_Page "$SCRIPT_DIR/$1" sed -i "\\~$MyPage~d" /tmp/menuTree.js rm -f "$SCRIPT_WEBPAGE_DIR/$MyPage" 2>/dev/null fi - Download_File "$SCRIPT_REPO/$1" "$SCRIPT_DIR/$1" + Download_File "$SCRIPT_REPO/files/$1" "$SCRIPT_DIR/$1" Print_Output true "New version of $1 downloaded" "$PASS" Mount_WebUI fi @@ -259,21 +259,21 @@ Update_File(){ fi elif [ "$1" = "S99tailtop" ]; then tmpfile="/tmp/$1" - Download_File "$SCRIPT_REPO/$1" "$tmpfile" + Download_File "$SCRIPT_REPO/files/$1" "$tmpfile" if ! diff -q "$tmpfile" "$SCRIPT_DIR/$1" >/dev/null 2>&1; then if [ -f "$SCRIPT_DIR/S99tailtop" ]; then "$SCRIPT_DIR/S99tailtop" stop >/dev/null 2>&1 sleep 2 fi - Download_File "$SCRIPT_REPO/$1" "$SCRIPT_DIR/$1" + Download_File "$SCRIPT_REPO/files/$1" "$SCRIPT_DIR/$1" chmod 0755 "$SCRIPT_DIR/$1" "$SCRIPT_DIR/S99tailtop" start >/dev/null 2>&1 Print_Output true "New version of $1 downloaded" "$PASS" fi rm -f "$tmpfile" - elif [ "$1" = "tailtop" ] || [ "$1" = "tailtopd" ] || [ "$1" = "sc.func" ]; then + elif [ "$1" = "tailtop" ] || [ "$1" = "tailtopd" ]; then tmpfile="/tmp/$1" - Download_File "$SCRIPT_REPO/$1" "$tmpfile" + Download_File "$SCRIPT_REPO/files/$1" "$tmpfile" if ! diff -q "$tmpfile" "$SCRIPT_DIR/$1" >/dev/null 2>&1; then if [ -f "$SCRIPT_DIR/S99tailtop" ]; then "$SCRIPT_DIR/S99tailtop" stop >/dev/null 2>&1 @@ -1328,6 +1328,9 @@ Menu_Install(){ Update_File S99tailtop Clear_Lock + + Download_File "$SCRIPT_REPO/install-success/LICENSE" "$SCRIPT_DIR/LICENSE" + ScriptHeader MainMenu } @@ -1613,13 +1616,13 @@ case "$1" in ;; develop) SCRIPT_BRANCH="develop" - SCRIPT_REPO="https://raw.githubusercontent.com/jackyaz/$SCRIPT_NAME/$SCRIPT_BRANCH" + SCRIPT_REPO="https://jackyaz.io/$SCRIPT_NAME/$SCRIPT_BRANCH" Update_Version force exit 0 ;; stable) SCRIPT_BRANCH="master" - SCRIPT_REPO="https://raw.githubusercontent.com/jackyaz/$SCRIPT_NAME/$SCRIPT_BRANCH" + SCRIPT_REPO="https://jackyaz.io/$SCRIPT_NAME/$SCRIPT_BRANCH" Update_Version force exit 0 ;; From a3811978588d1ab33ef6e5a1ed173236c6776550 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Wed, 5 Jan 2022 19:43:04 +0000 Subject: [PATCH 12/29] Option to enable wtachdog for dnsmasq tainted --- scmerlin.sh | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 118 insertions(+), 3 deletions(-) diff --git a/scmerlin.sh b/scmerlin.sh index 5e8e636..f3f09c0 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -35,6 +35,7 @@ readonly SHARED_DIR="/jffs/addons/shared-jy" readonly SHARED_REPO="https://jackyaz.io/shared-jy/master" readonly SHARED_WEB_DIR="$SCRIPT_WEBPAGE_DIR/shared-jy" readonly NTP_WATCHDOG_FILE="$SCRIPT_DIR/.watchdogenabled" +readonly TAIL_TAINTED_FILE="$SCRIPT_DIR/.tailtaintdnsenabled" [ -z "$(nvram get odmpid)" ] && ROUTER_MODEL=$(nvram get productid) || ROUTER_MODEL=$(nvram get odmpid) ### End of script variables ### @@ -176,8 +177,11 @@ Update_Version(){ Update_File sitemap.asp Update_File tailtop Update_File tailtopd + Update_File tailtaintdns + Update_File tailtaintdnsd Update_File sc.func Update_File S99tailtop + Update_File S95tailtaintdns Download_File "$SCRIPT_REPO/update/$SCRIPT_NAME_LOWER.sh" "/jffs/scripts/$SCRIPT_NAME_LOWER" && Print_Output true "$SCRIPT_NAME successfully updated" chmod 0755 "/jffs/scripts/$SCRIPT_NAME_LOWER" Set_Version_Custom_Settings local "$serverver" @@ -207,8 +211,11 @@ Update_Version(){ Update_File sitemap.asp Update_File tailtop Update_File tailtopd + Update_File tailtaintdns + Update_File tailtaintdnsd Update_File sc.func Update_File S99tailtop + Update_File S95tailtaintdns Download_File "$SCRIPT_REPO/update/$SCRIPT_NAME_LOWER.sh" "/jffs/scripts/$SCRIPT_NAME_LOWER" && Print_Output true "$SCRIPT_NAME successfully updated" chmod 0755 "/jffs/scripts/$SCRIPT_NAME_LOWER" Set_Version_Custom_Settings local "$serverver" @@ -279,10 +286,51 @@ Update_File(){ "$SCRIPT_DIR/S99tailtop" stop >/dev/null 2>&1 sleep 2 fi - Download_File "$SCRIPT_REPO/$1" "$SCRIPT_DIR/$1" + Download_File "$SCRIPT_REPO/files/$1" "$SCRIPT_DIR/$1" chmod 0755 "$SCRIPT_DIR/$1" - Print_Output true "New version of $1 downloaded" "$PASS" "$SCRIPT_DIR/S99tailtop" start >/dev/null 2>&1 + Print_Output true "New version of $1 downloaded" "$PASS" + fi + rm -f "$tmpfile" + elif [ "$1" = "S95tailtaintdns" ]; then + tmpfile="/tmp/$1" + Download_File "$SCRIPT_REPO/files/$1" "$tmpfile" + if ! diff -q "$tmpfile" "$SCRIPT_DIR/$1" >/dev/null 2>&1; then + if [ -f "$SCRIPT_DIR/S95tailtaintdns" ]; then + "$SCRIPT_DIR/S95tailtaintdns" stop >/dev/null 2>&1 + sleep 2 + fi + Download_File "$SCRIPT_REPO/files/$1" "$SCRIPT_DIR/$1" + chmod 0755 "$SCRIPT_DIR/$1" + if [ "$(NTPBootWatchdog check)" = "ENABLED" ]; then + "$SCRIPT_DIR/S95tailtaintdns" start >/dev/null 2>&1 + fi + Print_Output true "New version of $1 downloaded" "$PASS" + fi + rm -f "$tmpfile" + elif [ "$1" = "tailtaintdns" ] || [ "$1" = "tailtaintdnsd" ]; then + tmpfile="/tmp/$1" + Download_File "$SCRIPT_REPO/files/$1" "$tmpfile" + if ! diff -q "$tmpfile" "$SCRIPT_DIR/$1" >/dev/null 2>&1; then + if [ -f "$SCRIPT_DIR/S95tailtaintdns" ]; then + "$SCRIPT_DIR/S95tailtaintdns" stop >/dev/null 2>&1 + sleep 2 + fi + Download_File "$SCRIPT_REPO/files/$1" "$SCRIPT_DIR/$1" + chmod 0755 "$SCRIPT_DIR/$1" + if [ "$(NTPBootWatchdog check)" = "ENABLED" ]; then + "$SCRIPT_DIR/S95tailtaintdns" start >/dev/null 2>&1 + fi + Print_Output true "New version of $1 downloaded" "$PASS" + fi + rm -f "$tmpfile" + elif [ "$1" = "sc.func" ]; then + tmpfile="/tmp/$1" + Download_File "$SCRIPT_REPO/files/$1" "$tmpfile" + if ! diff -q "$tmpfile" "$SCRIPT_DIR/$1" >/dev/null 2>&1; then + Download_File "$SCRIPT_REPO/files/$1" "$SCRIPT_DIR/$1" + chmod 0755 "$SCRIPT_DIR/$1" + Print_Output true "New version of $1 downloaded" "$PASS" fi rm -f "$tmpfile" else @@ -324,6 +372,7 @@ Create_Symlinks(){ ln -s /tmp/scmcronjobs.tmp "$SCRIPT_WEB_DIR/scmcronjobs.htm" 2>/dev/null ln -s "$NTP_WATCHDOG_FILE" "$SCRIPT_WEB_DIR/watchdogenabled.htm" 2>/dev/null + ln -s "$TAIL_TAINTED_FILE" "$SCRIPT_WEB_DIR/tailtaintdnsenabled.htm" 2>/dev/null if [ ! -d "$SHARED_WEB_DIR" ]; then ln -s "$SHARED_DIR" "$SHARED_WEB_DIR" 2>/dev/null @@ -776,6 +825,49 @@ EOF esac } +TailTaintDns(){ + case "$1" in + enable) + touch "$TAIL_TAINTED_FILE" + if [ -f /jffs/scripts/services-start ]; then + STARTUPLINECOUNT=$(grep -i -c '# '"$SCRIPT_NAME - tailtaintdns" /jffs/scripts/services-start) + STARTUPLINECOUNTEX=$(grep -i -cx "$SCRIPT_DIR/S95tailtaintdns start >/dev/null 2>&1 & # $SCRIPT_NAME - tailtaintdns" /jffs/scripts/services-start) + + if [ "$STARTUPLINECOUNT" -gt 1 ] || { [ "$STARTUPLINECOUNTEX" -eq 0 ] && [ "$STARTUPLINECOUNT" -gt 0 ]; }; then + sed -i -e '/# '"$SCRIPT_NAME"'/d' /jffs/scripts/services-start + fi + + if [ "$STARTUPLINECOUNTEX" -eq 0 ]; then + echo "$SCRIPT_DIR/S95tailtaintdns start >/dev/null 2>&1 & # $SCRIPT_NAME" >> /jffs/scripts/services-start + fi + else + echo "#!/bin/sh" > /jffs/scripts/services-start + echo "" >> /jffs/scripts/services-start + echo "$SCRIPT_DIR/S95tailtaintdns start >/dev/null 2>&1 & # $SCRIPT_NAME" >> /jffs/scripts/services-start + chmod 0755 /jffs/scripts/services-start + fi + ;; + disable) + rm -f "$TAIL_TAINTED_FILE" + "$SCRIPT_DIR/S95tailtaintdns" stop >/dev/null 2>&1 + if [ -f /jffs/scripts/services-start ]; then + STARTUPLINECOUNT=$(grep -i -c '# '"$SCRIPT_NAME - tailtaintdns" /jffs/scripts/services-start) + + if [ "$STARTUPLINECOUNT" -gt 0 ]; then + sed -i -e '/# '"$SCRIPT_NAME"' - tailtaintdns/d' /jffs/scripts/services-start + fi + fi + ;; + check) + if [ -f "$TAIL_TAINTED_FILE" ] && [ "$(grep -i -c '# '"$SCRIPT_NAME - tailtaintdns" /jffs/scripts/services-start)" -gt 0 ]; then + echo "ENABLED" + else + echo "DISABLED" + fi + ;; + esac +} + Process_Upgrade(){ if [ -f /opt/etc/init.d/S99tailtop ]; then /opt/etc/init.d/S99tailtop stop >/dev/null 2>&1 @@ -786,6 +878,10 @@ Process_Upgrade(){ Update_File S99tailtop rm -f "$SCRIPT_DIR/.usbdisabled" fi + if [ ! -f "$SCRIPT_DIR/S95tailtaintdns" ]; then + Update_File S95tailtaintdns + rm -f "$SCRIPT_DIR/.usbdisabled" + fi if [ ! -f "$SCRIPT_DIR/sitemap.asp" ]; then Update_File sitemap.asp fi @@ -921,7 +1017,13 @@ MainMenu(){ else NTPBW_ENABLED="Disabled" fi - printf "ntp. Toggle NTP boot watchdog script\\n Currently: ${BOLD}$NTPBW_ENABLED${CLEARFORMAT}\\n\\n" + printf "ntp. Toggle NTP boot watchdog script\\n Currently: ${BOLD}$NTPBW_ENABLED${CLEARFORMAT}\\n" + if [ "$(TailTaintDns check)" = "ENABLED" ]; then + TAILTAINT_ENABLED="${SETTING}Enabled" + else + TAILTAINT_ENABLED="Disabled" + fi + printf "dns. Toggle dnsmasq tainted watchdog script\\n Currently: ${BOLD}$TAILTAINT_ENABLED${CLEARFORMAT}\\n\\n" printf "u. Check for updates\\n" printf "uf. Update %s with latest version (force update)\\n\\n" "$SCRIPT_NAME" printf "e. Exit %s\\n\\n" "$SCRIPT_NAME" @@ -1228,6 +1330,15 @@ MainMenu(){ fi break ;; + dns) + printf "\\n" + if [ "$(TailTaintDns check)" = "ENABLED" ]; then + TailTaintDns disable + elif [ "$(TailTaintDns check)" = "DISABLED" ]; then + TailTaintDns enable + fi + break + ;; u) printf "\\n" if Check_Lock menu; then @@ -1324,8 +1435,11 @@ Menu_Install(){ Update_File shared-jy.tar.gz Update_File tailtop Update_File tailtopd + Update_File tailtaintdns + Update_File tailtaintdnsd Update_File sc.func Update_File S99tailtop + Update_File S95tailtaintdns Clear_Lock @@ -1363,6 +1477,7 @@ Menu_Uninstall(){ Auto_Startup delete 2>/dev/null Auto_ServiceEvent delete 2>/dev/null NTPBootWatchdog disable + TailTaintDns disable LOCKFILE=/tmp/addonwebui.lock FD=386 From 49968d8ecab2cf557142e9a27239fe7f355e10eb Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Wed, 5 Jan 2022 19:44:38 +0000 Subject: [PATCH 13/29] Menu line spacing --- scmerlin.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scmerlin.sh b/scmerlin.sh index f3f09c0..870ca86 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -1017,7 +1017,7 @@ MainMenu(){ else NTPBW_ENABLED="Disabled" fi - printf "ntp. Toggle NTP boot watchdog script\\n Currently: ${BOLD}$NTPBW_ENABLED${CLEARFORMAT}\\n" + printf "ntp. Toggle NTP boot watchdog script\\n Currently: ${BOLD}$NTPBW_ENABLED${CLEARFORMAT}\\n\\n" if [ "$(TailTaintDns check)" = "ENABLED" ]; then TAILTAINT_ENABLED="${SETTING}Enabled" else From 627fdde6b9f3b4b99e42110c2c85fe085748fc66 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Wed, 5 Jan 2022 19:45:54 +0000 Subject: [PATCH 14/29] Need sub files on upgrade --- scmerlin.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scmerlin.sh b/scmerlin.sh index 870ca86..ef1e2dc 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -879,6 +879,8 @@ Process_Upgrade(){ rm -f "$SCRIPT_DIR/.usbdisabled" fi if [ ! -f "$SCRIPT_DIR/S95tailtaintdns" ]; then + Update_File tailtaintdns + Update_File tailtaintdnsd Update_File S95tailtaintdns rm -f "$SCRIPT_DIR/.usbdisabled" fi From 601f659d226c97ac5086b6861ee45dde6c155572 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Wed, 5 Jan 2022 19:48:41 +0000 Subject: [PATCH 15/29] Add full comment in services-start --- scmerlin.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scmerlin.sh b/scmerlin.sh index ef1e2dc..b3fadf4 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -834,16 +834,16 @@ TailTaintDns(){ STARTUPLINECOUNTEX=$(grep -i -cx "$SCRIPT_DIR/S95tailtaintdns start >/dev/null 2>&1 & # $SCRIPT_NAME - tailtaintdns" /jffs/scripts/services-start) if [ "$STARTUPLINECOUNT" -gt 1 ] || { [ "$STARTUPLINECOUNTEX" -eq 0 ] && [ "$STARTUPLINECOUNT" -gt 0 ]; }; then - sed -i -e '/# '"$SCRIPT_NAME"'/d' /jffs/scripts/services-start + sed -i -e '/# '"$SCRIPT_NAME - tailtaintdns"'/d' /jffs/scripts/services-start fi if [ "$STARTUPLINECOUNTEX" -eq 0 ]; then - echo "$SCRIPT_DIR/S95tailtaintdns start >/dev/null 2>&1 & # $SCRIPT_NAME" >> /jffs/scripts/services-start + echo "$SCRIPT_DIR/S95tailtaintdns start >/dev/null 2>&1 & # $SCRIPT_NAME - tailtaintdns" >> /jffs/scripts/services-start fi else echo "#!/bin/sh" > /jffs/scripts/services-start echo "" >> /jffs/scripts/services-start - echo "$SCRIPT_DIR/S95tailtaintdns start >/dev/null 2>&1 & # $SCRIPT_NAME" >> /jffs/scripts/services-start + echo "$SCRIPT_DIR/S95tailtaintdns start >/dev/null 2>&1 & # $SCRIPT_NAME - tailtaintdns" >> /jffs/scripts/services-start chmod 0755 /jffs/scripts/services-start fi ;; From 1b98ca368b2f68ad94a12f87c8936326591a730e Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Wed, 5 Jan 2022 19:59:02 +0000 Subject: [PATCH 16/29] Tighten up grep matching --- scmerlin.sh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/scmerlin.sh b/scmerlin.sh index b3fadf4..c04fd44 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -416,43 +416,43 @@ Auto_Startup(){ case $1 in create) if [ -f /jffs/scripts/post-mount ]; then - STARTUPLINECOUNT=$(grep -i -c '# '"$SCRIPT_NAME" /jffs/scripts/post-mount) + STARTUPLINECOUNT=$(grep -i -c '# '"$SCRIPT_NAME$" /jffs/scripts/post-mount) if [ "$STARTUPLINECOUNT" -gt 0 ]; then - sed -i -e '/# '"$SCRIPT_NAME"'/d' /jffs/scripts/post-mount + sed -i -e '/# '"$SCRIPT_NAME$"'/d' /jffs/scripts/post-mount fi fi if [ -f /jffs/scripts/services-start ]; then - STARTUPLINECOUNT=$(grep -i -c '# '"$SCRIPT_NAME" /jffs/scripts/services-start) - STARTUPLINECOUNTEX=$(grep -i -cx "/jffs/scripts/$SCRIPT_NAME_LOWER startup"' & # '"$SCRIPT_NAME" /jffs/scripts/services-start) + STARTUPLINECOUNT=$(grep -i -c '# '"$SCRIPT_NAME$" /jffs/scripts/services-start) + STARTUPLINECOUNTEX=$(grep -i -cx "/jffs/scripts/$SCRIPT_NAME_LOWER startup"' & # '"$SCRIPT_NAME$" /jffs/scripts/services-start) if [ "$STARTUPLINECOUNT" -gt 1 ] || { [ "$STARTUPLINECOUNTEX" -eq 0 ] && [ "$STARTUPLINECOUNT" -gt 0 ]; }; then - sed -i -e '/# '"$SCRIPT_NAME"'/d' /jffs/scripts/services-start + sed -i -e '/# '"$SCRIPT_NAME$"'/d' /jffs/scripts/services-start fi if [ "$STARTUPLINECOUNTEX" -eq 0 ]; then - echo "/jffs/scripts/$SCRIPT_NAME_LOWER startup"' & # '"$SCRIPT_NAME" >> /jffs/scripts/services-start + echo "/jffs/scripts/$SCRIPT_NAME_LOWER startup"' & # '"$SCRIPT_NAME$" >> /jffs/scripts/services-start fi else echo "#!/bin/sh" > /jffs/scripts/services-start echo "" >> /jffs/scripts/services-start - echo "/jffs/scripts/$SCRIPT_NAME_LOWER startup"' & # '"$SCRIPT_NAME" >> /jffs/scripts/services-start + echo "/jffs/scripts/$SCRIPT_NAME_LOWER startup"' & # '"$SCRIPT_NAME$" >> /jffs/scripts/services-start chmod 0755 /jffs/scripts/services-start fi ;; delete) if [ -f /jffs/scripts/post-mount ]; then - STARTUPLINECOUNT=$(grep -i -c '# '"$SCRIPT_NAME" /jffs/scripts/post-mount) + STARTUPLINECOUNT=$(grep -i -c '# '"$SCRIPT_NAME$" /jffs/scripts/post-mount) if [ "$STARTUPLINECOUNT" -gt 0 ]; then - sed -i -e '/# '"$SCRIPT_NAME"'/d' /jffs/scripts/post-mount + sed -i -e '/# '"$SCRIPT_NAME$"'/d' /jffs/scripts/post-mount fi fi if [ -f /jffs/scripts/services-start ]; then - STARTUPLINECOUNT=$(grep -i -c '# '"$SCRIPT_NAME" /jffs/scripts/services-start) + STARTUPLINECOUNT=$(grep -i -c '# '"$SCRIPT_NAME$" /jffs/scripts/services-start) if [ "$STARTUPLINECOUNT" -gt 0 ]; then - sed -i -e '/# '"$SCRIPT_NAME"'/d' /jffs/scripts/services-start + sed -i -e '/# '"$SCRIPT_NAME$"'/d' /jffs/scripts/services-start fi fi ;; From fa09bf6a3e0466ae22c3a8a1e5572c26376b0ec9 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Wed, 5 Jan 2022 21:39:30 +0000 Subject: [PATCH 17/29] Start S95tailtaintdns when enabling it --- scmerlin.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scmerlin.sh b/scmerlin.sh index c04fd44..74d2721 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -829,6 +829,7 @@ TailTaintDns(){ case "$1" in enable) touch "$TAIL_TAINTED_FILE" + "$SCRIPT_DIR/S95tailtaintdns" start >/dev/null 2>&1 if [ -f /jffs/scripts/services-start ]; then STARTUPLINECOUNT=$(grep -i -c '# '"$SCRIPT_NAME - tailtaintdns" /jffs/scripts/services-start) STARTUPLINECOUNTEX=$(grep -i -cx "$SCRIPT_DIR/S95tailtaintdns start >/dev/null 2>&1 & # $SCRIPT_NAME - tailtaintdns" /jffs/scripts/services-start) From 76c1eb453e56727f35bbd24d5c08287adfb4c1f6 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Fri, 14 Jan 2022 23:34:16 +0000 Subject: [PATCH 18/29] Test if we should restart tailing at any point, e.g. reboot --- tailtaintdns | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tailtaintdns b/tailtaintdns index 3865157..1cfe48a 100644 --- a/tailtaintdns +++ b/tailtaintdns @@ -12,7 +12,8 @@ fi renice 15 $$ tail -F "$tailfile" | \ while read -r line; do \ -if echo "$line" | grep -q "Comm: dnsmasq Tainted:"; then logger "dnsmasq tainted detected, restarting dnsmasq"; service restart_dnsmasq; fi \ +if echo "$line" | grep -q "Comm: dnsmasq Tainted:"; then logger "dnsmasq tainted detected, restarting dnsmasq"; service restart_dnsmasq; fi +if [ "$tailfile" = "/tmp/syslog.log" ] && [ "$(pidof syslog-ng | wc -w)" -gt 0 ]; then break; fi done renice 0 $$ From a7803d9e300f671ba3d49bde5850b998709629a9 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Fri, 14 Jan 2022 23:34:35 +0000 Subject: [PATCH 19/29] Line breaks --- tailtaintdns | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tailtaintdns b/tailtaintdns index 1cfe48a..f40319b 100644 --- a/tailtaintdns +++ b/tailtaintdns @@ -10,8 +10,7 @@ if [ "$(pidof syslog-ng | wc -w)" -gt 0 ]; then fi renice 15 $$ -tail -F "$tailfile" | \ -while read -r line; do \ +tail -F "$tailfile" | while read -r line; do if echo "$line" | grep -q "Comm: dnsmasq Tainted:"; then logger "dnsmasq tainted detected, restarting dnsmasq"; service restart_dnsmasq; fi if [ "$tailfile" = "/tmp/syslog.log" ] && [ "$(pidof syslog-ng | wc -w)" -gt 0 ]; then break; fi done From 560317779de8fdb0fed65c4adc71c31aada73090 Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Sun, 16 Jan 2022 09:51:01 +0000 Subject: [PATCH 20/29] Always tail /tmp/syslog --- tailtaintdns | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tailtaintdns b/tailtaintdns index f40319b..cf5a1d0 100644 --- a/tailtaintdns +++ b/tailtaintdns @@ -5,14 +5,9 @@ trap '' SIGHUP tailfile="/tmp/syslog.log" -if [ "$(pidof syslog-ng | wc -w)" -gt 0 ]; then - tailfile="/opt/var/log/messages" -fi - renice 15 $$ tail -F "$tailfile" | while read -r line; do if echo "$line" | grep -q "Comm: dnsmasq Tainted:"; then logger "dnsmasq tainted detected, restarting dnsmasq"; service restart_dnsmasq; fi -if [ "$tailfile" = "/tmp/syslog.log" ] && [ "$(pidof syslog-ng | wc -w)" -gt 0 ]; then break; fi done renice 0 $$ From 60cc205f7a7ed7897b10385a369103c5e9098811 Mon Sep 17 00:00:00 2001 From: Tianyou Song Date: Thu, 13 Apr 2023 11:39:36 -0700 Subject: [PATCH 21/29] Fix addons icon The addons icon was bothering me. --- scmerlin.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scmerlin.sh b/scmerlin.sh index 73265a8..69700c2 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -482,7 +482,7 @@ Mount_WebUI(){ fi if ! grep -q '.menu_Addons' /tmp/index_style.css ; then - echo ".menu_Addons { background: url(ext/shared-jy/addons.png); }" >> /tmp/index_style.css + echo ".menu_Addons { background: url(ext/shared-jy/addons.png); background-size: contain; }" >> /tmp/index_style.css fi if ! grep -q '.dropdown-content' /tmp/index_style.css ; then From 779e43f0b3da212ebbd22b1602dd8d7a63b2dec9 Mon Sep 17 00:00:00 2001 From: Martinski <119833648+Martinski4GitHub@users.noreply.github.com> Date: Sun, 4 Jun 2023 18:04:18 -0700 Subject: [PATCH 22/29] Update scmerlin_www.asp - Added/modified code to address issues with "missing temperature" values on the webGUI page. - Added support for Tri-Band & Quad-Band routers when reporting temperatures. --- scmerlin_www.asp | 113 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 94 insertions(+), 19 deletions(-) diff --git a/scmerlin_www.asp b/scmerlin_www.asp index 899b967..6877f1d 100644 --- a/scmerlin_www.asp +++ b/scmerlin_www.asp @@ -80,6 +80,78 @@ function show_memcpu(){ } } +/**-------------------------------------**/ +/** Added by Martinski W. [2023-Jun-02] **/ +/**-------------------------------------**/ +let band_5GHz_1_supported=false, + band_5GHz_2_supported=false, + band_6GHz_1_supported=false; + +if (typeof wl_info == 'undefined' || wl_info == null) +{ + band_5GHz_1_supported = band5g_support; + band_5GHz_2_supported = band5g2_support; + band_6GHz_1_supported = band6g_support; +} +else +{ + band_5GHz_1_supported = wl_info.band5g_support; + band_5GHz_2_supported = wl_info.band5g_2_support; + band_6GHz_1_supported = wl_info.band6g_support; +} + +/**----------------------------------------------**/ +/** Added/Modified by Martinski W. [2023-Jun-03] **/ +/**----------------------------------------------**/ +function GetTemperatureValue (bandIDstr) +{ + let temperatureVal="[N/A]"; + + switch (bandIDstr) + { + case '2.4GHz': + if (productid == 'GT-AXE16000' && + typeof curr_coreTmp_wl3_raw != 'undefined' && curr_coreTmp_wl3_raw != null) + { temperatureVal = curr_coreTmp_wl3_raw; } + else if (typeof curr_coreTmp_wl0_raw != 'undefined' && curr_coreTmp_wl0_raw != null) + { temperatureVal = curr_coreTmp_wl0_raw; } + else if (typeof curr_coreTmp_2_raw != 'undefined' && curr_coreTmp_2_raw != null) + { temperatureVal = curr_coreTmp_2_raw; } + break; + + case '5GHz_1': + if (productid == 'GT-AXE16000' && + typeof curr_coreTmp_wl0_raw != 'undefined' && curr_coreTmp_wl0_raw != null) + { temperatureVal = curr_coreTmp_wl0_raw; } + else if (typeof curr_coreTmp_wl1_raw != 'undefined' && curr_coreTmp_wl1_raw != null) + { temperatureVal = curr_coreTmp_wl1_raw; } + else if (typeof curr_coreTmp_5_raw != 'undefined' && curr_coreTmp_5_raw != null) + { temperatureVal = curr_coreTmp_5_raw; } + break; + + case '5GHz_2': + if (productid == 'GT-AXE16000' && + typeof curr_coreTmp_wl1_raw != 'undefined' && curr_coreTmp_wl1_raw != null) + { temperatureVal = curr_coreTmp_wl1_raw; } + else if (typeof curr_coreTmp_wl2_raw != 'undefined' && curr_coreTmp_wl2_raw != null) + { temperatureVal = curr_coreTmp_wl2_raw; } + else if (typeof curr_coreTmp_52_raw != 'undefined' && curr_coreTmp_52_raw != null) + { temperatureVal = curr_coreTmp_52_raw; } + break; + + case '6GHz_1': + if (typeof curr_coreTmp_wl2_raw != 'undefined' && curr_coreTmp_wl2_raw != null) + { temperatureVal = curr_coreTmp_wl2_raw; } + else if (typeof curr_coreTmp_52_raw != 'undefined' && curr_coreTmp_52_raw != null) + { temperatureVal = curr_coreTmp_52_raw; } + break; + } + return (temperatureVal); +} + +/**----------------------------------------**/ +/** Modified by Martinski W. [2023-Jun-02] **/ +/**----------------------------------------**/ function update_temperatures(){ $j.ajax({ url: '/ajax_coretmp.asp', @@ -87,29 +159,32 @@ function update_temperatures(){ error: function(xhr){ update_temperatures(); }, - success: function(response){ - code = '2.4 GHz: ' + curr_coreTmp_2_raw + ''; - if(wl_info.band5g_2_support){ - code += '  -  5 GHz-1: ' + curr_coreTmp_5_raw + ''; - if(typeof curr_coreTmp_52_raw == 'undefined' || curr_coreTmp_52_raw == null){ - curr_coreTmp_52_raw = 'N/A' - } - code += '  -  5 GHz-2: ' + curr_coreTmp_52_raw + ''; - } - else if(band5g_support){ - code += '  -  5 GHz: ' + curr_coreTmp_5_raw + ''; + success: function(response) + { + code = '2.4 GHz: ' + GetTemperatureValue ('2.4GHz') + ''; + + if (band_5GHz_2_supported) + { + code += '  -  5 GHz-1: ' + GetTemperatureValue ('5GHz_1') + ''; + code += '  -  5 GHz-2: ' + GetTemperatureValue ('5GHz_2') + ''; } - - var CPUTemp = ''; - if(typeof curr_cpuTemp === 'undefined' || curr_cpuTemp === null){ - CPUTemp = curr_coreTmp_cpu; + else if (band_5GHz_1_supported) + { + code += '  -  5 GHz: ' + GetTemperatureValue ('5GHz_1') + ''; } - else{ - CPUTemp = curr_cpuTemp; + if (band_6GHz_1_supported) + { + code += '  -  6 GHz: ' + GetTemperatureValue ('6GHz_1') + ''; } + + var CPUTemp = ''; + if (typeof curr_cpuTemp == 'undefined' || curr_cpuTemp == null) + { CPUTemp = curr_coreTmp_cpu; } + else + { CPUTemp = curr_cpuTemp; } if(CPUTemp != ''){ - code +='  -  CPU: ' + parseInt(CPUTemp) +'°C'; + code +='  -  CPU: ' + parseInt(CPUTemp) +'°C'; } document.getElementById('temp_td').innerHTML = code; setTimeout(update_temperatures, 3000); @@ -236,7 +311,7 @@ var tout,arrayproclistlines=[],sortnameproc="CPU%",sortdirproc="desc",arraycronj - +
TemperaturesTemperatures
From f7dcba088201551b9a6be89c84b28293024e8c52 Mon Sep 17 00:00:00 2001 From: Martinski <119833648+Martinski4GitHub@users.noreply.github.com> Date: Sun, 4 Jun 2023 18:07:54 -0700 Subject: [PATCH 23/29] Update scmerlin.sh - Added support for Tri-Band & Quad-Band routers when reporting temperatures. - Added/modified code to address issues with some webGUI elements (SiteMap & pop-ups) being left behind after uninstalling the add-on. --- scmerlin.sh | 165 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 154 insertions(+), 11 deletions(-) diff --git a/scmerlin.sh b/scmerlin.sh index 74d2721..a7a43f6 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -11,6 +11,8 @@ ## https://github.com/jackyaz/scMerlin ## ## ## ###################################################### +# Last Modified: Martinski W. [2023-Jun-04]. +#----------------------------------------------------- ########## Shellcheck directives ########### # shellcheck disable=SC2016 @@ -49,6 +51,90 @@ readonly SETTING="${BOLD}\\e[36m" readonly CLEARFORMAT="\\e[0m" ### End of output format variables ### +##-------------------------------------## +## Added by Martinski W. [2023-Jun-02] ## +##-------------------------------------## +readonly SUPPORTstr="$(nvram get rc_support)" + +if echo "$SUPPORTstr" | grep -qw '2.4G' +then Band_24G_Support=true +else Band_24G_Support=false +fi + +if echo "$SUPPORTstr" | grep -qw '5G' +then Band_5G_1_Support=true +else Band_5G_1_Support=false +fi + +if echo "$SUPPORTstr" | grep -qw '5G-2' +then Band_5G_2_support=true +else Band_5G_2_support=false +fi + +if echo "$SUPPORTstr" | grep -qw 'wifi6e' +then Band_6G_1_Support=true +else Band_6G_1_Support=false +fi + +##----------------------------------------------## +## Added/Modified by Martinski W. [2023-Jun-03] ## +##----------------------------------------------## +GetIFaceName() +{ + if [ $# -eq 0 ] || [ -z "$1" ] ; then echo "" ; return 1 ; fi + + theIFnamePrefix="" + case "$1" in + "2.4GHz") + if "$Band_24G_Support" + then + if [ "$ROUTER_MODEL" = "GT-AXE16000" ] + then theIFnamePrefix="wl3" + else theIFnamePrefix="wl0" + fi + fi + ;; + "5GHz_1") + if "$Band_5G_1_Support" + then + if [ "$ROUTER_MODEL" = "GT-AXE16000" ] + then theIFnamePrefix="wl0" + else theIFnamePrefix="wl1" + fi + fi + ;; + "5GHz_2") + if "$Band_5G_2_support" + then + if [ "$ROUTER_MODEL" = "GT-AXE16000" ] + then theIFnamePrefix="wl1" + else theIFnamePrefix="wl2" + fi + fi + ;; + "6GHz_1") + if [ "$ROUTER_MODEL" = "GT-AXE16000" ] || "$Band_6G_1_Support" + then theIFnamePrefix="wl2" ; fi + ;; + esac + if [ -z "$theIFnamePrefix" ] + then echo "" + else echo "$(nvram get "${theIFnamePrefix}_ifname")" + fi +} + +##-------------------------------------## +## Added by Martinski W. [2023-Jun-02] ## +##-------------------------------------## +GetTemperatureValue() +{ + theIFname="$(GetIFaceName "$1")" + if [ -z "$theIFname" ] + then echo "[N/A]" + else echo "$(wl -i "$theIFname" phy_tempsense | awk '{print $1/2+20}')" + fi +} + # $1 = print to syslog, $2 = message to print, $3 = log level Print_Output(){ if [ "$1" = "true" ]; then @@ -556,6 +642,7 @@ Mount_WebUI(){ sed -i "\\~$MyPage~d" /tmp/menuTree.js + ## Make sure to synchronize code changes here with those needed in the "Menu_Uninstall()" function ## if ! grep -q 'menuName: "Addons"' /tmp/menuTree.js ; then lineinsbefore="$(( $(grep -n "exclude:" /tmp/menuTree.js | cut -f1 -d':') - 1))" sed -i "$lineinsbefore"'i,\n{\nmenuName: "Addons",\nindex: "menu_Addons",\ntab: [\n{url: "javascript:var helpwindow=window.open('"'"'/ext/shared-jy/redirect.htm'"'"')", tabName: "Help & Support"},\n{url: "NULL", tabName: "__INHERIT__"}\n]\n}' /tmp/menuTree.js @@ -1278,21 +1365,43 @@ MainMenu(){ ScriptHeader printf "\\n${BOLD}Temperatures${CLEARFORMAT}\\n\\n" if [ -f /sys/class/thermal/thermal_zone0/temp ]; then - printf "CPU: %s°C\\n" "$(awk '{ print int($1/1000) }' /sys/class/thermal/thermal_zone0/temp)" + printf "CPU:\t %s°C\\n" "$(awk '{ print int($1/1000) }' /sys/class/thermal/thermal_zone0/temp)" elif [ -f /proc/dmu/temperature ]; then - printf "CPU:%s\\n" "$(cut -f2 -d':' /proc/dmu/temperature | awk '{$1=$1;print}' | sed 's/..$/°C/')" + printf "CPU:\t %s\\n" "$(cut -f2 -d':' /proc/dmu/temperature | awk '{$1=$1;print}' | sed 's/..$/°C/')" else - printf "CPU: N/A\\n" + printf "CPU:\t [N/A]\\n" fi - printf "2.4 GHz: %s°C\\n" "$(wl -i "$(nvram get wl0_ifname)" phy_tempsense | awk '{ print $1/2+20 }')" + ##----------------------------------------------## + ## Added/Modified by Martinski W. [2023-Jun-03] ## + ##----------------------------------------------## + theTemptrVal="$(GetTemperatureValue "2.4GHz")" + if [ -n "$theTemptrVal" ] ; then printf "2.4 GHz: %s°C\n" "$theTemptrVal" ; fi if [ "$ROUTER_MODEL" = "RT-AC87U" ] || [ "$ROUTER_MODEL" = "RT-AC87R" ]; then - printf "5 GHz: %s°C\\n\\n" "$(qcsapi_sockrpc get_temperature | awk 'FNR == 2 {print $3}')" - else - printf "5 GHz: %s°C\\n\\n" "$(wl -i "$(nvram get wl1_ifname)" phy_tempsense | awk '{ print $1/2+20 }')" + printf "5 GHz: %s°C\n" "$(qcsapi_sockrpc get_temperature | awk 'FNR == 2 {print $3}')" + echo ; PressEnter + break fi - PressEnter + + if "$Band_5G_2_support" + then + theTemptrVal="$(GetTemperatureValue "5GHz_1")" + if [ -n "$theTemptrVal" ] ; then printf "5 GHz-1: %s°C\n" "$theTemptrVal" ; fi + + theTemptrVal="$(GetTemperatureValue "5GHz_2")" + if [ -n "$theTemptrVal" ] ; then printf "5 GHz-2: %s°C\n" "$theTemptrVal" ; fi + elif "$Band_5G_1_Support" + then + theTemptrVal="$(GetTemperatureValue "5GHz_1")" + if [ -n "$theTemptrVal" ] ; then printf "5 GHz: %s°C\n" "$theTemptrVal" ; fi + fi + if "$Band_6G_1_Support" + then + theTemptrVal="$(GetTemperatureValue "6GHz_1")" + if [ -n "$theTemptrVal" ] ; then printf "6 GHz: %s°C\n" "$theTemptrVal" ; fi + fi + echo ; PressEnter break ;; w) @@ -1474,6 +1583,9 @@ Menu_Startup(){ Clear_Lock } +##----------------------------------------## +## Modified by Martinski W. [2023-Jun-04] ## +##----------------------------------------## Menu_Uninstall(){ Print_Output true "Removing $SCRIPT_NAME..." "$PASS" Shortcut_Script delete @@ -1486,14 +1598,45 @@ Menu_Uninstall(){ FD=386 eval exec "$FD>$LOCKFILE" flock -x "$FD" + + resetWebGUI=false + Get_WebUI_Page "$SCRIPT_DIR/sitemap.asp" + if [ -n "$MyPage" ] && [ "$MyPage" != "none" ] && [ -f /tmp/menuTree.js ] + then + resetWebGUI=true + sed -i "\\~$MyPage~d" /tmp/menuTree.js + rm -f "$SCRIPT_WEBPAGE_DIR/$MyPage" + fi Get_WebUI_Page "$SCRIPT_DIR/scmerlin_www.asp" - if [ -n "$MyPage" ] && [ "$MyPage" != "none" ] && [ -f /tmp/menuTree.js ]; then + if [ -n "$MyPage" ] && [ "$MyPage" != "none" ] && [ -f /tmp/menuTree.js ] + then + resetWebGUI=true sed -i "\\~$MyPage~d" /tmp/menuTree.js - umount /www/require/modules/menuTree.js - mount -o bind /tmp/menuTree.js /www/require/modules/menuTree.js rm -f "$SCRIPT_WEBPAGE_DIR/$MyPage" rm -f "$SCRIPT_WEBPAGE_DIR/$(echo $MyPage | cut -f1 -d'.').title" fi + + ## Make sure to synchronize code changes here with those made in the "Mount_WebUI()" function ## + if grep -qE '^menuName: "Addons",$|tabName: "Help & Support"},$' /tmp/menuTree.js + then + resetWebGUI=true + STARTnum="$(grep -n '^menuName: "Addons",$' /tmp/menuTree.js | awk -F ':' '{print $1}')" + [ -n "$STARTnum" ] && STARTnum=$((STARTnum - 2)) + ENDnum="$(grep -n '{url: "javascript:var helpwindow=window.open('"'"'/ext/shared-jy/redirect.htm'"'"')", tabName: "Help & Support"},' /tmp/menuTree.js | awk -F ':' '{print $1}')" + [ -n "$ENDnum" ] && ENDnum=$((ENDnum + 3)) + [ -n "$STARTnum" ] && [ -n "$ENDnum" ] && sed -i "${STARTnum},${ENDnum}d" /tmp/menuTree.js + fi + if "$resetWebGUI" + then + umount /www/require/modules/menuTree.js 2>/dev/null + if [ -f /tmp/index_style.css ] && grep -q '.menu_Addons' /tmp/index_style.css + then rm -f /tmp/index_style.css ; umount /www/index_style.css 2>/dev/null + fi + if [ -f /tmp/state.js ] && grep -qwE 'GenerateSiteMap|AddDropdowns' /tmp/state.js + then rm -f /tmp/state.js ; umount /www/state.js 2>/dev/null + fi + mount -o bind /tmp/menuTree.js /www/require/modules/menuTree.js + fi flock -u "$FD" rm -rf "$SCRIPT_WEB_DIR" 2>/dev/null From dbca089834b9cf8ac371970f999e13c356eabb89 Mon Sep 17 00:00:00 2001 From: Martinski <119833648+Martinski4GitHub@users.noreply.github.com> Date: Mon, 5 Jun 2023 06:44:26 -0700 Subject: [PATCH 24/29] Update scmerlin_www.asp Minor formatting. --- scmerlin_www.asp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scmerlin_www.asp b/scmerlin_www.asp index 6877f1d..886b144 100644 --- a/scmerlin_www.asp +++ b/scmerlin_www.asp @@ -150,7 +150,7 @@ function GetTemperatureValue (bandIDstr) } /**----------------------------------------**/ -/** Modified by Martinski W. [2023-Jun-02] **/ +/** Modified by Martinski W. [2023-Jun-05] **/ /**----------------------------------------**/ function update_temperatures(){ $j.ajax({ @@ -179,9 +179,9 @@ function update_temperatures(){ var CPUTemp = ''; if (typeof curr_cpuTemp == 'undefined' || curr_cpuTemp == null) - { CPUTemp = curr_coreTmp_cpu; } + { CPUTemp = curr_coreTmp_cpu; } else - { CPUTemp = curr_cpuTemp; } + { CPUTemp = curr_cpuTemp; } if(CPUTemp != ''){ code +='  -  CPU: ' + parseInt(CPUTemp) +'°C'; From 29fa3f34e72ab4596b0df8b49e586c08d9109b2c Mon Sep 17 00:00:00 2001 From: Jack Naisbett Date: Tue, 6 Jun 2023 19:03:19 +0100 Subject: [PATCH 25/29] Add check for existing users to ensure background-size is added --- scmerlin.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scmerlin.sh b/scmerlin.sh index 9d19c57..5ce2e35 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -533,6 +533,10 @@ Mount_WebUI(){ if ! grep -q '.menu_Addons' /tmp/index_style.css ; then echo ".menu_Addons { background: url(ext/shared-jy/addons.png); background-size: contain; }" >> /tmp/index_style.css fi + + if grep -q '.menu_Addons' /tmp/index_style.css && ! grep -q 'url(ext/shared-jy/addons.png); background-size: contain;' /tmp/index_style.css; then + sed -i 's/addons.png);/addons.png); background-size: contain;/' /tmp/index_style.css + fi if grep -q '.dropdown-content {display: block;}' /tmp/index_style.css ; then sed -i '/dropdown-content/d' /tmp/index_style.css From 92ce70c592afe46d9ffc9c93b12f8c612102c9ae Mon Sep 17 00:00:00 2001 From: Martinski <119833648+Martinski4GitHub@users.noreply.github.com> Date: Fri, 9 Jun 2023 19:14:39 -0700 Subject: [PATCH 26/29] Update scmerlin.sh Code improvements when inserting changes during installation of the webGUI elements, and then later on to delete the same changes during uninstallation of the webGUI. --- scmerlin.sh | 78 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 23 deletions(-) diff --git a/scmerlin.sh b/scmerlin.sh index ffdc8bc..4075787 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -11,7 +11,7 @@ ## https://github.com/jackyaz/scMerlin ## ## ## ###################################################### -# Last Modified: Martinski W. [2023-Jun-04]. +# Last Modified: 2023-Jun-09 #----------------------------------------------------- ########## Shellcheck directives ########### @@ -51,9 +51,11 @@ readonly SETTING="${BOLD}\\e[36m" readonly CLEARFORMAT="\\e[0m" ### End of output format variables ### -##-------------------------------------## -## Added by Martinski W. [2023-Jun-02] ## -##-------------------------------------## +##----------------------------------------------## +## Added/Modified by Martinski W. [2023-Jun-09] ## +##----------------------------------------------## +readonly BEGIN_InsertTag="/\*\*BEGIN:scMerlin\*\*/" +readonly ENDIN_InsertTag="/\*\*END:scMerlin\*\*/" readonly SUPPORTstr="$(nvram get rc_support)" if echo "$SUPPORTstr" | grep -qw '2.4G' @@ -594,6 +596,9 @@ Get_WebUI_URL(){ } ### ### +##----------------------------------------## +## Modified by Martinski W. [2023-Jun-09] ## +##----------------------------------------## ### locking mechanism code credit to Martineau (@MartineauUK) ### Mount_WebUI(){ realpage="" @@ -646,10 +651,20 @@ Mount_WebUI(){ sed -i "\\~$MyPage~d" /tmp/menuTree.js - ## Make sure to synchronize code changes here with those needed in the "Menu_Uninstall()" function ## - if ! grep -q 'menuName: "Addons"' /tmp/menuTree.js ; then - lineinsbefore="$(( $(grep -n "exclude:" /tmp/menuTree.js | cut -f1 -d':') - 1))" - sed -i "$lineinsbefore"'i,\n{\nmenuName: "Addons",\nindex: "menu_Addons",\ntab: [\n{url: "javascript:var helpwindow=window.open('"'"'/ext/shared-jy/redirect.htm'"'"')", tabName: "Help & Support"},\n{url: "NULL", tabName: "__INHERIT__"}\n]\n}' /tmp/menuTree.js + ## Use the same BEGIN/END insert tags here as those used in the "Menu_Uninstall()" function ## + if ! grep -qE '^menuName: "Addons"' /tmp/menuTree.js + then + lineinsbefore="$(($(grep -n "^exclude:" /tmp/menuTree.js | cut -f1 -d':') - 1))" + sed -i "$lineinsbefore""i\ +${BEGIN_InsertTag}\n\ +,\n{\n\ +menuName: \"Addons\",\n\ +index: \"menu_Addons\",\n\ +tab: [\n\ +{url: \"javascript:var helpwindow=window.open('\/ext\/shared-jy\/redirect.htm')\", tabName: \"Help & Support\"},\n\ +{url: \"NULL\", tabName: \"__INHERIT__\"}\n\ +]\n}\n\ +${ENDIN_InsertTag}" /tmp/menuTree.js fi sed -i "/url: \"javascript:var helpwindow=window.open('\/ext\/shared-jy\/redirect.htm'/i {url: \"$MyPage\", tabName: \"$SCRIPT_NAME\"}," /tmp/menuTree.js @@ -1588,7 +1603,7 @@ Menu_Startup(){ } ##----------------------------------------## -## Modified by Martinski W. [2023-Jun-04] ## +## Modified by Martinski W. [2023-Jun-09] ## ##----------------------------------------## Menu_Uninstall(){ Print_Output true "Removing $SCRIPT_NAME..." "$PASS" @@ -1604,12 +1619,15 @@ Menu_Uninstall(){ flock -x "$FD" resetWebGUI=false - Get_WebUI_Page "$SCRIPT_DIR/sitemap.asp" - if [ -n "$MyPage" ] && [ "$MyPage" != "none" ] && [ -f /tmp/menuTree.js ] + if [ -f "$SCRIPT_DIR/sitemap.asp" ] then - resetWebGUI=true - sed -i "\\~$MyPage~d" /tmp/menuTree.js - rm -f "$SCRIPT_WEBPAGE_DIR/$MyPage" + Get_WebUI_Page "$SCRIPT_DIR/sitemap.asp" + if [ -n "$MyPage" ] && [ "$MyPage" != "none" ] && [ -f /tmp/menuTree.js ] + then + resetWebGUI=true + sed -i "\\~$MyPage~d" /tmp/menuTree.js + rm -f "$SCRIPT_WEBPAGE_DIR/$MyPage" + fi fi Get_WebUI_Page "$SCRIPT_DIR/scmerlin_www.asp" if [ -n "$MyPage" ] && [ "$MyPage" != "none" ] && [ -f /tmp/menuTree.js ] @@ -1620,23 +1638,37 @@ Menu_Uninstall(){ rm -f "$SCRIPT_WEBPAGE_DIR/$(echo $MyPage | cut -f1 -d'.').title" fi - ## Make sure to synchronize code changes here with those made in the "Mount_WebUI()" function ## - if grep -qE '^menuName: "Addons",$|tabName: "Help & Support"},$' /tmp/menuTree.js + ## Use the same BEGIN/END insert tags here as those used in the "Mount_WebUI()" function ## + if grep -qE "^${BEGIN_InsertTag}$" /tmp/menuTree.js && \ + grep -qE "^${ENDIN_InsertTag}$" /tmp/menuTree.js then resetWebGUI=true - STARTnum="$(grep -n '^menuName: "Addons",$' /tmp/menuTree.js | awk -F ':' '{print $1}')" - [ -n "$STARTnum" ] && STARTnum=$((STARTnum - 2)) - ENDnum="$(grep -n '{url: "javascript:var helpwindow=window.open('"'"'/ext/shared-jy/redirect.htm'"'"')", tabName: "Help & Support"},' /tmp/menuTree.js | awk -F ':' '{print $1}')" - [ -n "$ENDnum" ] && ENDnum=$((ENDnum + 3)) - [ -n "$STARTnum" ] && [ -n "$ENDnum" ] && sed -i "${STARTnum},${ENDnum}d" /tmp/menuTree.js + BEGINnum="$(grep -nE "^${BEGIN_InsertTag}$" /tmp/menuTree.js | awk -F ':' '{print $1}')" + ENDINnum="$(grep -nE "^${ENDIN_InsertTag}$" /tmp/menuTree.js | awk -F ':' '{print $1}')" + [ -n "$BEGINnum" ] && [ -n "$ENDINnum" ] && [ "$BEGINnum" -lt "$ENDINnum" ] && \ + sed -i "${BEGINnum},${ENDINnum}d" /tmp/menuTree.js fi + ## Remove any "old" previous lines left behind ## + if grep -qE '^menuName: "Addons",$' /tmp/menuTree.js && \ + grep -qE 'tabName: "Help & Support"},$' /tmp/menuTree.js + then + resetWebGUI=true + BEGINnum="$(grep -nE '^menuName: "Addons",$' /tmp/menuTree.js | awk -F ':' '{print $1}')" + ENDINnum="$(grep -nE 'tabName: "Help & Support"},$' /tmp/menuTree.js | awk -F ':' '{print $1}')" + [ -n "$BEGINnum" ] && [ -n "$ENDINnum" ] && [ "$BEGINnum" -lt "$ENDINnum" ] && \ + BEGINnum=$((BEGINnum - 2)) && ENDINnum=$((ENDINnum + 3)) && \ + [ "$(sed -n "${BEGINnum}p" /tmp/menuTree.js)" = "," ] && \ + [ "$(sed -n "${ENDINnum}p" /tmp/menuTree.js)" = "}" ] && \ + sed -i "${BEGINnum},${ENDINnum}d" /tmp/menuTree.js + fi + if "$resetWebGUI" then umount /www/require/modules/menuTree.js 2>/dev/null - if [ -f /tmp/index_style.css ] && grep -q '.menu_Addons' /tmp/index_style.css + if [ -f /tmp/index_style.css ] && grep -qF '.menu_Addons { background:' /tmp/index_style.css then rm -f /tmp/index_style.css ; umount /www/index_style.css 2>/dev/null fi - if [ -f /tmp/state.js ] && grep -qwE 'GenerateSiteMap|AddDropdowns' /tmp/state.js + if [ -f /tmp/state.js ] && grep -qE 'function GenerateSiteMap|function AddDropdowns' /tmp/state.js then rm -f /tmp/state.js ; umount /www/state.js 2>/dev/null fi mount -o bind /tmp/menuTree.js /www/require/modules/menuTree.js From d76fbb0d88f196e22c6bd351068459a029ee8ef1 Mon Sep 17 00:00:00 2001 From: Martinski <119833648+Martinski4GitHub@users.noreply.github.com> Date: Wed, 5 Jul 2023 20:56:00 -0700 Subject: [PATCH 27/29] Improved code to get temperatures from a 3rd set of vars. Code improvement to account for a 3rd set of temperature variables used in the 386.8 F/W version. --- scmerlin_www.asp | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/scmerlin_www.asp b/scmerlin_www.asp index 886b144..c933223 100644 --- a/scmerlin_www.asp +++ b/scmerlin_www.asp @@ -101,7 +101,7 @@ else } /**----------------------------------------------**/ -/** Added/Modified by Martinski W. [2023-Jun-03] **/ +/** Added/Modified by Martinski W. [2023-Jul-05] **/ /**----------------------------------------------**/ function GetTemperatureValue (bandIDstr) { @@ -110,31 +110,50 @@ function GetTemperatureValue (bandIDstr) switch (bandIDstr) { case '2.4GHz': - if (productid == 'GT-AXE16000' && - typeof curr_coreTmp_wl3_raw != 'undefined' && curr_coreTmp_wl3_raw != null) - { temperatureVal = curr_coreTmp_wl3_raw; } + if (productid == 'GT-AXE16000') + { + if (typeof curr_coreTmp_wl3_raw != 'undefined' && curr_coreTmp_wl3_raw != null) + { temperatureVal = curr_coreTmp_wl3_raw; } + else if (typeof curr_coreTmp_3_raw != 'undefined' && curr_coreTmp_3_raw != null) + { temperatureVal = curr_coreTmp_3_raw; } + } else if (typeof curr_coreTmp_wl0_raw != 'undefined' && curr_coreTmp_wl0_raw != null) { temperatureVal = curr_coreTmp_wl0_raw; } + else if (typeof curr_coreTmp_0_raw != 'undefined' && curr_coreTmp_0_raw != null) + { temperatureVal = curr_coreTmp_0_raw; } else if (typeof curr_coreTmp_2_raw != 'undefined' && curr_coreTmp_2_raw != null) { temperatureVal = curr_coreTmp_2_raw; } break; case '5GHz_1': - if (productid == 'GT-AXE16000' && - typeof curr_coreTmp_wl0_raw != 'undefined' && curr_coreTmp_wl0_raw != null) - { temperatureVal = curr_coreTmp_wl0_raw; } + if (productid == 'GT-AXE16000') + { + if (typeof curr_coreTmp_wl0_raw != 'undefined' && curr_coreTmp_wl0_raw != null) + { temperatureVal = curr_coreTmp_wl0_raw; } + else if (typeof curr_coreTmp_0_raw != 'undefined' && curr_coreTmp_0_raw != null) + { temperatureVal = curr_coreTmp_0_raw; } + } else if (typeof curr_coreTmp_wl1_raw != 'undefined' && curr_coreTmp_wl1_raw != null) { temperatureVal = curr_coreTmp_wl1_raw; } + else if (typeof curr_coreTmp_1_raw != 'undefined' && curr_coreTmp_1_raw != null) + { temperatureVal = curr_coreTmp_1_raw; } else if (typeof curr_coreTmp_5_raw != 'undefined' && curr_coreTmp_5_raw != null) { temperatureVal = curr_coreTmp_5_raw; } break; case '5GHz_2': - if (productid == 'GT-AXE16000' && - typeof curr_coreTmp_wl1_raw != 'undefined' && curr_coreTmp_wl1_raw != null) - { temperatureVal = curr_coreTmp_wl1_raw; } + if (productid == 'GT-AXE16000') + { + if (typeof curr_coreTmp_wl1_raw != 'undefined' && curr_coreTmp_wl1_raw != null) + { temperatureVal = curr_coreTmp_wl1_raw; } + else if (typeof curr_coreTmp_1_raw != 'undefined' && curr_coreTmp_1_raw != null) + { temperatureVal = curr_coreTmp_1_raw; } + } else if (typeof curr_coreTmp_wl2_raw != 'undefined' && curr_coreTmp_wl2_raw != null) { temperatureVal = curr_coreTmp_wl2_raw; } + else if (typeof curr_coreTmp_0_raw != 'undefined' && curr_coreTmp_0_raw != null && + typeof curr_coreTmp_2_raw != 'undefined' && curr_coreTmp_2_raw != null) + { temperatureVal = curr_coreTmp_2_raw; } else if (typeof curr_coreTmp_52_raw != 'undefined' && curr_coreTmp_52_raw != null) { temperatureVal = curr_coreTmp_52_raw; } break; @@ -142,6 +161,9 @@ function GetTemperatureValue (bandIDstr) case '6GHz_1': if (typeof curr_coreTmp_wl2_raw != 'undefined' && curr_coreTmp_wl2_raw != null) { temperatureVal = curr_coreTmp_wl2_raw; } + else if (typeof curr_coreTmp_0_raw != 'undefined' && curr_coreTmp_0_raw != null && + typeof curr_coreTmp_2_raw != 'undefined' && curr_coreTmp_2_raw != null) + { temperatureVal = curr_coreTmp_2_raw; } else if (typeof curr_coreTmp_52_raw != 'undefined' && curr_coreTmp_52_raw != null) { temperatureVal = curr_coreTmp_52_raw; } break; From 06a12254f6978d9f0bd66f895326369bbd24128d Mon Sep 17 00:00:00 2001 From: Martinski <119833648+Martinski4GitHub@users.noreply.github.com> Date: Tue, 12 Mar 2024 13:10:51 -0700 Subject: [PATCH 28/29] Bug fix when adding "startup" call to "services-start" script. --- scmerlin.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scmerlin.sh b/scmerlin.sh index 4075787..3c43442 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -11,7 +11,7 @@ ## https://github.com/jackyaz/scMerlin ## ## ## ###################################################### -# Last Modified: 2023-Jun-09 +# Last Modified: 2024-Mar-12 #----------------------------------------------------- ########## Shellcheck directives ########### @@ -500,6 +500,9 @@ Auto_ServiceEvent(){ esac } +##----------------------------------------## +## Modified by Martinski W. [2024-Mar-12] ## +##----------------------------------------## Auto_Startup(){ case $1 in create) @@ -519,12 +522,12 @@ Auto_Startup(){ fi if [ "$STARTUPLINECOUNTEX" -eq 0 ]; then - echo "/jffs/scripts/$SCRIPT_NAME_LOWER startup"' & # '"$SCRIPT_NAME$" >> /jffs/scripts/services-start + echo "/jffs/scripts/$SCRIPT_NAME_LOWER startup"' & # '"$SCRIPT_NAME" >> /jffs/scripts/services-start fi else echo "#!/bin/sh" > /jffs/scripts/services-start echo "" >> /jffs/scripts/services-start - echo "/jffs/scripts/$SCRIPT_NAME_LOWER startup"' & # '"$SCRIPT_NAME$" >> /jffs/scripts/services-start + echo "/jffs/scripts/$SCRIPT_NAME_LOWER startup"' & # '"$SCRIPT_NAME" >> /jffs/scripts/services-start chmod 0755 /jffs/scripts/services-start fi ;; From 40cc81c4d1141ced690a51fbc615d0a229ad59aa Mon Sep 17 00:00:00 2001 From: Jack <6189420+jackyaz@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:31:35 +0000 Subject: [PATCH 29/29] Update scmerlin.sh --- scmerlin.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scmerlin.sh b/scmerlin.sh index 3c43442..40c21bc 100644 --- a/scmerlin.sh +++ b/scmerlin.sh @@ -28,7 +28,7 @@ readonly SCRIPT_NAME="scMerlin" readonly SCRIPT_NAME_LOWER="$(echo "$SCRIPT_NAME" | tr 'A-Z' 'a-z' | sed 's/d//')" readonly SCM_VERSION="v2.4.1" readonly SCRIPT_VERSION="v2.4.1" -SCRIPT_BRANCH="develop" +SCRIPT_BRANCH="master" SCRIPT_REPO="https://jackyaz.io/$SCRIPT_NAME/$SCRIPT_BRANCH" readonly SCRIPT_DIR="/jffs/addons/$SCRIPT_NAME_LOWER.d" readonly SCRIPT_WEBPAGE_DIR="$(readlink /www/user)"