Community discussions

MikroTik App
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Backup config to Gmail v1.6  [SOLVED]

Fri Feb 25, 2022 9:03 pm

Backup script to send config to Gmail account.
#
# Created Jotne 2023 v1.6
#
# 1.6 Fixed script for x86 devicews (Credit rextended)
# 1.5 Fixed for router missing serial
# 1.4 Added Router OS version
# 1.3r Revised by rextended
# 1.3 / 1.2 try to fix v6/v7 compability
# 1.1 added "show-sensitive"
# 1.0 initial release
#
# Takes two different backup and send then to email
#
# backup.rsc readable backup
# Certificates, the Dude and Usermanager are also NOT exported or backed up fully and should be backed up separately
# Can be used to restore config to different routers
#
# backup.bin binary backup
# Binary backup that can only be used to fully restored the same router.
#


:local email "<your mail>@gmail.com"
:local rscfn "backup"
:local bakfn "bin"

/system
:local date [clock get date]
:local time [clock get time]
:local info [identity get name]
:local board ([resource get board-name])
:local files "$rscfn.rsc,$bakfn.backup"
:local Version [resource get version]

/system
:local serial "undefined"
:if (!($board~"(x86|CHR)")) do={
    :global testrbsn "NO RouterBOARD"
    :execute ":global testrbsn; :set testrbsn [/system routerboard get serial-number]"
    :delay 1s
    :set serial $testrbsn
    :set testrbsn
} else={
    :if ($board="x86") do={:set serial [license get software-id]}
    :if ($board="CHR") do={:set serial [license get system-id]}
}

:if ($Version~"^7") do={
	[:parse "/export show-sensitive file=$rscfn.rsc"]
} else={
	/export file="$rscfn.rsc"
}
:delay 2s

/system backup save name="$bakfn"
:delay 2s

/tool e-mail send to="$email" subject="Mikrotik: Backup $info $Version $serial" file="$files" body="Automatic Backup of $info $serial at $date $time"
:delay 20s
:execute "/file remove $files"
:log info "Backup router=$info serial=$serial ok"

PS Since gmail are free, I suggest you make a new email for your backup files.

----------------------------------------------------------------------------------------
Use Splunk> to log/monitor your MikroTik Router(s). See link below. :mrgreen:

MikroTik->Splunk
Last edited by Jotne on Mon Apr 03, 2023 9:55 am, edited 10 times in total.
 
User avatar
Amm0
Forum Guru
Forum Guru
Posts: 3169
Joined: Sun May 01, 2016 7:12 pm
Location: California

Re: Script comparability v6<->v7 problems

Fri Feb 25, 2022 11:11 pm

Their syntax checker kicks in... But you could still cheat with [:parse ":export ..."].
{
:local vermajor [:tonum [:pick [/system resource get version] 0 1]]
:if ($vermajor > 6) do={ [:parse "export show-sensitive file=backup.rsc"] } else={ :export file=backup.rsc }
}
I always thought it strange they didn't just add "show-sensitive" as option in the V6 codeline, even if it's implied in V6. That wouldn't break annoying thing in V6, but avoid needing a stupid [:parse ""] thing for a common task. (and yes, I'm sure they need to deal with BOTH show-sensitive and hide-sensitive in V6, but scripts would then be portable between V6/V7)
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Script comparability v6<->v7 problems

Sat Feb 26, 2022 12:29 am

Perfect. Did learn some new today, so thank you for the help :)

Was just what I needed and have tested the script on various version and works fine.
#
# Created Jotne 2022 v1.3
#
# 1.1 Added "show-sensitive"
# 1.3 Fixed v6/v7 compability
#
# Takes two different backup and send then to email
#
# backup.rsc readable backup
# Certificates, the Dude and Usermanager are also NOT exported or backed up fully and should be backed up separately.  Can be used to restore config to different routers
#
# backup.bin binary backup
# Binary backup that can only be used to fully restored the same router.
#

:local email "<your mail>@gmail.com"

:if ([:tonum [:pick [/system resource get version] 0 1]] > 6) do={
	[:parse "export show-sensitive file=backup.rsc"]
} else={
	:export file=backup.rsc
}

:delay 2s
/system backup save name=bin
:delay 2s
:local date [/system clock get date]
:local time [/system clock get time]
:local info [/system identity get name]
:local serial [/system routerboard get serial-number]

:local files "backup.rsc,bin.backup"
/tool e-mail send to="$email" subject="Mikrotik: Backup $info $serial" file=$files body="Automatic Backup of $info $serial at $date $time."
:delay 20s
/file remove backup.rsc
/file remove bin.backup
:log info message="Backup router=$info serial=$serial ok"
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Script comparability v6<->v7 problems

Sat Feb 26, 2022 10:48 am

[:parse "export show-sensitive file=backup.rsc"]
cause error on v6 because the presence of show-sensitive

edit: never cut with "..." again, cause confusion
Last edited by rextended on Sun Feb 27, 2022 12:40 am, edited 4 times in total.
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Script comparability v6<->v7 problems

Sat Feb 26, 2022 11:09 am

Revised by REX code

#
# Created Jotne 2022 v1.3r
#
# 1.3r Revised by REX
# 1.3 / 1.2 try to fix v6/v7 compability
# 1.1 added "show-sensitive"
# 1.0 initial release
#
# Takes two different backup and send then to email
#
# backup.rsc readable backup
# Certificates, the Dude and Usermanager are also NOT exported or backed up fully and should be backed up separately
# Can be used to restore config to different routers
#
# backup.bin binary backup
# Binary backup that can only be used to fully restored the same router.
#

