Functions & Scripts Auto Setup (FaSAS)

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Делюсь как идеей маленьким скриптом-установщиком. Может запускать скрипты из списка и устанавливать функции из скриптов. Список заполните сами своими данными. Можно дополнить скрипт возможностями установки скриптов из файлов, с других роутеров по SSH и другими возможностями.

Код: Выделить всё

#------------------------------------------------------------
# Functions & Scripts Auto Setup (FaSAS)
#                by Sertik 04/03/2023
#------------------------------------------------------------

# логика работы:

# скрипт ищет в ключевом массиве arrayComUser функции и скрипты пользователя
# если элемент массива не имеет значения (ключ есть, значения нет), то данный
# элемент считается скриптом репозитория и выполняется
# если же элемент имеет ключ и значение, то ключ считается именем функции, лежащей в скрипте 
# с именем значения элемента. Производится запуск этого скрипта для установки функции в окружение
# сама функция не выполняется, имена установленных скриптом функций накапливаются в 
# глобальном массиве funcList для последующего пользования


# list users scripts and functions:
:local arrayComUser {\
                                           "CalcDay"="";
                                           "scriptERROR"="";
                                           "FuncAS"="FuncAs+";
                                           "funcERROR"="mama";
                                           "FuncPassGen"="Func_PassGen";
                                           "SSHsms"="!_SSH_sendSMS"
                                            }

# -- > work part 
 :log info ""
 :log warning "Function & scripts auto Setup"
 :log error "========================="
 :log info ""
 
  :global funcList [:toarray ""] 
  :local calc
  :local funcerror
  :local scripterror
  :foreach key,val in=$arrayComUser do={
              :if (([:len [/system script environment find $key]]=0) && ($val!="")) do={
              :do {
              /system script run $val
              :log warning "function $key is set"
              :set funcList ($funcList, $key)
              } on-error={
              :log error "error setup function $key"
              :set funcerror ($funcerror+1)}
   }
            :if ($val="") do={
            :do {
            /system script run $key
           :log warning "script $key is run"
           :set calc ($calc+1)
              } on-error={
            :log error "error: script $key not find"
            :set scripterror ($scripterror+1)}
  }
}

# ---> report part in log
:log info ""
:log warning "setup is done"; 
:log error "==========="
:log info ""
:log warning ("scripts executed: $calc")
:if ($scripterror>0) do={:log error ("error run script: $scripterror")}
:log warning "in environment is set functions: $[:len $funcList]"
:log warning "list is installed functions:"
:log warning ("[\$$funcList]")
:if ($funcerror>0) do={:log error ("error set functions: $funcerror")}

# end script


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Чуть подработал скрипт. Теперь он умеет:
1. запускать скрипты из репозитория
2. устанавливать функции с запоминанием имён установленных в массив
3. импортировать скрипты и функции из файла корня /files или удаленного URL-ресурса
4. добавлять скрипты в репозиторий роутера из текстовых файлов /files

Код: Выделить всё

#------------------------------------------------------------
# Functions & Scripts Auto Setup (FaSAS)
#                by Sertik 09/03/2023
#------------------------------------------------------------

# логика работы:

# скрипт ищет в ключевом массиве arrayComUser функции и скрипты пользователя
# если элемент массива не имеет значения (ключ есть, значения нет), то данный
# элемент считается скриптом репозитория и выполняется
# если же элемент имеет ключ и значение, то ключ считается именем функции, лежащей в скрипте 
# с именем значения элемента. Производится запуск этого скрипта для установки функции в окружение
# сама функция не выполняется, имена установленных скриптом функций накапливаются в 
# глобальном массиве funcList для последующего пользования
# если элемент имеет ключ содержащий ".rsc", но не содержит значения, 
# то осуществляется /import из скрипта с именем ключа (из /files)
# если элемент имеет ключ содержащий ".rsc" и содержит значение, то 
# значение, считается путем URL для загрузки и последующего импорта скрипта
# если ключ содержит ".txt", считается, что нужно считать текстовый файл 
# нужно добавить скрипт c именем=значению элемента, содержанием из файла с именем-ключом.
# не запуская его, имена таких добавленных в репозиторий скриптов накапливаются в listScript
# комментарии на национальных языках имплантируются неверно


# list users scripts and functions:
:local arrayComUser {\
                                           "CalcDay"="";
                                           "mama.txt"="pokeScript";
                                           "scriptERROR"="";
                                           "JParseFunctions.rsc"="https://raw.githubusercontent.com/Winand/mikrotik-json-parser/master/JParseFunctions";
                                           "JParse.rsc"="";
                                           "FuncAS"="FuncAs+";
                                           "funcERROR"="mama";
                                           "FuncPassGen"="Func_PassGen";
                                           "SSHsms"="!_SSH_sendSMS"
                                            }

