usr bin env python coding utf-8 Скрипт для работы со срезом репозитори

  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
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#! /usr/bin/env python
# coding=utf-8
""" Скрипт для работы со срезом репозитория gentoo.
Автор: ZeVoluciON
Дата: [14.09.2008 - 01:00] """
import os
import sys
import subprocess
import re
MOUNT_CMD = "eject -t && mount /mnt/cdrom"
UMOUNT_CMD = "umount /mnt/cdrom && eject"
DISTFILES_CD = "/mnt/cdrom/distfiles"
DISTFILES = "/usr/portage/distfiles/"
DB_DIR = "db/"
#-------------------------------------------------------------------------------
""" Эта функция получает список файлов в директории DISTFILES_CD и сохраняет его
в файле для последующей оперативной работы с ним. """
def add_disk():
# Пока нет доступа к файлам на диске
while not os.access(DISTFILES_CD, os.F_OK):
raw_input("Insert disk and press any key ")
# Монтируем cdrom
if os.system(MOUNT_CMD):
print "Failed mount cdrom"
return 1
# Если даже после успешного монтирования нужные файлы недоступны
elif not os.access(DISTFILES_CD, os.F_OK):
# предлагаем выйти или повторить попытку с другим диском
if raw_input("Your disk incorrect, exit? [y/n]: ") != "n":
return 1
# Отмонтируем cdrom
os.system(UMOUNT_CMD)
# Проверяем, есть ли директория в текущем каталоге с файлами, содержащими
# списки файлов с дисков
if not os.access(DB_DIR, os.F_OK):
# создаём её, если нет
os.mkdir(DB_DIR)
# Спрашиваем название диска и сохраняем в переменную
name_disk = DB_DIR + raw_input("Cdrom ready. Insert the disk name: ")
# Получаем список файлов в директории distfiles на диске
list_files = os.listdir(DISTFILES_CD)
# Если файл в директории DB_DIR с выбранным именем name_disk уже существует
if (os.access(name_disk,os.F_OK)):
# Переменная для контроля корректности ответа
bool_choice = False
# Пока ответ содержит отличные от 'y' или 'n' знаки
while not bool_choice:
# получаем ответ
choice = raw_input("File exists, continue? [y/n]: ")
# если ответ утвердительный, продолжаем
if choice == "y":
bool_choice = True
# иначе выходим с кодом возврата 1
elif choice == "n":
return 1
# в остальных случаях цикл повторяется
else:
print "Invalid choice."
# начало обработки исключения ошибки ввода/вывода
try:
# открываем файл для записи списка файлов
dfile = open(name_disk, "w")
# реагируем на исключение сообщением и выходим
except IOError:
print "Failed open %s for write" % name_disk
return 1
# В цикле по списку файлов записываем построчно их названия
for pkg in (list_files):
dfile.write(pkg + "\n")
# Закрываем файл и отмонтируем cdrom
dfile.close()
os.system(UMOUNT_CMD)
# Предлагаем добавить данные с еще одного диска, если есть, и выполняем
# рекурсивный вызов текущей функции
if raw_input("Add next cdrom? [y]: ") == "y":
add_disk()
return 0
#-------------------------------------------------------------------------------
""" Функция для копирования пакетов с диска в папку distfiles """
def get_pckg_from_disk(pckg_el):
index_pckg_el = 0
pathToFile = DISTFILES_CD + "/" + pckg_el[index_pckg_el]
while not os.access(pathToFile, os.F_OK):
if not os.access(DISTFILES_CD, os.F_OK):
if not os.system(MOUNT_CMD):
if not os.access(DISTFILES_CD, os.F_OK):
os.system(UMOUNT_CMD)
raw_input("Insert other disk and press [Enter]: ")
else:
print "Failed mount cdrom"
return 1
elif not os.access(pathToFile, os.F_OK):
if raw_input("Not found " + pathToFile + ", exit? [y/n]: ") == "n":
if raw_input("Continue with this cd? [y/n]: ") != "n":
index_pckg_el += 1
if index_pckg_el < len(pckg_el):
pathToFile = DISTFILES_CD + "/" + pckg_el[index_pckg_el]
else:
os.system(UMOUNT_CMD)
return 0
else:
os.system(UMOUNT_CMD)
return 1
for namePckg in pckg_el:
pathToFile = DISTFILES_CD + "/" + namePckg
CP_CMD = "cp " + pathToFile + " " + DISTFILES + namePckg
if not os.system(CP_CMD):
print "File %s copy successful" % namePckg
else:
print "Copy file %s failed." % namePckg
if raw_input("Continue? [y/n]: ") != "y":
os.system(UMOUNT_CMD)
return 1
os.system(UMOUNT_CMD)
return 0
#-------------------------------------------------------------------------------
""" Функция для получения и обработки вывода emerge с последующим
запросом вставки диска с необходимыми пакетами """
def emerge(pckg):
pckg_str = ""
for pckg_atom in pckg:
pckg_str += pckg_atom + " "
cmd_femerge = "emerge --nospinner -pf --color n " + pckg_str
x = subprocess.Popen(cmd_femerge,shell=True,\
stdout=subprocess.PIPE).stdout.read()
namePckgFileList = []
for string in x.splitlines():
if string.find("://") >= 0:
fetchlist = re.split('/',string)
namePckgFileList.append(fetchlist[-1].strip())
# массив списков для хранения данных о дисках, с которых можно получить
# необходимые пакеты, первый элемент каждого списка - название диска,
# остальные - названия пакетов для копирования
listGetPckg = []
indexListGetPckg = 0
for db_file in os.listdir(DB_DIR):
content_file = []
listGetPckg.append([])
cur_db_file = open(DB_DIR + db_file, "r")
try:
for line in cur_db_file:
content_file.append(line.strip())
finally:
cur_db_file.close()
for pckg_el in namePckgFileList:
if not os.access(DISTFILES + pckg_el, os.F_OK):
if pckg_el in content_file:
if listGetPckg[indexListGetPckg].__len__() == 0:
listGetPckg[indexListGetPckg].append(db_file)
listGetPckg[indexListGetPckg].append(pckg_el)
if listGetPckg[indexListGetPckg].__len__() > 1:
indexListGetPckg = indexListGetPckg + 1
if indexListGetPckg >= 1:
for x in range(indexListGetPckg):
diskName = listGetPckg[x][0]
pckgList = listGetPckg[x][1:]
raw_input("Please insert disk with name " + diskName +
" and press [Enter]: ")
if get_pckg_from_disk(pckgList):
return 1
else:
print "Failed\n" + pckg_str + " not found in this db_file. Exit."
return 1
return 0
#-------------------------------------------------------------------------------
""" Инициализирующая процедура """
def main():
command = sys.argv[1:]
scriptName = sys.argv[0]
if command == []:
print "Your command not valid. Use:"
print "%s add_disk" % scriptName
print "%s emerge <name>" % scriptName
if command[0] == "add_disk":
add_disk()
elif command[0] == "emerge":
pckg = command[1:]
if pckg != "":
emerge(pckg)
else:
print "Not correct command"
#-------------------------------------------------------------------------------
if __name__ == "__main__":
main()
#-------------------------------------------------------------------------------