{

:local email "<your mail>@gmail.com"
:local rscfn "backup"
:local bakfn "bin"

/system
:local date [clock get date]
:local time [clock get time]
:local info [identity get name]
:local serial [routerboard get serial-number]
:local files "$rscfn.rsc,$bakfn.backup"

/system resource
:if ([get version]~"^7") do={
	[:parse "/export show-sensitive file=$rscfn.rsc"]
} else={
	/export file="$rscfn.rsc"
}
:delay 2s

/system backup save name="$bakfn"
:delay 2s

/tool e-mail send to="$email" subject="Mikrotik: Backup $info $serial" file="$files" body="Automatic Backup of $info $serial at $date $time"
:delay 20s
:execute "/file remove $files"
:log info "Backup router=$info serial=$serial ok"

}
Edit: put back the [ ] on :parse for v7 (invalid syntax but, thank to "if", never executed on v6)
Last edited by rextended on Sun Feb 27, 2022 12:28 am, edited 6 times in total.
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Script comparability v6<->v7 problems

Sat Feb 26, 2022 11:21 am

Related:
(not tested on v7)

save and restore global variables on reboot
viewtopic.php?f=9&t=170591&p=883422#p883422

Save RouterBOARD full backup of everything [configuration, certificates, host key, router users (no passwords), user-manager, dude, other files]
viewtopic.php?f=1&t=175360&p=858564#p858564


eidt:added note not tested on v7
Last edited by rextended on Sun Feb 27, 2022 12:41 am, edited 2 times in total.
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Script comparability v6<->v7 problems

Sat Feb 26, 2022 12:01 pm

Does not work. Tested in 7.1.2

Pasting this to terminal, does not give anything.
:parse "/export show-sensitive file=test.rsc"
But this works:
[:parse "/export show-sensitive file=test.rsc"]
 
User avatar
Amm0
Forum Guru
Forum Guru
Posts: 3169
Joined: Sun May 01, 2016 7:12 pm
Location: California

Re: Script comparability v6<->v7 problems

Sat Feb 26, 2022 5:00 pm

We wouldn't be here if either V7 or V6 just ignored a meaningless "hide-sensitive" or "show-sensitive" – that seem like something MT should fix somehow...

Does not work. Tested in 7.1.2

Pasting this to terminal, does not give anything.
:parse "/export show-sensitive file=test.rsc"
But this works:
[:parse "/export show-sensitive file=test.rsc"]

":parse" alone creates a :typeof "code", at "runtime". But the context that :parse used matters, since it acts more like a script do={} function – so it's more confusing than it appears. You can see the "code" type here:
:put [:parse "/ip address print"]  
#(eval /ip address print)

:put [:typeof [:parse "/ip address print"]]
# code

Before my time in RouterOS, but believe ":parse" was a way to create functions before the ":global fn do={}" way. So if you view that ":parse <string_script>" is same as do={<actual_script>}, then " :parse" is a definition of something runnable, why :parse at CLI doesn't run anything.
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Script comparability v6<->v7 problems

Sat Feb 26, 2022 5:37 pm

My version do work at both 6 and 7. What do I need to make rextendeds script to work on 7.x?
 
User avatar
Amm0
Forum Guru
Forum Guru
Posts: 3169
Joined: Sun May 01, 2016 7:12 pm
Location: California

Re: Script comparability v6<->v7 problems

Sat Feb 26, 2022 9:54 pm

My version do work at both 6 and 7. What do I need to make rextendeds script to work on 7.x?
@Jonte, which one, and what problem you having? I can offer what see in @rextended's examples below, but can't vouch that's all the V7 issues.

save and restore global variables on reboot
viewtopic.php?f=9&t=170591&p=883422#p883422

I didn't try this one, but I DO know it won't detect functions right in V7. "eval" is now "evl", here no :parse be needed, just different string to look for in V7 vs V6 to fix that one.
:global x do={:put "blah"}

# Version 7 it's ";evl(" that need to be :find 
/system script environment print detail where name=x
	# 3 name="x" value=";(evl (evl /putmessage=blah))" 

# But in Version 6, it's ";eval" that's @rextended uses
/system script environment print detail where name=x
	# 1 name="x" value=";(eval (eval /putmessage=blah))" 
Basically those are :typeof str, but represent the "compiled script" which why @rextended excludes them. Only issue how he's identifying them similar ":if ($majorversion>6) do={} else={}" thing.


Save RouterBOARD full backup of everything [configuration, certificates, host key, router users (no passwords), user-manager, dude, other files]
viewtopic.php?f=1&t=175360&p=858564#p858564
This one has a different problem. I don't know exactly why but the "$byemail ..." lines need be wrapped in a parenthesis. Only did a quick test, but changing the ALL the $byemail lines like this:
# did not work in V7
  $bymail $dsubj="Certificate $certname $date $time" $dfile="auto_$certname.p12"
# works in V7
 ($bymail $dsubj="Certificate $certname $date $time" $dfile="auto_$certname.p12")
 
# NOTE: I'm not sure the $ in $dsubj= needed 
I've found being using a "command subdirectory" to then "short form" find/get/set's sometimes causes odd issues in V7. Do something like "/certificate", then your code does make the script more human readable – but RouterOS "script compiler" seems to needs more help to figure stuff out when you do that. So putting commands or functions with parameters in parenthesis and/or brackets often helps MT's hidden script compiler. In theory, I wouldn't say you should need them, but the ($bymail ...) fixed @rextended's backup script on v7.2rc4 in my quick test.
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Script comparability v6<->v7 problems

