close

Вход

Забыли?

вход по аккаунту

?

Otchet (1)

код для вставкиСкачать
Государственное образовательное учреждение высшего
профессионального образования
Челябинский государственный университет
Кафедра компьютерной безопасности и прикладной алгебры
ОТЧЕТ
по учебной практике
Выполнил: Полижай В.А.,
гр. МК-201
Проверил: Окороков В. А.
Оценка:
Челябинск 2012
1
Оглавление
Задание 1......................................................................................................................3
 Формальная модель предметной области ….................................................4
 Соглашение о требованиях..............................................................................5
 Проект процедуры............................................................................................6
 Реализация.........................................................................................................8
 Тестирование...................................................................................................13
Задание 2.....................................................................................................................18
 Формальная модель предметной области.....................................................19
 Соглашение о требованиях.............................................................................20
 Проект процедуры...........................................................................................20
 Реализация........................................................................................................2
1
 Тестирование...................................................................................................23
Задание 3.....................................................................................................................25
 Формальная модель предметной области.....................................................26
 Соглашение о требованиях.............................................................................27
 Проект процедуры...........................................................................................28
 Реализация........................................................................................................2
9
 Тестирование...................................................................................................31
Задание 4.....................................................................................................................33
 Формальная модель предметной области.....................................................33
 Соглашение о требованиях.............................................................................34
 Проект процедуры...........................................................................................35
 Реализация........................................................................................................3
6
 Тестирование...................................................................................................38
