tms-dos21-onl / anzhalika-tseliak

Apache License 2.0
0 stars 0 forks source link

[HW12] Bash скрипты (функции, строки, регулярные выражения) #16

Open AlexPykavy opened 4 months ago

AlexPykavy commented 4 months ago

Дедлайн: 22/03/2024

Для описания аргументов командной строки скриптов был использован Command-line syntax key стандарт (см. https://stackoverflow.com/a/47026846).

1. Создать скрипт expand-variables.sh, который считывает файл с шаблоном переданный через аргумент -f или же из стандартного потока ввода и выполняет интерполяцию переданного шаблона с использованием утилиты envsubst.

Описание аргументов командной строки скрипта:
./expand-variables.sh [-f <FILE>] <KEY_VALUE_PAIR> ...

Пример использования скрипта:

[root@localhost ~]# cat ./template.json

{
"ServerUrl": "$SERVER_URL",
"DatabaseConnectionString": "$DB_CONNECTION_STRING"
}

[root@localhost ~]# cat ./template.json | ./expand-variables.sh "SERVER_URL=https://localhost" "DB_CONNECTION_STRING=Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"

{
"ServerUrl": "https://localhost",
"DatabaseConnectionString": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"
}

[root@localhost ~]# ./expand-variables.sh -f ./template.json "SERVER_URL=https://localhost" "DB_CONNECTION_STRING=Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"

{
"ServerUrl": "https://localhost",
"DatabaseConnectionString": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"
}

2. Создать скрипт filter.sh, который считывает файл переданный через аргумент -f или же из стандартного потока ввода и выводит в стандартный поток вывода строки содержащие токен (или любой из токенов, если их было передано несколько) по заданному правилу. Для выполнения фильтрации использовать регулярные выражения.

Описание аргументов командной строки скрипта:

./filter.sh [-f <FILE>] {contains|startswith|endswith} <TOKEN> ...

Пример использования скрипта:
[root@localhost ~]# cat ./file

VAR_1=A
VAR_2=B
VAR_3
VAR_4=D

[root@localhost ~]# cat ./file | ./filter.sh contains = | ./filter.sh startswith VAR_1 VAR_2

VAR_1=A
VAR_2=B

[root@localhost ~]# ./filter.sh -f ./file contains = | ./filter.sh startswith VAR_1 VAR_2

VAR_1=A
VAR_2=B

3. Пишем свой Ansible 😎 Необходимо создать скрипт ansible-emulator.sh на Bash (либо ansible-emulator.py на Python, либо ansible-emulator.ps1 на PowerShell), который считывает файл с командами переданный через аргумент -f или же из стандартного потока ввода. В каждой строке входного файла находится по одной команде из следующего набора:

user --name <NAME> --password <PASSWORD> --state {present|absent} [--group <GROUP>] [--groups <GROUPS>] [--home <HOME>] [--shell <SHELL>]
Eсли --state установлен в present и пользователя <NAME> не существует, то пользователь <NAME> создаётся с указанными параметрами. Eсли --state установлен в absent, то пользователь <NAME> удаляется.

package --name <NAME> --state {present|absent}
Eсли --state установлен в present, то пакет <NAME> устанавливается. Eсли --state установлен в absent, то пакет <NAME> удаляется.

get_url --url <URL> --dest <DEST> [--checksum <CHECKSUM>] [--retries <RETRIES>] [--delay <DELAY>] [--force]
Если файл <DEST> не существует или флаг --force передан, то файл <URL> скачивается в файл <DEST> и проверяется совпадение контрольной суммы скаченного файла с <CHECKSUM>. В случае ошибки через <DELAY> секунд скачивание повторяется до тех пор пока количество попыток не достигнет <RETRIES>. Соответственно, если флаг --force не передан и файл <DEST> существует, то файл не скачивается.

file --path <PATH> --state {touch|directory|absent} [--owner <OWNER>] [--mode <MODE>]
Eсли --state установлен в touch/directory и файл/директория <PATH> не существует, то он/она создается. Eсли --state установлен в absent, то соответствующий файл/директория <PATH> удаляется.

unarchive --src <SRC> --dest <DEST>
Tarball архив <SRC> всегда распаковывается в директорию <DEST>.

lineinfile --path <PATH> --regexp <REGEXP> --line <LINE> --state {present|absent}
Eсли --state установлен в present, то строка соответствующая регулярному выражению <REGEXP> заменяется на <LINE>. Если несколько строк соответствуют регулярному выражению <REGEXP>, то заменяется только последняя. Eсли --state установлен в absent, то строка соответствующая регулярному выражению <REGEXP> удаляется.

Пример использования скрипта:
[root@localhost ~]# cat commands

package --name openjdk-8-jre --state present
user --name nexus --group nexus --password nexus --state present
geturl --url https://download.sonatype.com/nexus/3/nexus-3.58.1-02-unix.tar.gz --dest /tmp/nexus.tar.gz
file --path /opt/nexus --owner nexus --state directory
unarchive --src /tmp/nexus.tar.gz --dest /opt/nexus

[root@localhost ~]# cat commands | ./ansible-emulator.sh

...

[root@localhost ~]# ./ansible-emulator.sh -f commands

...

4. Создать Pull Request (PR) содержащий 3 созданных скрипта.
5. (**) Убедиться, что все файлы в репозитории проходят валидацию.

** не обязательны к выполнению. Задачи на интерес_