Иногда (особенно когда плохая память на незначительные мелочи :-) ) бывает полезно постоянно иметь перед глазами расписание своей группы в универе. Ради этого, я написал набор из пары скриптов и конфига к conky, которые выводят на рабочий стол расписание группы на текущий день.

Первый скрипт — ifmo_shedule.sh — будучи запущенным в фоне, каждый день скачивает расписание с сайта ИТМО. Это расписание легко получить в удобочитаемой форме, подставив к параметру gr в GET-запросе номер своей группы:

http://www.ifmo.ru/file/schedule.php?gr=3101

Скачанное расписание преобразуется в псевдотекстовый формат при помощи w3m и сохраняется в дебрях /tmp/.

Оттуда, второй скрипт — ifmo_shedule_curr.sh, достает тот кусок расписания, который отвечает за текущий день. Алгоритм работы прост — узнаются текущий и следующий дни недели (в русской локали), сопоставляются с днями недели в расписании и выводятся строки, расположенные между соответствующими днями недели. Будет работать до тех пор, пока не изменятся названия дней недели в русском языке.

Выводом расписания на рабочий стол заведует conky. Вот часть конфига, отвечающая за вывод расписания на экран:

TEXT
${color #dddddd} ${execi 300 /home/drag0n/bin/ifmo_shedule_curr.sh}

Если файл расписания будет отсутствовать и новый файл будет еще загружаться, то некоторое время (пока conky не обновится) можно будет наблюдать следующую надпись на экране вместо расписания:

Schedule not found

Если же все на месте, то наше расписание будет выглядеть примерно вот так:

Schedule

Привожу код скриптов:

  • ifmo_schedule.sh

    #!/bin/bash
    
    # number of student group
    GROUP="3101"
    URL="http://www.ifmo.ru/file/schedule.php?gr="$GROUP
    SHEDFILE="/tmp/ifmo.shedule"
    
    while :; do
        # check internet connection
        while :; do
            ping -W 10 -c1 cde.ifmo.ru &>/dev/null
            if [ "$?" -eq "0" ]; then
                break;
            fi
            sleep 60
        done
    
        w3m -I CP1251 -dump $URL > $SHEDFILE.tmp 2>/dev/null
        if [ "$?" -ne "0" ]; then
            rm $SHEDFILE.tmp &> /dev/null
            if [ "$?" -ne "0" ]; then
                exit 1;
            fi
        else
            mv $SHEDFILE.tmp $SHEDFILE &> /dev/null
            if [ "$?" -ne "0" ]; then
                exit 1;
            fi
            chmod go+r $SHEDFILE
            if [ "$?" -ne "0" ]; then
                exit 1;
            fi
        fi
        # sleep 1 day
        sleep 86400
        if [ "$?" -ne "0" ]; then
            exit 1;
        fi
    done
  • ifmo_shedule_curr.sh

    #!/bin/sh
    
    SHED_FILE="/tmp/ifmo.shedule"
    
    if [ ! -e $SHED_FILE ]; then
        echo "File: $SHED_FILE not exist..."
        exit 1
    fi
    
    CURR_WEEKDAY=`date +%A`
    NEXT_WEEKDAY=`date -d "tomorrow" +%A`
    
    if [ "$CURR_WEEKDAY" == "Воскресенье" ]; then
        echo 'Гуляй, студент!'
        exit 0
    fi
    
    START_LINE=`cat $SHED_FILE | awk '/'$CURR_WEEKDAY'/{print NR}'`
    START_LINE=`echo "$START_LINE-1" | bc -l`
    
    if [ "$NEXT_WEEKDAY" == "Воскресенье" ]; then
        STOP_LINE=`wc -l $SHED_FILE | awk '{print $1}'`
    else
        STOP_LINE=`cat $SHED_FILE | awk '/'$NEXT_WEEKDAY'/{print NR}'`
        STOP_LINE=`echo "$STOP_LINE-1" | bc -l`
    fi
    
    head -n 1 $SHED_FILE
    echo
    
    cat $SHED_FILE | awk '{if((NR >='"$START_LINE"') && (NR <='""$STOP_LINE')) print $0}'

Итоговый результат:

Result

linux