Skip to content

Commit

Permalink
Merge pull request #43 from OlegH-ua/lesson03
Browse files Browse the repository at this point in the history
Lesson03
  • Loading branch information
yekovalyov authored Oct 29, 2018
2 parents a3effc9 + 066c8aa commit d025372
Show file tree
Hide file tree
Showing 30 changed files with 678 additions and 2 deletions.
155 changes: 155 additions & 0 deletions 03-bash/README.md
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
1 change: 0 additions & 1 deletion 03-bash/README1.md

This file was deleted.

31 changes: 31 additions & 0 deletions 03-bash/addsyspath.sh
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
15 changes: 15 additions & 0 deletions 03-bash/task1.out
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" ----
152 changes: 152 additions & 0 deletions 03-bash/task1.sh
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!"
Loading

0 comments on commit d025372

Please sign in to comment.