-
Notifications
You must be signed in to change notification settings - Fork 27
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #43 from OlegH-ua/lesson03
Lesson03
- Loading branch information
Showing
30 changed files
with
678 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,156 @@ | ||
<<<<<<< HEAD | ||
|
||
======= | ||
# Bash | ||
|
||
## Manuals | ||
- [Advanced bash-scripting guide](http://www.tldp.org/LDP/abs/html/index.html) | ||
- [Bash Reference Manual](https://www.gnu.org/software/bash/manual/) | ||
- [ksh Reference Manual](http://www.bolthole.com/solaris/ksh.html) | ||
|
||
|
||
## Завдання 1 | ||
|
||
### ЗБИРАЄМО ДАНІ ПРО ПЛАТФОРМУ | ||
|
||
##### Створіть bash скрипт `task1.sh`, що збирає базову інформацію про обладнання, операційну систему та конфігурацію мережевих інтерфейсів. | ||
|
||
1. Скрипт повинен мати назву `task1.sh` | ||
і має бути завантажений у GitHub репозиторій GlobalLogic; | ||
|
||
2. Скрипт повинен запускатися командою: | ||
```bash | ||
./task1.sh [-h|--help] [-n num] [file] | ||
``` | ||
де `num` - кількість файлів із результатами, | ||
`file` - шлях та ім'я файла, у який треба записати результат; | ||
наприклад: `task1.sh -n 9 ./test/info/info.txt` | ||
|
||
3. Скрипт повинен обробляти вказані йому при запуску ключі та параметри; | ||
|
||
4. Параметр для ключа `-n` повинен бути цілим числом більшим за 1; | ||
|
||
5. Якщо при запуску вказано ключ `-h` або `--help`, | ||
скрипт повинен вивести лише довідкову інформацію | ||
та завершити свою роботу з успішним результатом; | ||
|
||
6. Якщо хоча б один ключ або параметр вказано неправильно, | ||
скрипт повинен вивести інформацію про помилку в стандартний потік помилок | ||
і завершити свою роботу із невдалим результатом; | ||
|
||
7. Якщо у користувач встановив українську мову локалізації, | ||
скрипт повинен виводити інформацію про помилки українською мовою. | ||
|
||
8. Зібрані дані скрипт повинен записувати у файл, який вказано при запуску, | ||
або у файл `~/bash/task1.out`, якщо при запуску файл не вказано; | ||
|
||
9. Якщо потрібні директорії ще не існують, | ||
скрипт повинен її автоматично створити; | ||
|
||
10. Якщо директорії створити не вдалося, | ||
скрипт повинен вивести інформацію про помилку в стандартний потік помилок | ||
і завершити свою роботу із невдалим результатом; | ||
|
||
11. Якщо файл із вказаним іменем (або іменем `task1.out`) вже існує, | ||
цей файл необхідно перейменувати у файл: `файл-yyyymmdd-nnnn`, де | ||
`файл` - вказане при запуску ім'я файла (або `task1.out`), | ||
`yyyymmdd` - рік, місяць, день перейменування файла, | ||
`nnnn` - номер перейменованого протягом дня файла, починаючи з `0000`; | ||
|
||
12. Якщо при запуску вказано ключ `-n`, | ||
скрипт повинен залишити у піддиректорії лише вказану кількість нових перейменованих файлів із вказаним іменем, | ||
а усі старі файли - видалити; | ||
|
||
13. Приклад файла з даними про платформу: | ||
``` | ||
Date: Sat, 07 Jul 2018 16:18:06 +0300 | ||
---- Hardware ---- | ||
CPU: "Intel(R) Celeron(R) CPU E1400 @ 2.00GHz" | ||
RAM: 2048 MB | ||
Motherboard: "ASUSTeK Computer INC", "P5KPL-AM/PS" | ||
System Serial Number: MT7089K12013428 | ||
---- System ---- | ||
OS Distribution: "CentOS release 6.10 (Final)" | ||
Kernel version: 2.6.32-754.el6.x86_64 | ||
Installation date: Wed Sep 9 14:35:22 2015 | ||
Hostname: ws267.se.nure.ua | ||
Uptime: 1:49 | ||
Processes running: 194 | ||
User logged in: 3 | ||
---- Network ---- | ||
lo: 127.0.0.1/8 | ||
eth0: 192.168.123.231/24 | ||
----"EOF"---- | ||
``` | ||
|
||
14. Значення та розділи (Hardware, System, Network) у файлі | ||
повинні йти лише у вказаному порядку | ||
і у вказаному (включно з лапками) вигляді; | ||
|
||
15. Значення `Motherboard` та `System Serial Number` | ||
потрібно формувати із отриманих з допомогою утиліти `dmidecode` параметрів: | ||
- baseboard-manufacturer, | ||
- baseboard-product-name, | ||
- system-serial-number; | ||
|
||
16. Якщо якесь значення отримати не вдалося, | ||
замість нього потрібно вказувати `Unknown`; | ||
|
||
17. Інформацію про параметри налаштування мережевих інтерфейсів | ||
потрібно збирати незалежно від їх стану та кількості; | ||
|
||
18. Для кожного інтерфейсу повинна виводитися інформація про його IP адресу та мережеву маску; | ||
|
||
19. Якщо IP адресу та маску для інтерфейсу не встановлено, | ||
замість них має виводитися `-/-` | ||
|
||
|
||
## Завдання 2 | ||
|
||
### ВСТАНОВЛЮЄМО ПРОГРАМУ | ||
|
||
##### Створіть bash скрипт `task2.sh`, що встановлює створену в завданні 1 програму в систему. | ||
|
||
1. Скрипт повинен мати назву `task2.sh` | ||
і має бути завантажений у GitHub репозиторій GlobalLogic; | ||
|
||
2. Скрипт повинен запускати користувач root командою: `./task2.sh` | ||
|
||
3. Якщо при запуску вказано ключ `-h` або `--help`, | ||
скрипт повинен вивести лише довідкову інформацію | ||
та завершити свою роботу з успішним результатом; | ||
|
||
4. Якщо ключі або параметри вказано неправильно, | ||
скрипт повинен вивести інформацію про помилку в стандартний потік помилок | ||
і завершити свою роботу із невдалим результатом; | ||
|
||
5. Якщо у користувач встановив українську мову локалізації, | ||
скрипт повинен виводити інформацію про помилки українською мовою; | ||
|
||
6. Скрипт повинен встановити створену в завданні 1 програму в директорію `/usr/local/bin`; | ||
|
||
7. Якщо директорія ще не існує, скрипт повинен її автоматично створити; | ||
|
||
8. Якщо директорію створити не вдалося, | ||
скрипт повинен вивести інформацію про помилку в стандартний потік помилок | ||
і завершити свою роботу із невдалим результатом; | ||
|
||
9. Скрипт повинен автоматично внести зміни у конфігураційні файли системи | ||
таким чином, щоб після інсталяції програми, | ||
будь-який користувач міг її запустити командою: `task1.sh` | ||
|
||
10. Перед внесенням змін, скрипт повинен створити резервні копії конфігураційних файлів | ||
з іменами у вигляді: `файл-yyyymmdd-nnnn`, де | ||
`файл` - ім'я конфігураційного файла, | ||
`yyyymmdd` - рік, місяць, день створення резервної копії, | ||
`nnnn` - номер створеної протягом дня резервної копії, починаючи з `0000`; | ||
|
||
11. Резервні копії конфігураційних файлів мають знаходитися у тій самій директорії, | ||
що і самі файли; | ||
|
||
12. Після встановлення програми, ніхто з користувачів системи (крім root) | ||
не повинен мати можливості вносити в неї зміни; | ||
|
||
13. Якщо програму встановлено успішно, | ||
скрипт повинен завершити роботу з успішним результатом. | ||
>>>>>>> main/master |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
#!/bin/bash | ||
|
||
path_to_add=/usr/local/bin | ||
|
||
if [ -n "$1" ] | ||
then | ||
path_to_add=$1 | ||
fi | ||
|
||
nnn=1 | ||
while [ 0 ] | ||
do | ||
pathn=$(cut -f$nnn -d":" <<< $PATH) | ||
if [ ! -n "$pathn" ]; then | ||
break | ||
fi | ||
if [ $pathn = "$path_to_add" ] | ||
then | ||
echo "$path_to_add already in the PATH." | ||
exit 0 | ||
fi | ||
let nnn=nnn+1 | ||
done | ||
|
||
echo "Adding $path_to_add to PATH..." | ||
export PATH=$PATH:${path_to_add} | ||
|
||
if [ -n "$2" ] | ||
then | ||
cp $0 "/etc/profile.d/$2" | ||
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
Date: Ср, 24 окт 2018 10:54:18 +0300 | ||
---- Hardware ---- | ||
CPU: "Intel(R) Pentium(R) Silver N5000 CPU @ 1.10GHz" | ||
RAM: 4096 MB | ||
Motherboard: "LENOVO", "LNVNB161216" | ||
System serial number: PF199ZW8 | ||
---- System ---- | ||
OS Distribution: "Ubuntu 18.04.1 LTS" | ||
Kernel Version: 4.19.0-rc8+ | ||
Hostname: olegh-ideapad | ||
---- Network ---- | ||
enp1s0: -/- | ||
lo: 127.0.0.1/8 | ||
wlp2s0: 192.168.1.24/24 | ||
---- "EOF" ---- |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,153 @@ | ||
#!/bin/bash | ||
# LESSON03: task1.sh - system information | ||
|
||
# check lang | ||
LNG='en' | ||
SYS_LANG=${LANG::5} | ||
if [ "$SYS_LANG" = "uk_UA" ] | ||
then | ||
LNG='ua' | ||
fi | ||
|
||
# output file name | ||
FNAME=~/bash/task1.out | ||
|
||
declare -i NFILES=0 | ||
|
||
# check and parse command line arguments | ||
for arg | ||
do | ||
if [ $arg = '-h' ] || [ $arg = '--help' ] | ||
then | ||
if [ $LNG = 'ua' ] | ||
then | ||
echo 'Завдання03: учбовий скрип shell: інформація про систему' | ||
echo 'arguments:' | ||
echo ' -h or --help - this help' | ||
echo ' -n N - max number of output files' | ||
echo ' filename - path and name of file to store system information' | ||
else | ||
echo 'Lesson03: educative shell script: system info' | ||
echo 'arguments:' | ||
echo ' -h or --help - this help' | ||
echo ' -n N - max number of output files' | ||
echo ' filename - path and name of file to store system information' | ||
fi | ||
exit 0 | ||
elif [ $NKEY ] | ||
then | ||
NKEY='' | ||
if [ $arg -ge "1" ] | ||
then | ||
NFILES=$arg | ||
else | ||
if [ $LNG = 'ua' ] | ||
then | ||
echo 'Треба вказа3ти ціле число файлів після ключа -n' 1>&2 | ||
else | ||
echo 'Expected integer max file number after -n key.' 1>&2 | ||
fi | ||
exit 1 | ||
fi | ||
elif [ $arg = '-n' ] | ||
then | ||
NKEY='1' | ||
else | ||
FNAME=$arg | ||
fi | ||
done | ||
|
||
DIR="$(dirname $FNAME)" | ||
echo "DIR is $DIR" | ||
mkdir -p "$DIR" | ||
if [ $? -ne 0 ] | ||
then | ||
if [ $LNG = 'ua' ] | ||
then | ||
echo "Неможливо збудувати повний путь '$DIR'." 1>&2 | ||
else | ||
echo "Can't create path: '$DIR'." 1>&2 | ||
fi | ||
exit 2 | ||
fi | ||
|
||
if [ -f "$FNAME" ] | ||
then | ||
echo "File '$FNAME' exists. Renaming..." | ||
# loop | ||
NN='0000' | ||
while [ "0" ] | ||
do | ||
FNAME2="$FNAME-"`date +%Y%m%d`-`printf "%04d" $NN` | ||
#echo $FNAME2 | ||
if [ ! -f "$FNAME2" ] | ||
then | ||
break; | ||
fi | ||
let NN=NN+1 | ||
done | ||
mv $FNAME $FNAME2 | ||
fi | ||
|
||
if (( $NFILES > 0 )) | ||
then | ||
echo "NFiles = $NFILES" | ||
#delete old files (not only for current date) | ||
FLIST=$(ls -1 -t $FNAME-????????-????) | ||
#skip NFILES lines, else (if any) - remove | ||
#echo $FLIST | ||
FILEN=0 | ||
while read -r line | ||
do | ||
let FILEN=FILEN+1 | ||
if [[ $FILEN -gt $NFILES ]] | ||
then | ||
echo "Removing old file '$line'..." | ||
rm $line | ||
fi | ||
done <<< $FLIST | ||
fi | ||
|
||
echo "Using output file '$FNAME'..." | ||
echo -n "Date: " > $FNAME | ||
date "+%a, %d %h %Y %T %z" >> $FNAME | ||
echo "---- Hardware ----" >> $FNAME | ||
CPU=$(sudo dmidecode -s processor-version) | ||
echo "CPU: \"$CPU\"" >> $FNAME | ||
MEMGB=$(sudo dmidecode -q | grep -e "Size: [0-9][0-9][0-9][0-9] MB") | ||
MEMGB=$(cut -f2 -d":" <<< $MEMGB) | ||
echo "RAM:$MEMGB" >> $FNAME | ||
MBOARD="\"$(sudo dmidecode -s baseboard-manufacturer)\", \"$(sudo dmidecode -s baseboard-product-name)\"" | ||
echo "Motherboard: $MBOARD" >> $FNAME | ||
SSN=$(sudo dmidecode -s system-serial-number) | ||
echo "System serial number: $SSN" >> $FNAME | ||
|
||
echo "---- System ----" >> $FNAME | ||
OS_ABOUT=$(hostnamectl | grep "Operating System") | ||
OS_ABOUT=${OS_ABOUT:20} | ||
echo "OS Distribution: \"$OS_ABOUT\"" >> $FNAME | ||
KERNEL_VER=$(uname -r) | ||
echo "Kernel Version: $KERNEL_VER" >> $FNAME | ||
HOST_NAME=$(hostname) | ||
echo "Hostname: $HOST_NAME" >> $FNAME | ||
|
||
echo "---- Network ----" >> $FNAME | ||
IFLIST=$(ls -1 /sys/class/net/) | ||
|
||
while read -r line | ||
do | ||
echo -n $line >> $FNAME | ||
IPLINE=$(ip address show dev $line | grep "inet ") | ||
if [ -n "$IPLINE" ] | ||
then | ||
#IPADDR=$(cut -f6 -d" " <<< $IPLINE) | ||
IPADDR=$(awk '{ print $2}' <<< $IPLINE) | ||
else | ||
IPADDR="-/-" | ||
fi | ||
echo ": $IPADDR" >> $FNAME | ||
done <<< $IFLIST | ||
|
||
|
||
echo "---- \"EOF\" ----" >> $FNAME | ||
echo "Done.Buy!" |
Oops, something went wrong.