# -- > work part 
 :log info ""
 :log warning "Function & scripts auto Setup"
 :log error "========================="
 :log info ""
 
  :global funcList [:toarray ""] 
  :local calc 0
  :local importcalc 0
  :local filecalc 0
  :local funcerror
  :local scripterror
  :local importerror
  :local fileerror
  :foreach key,val in=$arrayComUser do={

#  add scriptin repository from file (.txt)
          :if ([:len [:find $key ".txt"]]!=0) do={
                :do {
                :if ([:len [/system script find name=$val]]!=0) do={[/system script remove $val]} 
                 /system script add name=$val source=[/file get [find where name=$key] contents]
                 :log warning ("add $val script from file $key is done")
                 :set filecalc ($filecalc+1)
                  } on-error={:log error "error add script $val from file $key"; :set fileerror ($fileerror +1)}
   }

# import or download & import script library (.rsc)
          :if ([:len [:find $key ".rsc"]]!=0) do={
              :if ($val="") do={
                :do {
                 :import $key;
                 :log warning "import $key script is done"
                 :set importcalc ($importcalc+1)
                  } on-error={:log error "error import script file $key"; :set importerror ($importerror +1)}
                } else={ 
                :do {
                /tool fetch url=$val
               :log warning "download $key from $val is done"
                :local nImport
                :if ([:len [/file find $key]]!=0) do={:set nImport $key} else={:set nImport [:pick $key 0 [:find $key ".rsc"]]}
                :import $nImport
               :log warning "import $nImport script is done";
               :set importcalc ($importcalc+1)
                   } on-error={:log error "error: could not load or import $key"; :set importerror ($importerror +1)}
   }
 }

# installed function from script 
              :if (([:len [/system script environment find $key]]=0) && ($val!="") && ([:len [:find $key ".txt"]]=0) &&  ([:len [:find $key ".rsc"]]=0)) do={
              :do {
              /system script run $val
              :log warning "function $key is set"
              :set funcList ($funcList, $key)
              } on-error={
              :log error "error setup function $key"
              :set funcerror ($funcerror+1)}
   }

# run script in repository
            :if (($val="") && ([:len [:find $key ".rsc"]]=0) && ([:len [:find $key ".txt"]]=0)) do={
            :do {
            /system script run $key
           :log warning "script $key is run"
           :set calc ($calc+1)
              } on-error={
            :log error "error: script $key not find"
            :set scripterror ($scripterror+1)}
  }

}

# ---> report part in log
:log info ""
:log warning "setup is done"; 
:log error "==========="
:log info ""
:log warning ("scripts executed: $calc")
:if ($scripterror>0) do={:log error ("error run script: $scripterror")}
:log warning "in environment is set functions: $[:len $funcList]"
:log warning "list is installed functions:"
:log warning ("[\$$funcList]")
:if ($funcerror>0) do={:log error ("error set functions: $funcerror")}
:log warning "import or download & import files $importcalc"
:if ($importerror>0) do={:log error ("error import / download: $importerror")}
:log warning "add script in repository from files $filecalc"
:if ($fileerror>0) do={:log error ("error add script in repository: $fileerror")}


# end script FaSAS


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Переделал скрипт FASAS в функцию. Возможности и использование ясны из комментариев.

Код: Выделить всё

#-----------------------------------------------------------------------------------
# Function (Functions & Scripts Auto Setup) (FaSaS)
#                by Sertik 13/03/2023
#-----------------------------------------------------------------------------------

# логика работы:

# $1 = txt, rsc, fnc, run

# [$FuncFaSAs txt file1 script1] - создает скрипт с именем script1 ($3) из текстового файла file1 ($2)
# [$FuncFaSas rsc script2.rsc] - импортирует скрипт с указанным именем ($2)
# [$FuncFaSas rsc script3.rsc "http://urlpatch"] - загружает c удаленного ресурса $3 и импортирует скрипт, даёт ему имя $2
# [$FuncFaSas fnc myFunc script4] - создает функцию c именем $2 из скрипта c именем $3, проверяя его наличие в репозитории
# [$FuncFaSas run script5] - выполняет скрипт $2, проверяя его наличие в репозитории 

# функция логирует результаты своей работы и возвращает соответствующие ошибки

:global FuncFaSaS do={

:local isp false
:local ferrans "ERROR function $0 type $1:"
:if ($1="txt") do={:set isp true
#  add scriptin repository from file (.txt)
                :do {
#                /system script set name=$3 source=[/file get [find where name=$2] contents]
                  :if ([:len [/system script find name=$3]]!=0) do={[/system script remove $3]} 
                  /system script add name=$3 source=[/file get [find where name=$2] contents]
                  :log warning ("$0: Add $3 script from file $2 is done")
                  } on-error={:log error ("$ferrans add script < $3 >  from file < $2 >")
                                    :return ("$ferrans error add script $3 from file $2")}
   }

:if ($1="rsc") do={:set isp true
# import or download & import script library (.rsc)
              :if ([:len $3]=0) do={
                :do {
                 :import $2;
                 :log warning "$0: import < $2 > script is done"
                  } on-error={:log error ("$ferrans error import script file < $2 >")
                                  :return ("$ferrans error import script file $2")}
                } else={ 
                :do {
                /tool fetch url=$3
               :log warning "$0: download < $2 > from < $3 > is done"
                :import $2
               :log warning "$0 import < $2 > script is done";
                   } on-error={:log error ("$ferrans could not load or import script file < $2 > from < $3 >")
                   :return ("$ferrans could not load or import script file < $2 > from < $3 >")}
   }
 }

:if ($1="fnc") do={:set isp true
# installed function from script 
             if ([:len [/system script find name $3]]=0) do={
                 :log error ("$ferrans function < $2 > not define but script < $3 > not found")  
                 :return "$ferrans script < $3 > not found"}
             :do {
                  :exec script=":global \"$2\" [:parse [/system script get $3 source]]";
                 } on-error={:log error ("$ferrans declare function < $2 > or get source script < $3 >");
                 :return ("$ferrans declare function < $2 > or get source script < $3 >")}
                :log warning  ("Function $0: defined function < $2 >  from script < $3>")
}

:if ($1="run") do={:set isp true
# run script in repository
             if ([:len [/system script find name $2]]=0) do={
                              :log error ("$ferrans script < $2 > not found")  
                              :return "$ferrans script < $2 > not found"}
            :do {
            /system script run $2
           :log warning "script $2 is run"
              } on-error={
            :log error "$ferrans script < $2 > error script code"
            :return "$ferrans script $2 error script code"}
  
   } 
:if ($isp) do={:return "Done"} else={:return ("ERROR function $0: bad $1 parameter")} 
}

# end func FaSaS


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить