Is this possible? Store data from Asus Router ajax .asp page for Temperature data.
-
I just discovered there is a secret webpage I didn't know about for my Asus Merlin router that when I run it in a browser gives me all the routers current temperatures.
http://192.168.0.1/ajax_coretmp.asp
I have to be logged into the router to access it however.
I tried to create an MSR rule with a HTTP request to store all this data in to a local expression.
But it looks like its not passing or accepting the username and password for my router, I tried Basic and Digest.
I just get this back in the local expression in the rule.
(string) "<HTML><HEAD><script>window.top.location.href='/Main_Login.asp';</script>\n</HEAD></HTML>\n"
The data returned in the browser looked like this:
curr_coreTmp_wl0_raw = "43°C"; curr_coreTmp_wl0 = (curr_coreTmp_wl0_raw.indexOf("disabled") > 0 ? 0 : curr_coreTmp_wl0_raw.replace("°C", "")); curr_coreTmp_wl1_raw = "49°C"; curr_coreTmp_wl1 = (curr_coreTmp_wl1_raw.indexOf("disabled") > 0 ? 0 : curr_coreTmp_wl1_raw.replace("°C", "")); curr_coreTmp_wl2_raw = "disabled"; curr_coreTmp_wl2 = (curr_coreTmp_wl2_raw.indexOf("disabled") > 0 ? 0 : curr_coreTmp_wl2_raw.replace("°C", "")); curr_coreTmp_wl3_raw = "disabled"; curr_coreTmp_wl3 = (curr_coreTmp_wl3_raw.indexOf("disabled") > 0 ? 0 : curr_coreTmp_wl3_raw.replace("°C", "")); curr_cpuTemp = "66.495"; fanctrl_info = "";
I know how to do this for webpages and sites that give back JSON data, however this data I am not sure what format it is, Javascript ? The page is a .asp ajax page.
So not sure if this is possible ?
I really wanted to monitor the CPU temps on my router as its been getting very hot, even with extra USB fans now on the back of it. Think its a firmware bug maybe in the Asus firmware as others have been talking about it online.
Thanks.
-
Or the other option might be some SSH command that can retrieve the CPU temp value from router?
Maybe some kind of remote ssh command from my Vera Plus to the router or from the MSR linux box to the router to get and store the temp value ?
If I ssh into the router itself and run this command it does then list the current CPU temp.
cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1 / 1000}'
But I don't know how to do that remotely and then store the value into an expression in MSR? If possible ?
Thanks.
-
Do you happen to run Home Assistant? There’s an integration that monitors CPU temps and a lot of other things.
-
@Pabla said in Is this possible? Store data from Asus Router ajax .asp page for Temperature data.:
Do you happen to run Home Assistant? There’s an integration that monitors CPU temps and a lot of other things.
No I am using Vera / Ezlo controllers.
But I did see and read that Home Assistant had some support for monitoring Asus Routers using SNMP I believe.
-
toggledbitsreplied to cw-kid on Jul 26, 2023, 4:56 PM last edited by toggledbits Jul 26, 2023, 12:57 PM
@cw-kid your router seems to have a special login page that sets up a session cookie for your browser, rather than using the native HTTP authentication (which is what is used when you select Basic or Digest in the request). That page
ajax_coretmp.asp
is probably a dead-end here, since you're not going to be able to reproduce a valid session cookie for the request without going through that login page.The SSH solution can probably work, but will test your technical prowess. You can use a Shell Command action to make the request to the router via SSH. You will likely need to set up public key authentication between the router and the MSR host system so that the
ssh
command can run without login credentials (the router trusts the MSR host system). That requires configuration on the router about which I have no information, and done incorrectly may lock you out of your router and send you to a factory reset and reconfiguration (back up your router config beforehand if that's an available feature). This trust also opens some security risks, so proceed at your own peril. The command line may look something like:ssh -i <path-to-trusted-key> routeruser@192.168.0.1 'cat /sys/class/thermal/thermal_zone0/temp'
Rather than wrestle with shell quoting to get the
awk
in on thessh
command, do the parsing and math in MSR expressions on the returned response. -
Thank you for the reply.
OK so I ran "ssh-keygen" on the MSR Linux box, this created an id_rsa.pub public key in the /root/.ssh directory.
I then copied that key onto my Asus Router in the Administration -> System menu "Authorized Keys".
I then on the terminal on the MSR host ran this command
ssh -i ~/.ssh/id_rsa.pub admin@192.168.0.1 'cat /sys/class/thermal/thermal_zone0/temp'
I then saw this:
It then prompted me for a password, which I was not expecting for admin@192.168.0.1
After entering the password it looks to have returned the requested CPU temp value.When I ran the ssh-keygen I didn't enter a password for the key that was to be generated. Perhaps this was my mistake, I wasn't sure if I had to leave the password blank for the two systems to connect together over SSH without it prompting for a password etc.
Thanks
-
I ran the ssh-keygen again and this time entered a password for the key. It generated a different key, so I copied to the routers Admin page again.
Now when I run the ssh command on the terminal on the MSR host it says the same thing:
"Permissions 0644 for '/root/.ssh/id_rsa.pub' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/root/.ssh/id_rsa.pub": bad permissions"So not sure why that is.
These are the permissions the system set on the file
-
Think my command was wrong I need to remove the .pub from it. So its /id_rsa not /id_rsa.pub
ssh -i ~/.ssh/id_rsa admin@192.168.0.1 'cat /sys/class/thermal/thermal_zone0/temp'
Now its prompting me for the key password. So perhaps I do need to generate the key with no password after all.
-
OK its working now in the terminal at least, I generated the key again with no password and now the above command works and does not prompt me for a password and the routers CPU temp value is returned.
I will try it in an MSR rule next.
-
Must be doing something wrong I am getting null in the local expression
Looks like the path is wrong it should be root not my home dir
Doesn't work either if I put in root instead of ~
I then tried copying the id_rsa file into my home directory and the .ssh folder in there. But it still doesn't work. So I am stuck now.
-
toggledbitswrote on Jul 26, 2023, 7:56 PM last edited by toggledbits Jul 26, 2023, 4:03 PM
OK. The
~
means the home directory of the login user, and where MSR is running, that appears to be/home/stuart
, so that's why the first attempt doesn't work.The second attempt doesn't work because you used
root/...
instead of/root/...
... it's a path, not a username, so it needs to begin with a/
. Just changing that is unlikely to work, either, because regular users (like stuart) do not have (and should never have) access to the.ssh
directory of any other user, especially that ofroot
.You need to copy the public and private key files to somewhere where Reactor has access, and specify the full path to that directory in the command line's
-i
option.Alternately, use the public key for user stuart as the trusted key on the router, and let that user make the connection. This is by far preferable, as copying
root
's private key around to other places and giving it lower access permissions presents serious security risks. -
OK thanks, I changed the command in the rule to this now:
ssh -i /root/.ssh/id_rsa admin@192.168.0.1 'cat /sys/class/thermal/thermal_zone0/temp'
I am no longer getting any alert errors in MSR but the local expression is not being populated. As your edit just said that is likely why.
I then tried this command instead.
ssh -i home/stuart/.ssh/id_rsa admin@192.168.0.1 'cat /sys/class/thermal/thermal_zone0/temp'
and
ssh -i /home/stuart/.ssh/id_rsa admin@192.168.0.1 'cat /sys/class/thermal/thermal_zone0/temp'
But I get alert errors again.
"Alternately, use the public key for user stuart as the trusted key on the router, and let that user make the connection."
That might be the best option. I need to work out how to ssh-keygen for a particular user though ?
-
toggledbitsreplied to cw-kid on Jul 26, 2023, 8:04 PM last edited by toggledbits Jul 26, 2023, 4:10 PM
@cw-kid said in Is this possible? Store data from Asus Router ajax .asp page for Temperature data.:
I need to work out how to ssh-keygen for a particular user though ?
Why? Just use the existing key in
~stuart/.ssh
. If there isn't one, you just runssh-keygen
as user stuart rather than asroot
(nosudo
either). -
Got it I just connected to the MSR host logging in as me rather than root user and ran the keygen again, it created the two key files in my own .ssh folder now. I will add that to the router and try again. Thanks
-
-
@cw-kid the
\n
at the end is a newline character. Linux is quite literal. You can push that string through the expressionint()
function and it will convert it to a number and ignore the newline. -
@toggledbits said in Is this possible? Store data from Asus Router ajax .asp page for Temperature data.:
You can push that string through the expression int() function
No idea what that means, but I will search. I also need to do some thing with that data like round it, as it says"66986" which should read as 66.99 degrees
-
OK I see what you mean my local expression is a string. But how to change it to int ?
When you create a local expression it gives you no option of the type it should be.
-
-
int(RouterCPUTemp) / 1000
6/77