#!/bin/bash

if [[ ${#} -ne 1 ]] || [[ ! -f ${1} ]] ; then
        echo "Expected 1 argument - config file"
        exit 1
fi

devices=$(cat /proc/acpi/wakeup | tail -n +2 | awk '{print $1 " " $3}')
file="${1}"

while read device status ; do
        echo "${devices}" | grep -q "^${device}"
        if [[ ${?} -ne 0 ]] ; then
                echo "Warning, device ${device} does not exist"
        else
                device_status=$(echo "${devices}" | grep "^${device}" | awk '{print $2}')
                if [[ ${device_status} != "disabled" ]] && [[ ${device_status} != "enabled" ]] ; then
                        echo "Invalid device status"
                elif [[ ${device_status} != ${status} ]] ; then
                        echo "${device}" >> "/proc/acpi/wakeup"
                fi
        fi
done < <(cat ${file} | tail -n +2 | awk -F '#' '{print $1}')

#Съвременните компютри могат да влизат в различни режими за енергоспестяване
#(suspend) и излизат от този режим (wake-up) при настъпването на определени събития. Linux kernel
#предоставя специален виртуален файл /proc/acpi/wakeup, чрез който може да се проверява или
#променя настройката за “събуждане” при настъпване на различни събития, в общия случай - при
#активност на някое устройство. Тъй като този файл е интерфейс към ядрото, “четенето” от файла
#и “писането” във файла изглеждат различно.
#За улеснение на задачата ще ползваме опростено описание на този файл.
#Под whitespace разбираме произволна комбинация от табове и интервали. При четене от файла
#изходът представлява четири колони, разделени с whitespace, в полетата не може да има whitespace;
#първият ред е header на съответната колона. Примерно съдържание на файла:
#Device S-state Status Sysfs node
#GLAN S4 *enabled pci:0000:00:1f.6
#XHC S3 *enabled pci:0000:00:14.0
#XDCI S4 *disabled
#LID S4 *enabled platform:PNP0C0D:00
#HDAS S4 *disabled pci:0000:00:1f.3
#RP01 S4 *enabled pci:0000:00:1c.0
#където:
#• първата колона дава уникално име на устройство, което може да събуди машината, като името
#е ограничено до четири знака главни латински букви и цифри;
#• третата колона описва дали това устройство може да събуди машината. Възможните стойности
#са enabled/disabled, предхождани от звездичка;
#• втората и четвъртата колона ги игнорираме в рамките на задачата.
#При записване на име на устройство във файла /proc/acpi/wakeup, неговото състояние се променя
#от disabled на enabled или обратно. Например, ако файлът изглежда както примера по-горе, при
#запис на XHC в него, третият ред ще се промени на:
#XHC S3 *disabled pci:0000:00:14.0
#При запис на HDAS, шестият ред ще се промени на:
#HDAS S4 *enabled pci:0000:00:1f.3
#Дефиниран е формат на конфигурационен файл, който описва желан комплект от настройки на
#wakeup събития. Примерен файл:
## comment bar
#GLAN disabled
#LID enabled # comment foo
#където:
#• знакът диез (#) е знак за коментар до края на реда;
#• редовете би трябвало да са комбинация от име на устройство и желаното състояние на настройката за събуждане
#при събития от това устройство, разделени с whitespace.
#Напишете скрипт, който при подаден първи параметър име на конфигурационен файл в горния
#формат осигурява исканите настройки за събуждане. Ако във файла има ред за устройство, което не
#съществува, скриптът да извежда предупреждение. Обърнете внимание на обработката за грешки
#и съобщенията към потребителя – искаме скриптът да бъде удобен и валиден инструмент