Sat Feb 26, 2022 10:11 pm

@Jonte, which one, and what problem you having? I can offer what see in @rextended's examples below, but can't vouch that's all the V7 issues.
My latest postet script do work on both 6 and 7, but version rextended posted does not work on v7.
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Script comparability v6<->v7 problems

Sun Feb 27, 2022 12:24 am

My version do work at both 6 and 7. What do I need to make rextendeds script to work on 7.x?

(I have edited previous post)
The "related" link are not fully tested on v7 (see the dates of the posts...)

Ok, I understand why you do not understand:

The code itself is formally valid until not executed,
(for be more precise, is invalid the "show-sensitive" inside, not the use of the [ ])
the condition is never meet and never executed on v6
Put back [ ] on my "revision" work again on v7

My revision is only a hint for explain some "shortcut" or better style of coding...

For example: put / in front of export, because "export" export only current section.
:parse and :execute both consider / as start point, but if on future thath change, script is already ready...

Another example
all this
if ([:tonum [:pick [/system resource get version] 0 1]] > 6) do={
# translated: pick one character from the start of the version string, convert it to a number, if the resulting number is greater than 6 do ...

can be replaced with simpler and fastly readable
/system resource
:if ([get version]~"^7") do={
# translated: if the version string contains "7" at the beginning do ...
it work until version 70.x do not come out on year 2345 (for fixit on year 2345, simply add \. at the end, if someone of us is stil alive...)
If sometime on the future 8.x come out, probably the syntax change again, but if on 8, 9, 10 etc, is identical, use something like "^(7|8|9|10)"


For precision (tested on 6.47.10):
:parse "export file=backup.rsc" on v6 do not work like on v7
[:parse "export file=backup.rsc"] this work on both (but on v7 the new default do not export the sensitive data)
[:parse "export show-sensitive file=backup.rsc"] work only on v7 and NOT on v6, because have show-sensitive inside, not recognized on v6
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Script comparability v6<->v7 problems

Sun Feb 27, 2022 1:16 am


I didn't try this one, but I DO know it won't detect functions right in V7. "eval" is now "evl", here no :parse be needed, just different string to look for in V7 vs V6 to fix that one.
:global x do={:put "blah"}

# Version 7 it's ";evl(" that need to be :find 
/system script environment print detail where name=x
	# 3 name="x" value=";(evl (evl /putmessage=blah))" 

# But in Version 6, it's ";eval" that's @rextended uses
/system script environment print detail where name=x
	# 1 name="x" value=";(eval (eval /putmessage=blah))" 

probably the fix for work on both v6 and v7 is to replace

v6 only code

    :if ([:typeof [:find $vvalue "(eval " -1]] = "nil") do={
with

v6 and v7 code

    :if (([:typeof [:find $vvalue "(eval " -1]] = "nil") and ([:typeof [:find $vvalue "(evl " -1]] = "nil")) do={
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Script comparability v6<->v7 problems

Sun Feb 27, 2022 1:42 am


This one has a different problem. I don't know exactly why but the "$byemail ..." lines need be wrapped in a parenthesis. Only did a quick test, but changing the ALL the $byemail lines like this:
# did not work in V7
  $bymail $dsubj="Certificate $certname $date $time" $dfile="auto_$certname.p12"
# works in V7
 ($bymail $dsubj="Certificate $certname $date $time" $dfile="auto_$certname.p12")
 
# NOTE: I'm not sure the $ in $dsubj= needed 
[...]

the ($bymail ...) fixed @rextended's backup script on v7.2rc4 in my quick test.

Thanks.

The correct syntax is without $ in front of dsubj and dfile,
(caused for make consistant name of variables using replace $oldvarname with $newvarname, without removing $ when is not to be placed)
AND if used $var inside the strings, parenthesys ( ) must be used.
no need to use ( ) when the string not contain $varname
Thanks to you I just discover this strange behaviour.

Correct lines are (I have corrected the original script)
$bymail dsubj=("Certificate $certname $date $time") dfile=("auto_$certname.p12")
$bymail dsubj=("Host Key $date $time") dfile="auto_host-key_dsa,auto_host-key_dsa.pub,auto_host-key_rsa,auto_host-key_rsa.pub"
$bymail dsubj=("User Export $date $time") dfile="auto_user_export.rsc"
$bymail dsubj=("Backup $date $time") dfile="auto_backup.backup"
$bymail dsubj=("Database User-Manager $date $time") dfile="auto_user-manager.umb"
$bymail dsubj=("Database The Dude $date $time") dfile="auto_thedude.db"
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Script comparability v6<->v7 problems

Sun Feb 27, 2022 2:08 am

[...] in V7. "eval" is now "evl", here no :parse be needed

I need to use this on v6
:if ($vtype~"^(ip-prefix|ip6-prefix)\$") do={:execute ":global $vname [[:parse \":return $vvalue\"]]"}
because someone on the past broken the ":toip" function and for convert 1.1.1.0/27 to ip-prefix variable type I need to use this hack...

v6 ip-prefix example code

[rex@MATRIX] > :global test 1.1.1.0/24
[rex@MATRIX] > :put [:typeof $test]          
ip-prefix

[rex@MATRIX] > :global test "1.1.1.0/24"
[rex@MATRIX] > :put [:typeof $test]     
str

[rex@MATRIX] > :global test [:toip "1.1.1.0/24"]                  
[rex@MATRIX] > :put [:typeof $test]             
nil

[rex@MATRIX] > :global test [[:parse ":return 1.1.1.0/24"]]               
[rex@MATRIX] > :put [:typeof $test]                        
ip-prefix
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Script comparability v6<->v7 problems

Sun Feb 27, 2022 11:31 am

Thanks for the update and explanation rextended :)
Now it work both on 7.x and 6.x
 
msatter
Forum Guru
Forum Guru
Posts: 2897
Joined: Tue Feb 18, 2014 12:56 am
Location: Netherlands / Nīderlande

Re: Script comparability v6<->v7 problems

Sun Feb 27, 2022 12:54 pm

Sound familiar: viewtopic.php?p=881126&hilit=v7#p881126

It was a long time age...even before the Russian war.
 
User avatar
Amm0
Forum Guru
Forum Guru
Posts: 3169
Joined: Sun May 01, 2016 7:12 pm
Location: California

Re: Script comparability v6<->v7 problems

Mon Feb 28, 2022 6:00 pm

Sound familiar: viewtopic.php?p=881126&hilit=v7#p881126

It was a long time age...even before the Russian war.
Yeah it not only ":export XXXX-sensitive" attributes that differ subtle ways. I've been using V7 as excuse to re-writing my V6 scripts as functions, which has worked out well so far: basically everything is a parameterized function. So if you combine [:parse] WITH a function to apply @rextended's route table fix in above post...

:global rosmajorver [:tonum [:pick [/system resource get version] 0 1]]
:global rtlookup
:set $rtlookup do={
    :if ($rosmajorver>6) do={
        :return [[:parse "/routing table find where name=$1"]]
    } else={
        :return $1
    }
}

# >>  :put [$rtlookup main]
#    *0


With that above your firewall script, like so:
/ip firewall nat find where routing-mark=[$rtlookup "main"]

The function will hide the "ugly" :parse, and in theory you can use extend the above function to validate the route table for V6 etc. But using functions is how I've generically solve any some of oddities without a lot of ":if () do={}"'s everywhere.

Note: I know the code works for "main", but didn't test too much – more example of an approach to the next "show-sensitive".
 
User avatar
Amm0
Forum Guru
Forum Guru
Posts: 3169
Joined: Sun May 01, 2016 7:12 pm
Location: California

Re: Script comparability v6<->v7 problems

Mon Feb 28, 2022 6:25 pm

[...] in V7. "eval" is now "evl", here no :parse be needed
I need to use this on v6
:if ($vtype~"^(ip-prefix|ip6-prefix)\$") do={:execute ":global $vname [[:parse \":return $vvalue\"]]"}
because someone on the past broken the ":toip" function and for convert 1.1.1.0/27 to ip-prefix variable type I need to use this hack...
Oh that's a fun one! In the: "very cleaver solution, but annoying it's needed" category – but be a long wait for some ":toip-prefix" (or fixing/paramerizing :toip and other :toX) built-in.... Quite the path:
a :execute "background script", that's generated dynamically via :parse, to update a global variable used in the current – all because only a ":global" type definition will actually do a convert from string to a "ip[6]-prefix" type, BUT where you can define a global is limited. Somehow @rextended approach here does works, pretty nifty.
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.4

Mon May 09, 2022 10:35 am

Script updated to v1.4

Now also sends router version information in the subject. Faster to see when router was upgraded.
#
# Created Jotne 2022 v1.4
#
# 1.4 Added Router OS version
# 1.3r Revised by REX
# 1.3 / 1.2 try to fix v6/v7 compability
# 1.1 added "show-sensitive"
# 1.0 initial release
#
# Takes two different backup and send then to email
#
# backup.rsc readable backup
# Certificates, the Dude and Usermanager are also NOT exported or backed up fully and should be backed up separately
# Can be used to restore config to different routers
#
# backup.bin binary backup
# Binary backup that can only be used to fully restored the same router.
#


:local email "<your mail>@gmail.com"
:local rscfn "backup"
:local bakfn "bin"

/system
:local date [clock get date]
:local time [clock get time]
:local info [identity get name]
:local serial [routerboard get serial-number]
:local files "$rscfn.rsc,$bakfn.backup"
:local Version [resource get version]

:if ($Version~"^7") do={
	[:parse "/export show-sensitive file=$rscfn.rsc"]
} else={
	/export file="$rscfn.rsc"
}
:delay 2s

/system backup save name="$bakfn"
:delay 2s

/tool e-mail send to="$email" subject="Mikrotik: Backup $info $Version $serial" file="$files" body="Automatic Backup of $info $serial at $date $time"
:delay 20s
:execute "/file remove $files"
:log info "Backup router=$info serial=$serial ok"
Last edited by Jotne on Mon May 09, 2022 12:27 pm, edited 1 time in total.
 
User avatar
own3r1138
Long time Member
Long time Member
Posts: 680
Joined: Sun Feb 14, 2021 12:33 am
Location: Pleiades
Contact:

Re: Backup config to Gmail v1.4

Mon May 09, 2022 10:58 am

Hi,
Thanks for the post.
Can the binary version restore the user manager? if yes can it be used to restore between CHRs or it must be on the same machine.
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.4

Mon May 09, 2022 11:15 am

v6 or v7?

user-manager has is own separate databse, backup restore only customer, router, profiles and user, but without any profile assigned to users, sessions and the rest.
 
User avatar
own3r1138
Long time Member
Long time Member
Posts: 680
Joined: Sun Feb 14, 2021 12:33 am
Location: Pleiades
Contact:

Re: Backup config to Gmail v1.4

Mon May 09, 2022 11:18 am

v6 or v7?

user-manager has is own separate databse, backup restore only customer, router, profiles and user, but without any profile assigned to users, sessions and the rest.
Hi,
V7 is there any way that I can BK my user-manager automatically? sessions are no problem if reset but profile and start times are very important :d
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.4

Mon May 09, 2022 11:20 am

You can try my "Save RouterBOARD full backup of everything [configuration, certificates, host key, router users (no passwords), user-manager, dude, other files]"
viewtopic.php?f=1&t=175360&p=858564#p858564
 
User avatar
own3r1138
Long time Member
Long time Member
Posts: 680
Joined: Sun Feb 14, 2021 12:33 am
Location: Pleiades
Contact:

Re: Backup config to Gmail v1.4

Mon May 09, 2022 11:23 am

Well, Thankyou for sharing I will give it a try. is the
:local certpass "myprivatepass"
refers to PSK for certificate export?
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.4

Mon May 09, 2022 11:28 am

@Jotne
Script updated to v1.4
When something needs to be run on both versions, don't use syntax compatible only with v7 ;)
:local Version [/system/resource get version]
->
:local Version [resource get version]
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.4

Mon May 09, 2022 11:41 am

Well, Thankyou for sharing I will give it a try. is the
:local certpass "myprivatepass"
refers to PSK for certificate export?
yes... is cert-pass :roll:
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.4

Mon May 09, 2022 12:28 pm

When something needs to be run on both versions, don't use syntax compatible only with v7 ;)

:local Version [/system/resource get version]
->
:local Version [resource get version]

Good catch, updated.
 
Term
Frequent Visitor
Frequent Visitor
Posts: 88
Joined: Thu Jan 11, 2018 11:42 pm

Re: Backup config to Gmail v1.4

Mon Aug 08, 2022 10:54 pm

Hi,
thank you for this script. Works fine. Just note, how can I change name of files?
now I have backup.rsc , bin.backup

want to have for example $info.backup, so it will be ie RB4011.backup

Tried to add it, script stopped work for me.

Thank you
:local email "my@email.com"
:local rscfn "$info. "-" .$date. "-" .$time"
:local bakfn "$info. "-" .$date. "-" .$time"
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.4

Mon Aug 08, 2022 11:57 pm

date contain special character /
time contain special character :
and the routerboard name also can contain special characters

but ignoring that, your syntax is wrong (and why use two variables to store same things inside...)
:local email "my@email.com"
:local rscfn "$info-$date-$time"
:local bakfn "$info-$date-$time"

# or

:local email "my@email.com"
:local rscfn ($info . "-" . $date . "-" . $time)
:local bakfn ($info . "-" . $date . "-" . $time)
 
Term
Frequent Visitor
Frequent Visitor
Posts: 88
Joined: Thu Jan 11, 2018 11:42 pm

Re: Backup config to Gmail v1.4

Tue Aug 09, 2022 6:41 pm

:local email "my@email.com"
:local rscfn "$info-$date-$time"
:local bakfn "$info-$date-$time"

# or

:local email "my@email.com"
:local rscfn ($info . "-" . $date . "-" . $time)
:local bakfn ($info . "-" . $date . "-" . $time)
tried both, doesn't work fine.
Attachments are now:
--.rsc
--.backup
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.4

Tue Aug 09, 2022 6:45 pm

It was an example to explain the syntax to you, it wasn't to correct your version of the script.

This still remains valid: you can't create a filename with invalid characters in it, do you understand that?
date contain special character /
time contain special character :
and the routerboard name also can contain special characters
 
User avatar
Halfeez92
Member Candidate
Member Candidate
Posts: 101
Joined: Tue Oct 30, 2012 12:58 pm
Location: 127.0.0.1
Contact:

Re: Backup config to Gmail v1.4

Thu Oct 27, 2022 7:57 am

Script updated to v1.4

Now also sends router version information in the subject. Faster to see when router was upgraded.
#
# Created Jotne 2022 v1.4
#
# 1.4 Added Router OS version
# 1.3r Revised by REX
# 1.3 / 1.2 try to fix v6/v7 compability
# 1.1 added "show-sensitive"
# 1.0 initial release
#
# Takes two different backup and send then to email
#
# backup.rsc readable backup
# Certificates, the Dude and Usermanager are also NOT exported or backed up fully and should be backed up separately
# Can be used to restore config to different routers
#
# backup.bin binary backup
# Binary backup that can only be used to fully restored the same router.
#


:local email "<your mail>@gmail.com"
:local rscfn "backup"
:local bakfn "bin"

/system
:local date [clock get date]
:local time [clock get time]
:local info [identity get name]
:local serial [routerboard get serial-number]
:local files "$rscfn.rsc,$bakfn.backup"
:local Version [resource get version]

:if ($Version~"^7") do={
	[:parse "/export show-sensitive file=$rscfn.rsc"]
} else={
	/export file="$rscfn.rsc"
}
:delay 2s

/system backup save name="$bakfn"
:delay 2s

/tool e-mail send to="$email" subject="Mikrotik: Backup $info $Version $serial" file="$files" body="Automatic Backup of $info $serial at $date $time"
:delay 20s
:execute "/file remove $files"
:log info "Backup router=$info serial=$serial ok"
The script does not work. I put in script with "don't require permission". Where did it goes wrong?
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.4

Thu Oct 27, 2022 8:01 am

Add script in between { <script here> } and past it to the terminal. Then try to see what fails.
I guess you have gmail setup problems. See this example video: https://www.youtube.com/watch?v=HDyCTbDmgRM
 
User avatar
Halfeez92
Member Candidate
Member Candidate
Posts: 101
Joined: Tue Oct 30, 2012 12:58 pm
Location: 127.0.0.1
Contact:

Re: Backup config to Gmail v1.4

Thu Oct 27, 2022 10:00 am

Add script in between { <script here> } and past it to the terminal. Then try to see what fails.
I guess you have gmail setup problems. See this example video: https://www.youtube.com/watch?v=HDyCTbDmgRM
OK it works now. I have to remove the serial variable since I am using CHR there is no routerboard sub-command can be issued. Thanks for the help.
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.4

Thu Oct 27, 2022 6:00 pm

Ahh, Fixed in version 1.5
If unit has no serial, just add NA
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.4

Thu Oct 27, 2022 6:02 pm

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhhhhhhhhhhhhhhhhhhhhhhhhh....................

...on-error resume next...
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.5

Thu Oct 27, 2022 6:21 pm

Quick and dirty....

Fixed :)
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.5

Thu Oct 27, 2022 6:34 pm

must be tested
:local serial na
:if ($board!="CHR") do={
/system routerboard
    :set serial [get serial-number]
} else={
    /system license
    :set serial [get system-id]
}
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.5

Thu Oct 27, 2022 6:47 pm

Updated once more, and tested on a hEX
 
leanfr91
just joined
Posts: 2
Joined: Sun May 03, 2020 7:06 pm

Re: Backup config to Gmail v1.5

Fri Jan 20, 2023 2:52 am

thanks for the script
had to do some things to make it work for me:
add a schedule to trigger it everyday
config the e-mail server propperly cause gmail doesn't allow any "less secure aplication"
create an "app password" for the mail account for the password section in mkt e-mail settings
and thats it, it works fine, just don't use ip addres in mkt e-mail settings -> server, use gmail-smtp-msa.l.google.com
 
gabacho4
Member
Member
Posts: 329
Joined: Mon Dec 28, 2020 12:30 pm
Location: Earth

Re: Backup config to Gmail v1.5

Fri Jan 20, 2023 6:49 am

Care to provide the full working script by chance? I'd enjoy the chance to work through it step by step as I learn scripting.
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.5

Fri Jan 20, 2023 11:46 am

Script is a full working script.
Gmail have to be setup (not part of the script) (do a search for gmail mikrotik)
Schedule setup takes 1 second.

I can not help you to get out of the bed to turn on the computer...
 
gabacho4
Member
Member
Posts: 329
Joined: Mon Dec 28, 2020 12:30 pm
Location: Earth

Re: Backup config to Gmail v1.5

Fri Jan 20, 2023 12:09 pm

But will you pass me my slippers? 😀. Seriously, I misread leanfr91's message and thought he had altered the script some. After rereading I see that is not the case. Thanks for the script and the learning tool. We can work on the bed assistance later.
 
User avatar
diamuxin
Member
Member
Posts: 317
Joined: Thu Sep 09, 2021 5:46 pm
Location: Alhambra's City

Re: Backup config to Gmail v1.5

Fri Jan 20, 2023 12:52 pm

Hi Jotne,

I have tested your script with RouterOS version 7.7 and this part does not work:

/system license
	:set serial [get system-id]

Now it is:

/system license
	:set serial [get software-id]

Greetings.
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.5

Fri Jan 20, 2023 4:30 pm

Interesting. This will break several ting if its change a setting like this.
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.5

Fri Jan 20, 2023 6:22 pm

do not mix CHR with regular routerboard....
 
User avatar
diamuxin
Member
Member
Posts: 317
Joined: Thu Sep 09, 2021 5:46 pm
Location: Alhambra's City

Re: Backup config to Gmail v1.5

Fri Jan 20, 2023 8:47 pm

I'm sorry, but I don't understand Jotne's answer.

I mean this: (non system-id)
[admin@MikroTik] /system/license> pr
  software-id: XXXX-XXXX
       nlevel: 5
     features:
That's all.


BR.
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.5

Sat Jan 21, 2023 12:04 am

Since you did not write what system this is on, its hard to find the error.
It handles al routerBoard and CHR, but seems to fail on x86 OVA setup.
Will try to fix that.
 
User avatar
diamuxin
Member
Member
Posts: 317
Joined: Thu Sep 09, 2021 5:46 pm
Location: Alhambra's City

Re: Backup config to Gmail v1.5

Sat Jan 21, 2023 1:02 am

Since you did not write what system this is on, its hard to find the error.
It handles al routerBoard and CHR, but seems to fail on x86 OVA setup.
Will try to fix that.
It is tested on a RB4011, hAP ​​ac2 and hAP ac3.

BR
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.5

Sat Jan 21, 2023 1:16 am

Again, on RouterBOARD and x86 is software-id (and also serial-number for RouterBOARD only), both on v7 and previous versions
On CHR is system-id

The script on post #39
viewtopic.php?p=979117#p964465
is for read system-id instead of serial number on CHR (not software-id), because CHR do not have serial number, but system-id
 
User avatar
diamuxin
Member
Member
Posts: 317
Joined: Thu Sep 09, 2021 5:46 pm
Location: Alhambra's City

Re: Backup config to Gmail v1.5

Sat Jan 21, 2023 1:57 am

OK, thanks for the clarification.

BR.
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.5

Sat Jan 21, 2023 2:01 am

This part does not work on x86 routers, it seems to not like the routerboard command.

After testing adding the correct x86 name like this:
{
/system
:local board ([/system resource get board-name])
:local serial na
:if ($board!="x86") do={
/system routerboard
    :set serial [get serial-number]
} else={
    /system license
    :set serial [get system-id]
}
:put "$serial"
}
I get this output on 7.7 routerOS on x86
.
gmail.png
.

Just to show the version:
:put ([/system resource get board-name])
x86
To get it to work temporarily, just replace this:
:local serial na
:if ($board!="CHR") do={
	:set serial [routerboard get serial-number]
} else={
	/system license
	:set serial [get system-id]
}
with this
:local serial <your id>
You do not have the required permissions to view the files attached to this post.
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.5

Sat Jan 21, 2023 2:10 am

when you do not know if something exist...
:global thisvar "no routerboard"
:execute ":global thisvar; :set thisvar [/system routerboard get serial-number]"
:delay 1s
:put $thisvar
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.5

Sat Jan 21, 2023 2:17 am

Can you please help me to get that inn to the script?
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.5

Sat Jan 21, 2023 2:38 am

run code

{
/system
:local board  [resource get board-name]
:local serial "undefined"
:if (!($board~"(x86|CHR)")) do={
    :global testrbsn "NO RouterBOARD"
    :execute ":global testrbsn; :set testrbsn [/system routerboard get serial-number]"
    :delay 1s
    :set serial $testrbsn
    :set testrbsn
} else={
    :if ($board="x86") do={:set serial [license get software-id]}
    :if ($board="CHR") do={:set serial [license get system-id]}
}

:put "$serial"
}
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.6

Sat Jan 21, 2023 9:45 pm

Updated to version 1.6 in first post to also work with x86 routers that did fail due to missing serial.
Big thanks to Rextended :)
 
gabacho4
Member
Member
Posts: 329
Joined: Mon Dec 28, 2020 12:30 pm
Location: Earth

Re: Backup config to Gmail v1.6

Sat Jan 21, 2023 10:10 pm

This really is great! Thanks a million for your efforts and help!
 
DarkNate
Forum Veteran
Forum Veteran
Posts: 997
Joined: Fri Jun 26, 2020 4:37 pm

Re: Backup config to Gmail v1.6

Sun Jan 22, 2023 2:48 am

It would be better if it uses tmpfs in ROSv7.7 instead of the flash memory.
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.6

Sun Jan 22, 2023 9:01 am

Why is that better and will that work on all MT routers?
 
User avatar
Amm0
Forum Guru
Forum Guru
Posts: 3169
Joined: Sun May 01, 2016 7:12 pm
Location: California

Re: Backup config to Gmail v1.6

Sun Jan 22, 2023 4:05 pm

Why is that better and will that work on all MT routers?
Flash drives have a limited number of writes, so that's the logic. But a couple files once a day, isn't going to kill you IMO.

DarkNate isn't wrong, but I think the idea is here is it's simple. Nothing stop someone adding a ramdisk at start IF they know they have V7.7+, and adapting the backup filenames to use the ramdisk in path.
 
DarkNate
Forum Veteran
Forum Veteran
Posts: 997
Joined: Fri Jun 26, 2020 4:37 pm

Re: Backup config to Gmail v1.6

Sun Jan 22, 2023 5:14 pm

Why is that better and will that work on all MT routers?
Are you new to computer science in general? Do you not know flash memory has limited write capacity?

Do you also not know all MikroTik hardware dating back to the first models that supports ROSv7, supports tmpfs? Are you new to MikroTik?
 
User avatar
Amm0
Forum Guru
Forum Guru
Posts: 3169
Joined: Sun May 01, 2016 7:12 pm
Location: California

Re: Backup config to Gmail v1.6

Sun Jan 22, 2023 6:26 pm

@DarkNate, you could offer a "better" script that made use of ramdisk/tmpfs, if you wanted to offer something useful... Not sure attacking comments helps anyone.
 
User avatar
Jotne
Forum Guru
Forum Guru
Topic Author
Posts: 3279
Joined: Sat Dec 24, 2016 11:17 am
Location: Magrathean

Re: Backup config to Gmail v1.6

Sun Jan 22, 2023 8:16 pm

Are you new to computer science in general? Do you not know flash memory has limited write capacity?
I guess I have worked more with computers then you, but that is not important.
I do now what ramdisk are. But have you ever had a MikroTik that has a worn out flash memory?
You are not needed to use my scripts, I am only here to help out.
Script are made to work with most RouterOS, not only 7.7+
 
User avatar
rextended
Forum Guru
Forum Guru
Posts: 11967
Joined: Tue Feb 25, 2014 12:49 pm
Location: Italy
Contact:

Re: Backup config to Gmail v1.6

Sun Jan 22, 2023 11:09 pm

From 2007, I never have one device wit ruined NAND / flash for the writes...
I still have some RB1200 on service with user-manager inside...

Probably the generational change takes the device out of use sooner than the reads/writes to NAND or Flash

But that doesn't mean it isn't better to use a temporary file system.
Since RouterOS v6, units with /flash use RAM instead of Flash.
On drives that have /flash just ignore that folder and work in the root to basically work on the temporary file system.
 
User avatar
m3das
just joined
Posts: 14
Joined: Thu Feb 23, 2023 6:10 pm

Re: Backup config to Gmail v1.6

Sat Apr 01, 2023 9:20 pm

Backup script to send config to Gmail account.
#
# Created Jotne 2023 v1.6
#
# 1.6 Fixed script for x86 devicews (Credit rextended)
# 1.5 Fixed for router missing serial
# 1.4 Added Router OS version
# 1.3r Revised by rextended
# 1.3 / 1.2 try to fix v6/v7 compability
# 1.1 added "show-sensitive"
# 1.0 initial release
#
# Takes two different backup and send then to email
#
# backup.rsc readable backup
# Certificates, the Dude and Usermanager are also NOT exported or backed up fully and should be backed up separately
# Can be used to restore config to different routers
#
# backup.bin binary backup
# Binary backup that can only be used to fully restored the same router.
#


:local email "<your mail>@gmail.com"
:local rscfn "backup"
:local bakfn "bin"

/system
:local date [clock get date]
:local time [clock get time]
:local info [identity get name]
:local board ([resource get board-name])
:local files "$rscfn.rsc,$bakfn.backup"
:local Version [resource get version]

/system
:local serial "undefined"
:if (!($board~"(x86|CHR)")) do={
    :global testrbsn "NO RouterBOARD"
    :execute ":global testrbsn; :set testrbsn [/system routerboard get serial-number]"
    :delay 1s
    :set serial $testrbsn
    :set testrbsn
} else={
    :if ($board="x86") do={:set serial [license get software-id]}
    :if ($board="CHR") do={:set serial [license get system-id]}
}

:if ($Version~"^7") do={
	[:parse "/export show-sensitive file=$rscfn.rsc"]
} else={
	/export file="$rscfn.rsc"
}
:delay 2s

/system backup save name="$bakfn"
:delay 2s

/tool e-mail send to="$email" subject="Mikrotik: Backup $info $Version $serial" file="$files" body="Automatic Backup of $info $serial at $date $time"
:delay 20s
:execute "/file remove $files"
:log info "Backup router=$info serial=$serial ok"


----------------------------------------------------------------------------------------
Use Splunk> to log/monitor your MikroTik Router(s). See link below. :mrgreen:

MikroTik->Splunk
Thanks a lot for your script, sir!
Last edited by m3das on Sat Apr 01, 2023 9:22 pm, edited 2 times in total.
 
SpanMG
just joined
Posts: 17
Joined: Tue Oct 30, 2018 7:59 pm

Re: Backup config to Gmail v1.6

Tue Apr 11, 2023 12:45 pm

Hello friends.
If I remember correctly, Google stopped supporting insecure connections and now you can send mail through gmail, it does not pass authentication. Or am I doing something wrong?
 
holvoetn
Forum Guru
Forum Guru
Posts: 5322
Joined: Tue Apr 13, 2021 2:14 am
Location: Belgium

Re: Backup config to Gmail v1.6

Tue Apr 11, 2023 1:18 pm

Use app password
See security section of your Gmail account.
 
joshhboss
Member Candidate
Member Candidate
Posts: 270
Joined: Thu Aug 01, 2019 2:13 pm

Re: Backup config to Gmail v1.6

Thu Feb 01, 2024 12:37 am

Backup script to send config to Gmail account.
#
# Created Jotne 2023 v1.6
#
# 1.6 Fixed script for x86 devicews (Credit rextended)
# 1.5 Fixed for router missing serial
# 1.4 Added Router OS version
# 1.3r Revised by rextended
# 1.3 / 1.2 try to fix v6/v7 compability
# 1.1 added "show-sensitive"
# 1.0 initial release
#
# Takes two different backup and send then to email
#
# backup.rsc readable backup
# Certificates, the Dude and Usermanager are also NOT exported or backed up fully and should be backed up separately
# Can be used to restore config to different routers
#
# backup.bin binary backup
# Binary backup that can only be used to fully restored the same router.
#


:local email "<your mail>@gmail.com"
:local rscfn "backup"
:local bakfn "bin"

/system
:local date [clock get date]
:local time [clock get time]
:local info [identity get name]
:local board ([resource get board-name])
:local files "$rscfn.rsc,$bakfn.backup"
:local Version [resource get version]

/system
:local serial "undefined"
:if (!($board~"(x86|CHR)")) do={
    :global testrbsn "NO RouterBOARD"
    :execute ":global testrbsn; :set testrbsn [/system routerboard get serial-number]"
    :delay 1s
    :set serial $testrbsn
    :set testrbsn
} else={
    :if ($board="x86") do={:set serial [license get software-id]}
    :if ($board="CHR") do={:set serial [license get system-id]}
}

:if ($Version~"^7") do={
	[:parse "/export show-sensitive file=$rscfn.rsc"]
} else={
	/export file="$rscfn.rsc"
}
:delay 2s

/system backup save name="$bakfn"
:delay 2s

/tool e-mail send to="$email" subject="Mikrotik: Backup $info $Version $serial" file="$files" body="Automatic Backup of $info $serial at $date $time"
:delay 20s
:execute "/file remove $files"
:log info "Backup router=$info serial=$serial ok"


----------------------------------------------------------------------------------------
Use Splunk> to log/monitor your MikroTik Router(s). See link below. :mrgreen:

MikroTik->Splunk
Thanks a lot for your script, sir!
Love this! Many thanks to you guys !

Who is online

Users browsing this forum: JDF, miks and 22 guests