Приложения...............................................................................................................41
2
Задание 1
Составить процедуру, позволяющую:
1. Выполнять регистрацию студентов, перечень которых находится в файле,
передающемся в качестве аргумента процедуры. Для каждого студента в
исходном файле указаны: фамилия, инициалы и номер учебной группы.
Например, «Иванов И.И. МК-102».
Файл может содержать неупорядоченный перечень студентов различных курсов
и групп. Каждому пользователю при регистрации присваиваются
идентификатор, значение которого включает название группы и номер студента
в списке группы, который должен быть упорядочен по значению фамилии.
Значение пароля, заданное в процессе регистрации, должно быть уникальным
для каждого пользователя. В качестве комментария в регистрационной записи
используются фамилия пользователя, его инициалы и номер группы.
2. Выводить для каждой группы в отдельный файл следующую информацию:
No п/п, фамилия и инициалы студента, идентификатор пользователя и
пароль.
3. Создавать для каждой учебной группы собственную группу
пользователей,
если она ранее не существовала, и включать каждого студента в
соответствующую группу пользователей.
4. Для каждого пользователя, выбранного в режиме диалога, изменять дату
отключения пользователя и максимальное число суток между изменениями
пароля.
Регистрация пользователя подразумевает запись соответствующей информации
в системных файлах. Список пользователей, которые зарегистрированы в
системе, хранится в файле /etc/passwd. При выполнении процедуры входа в
систему происходит обращение к данному файлу и проверяется наличие
идентификатора пользователя и соответствие ему входного пароля.
Для хранения информации о группах используется файл /etc/group, который
содержит имена групп и списки пользователей каждой группы. Каждая строка
файла представляет одну группу и состоит из четырех полей, разделенных
символом двоеточие.
Для создания, изменения и удаления групп все версии UNIX предлагают три
команды, groupadd, groupmod и groupdel, соответственно.
Для создания, изменения и удаления учетных записей все версии ОС UNIX
предлагают три команды, useradd, usermod и userdel, соответственно. Эти
3
команды позволяют выполнить только согласованные и допустимые изменения
в файлах /etc/passwd, /etc/shadow и /etc/group.
Для временного изменения
действующего идентификатора пользователя используется команда su.
Команда passwd позволяет любому пользователю изменить свой пароль.
Для временного изменения действующего идентификатора пользователя
используется команда su .
Формальная модель предметной области
Список пользователей, которые зарегистрированы в системе, хранится в файле
/etc/passwd. Каждая строка файла описывает одного пользователя и содержит
следующие поля, разделенные двоеточиями:
1. регистрационное имя;
2. зашифрованный пароль (если не используется дополнительный файл);
3. идентификатор пользователя (UID);
4. идентификатор группы (GID);
5. комментарий (обычно полное имя, должность и телефоны);
6. домашний каталог пользователя;
7. регистрационная оболочка.
Для хранения информации о группах используется файл /etc/group, который
содержит имена групп и списки пользователей каждой группы. Каждая строка
файла представляет одну группу и состоит из четырех полей, разделенных
символом двоеточие. Поля имеют следующие значения:
1. имя группы;
2. зашифрованный пароль (обычно не используется);
3. идентификатор группы;
4. список членов группы (разделяются запятыми).
Для создания, изменения и удаления групп все версии UNIX предлагают три
команды, groupadd, groupmod и groupdel, соответственно. Они имеют
следующий синтаксис:
groupadd [-g идентификатор [-o]] группа
groupmod [-g идентификатор [-o]] [-n новое_имя] группа
groupdel группа
При удалении группы просто удаляется строка из файла /etc/group.
Для создания, изменения и удаления учетных записей все версии ОС UNIX
предлагают три команды, useradd, usermod и userdel, соответственно. Они в
большинстве систем имеют следующий синтаксис:
useradd [-c комментарий]
[-d домашний_каталог]
4
[-e дата_отключения] [-f время_до_отключения]
[-g начальная_группа] [-G группа[,...]]
[-m [-k структурный_каталог] | -M]
[-p пароль] [-s оболочка] [-u идентификатор [ -o]]
[-n] [-r] имя_пользователя
usermod [-c комментарий] [-d домашний_каталог [ -m]]
[-e дата_отключения] [-f время_до_отключения]
[-g начальная_группа] [-G группа[,...]]
[-l новое_имя_пользователя] [-p пароль]
[-s оболочка] [-u идентификатор] [-L|-U] имя_пользователя
userdel [-r] имя_пользователя
Эти команды позволяют выполнить только согласованные и допустимые
изменения в файлах /etc/passwd, /etc/shadow и /etc/group.
Команда passwd позволяет любому пользователю изменить свой пароль.
Привилегированные пользователи могут использовать команду для изменения
пароля и установки атрибутов пароля для любого пользователя. Формат
команды:
passwd [-k] [-l] [-u [-f]] [-d] [-n мин_сут] [-x макс_сут] [-w предупр_сут]
[-i неакт_сут] [-S] [--stdin] [ регистрационное_имя ]
Для временного изменения действующего идентификатора пользователя
используется команда su, которая имеет следующий формат:
su [параметр]... [-] [имя_пользователя [аргумент]...]
Соглашение о требованиях
Процедура предназначена для регистрации студентов, перечень которых
находится в файле, передающемся в качестве аргумента процедуры .
Каждому пользователю при регистрации присваиваются идентификатор,
значение которого включает название группы и номер студента в списке
группы, который должен быть упорядочен по значению фамилии . В качестве
комментария в регистрационной записи используются фамилия пользователя,
его инициалы и номер группы . Выводить для каждой группы в отдельный файл
следующую информацию:
No п/п, фамилия и инициалы студента, идентификатор пользователя и
пароль.
Создавать для каждой учебной группы собственную группу пользователей,
если она ранее не существовала, и включать каждого студента в
соответствующую группу пользователей. Для каждого пользователя,
выбранного в режиме диалога, изменять дату отключения пользователя и
5
максимальное число суток между изменениями пароля.
Входные данные перечислены в файле, передающимся в качестве параметра, в
формате:
Фамилия И.О. Группа
Фамилия должна начинаться с заглавной буквы и содержать буквы латинского
алфавита. Фамилия не должны быть длиннее 20 символов. После фамилии
через один пробел пишется имя. Имя задается заглавной буквой латинского
алфавита. После имени ставится точка. Отчество задается заглавной буквой
латинского алфавита. После отчества ставится точка. После точки через один
пробел пишется группа. Группа должна иметь 2 заглавные буквы латинского
алфавита, тире и 3 цифры, уникальных для всего документа. Дата вводится в
формате ГГГГ-ММ-ДД. Количество суток должно иметь одну или 2 цифры.
Выходные данные являются сообщениями, подающимися на терминал.
Проект программы
6
7
Реализация
# Полижай В.А. МК-201
# Задание 1
if [ $# -lt 1 ]; then
echo Нет аргументов
exit
fi
case $1 in
-1)
if [ $# -lt 2 ]; then
echo Нет аргументов
exit
fi
case $2 in
*[^a-zA-Z0-9-_.]*) echo Некорректное имя файла; exit;;
esac
if [ ! -f $2 ]; then
echo Нет файла
exit
fi
if [ ! -s $2 ]; then
echo Файл пуст
exit
fi
file=$2
kolvo=`wc -l $file|awk ' {print $1} '`
ind=1
while [ $ind -le $kolvo ]
do
fam=`awk 'NR=="'$ind'" {print $1}' $file`
case $fam in
[^A-Z]*) echo Некорректные данные; exit;;
?*[^a-z]*) echo Некорректные данные; exit;;
*) fam2=`echo ${#fam} `
if [ $fam2 -gt 20 ]; then
echo Некорректные данные; exit
fi;;
esac
inic=`awk 'NR=="'$ind'" {print $2}' $file`
case $inic in
8
[^A-Z]*) echo Некорректные данные; exit;;
?[^.]*) echo Некорректные данные; exit;;
??[^A-Z]*) echo Некорректные данные; exit;;
???[^.]) echo Некорректные данные; exit;;
?????*) echo Некорректные данные; exit;;
*) inic2=`echo ${#inic} `
if [ $inic2 -gt 4 ]; then
echo Некорректные данные; exit
fi;;
esac
group=`awk 'NR=="'$ind'" {print $3}' $file`
case $group in
[^A-Z]*) echo Некорректные данные; exit;;
?[^A-Z]*) echo Некорректные данные; exit;;
??[^-]*) echo Некорректные данные; exit;;
???*[^0-9]*) echo Некорректные данные; exit;;
???????*) echo Некорректные данные; exit;;
*) group2=`echo ${#group} `
if [ $group2 -gt 6 ]; then
echo Некорректные данные; exit
fi;;
esac
ind=$(($ind+1))
done
cp $file temp
ind=1
while [ $ind -le $kolvo ]
do
group=`awk 'NR==1 {print $3}' temp`
flag=` grep $group /etc/group|wc -l|awk ' {print $1}'`
if [ $flag -eq 0 ]; then
groupadd $group
echo Группа $group зарегистрирована
else
echo Группа $group уже зарегистрирована
fi
sed -i "/$group/d" temp &>/dev/null
ind=$(($ind+1))
if [ `wc -l temp|awk ' {print $1} '` -eq 0 ]; then
break
fi
9
done
cp $file temp
cat temp|sort|awk ' {print $0> "temp"} '
ind=1
while [ $ind -le $kolvo ]
do
group=`awk 'NR==1 {print $3}' temp`
I=` echo $group | sed ' s/^...//'`
awk ' BEGIN {indic=1} $3~"'$group'" {printf("%d %s %s %d%d
%d%d\n", indic, $1, $2, '"$I"', indic, '"$I"', indic)>$3; printf("%d %s %s %s %d%d
%d%d\n", indic, $1, $2, "'$group'", '"$I"', indic, '"$I"', indic)>>"temp2"; indic++} '
temp
sed -i "/$group/d" temp &>/dev/null
ind=$(($ind+1))
if [ `wc -l temp|awk ' {print $1} '` -eq 0 ]; then
break
fi
done
rm temp
ind=1
while [ $ind -le $kolvo ]
do
group=`awk 'NR==1 {print $4}' temp2`
user=`awk 'NR==1 {print $2}' temp2`
comment=`awk 'NR==1 {printf("%s %s %s",$2,$3,$4)}' temp2`
ident=`awk 'NR==1 {print $5}' temp2`
flag=` grep $user /etc/passwd|wc -l|awk ' {print $1}'`
if [ $flag -eq 0 ]; then
useradd -c "$comment" -g $group -p $ident -u $ident $user
echo Пользователь $user зарегистрирован
else
echo Пользователь $user уже зарегистрирован
fi
sed -i "1d" temp2 &>/dev/null
ind=$(($ind+1))
done
echo Регистрация выполнена
rm temp2;;
-2)
if [ $# -lt 2 ]; then
echo Нет аргументов
10
exit
fi
case $2 in
*[^a-zA-Z0-9-_.]*) echo Некорректное имя файла; exit;;
esac
if [ ! -f $2 ]; then
echo Нет файла
exit
fi
if [ ! -s $2 ]; then
echo Файл пуст
exit
fi
file=$2
echo Выберите пользователя клавишей Y/y
kolvo=`wc -l $file|awk ' {print $1} '`
ind=1
while [ $ind -le $kolvo ]
do
user=`awk 'NR=="'$ind'" {print $1}' $file`
echo $user
read fact
case $fact in
[Yy]) echo Введите дату отключения в формате ГГГГ-ММДД
read time
case $time in
*[^0-9-]*) echo Некорректная дата;;
????[^-]*) echo Некорректная дата;;
???????[^-]*) echo Некорректная дата;;
???????????*) echo Некорректная дата;;
*)time2=`echo ${#time} `
if [ $time2 -lt 10 ] || [ $time2 -gt 10 ]; then
echo Некорректная дата
else
yea=` echo $time | sed ' s/......$//'`
mon=` echo $time | sed ' s/...$//' | sed ' s/^.....//'`
den=` echo $time | sed ' s/^........//'`
yea2=` date +%Y `
mon2=` date +%m `
den2=` date +%d `
11
if [ $yea -lt $yea2 ]; then
echo Некорректная дата
else
if [ $yea -eq $yea2 ] && [ $mon -lt
$mon2 ]; then
echo Некорректная дата
else
if [ $yea -eq $yea2 ] && [ $mon eq $mon2 ] && [ $den -lt $den2 ]; then
echo Некорректная дата
else
usermod -e $time $user
fi
fi
fi
fi;;
esac
echo Введите максимальное количество суток между
изменениями пароля
read sut
case $sut in
*[^0-9]*) echo Некорректное значение;;
*) sut2=`echo ${#sut} `
if [ $sut -le 0 ]; then
echo Некорректное значение
else
passwd -x $sut $user
fi;;
esac
esac
ind=$(($ind+1))
done;;
*) echo Некоррректный ключ; exit;;
esac
12
Тестирование
№ теста Проверяемая функция
Исходные данные
Ожидаемый результат
1
Количество
аргументов
sh proced1
Нет аргументов
2
Корректность
аргументов
sh proced1 -3
Некорректный ключ
3
Количество
аргументов
sh proced1 -1
Нет аргументов
4
Корректность
аргументов
sh proced1 -1 f#ile
Некорректное имя
файла
5
Существование файла
sh proced1 file
Файла file не
существует
Нет файла
6
Пустота файла
sh proced1 file
file — пустой файл
Файл пуст
7
Регистрация
пользователей
sh proced1 -1 file
В файле все данные
корректные
Регистрация
пользователей,
создание для каждой
группы файлов и
запись в них
пользователей
8
Корректность данных
sh proced1 -1 file
В файле file есть
строка Pu#pkov A.A.
MK-201
Некорректные данные
9
Корректность данных
sh proced1 -1 file
В файле file есть
строка pupkov A.A.
MK-201
Некорректные данные
10
Корректность данных
sh proced1 -1 file
В файле file есть
строка Pupkov5 A.A.
MK-201
Некорректные данные
11
Корректность данных
sh proced1 -1 file
В файле file есть
строка
Некорректные данные
13
Pppppaaaaasssssddddd
ffffgggg A.A. MK-201
12
Корректность данных
sh proced1 -1 file
В файле file есть
строка Pupkov Я.A.
MK-201
Некорректные данные
13
Корректность данных
sh proced1 -1 file
В файле file есть
строка Pupkov a.A.
MK-201
Некорректные данные
14
Корректность данных
sh proced1 -1 file
Некорректные данные
В файле file есть
строка Pupkov A№A.
MK-201
12
Корректность данных
sh proced1 -1 file
В файле file есть
строка Pupkov A.A.a
MK-201
Некорректные данные
13
Корректность данных
sh proced1 -1 file
В файле file есть
строка Pupkov A.A.
M#K-201
Некорректные данные
14
Корректность данных
sh proced1 -1 file
В файле file есть
строка Pupkov A.A.
ЯK-201
Некорректные данные
15
Корректность данных
sh proced1 -1 file
В файле file есть
строка Pupkov A.A.
mK-201
Некорректные данные
16
Корректность данных
sh proced1 -1 file
В файле file есть
строка Pupkov A.A.
KK_201
Некорректные данные
17
Корректность данных
sh proced1 -1 file
В файле file есть
строка Pupkov A.A.
KK-20a1
Некорректные данные
14
18
Корректность данных
sh proced1 -1 file
В файле file есть
строка Pupkov A.A.
KK-201!
Некорректные данные
19
Регистрация групп
sh proced1 -1 file
В файле file есть
строка Pupkov A.A.
KK-201 и группа KK201 уже
зарегистрирована в
системе
Корректная работа
20
Регистрация
пользователей
sh proced1 -1 file
В файле file есть
строка Pupkov A.A.
KK-201 и
пользователь Pupkov
уже зарегистрирован
Корректная работа
21
Корректность
аргументов
sh proced -2
Нет файла
22
Корректность
аргументов
sh proced -2 fi^le
Некорректное имя
файла
23
Существование файла
sh proced1 -2 file
Файла file не
существует
Нет файла
24
Пустота файла
sh proced1 -2 file
file — пустой файл
Файл пуст
25
Изменение даты
отключения и
максимального
количества суток
sh proced1 -1 file
В файле все данные
корректные
Для выбранных
пользователей
изменяется дата
отключения и
максимальное
количество суток
26
Изменения даты
отключения
sh proced1 -2 file
Выбран пользователь
Pupkov и введена дата
отключения 210-1212
Некорректная дата
27
Изменения даты
sh proced1 -2 file
Некорректная дата
15
отключения
Выбран пользователь
Pupkov и введена дата
отключения 2$10-1212
28
Изменения даты
отключения
sh proced1 -2 file
Выбран пользователь
Pupkov и введена дата
отключения 2010_1212
Некорректная дата
29
Изменения даты
отключения
sh proced1 -2 file
Выбран пользователь
Pupkov и введена дата
отключения 2010-1212a
Некорректная дата
30
Изменения даты
отключения
sh proced1 -2 file
Выбран пользователь
Pupkov и вместо даты
отключения нажат
enter
Некорректная дата
31
Изменения даты
отключения
sh proced1 -2 file
Некорректное значение
Выбран пользователь
Pupkov и введено
число суток as
32
Изменение
максимального
количества суток
sh proced1 -2 file
Некорректное значение
Выбран пользователь
Pupkov и введено
число суток -15
33
Изменение
максимального
количества суток
sh proced1 -2 file
Некорректное значение
Выбран пользователь
Pupkov и введено
число суток 1#4
34
Изменение
максимального
количества суток
sh proced1 -2 file
Некорректное значение
Выбран пользователь
Pupkov и вместо
числа суток нажат
enter
35
Изменение
максимального
sh proced1 -2 file
Выбран пользователь
16
Корректная работа
36
количества суток
Pupkov и введено
число суток 14
Изменение
максимального
количества суток
sh proced1 -2 file
Не выбран ни один
пользователь
17
Завершение работы
Задание 2
Составить процедуру, которая:
1. Определяет наличие в системе программ, работающих более 2 минут.
2. Выводит сообщение, содержащее регистрационное имя пользователя,
название программы и/или идентификатор процесса.
3. Запрашивает у пользователя для каждой найденной программы вид
действий, которые следует выполнить: уменьшить приоритет, прекратить
выполнение процесса или не изменять порядок работы программы.
4. Выполняет выбранные действия и завершает работу.
Процесс состоит из адресного пространства, которое содержит программный
код, данные, стек и различную вспомогательную информацию, а также структур
данных ядра, которые обеспечивают управление процессом со стороны ядра.
Фактор nice (устанавливается с помощью команды nice). Чем выше значение
фактора nice, тем меньший приоритет имеет программа.
Фактор nice процесса можно установить во время его создания. Это делается с
помощью команды nice. Команда renice позволяет изменять значение фактора во
время выполнения процесса. Первая из этих команд принимает в качестве
аргумента командную строку, а вторая – идентификатор процесса либо имя
пользователя.
Сигналы – это запросы на прерывание на уровне процессов.
Для отправки сигналов процессам используется команда kill. Чаще всего она
применяется для прекращения выполнения процесса. Эта команда может
послать процессу любой сигнал, но по умолчанию это сигнал TERM
(программное завершение). Команду kill могут выполнять как обычные
пользователи (для своих собственных процессов), так и пользователь root (для
любого процесса).
Команда ps – основной инструмент, который используется для текущего
контроля процессов. С помощью команды ps можно получить информацию об
идентификаторах, приоритете, управляющем терминале того или иного
процесса, идентификаторы родительского процесса и группы. Она также
позволяет узнать о том, какой объем памяти использует процесс, сколько
времени центрального процессора он затребовал, каково его текущее
состояние (выполняется, остановлен, простаивает и т.д.).
Команда ps позволяет вывести данные о состоянии системы в некоторый
момент времени. Для отслеживания изменения состояния выполняющихся
процессов в течение длительных интервалов времени более удобно
использовать команду top. Команда top в режиме реального времени
обеспечивает текущий контроль над состоянием системы. Она может выводить
суммарную информацию, характеризующую систему, а также список текущих
18
задач, управляемых ядром. Состав демонстрируемой системной информации, а
также информации о выполняющихся процессах полностью конфигурируются
пользователем, и может быть изменен после перезапуска команды.
Формальная модель предметной области
Процесс состоит из адресного пространства, которое содержит программный
код, данные, стек и различную вспомогательную информацию, а также структур
данных ядра, которые обеспечивают управление процессом со стороны ядра. К
наиболее важным структурам ядра относятся:
1. идентификатор процесса;
2. таблица распределения памяти процесса;
3. текущее состояние процесса;
4. приоритет процесса;
5. информация об используемых ресурсах;
6. маска сигналов процесса;
7. идентификатор владельца процесса.
Фактор nice процесса можно установить во время его создания. Это делается с
помощью команды nice. Команда renice позволяет изменять значение фактора во
время выполнения процесса.
Для отправки сигналов процессам используется команда kill. Чаще всего она
применяется для прекращения выполнения процесса. Эта команда может
послать процессу любой сигнал, но по умолчанию это сигнал TERM
(программное завершение). Команду kill могут выполнять как обычные
пользователи (для своих собственных процессов), так и пользователь root (для
любого процесса). Она имеет следующий формат:
kill PID...
Послать сигнал SIGTERM всем перечисленным процессам.
kill -сигнал
Послать указанный сигнал всем перечисленным процессам.
PID...
kill -s сигнал PID
kill -l
Вывести имена всех сигналов.
kill -l сигнал
Преобразовать номер сигнала в его имя.
где сигнал – это номер или символическое имя посылаемого сигнала, а PID –
это номер процесса-адресата.
Команда ps – основной инструмент, который используется для текущего
контроля процессов. Формат команды:
ps [-a] [-d] [-e] [-u] [-f] [-l] [-j] [f] [T]
Опции позволяют регулировать состав и объем выводимой информации.
Для отслеживания изменения состояния выполняющихся процессов в течение
длительных интервалов времени более удобно использовать команду top,
19
которая имеет следующий формат:
top -bcisS -d задержка -n итерации -p PID [, PID ...]
Соглашение о требованиях
Процедура предназначена для определения наличие в системе программ,
работающих более 2 минут.
Процедура выводит сообщение, содержащее регистрационное имя
пользователя, название программы и/или идентификатор процесса.
Запрашивает у пользователя для каждой найденной программы вид действий,
которые следует выполнить: уменьшить приоритет, прекратить выполнение
процесса или не изменять порядок работы программы. Выполняет выбранные
действия и завершает работу.
Входные данные являются сообщениями, вводимыми на терминале. Приоритет
должен быть числом из интервала [-20;19] и быть больше старого приоритета.
Выходные данные являются сообщениями, подающимися на терминал.
Проект программы
Реализация
20
# Полижай В.А. МК-201
# Задание 2
time=` date | awk ' {print $4} ' `
hou=` echo $time|sed 's/......$//' `
min=` echo $time|sed 's/^...//'|sed 's/...$//' `
time=$hou$min
ps -efl > temp
kol=` wc -l temp|awk '{print $1}' `
flag=0
i=2
while [ $i -lt $kol ]
do
time2=`awk ' NR=="'$i'" {print $12}' temp`
hou2=` echo $time2|sed 's/...$//' `
min2=` echo $time2|sed 's/^...//'|sed 's/...$//' `
time2=$hou2$min2
time2=$(($time-$time2))
if [ $time2 -gt 2 ]; then
flag=$(($flag+1))
awk ' NR=="'$i'" {printf("User=%s Name=%s Pid=%d\n", $3, $15,
$4);} ' temp
pid=` awk ' NR=="'$i'" {print $4}' temp `
ni=` awk ' NR=="'$i'" {print $8}' temp `
echo Выберите действие для программы
echo 1 - Уменьшить приоритет
echo 2 - Прекратить выполнение процесса
echo Любая другая комбинация - не изменять порядок работы
read d
case $d in
1) echo Старый приоритет: $ni, Введите новый приоритет в
пределах [-20, 19]:; read prio;
case $prio in
-[^0-9]*|[^-]*[^0-9]*) echo Некорректный приоритет;;
*) if [ $prio -gt 19 ] || [ $prio -lt -20 ]; then
echo Вы вышли за пределы
else
if [ $prio -lt $ni ]; then
echo Этот приоритет выше
else
renice $prio $pid
21
fi
fi;;
esac;;
2) kill $pid;;
esac
fi
i=$(($i+1))
done
rm temp
if [ $flag -eq 0 ]; then
echo Нет таких программ
exit
fi
Тестирование
22
№ теста Проверяемая функция
Исходные данные
Ожидаемый результат
Нет таких программ
1
Количество программ
sh proced2
Нет программ,
работающих больше
2 минут
2
Количество программ
sh proced2
Выведены пользователь,
Есть программы,
имя и pid
работающие больше
2 минут
3
Выбор действия
sh proced2
Программа prog
работает больше 2
минут и выбрано
действие asd
Не изменение порядка
работы
Корректная работа
4
Выбор действия
sh proced2
Программа prog
работает больше 2
минут и выбрано
действие 35
Не изменение порядка
работы
Корректная работа
5
Выбор действия
sh proced2
Программа prog
работает больше 2
минут и выбрано
действие 1
Выведен старый
приоритет
Запрос нового
приоритета
6
Изменение
приоритета
sh proced2
Программа prog
работает больше 2
минут и выбран
новый приоритет
2^4
Выведен старый
приоритет
Некорректный
приоритет
7
Изменение
приоритета
8
Изменение
приоритета
sh proced2
Выведен старый
Программа prog
приоритет
работает больше 2 Вы вышли за пределы
минут и выбран
новый приоритет -30
sh proced2
Программа prog
23
Выведен старый
приоритет
работает больше 2
минут и выбран
новый приоритет 48
Вы вышли за пределы
9
Изменение
приоритета
sh proced2
Программа prog
работает больше 2
минут и выбран
новый приоритет 12,
который выше
старого
Выведен старый
приоритет
Корректная работа
10
Изменение
приоритета
sh proced2
Программа prog
работает больше 2
минут и выбран
новый приоритет 12,
который ниже
старого
Выведен старый
приоритет
Этот приоритет выше
11
Изменение
приоритета
sh proced2
Программа prog
работает больше 2
минут и выбран
новый приоритет 12,
который равен
старому
Выведен старый
приоритет
Корректная работа
12
Выбор действия
sh proced2
Программа prog
работает больше 2
минут и выбрано
действие 2
Прекращение
выполнения процесса
Задание 3
24
Составить процедуру, которая выполняет следующие действия:
1. Создает файловую систему ext2 на дискете c размером блока, количеством
байт на индекс и меткой тома, значения которых передаются в качестве
параметров процедуры.
2. В случае успешного создания файловая система проверяется на наличие
ошибок и дефектных блоков.
3. Созданная файловая система монтируется к точке монтирования, которая
задается значением параметра процедуры.
Каждый жесткий диск состоит из одной или нескольких логических частей
(групп цилиндров), называемых разделами. Расположение и размер раздела
определяется при форматировании диска. В ОС UNIX разделы выступают в
качестве независимых устройств, доступ к которым осуществляется как к
различным носителям данных. Обычно в разделе может располагаться только
одна физическая файловая система.
Для создания файловой системы в одном из разделов жесткого диска
используется команда mkfs, которая служит интерфейсной надстройкой к
программам, предназначенным для создания определенных файловых систем.
Проверка целостности файловой системы выполняется с помощью команды
fsck, которая ищет и исправляет противоречия в файловых системах. Если
файловая система находится в несогласованном состоянии, которое нельзя
однозначно исправить, у пользователя спрашивают подтверждения перед
попыткой выполнить каждое исправление. При использовании fsck файловая
система должна быть неактивной (размонтирована или смонтирована только
для чтения).
Физические файловые системы, кроме корневой, считаются съемными в том
смысле, что они могут быть как доступны для пользователей, так и недоступны.
Команда mount уведомляет систему, что блочное устройство или удаленный
ресурс доступны для пользователей в точке монтирования, которая уже должна
существовать. Точка монтирования становится именем корня вновь
смонтированного устройства или ресурса. Говорят, что эта команда монтирует
или подключает физическую файловую систему или ресурс к общей логической
файловой системе.
Обратная процедура по отношению к монтированию называется
демонтированием и выполняется командой umount.
Команда mount по умолчанию добавляет запись в таблицу смонтированных
файловых систем (файл /etc/mtab); umount удаляет запись из этой таблицы.
Формальная модель предметной области
25
Файловая система UNIX занимает раздел диска и состоит из таких основных
компонентов:
1. Суперблок. Содержит общую информацию о файловой системе.
2. Массив индексных дескрипторов. Индексный дескриптор содержит
информацию о статусе файла и указывает на расположение данных этого
файла. Ядро обращается к индексному дескриптору по индексу в массиве. Один
дескриптор является корневым для физической файловой системы, через него
обеспечивается доступ к структуре каталогов и файлов после монтирования
файловой системы. Размер массива индексных дескрипторов является
фиксированным и задается при создании физической файловой системы.
3. Блоки хранения данных. Данные обычных файлов и каталогов хранятся в
блоках. Обработка файла осуществляется через индексный дескриптор,
содержащий ссылки на блоки данных.
Суперблок содержит:
1. тип файловой системы;
2. размер файловой системы в логических блоках, включая сам суперблок,
массив
индексных дескрипторов и блоки данных;
3. размер массива индексных дескрипторов;
4. количество свободных блоков;
5. количество свободных индексных дескрипторов;
6. флаги;
7. размер логического блока файловой системы (512, 1024, 2048, 4096, 8192).
8. список номеров свободных индексных дескрипторов;
9. список адресов свободных блоков.
Индексный дескриптор содержит:
1. тип файла;
2. права доступа к файлу;
3. количество жестких ссылок на файл;
4. идентификаторы владельца и группы владельца;
5. размер файла в байтах;
6. время последнего доступа к файлу;
7. время последнего изменения файла;
8. время последнего изменения индексного дескриптора файла;
9. указатели на блоки данных файла;
10. указатели на косвенные блоки.
Для создания файловой системы в одном из разделов жесткого диска
используется команда mkfs, которая служит интерфейсной надстройкой к
программам, предназначенным для создания определенных файловых систем.
Команда имеет следующий формат:
26
mkfs [ -V ] [ -t fs_тип ] [ fs-опции ] файловая_система [ число блоков ]
Проверка целостности файловой системы выполняется с помощью команды
fsck, которая ищет и исправляет противоречия в файловых системах.
Команда fsck имеет следующий формат:
fsck [ -sACVRP ] [ -t fs_тип ] [файловая_система ... ] [--] [ fs_опции ]
Команда mount уведомляет систему, что блочное устройство или удаленный
ресурс доступны для пользователей в точке монтирования, которая уже должна
существовать. Команда имеет следующий формат:
mount [-rw] [-t vfs_тип] [-o опции] устройство каталог
Обратная процедура по отношению к монтированию называется
демонтированием и выполняется командой umount, которая имеет следующий
формат:
umount [-l] dir [...]
Команда mount по умолчанию добавляет запись в таблицу смонтированных
файловых систем (файл /etc/mtab); umount удаляет запись из этой таблицы.
Соглашение о требованиях
Процедура предназначена для создания файловой системы ext2 на флэш-карте.
Создается файловую систему ext2 на флэш-карте c размером блока,
количеством байт на индекс и меткой тома, значения которых передаются в
качестве параметров процедуры. В случае успешного создания файловая
система проверяется на наличие ошибок и дефектных блоков. Созданная
файловая система монтируется к точке монтирования, которая задается
значением параметра процедуры.
Входные данные являются параметрами, задающимися при запуске процедуры.
Размер блока должен быть 1024, 2048 или 4096. Количество байт должно быть
больше размера блока. Метка должна содержать только буквы латинского
алфавита и цифры. Адрес монтирования должен начинаться со / и
существовать. Адрес устройства должен быть в виде /dev/устройство и
устройство должно быть присоединено.
Выходные данные являются сообщениями, подающимися на терминал.
Проект программы
27
Реализация
28
# Полижай В.А. МК-201
# задание 3
if [ $# -lt 4 ]; then
echo Не все аргументы
exit
fi
case $1 in
*[^0-9]*) echo Некорректный размер блока; exit;;
*) if [ $1 -ne 1024 ] && [ $1 -ne 2048 ] && [ $1 -ne 4096 ]; then
echo Размер блока должен быть равен 1024, 2048 или 4096; exit;
fi;;
esac
case $2 in
*[^0-9]*) echo Некорректное количество байт; exit;;
*) if [ $2 -le $1 ]; then
echo Количество байт должно быть больше размера блока; exit;
fi;;
esac
case $3 in
*[^a-zA-Z0-9]*) echo Некорректная метка; exit;;
esac
case $4 in
[^/]*) echo Некорректный адрес монтирования; exit;;
?*[^/0-9a-zA-Z-]*) echo Некорректный адрес монтирования; exit;;
*) if [ ! -d $4 ]; then
echo Нет такой директории
exit
fi;;
esac
echo Введите адрес устройства в формате /dev/устройство
read adr
case $adr in
*[^/a-z0-9]*) echo Некорректный адрес; exit;;
[^/]*) echo Некорректный адрес; exit;;
esac
mkfs -t ext2 -b $1 -i $2 -L $3 $adr
if [ $? -eq 0 ]; then
fsck -t ext2
if [ $? -eq 0 ]; then
mount $adr $4
29
if [ $? -ne 0 ]; then
echo Не удалось смонтировать
else
echo Монтирование выполнено
fi
else
echo Не удалось выполнить проверку на ошибки
fi
else
echo Не удалось создать файловую систему
exit
fi
Тестирование
30
№ теста Проверяемая функция
Исходные данные
Ожидаемый результат
1
Количество
аргументов
sh proced3
Не все аргументы
2
Количество
аргументов
sh proced3 1024
Не все аргументы
3
Количество
аргументов
sh proced3 1024 2048
Не все аргументы
4
Количество
аргументов
sh proced3 1024 2048
ASD45
Не все аргументы
5
Создание файловой
системы
6
Корректность
аргументов
sh 1*24 2048 ASD45
/home/ichida/flash
Некорректный размер
блока
7
Корректность
аргументов
sh 1023 2048 ASD45
/home/ichida/flash
Некорректный размер
блока
8
Корректность
аргументов
sh 1023f 2048
ASD45
/home/ichida/flash
Некорректный размер
блока
9
Корректность
аргументов
sh 1024 2e048
ASD45
/home/ichida/flash
Некорректное
количество байт
10
Корректность
аргументов
sh 1024 2048)
ASD45
/home/ichida/flash
Некорректное
количество байт
11
Корректность
аргументов
sh 1024 1010 ASD45
/home/ichida/flash
Некорректное
количество байт
12
Корректность
аргументов
sh 1024 2048
A#SD45
/home/ichida/flash
Некорректная метка
13
Корректность
аргументов
sh 1024 2048 ASD45
/ho%me/ichida/flash
Некорректный адрес
монтирования
14
Корректность
аргументов
sh 1024 2048 ASD45
home/ichida/flash
Некорректный адрес
монтирования
sh 1024 2048 ASD45
Создание файловой
/home/ichida/flash и системы ext2 на флэшвведен адрес
карте
устройства /dev/sdb1
31
15
Корректность
аргументов
sh 1024 2048 ASD45
/home/ichida/flash
Директории
/home/ichida/flash
не существует
Нет такой директории
16
Корректность адреса sh 1024 2048 ASD45
устройства
/home/ichida/flash
Введен адрес
устройства dev/sdb1
Некорректный адрес
17
Корректность адреса sh 1024 2048 ASD45
устройства
/home/ichida/flash
Введен адрес
устройства
/dev/s;db1
Некорректный адрес
18
Создание файловой
системы
sh 1024 2048 ASD45
/home/ichida/flash
Введен адрес
устройства /dev/sdb1
Флэш-карта не
подсоединена
Задание 4
32
Не удалось создать
файловую систему
Составить процедуру, которая выполняет следующие действия:
1. Для пакета, указанного в качестве параметра процедуры, проверяется,
установлен ли он в системе.
2. Если пакет не установлен, то процедура запрашивает необходимость его
установки.
a. В случае положительного ответа запрашивается установка диска с
дистрибутивом, содержащим этот пакет.
i. Выполняется монтирование диска.
ii. Проверяется наличие пакета на диске.
iii. Выводится информация о назначении пакета.
iv. Проверяется возможность его установки.
1. Если установка возможна, то выполняется инсталляция пакета.
2. Выполняется верификация пакета.
v. Выполняется демонтирование диска.
b. В случае отрицательного ответа работа процедуры заканчивается.
3. Если пакет установлен, то:
a. Выполняется его верификация.
b. Выводится список файлов, входящих в пакет.
c. Выводится запрос на удаление пакета.
i. В случае положительного ответа пакет удаляется.
ii. В противном случае процедура заканчивает работу.
Для автоматизации установки и обновления программного обеспечения в UNIX
часто используется команда rpm . Для того чтобы с помощью команды rpm
можно было выполнить установку нового программного обеспечения,
соответствующий комплекс программ должен быть оформлен в виде rpmпакета, который представляет собой специальным образом подготовленный
архив, предназначенный для обработки программой rpm. При установке пакета
программа проверяет взаимозависимости пакетов и предлагает установить
недостающие компоненты. Каждый пакет содержит архив файлов и
метаданные, которые используются для установки и удаления файлов архива, и
включают название, версию и описание пакета.
Формальная модель предметной области
Для автоматизации установки и обновления программного обеспечения в UNIX
часто используется команда rpm . Имена файлов, содержащих rpm-пакеты,
оканчиваются на суффикс .rpm. Для установки в системе программного
обеспечения, подготовленного в виде rpm- пакета, необходимо использовать
33
команду rpm в следующем общем виде:
rpm {-i|--install} [опции установки и обновления] пакет ...,
а для обновления подается команда в следующем виде:
rpm {-U|--upgrade} [опции установки и обновления] пакет ...
Где параметр <пакет> задает полное имя файла, содержащего соответствующий
пакет.
Если перед установкой пакета требуется проверить его состояние или получить
дополнительную информацию относительно назначения соответствующего
программного обеспечения, то можно выполнить запрос с помощью команды
rpm. Общая форма запроса:
rpm {-q|--query} [опции выбора пакетов] [опции запроса] .
Для удаления пакета используется команда rpm в следующей общей форме:
rpm {-e|--erase} [опции удаления] пакет ...
Соглашение о требованиях
Процедура предназначенна для установки или удаления пакета.
Для пакета, указанного в качестве параметра процедуры, проверяется,
установлен ли он в системе. Если пакет не установлен, то процедура
запрашивает необходимость его установки. В случае положительного ответа
запрашивается установка диска с дистрибутивом, содержащим этот пакет.
Выполняется монтирование диска. Проверяется наличие пакета на диске.
Выводится информация о назначении пакета. Проверяется возможность его
установки. Если установка возможна, то выполняется инсталляция
пакета. Выполняется верификация пакета. Выполняется демонтирование диска.
В случае отрицательного ответа работа процедуры заканчивается. Если пакет
установлен, то выполняется его верификация. Выводится список файлов,
входящих в пакет. Выводится запрос на удаление пакета. В случае
положительного ответа пакет удаляется. В противном случае процедура
заканчивает работу.
Входные данные являются параметром, задающимися при запуске процедуры,
и сообщениями, вводимыми на терминале. Адрес устройства должен быть в
виде /dev/устройство и устройство должно быть присоединено.
Выходные данные являются сообщениями, подающимися на терминал.
Проект программы
34
Реализация
35
# Полижай В.А. МК-201
# Задание 4
if [ $# -lt 1 ]; then
echo Нет пакета
exit
fi
case $1 in
*[^0-9a-zA-Z.-]*) echo Некорректный пакет; exit;;
esac
package=$1
rpm -q $package
if [ $? -ne 0 ]; then
echo Установить пакет? [Д/н]
read point
case $point in
[д,Д]*)
echo Установить диск с дистрибутивом? [Д/н]
read point2
case $point2 in
[д,Д]*) echo Введите адрес устройства в формате
/dev/устройство
read adr
case $adr in
*[^/a-z0-9]*) echo Некорректный адрес; exit;;
[^/]*) echo Некорректный адрес; exit;;
esac
mount $adr /home/ichida/flash &>/dev/null
if [ $? -ne 0 ]; then
echo Невозможно смонтировать диск
else
find /home/ichida/flash -name $package.rpm
&>/dev/null
if [ $? -ne 0 ]; then
echo Нет такого пакета
else
rpm -qp --info
/home/ichida/flash/$package.rpm
rpm -i --test --nodeps
/home/ichida/flash/$package.rpm
if [ $? -ne 0 ]; then
echo Невозможно установить
36
пакет
else
rpm -i --nodeps
/home/ichida/flash/$package.rpm
rpm -V $package
echo Пакет установлен
umount $adr
fi
fi
fi
exit;;
[н,Н]*) exit;;
*) echo Некорректный ответ, выбран вариант н; exit;;
esac;;
[н,Н]*) exit;;
*) echo Некорректный ответ, выбран вариант н; exit;;
esac
else
rpm -V $package
rpm -q -l $package
echo Удалить пакет? [Д/н]
read point
case $point in
[д,Д]*) rpm -e $package; echo Пакет удален; exit;;
[н,Н]*) exit;;
*) echo Некорректный ответ, выбран вариант н; exit;;
esac
fi
Тестирование
37
№ теста Проверяемая функция
Исходные данные
Ожидаемый результат
1
Количество
аргументов
sh proced4
Нет пакета
2
Корректность
аргумента
sh proced4 m$c
Некорректный пакет
3
Установка пакета
sh proced4 mc
Пакет mc не
установлен
Запрос на установку
пакета
4
Установка пакета
sh proced4 mc
Пакет mc не
установлен и ответ на
установку н
Завершение
5
Установка пакета
sh proced4 mc
Пакет mc не
установлен и ответ на
установку ada
Некорректный ответ,
выбран вариант н
Завершение
6
Установка пакета
sh proced4 mc
Запрос на установку
Пакет mc не
диска с дистрибутивом
установлен и ответ на
установку д
7
Установка
дистрибутива
sh proced4 mc
Пакет mc не
установлен и ответ на
установку
дистрибутива н
Завершение
8
Установка
дистрибутива
sh proced4 mc
Пакет mc не
установлен и ответ на
установку
дистрибутива роы
Некорректный ответ,
выбран вариант н
Завершение
9
Корректность адреса
устройства
sh proced4 mc
Пакет mc не
установлен и адрес
устройства dev/sdb1
Некорректный адрес
10
Корректность адреса
устройства
sh proced4 mc
Пакет mc не
установлен и адрес
Некорректный адрес
38
устройства /dev/s!db1
11
Монтирование
устройства
sh proced4 mc
Пакет mc не
установлен и адрес
устройства /dev/sdb1
Не вставлена флэшкарта с пакетом
Невозможно
смонтировать диск
Завершение
12
Поиск пакета
sh proced4 mc
Пакет mc не
установлен
На флэш-карте нет
пакета
Нет такого пакета
13
Возможность
установки
sh proced4 mc
Пакет mc не
установлен и пакет
найден
Вывод информация о
назначении пакета
Проверяется
возможность установки
14
Возможность
установки
sh proced4 mc
Пакет mc не
установлен и его
нельзя установить
Невозможно
установить пакет
Завершение
15
Установка пакета
sh proced4 mc
Пакет mc не
установлен и его
можно установить
Установка пакета
Верификация пакета
Демонтирование диска
Завершение
16
Удаление пакета
sh proced4 mc
Пакет mc установлен
Верификация пакета
Выводится список
файлов, входящих в
пакет
Запрос на удаление
пакета
17
Удаление пакета
sh proced4 mc
Пакет mc установлен
и ответ на удаление н
Завершение
18
Удаление пакета
sh proced4 mc
Пакет mc установлен
и ответ на удаление
sddg
Некорректный ответ,
выбран вариант н
Завершение
39
19
Удаление пакета
sh proced4 mc
Пакет mc установлен
и ответ на удаление д
Приложения
Задание 1
40
Удаление пакета
Завершение
№ теста
Ожидаемый результат
Полученный результат
1
Нет аргументов
Совпал
2
Некорректный ключ
Совпал
3
Нет аргументов
Совпал
4
Некорректное имя файла
Совпал
5
Нет файла
Совпал
6
Файл пуст
Совпал
7
Регистрация пользователей,
создание для каждой группы
файлов и запись в них
пользователей
Совпал
8
Некорректные данные
Совпал
9
Некорректные данные
Корректная работа
10
Некорректные данные
Совпал
11
Некорректные данные
Совпал
12
Некорректные данные
Совпал
13
Некорректные данные
Корректная работа
14
Некорректные данные
Совпал
15
Некорректные данные
Корректная работа
16
Некорректные данные
Совпал
17
Некорректные данные
Совпал
18
Некорректные данные
Совпал
19
Некорректные данные
Совпал
20
Некорректные данные
Совпал
21
Некорректные данные
Совпал
22
Корректная работа
Совпал
23
Корректная работа
Совпал
24
Нет файла
Совпал
25
Некорректное имя файла
Совпал
26
Нет файла
Совпал
27
Файл пуст
Совпал
41
28
Для выбранных
пользователей изменяется
дата отключения и
максимальное количество
суток
Совпал
29
Некорректная дата
Совпал
30
Некорректная дата
Совпал
31
Некорректная дата
Совпал
32
Некорректная дата
Совпал
33
Некорректная дата
Совпал
34
Некорректное значение
Совпал
35
Некорректное значение
Совпал
36
Некорректное значение
Совпал
37
Некорректное значение
Совпал
38
Корректная работа
Совпал
39
Завершение работы
Совпал
№ теста
Ожидаемый результат
Полученный результат
1
Нет таких программ
Совпал
2
Выведены пользователь, имя
и pid
Совпал
3
Не изменение порядка
работы
Корректная работа
Совпал
4
Не изменение порядка
работы
Корректная работа
Совпал
5
Выведен старый приоритет
Запрос нового приоритета
Совпал
6
Выведен старый приоритет
Некорректный приоритет
Совпал
Задание 2
42
7
Выведен старый приоритет
Вы вышли за пределы
Совпал
8
Выведен старый приоритет
Вы вышли за пределы
Совпал
9
Выведен старый приоритет
Корректная работа
Совпал
10
Выведен старый приоритет
Этот приоритет выше
Совпал
11
Выведен старый приоритет
Корректная работа
Совпал
12
Прекращение выполнения
процесса
Совпал
№ теста
Ожидаемый результат
Полученный результат
1
Не все аргументы
Совпал
2
Не все аргументы
Совпал
3
Не все аргументы
Совпал
4
Не все аргументы
Совпал
5
Создание файловой
системы ext2 на флэшкарте
Совпал
6
Некорректный размер
блока
Совпал
7
Некорректный размер
блока
Совпал
8
Некорректный размер
блока
Совпал
9
Некорректное количество
байт
Совпал
10
Некорректное количество
байт
Совпал
11
Некорректное количество
Совпал
Задание 3
43
байт
12
Некорректная метка
Совпал
13
Некорректный адрес
монтирования
Совпал
14
Некорректный адрес
монтирования
Совпал
15
Нет такой директории
Совпал
16
Некорректный адрес
Совпал
17
Некорректный адрес
Совпал
18
Не удалось создать
файловую систему
Совпал
№ теста
Ожидаемый результат
Полученный результат
1
Нет пакета
Совпал
2
Некорректный пакет
Совпал
3
Запрос на установку пакета
Совпал
4
Завершение
Совпал
5
Некорректный ответ, выбран
вариант н
Завершение
Совпал
6
Запрос на установку диска с
дистрибутивом
Совпал
7
Завершение
Совпал
8
Некорректный ответ, выбран
вариант н
Завершение
Совпал
9
Некорректный адрес
Совпал
10
Некорректный адрес
Совпал
11
Невозможно смонтировать
диск
Завершение
Совпал
Задание 4
44
12
Нет такого пакета
Совпал
13
Вывод информация о
назначении пакета
Проверяется возможность
установки
Совпал
14
Невозможно установить
пакет
Завершение
Совпал
15
Установка пакета
Верификация пакета
Демонтирование диска
Завершение
Совпал
16
Верификация пакета
Выводится список файлов,
входящих в пакет
Запрос на удаление пакета
Совпал
17
Завершение
Совпал
18
Некорректный ответ, выбран
вариант н
Завершение
Совпал
19
Удаление пакета
Завершение
Совпал
45
Документ
Категория
Компьютеры, Программирование
Просмотров
42
Размер файла
574 Кб
Теги
otchet
1/--страниц
Пожаловаться на содержимое документа