Исправлена ошибка утилит при отсутсвия профиля системы

mhiretskiy
Mike khiretskiy 10 years ago
parent 0b0d13130a
commit ca0034f2ca

@ -3,6 +3,7 @@ AUX calculate-core-3.2.0_alpha4-r1.patch 16117 SHA256 cf06430288a9074388dfb92dcf
AUX calculate-core-3.2.0_alpha4-r2.patch 16188 SHA256 cd2ea5c818f9fa80db9e2164c35f563bc5a53710c8773e8699872bc133637b98 SHA512 441f08285dbd2ef813645df5c71ff1bf9442aeff39b965436c63ac596e3ba551cb5e9dee6e040655b440a171a893716dc8689891d3a25757fd2cc34b7142a907 WHIRLPOOL bd3006df43f4505006bb3e7f2b5520fda45e18a1e0a580ca48a6b5296b09e02cb78557ce614ad826945dabe085195d84522a054a301c8d3220beede84474fd94
AUX calculate-core-3.2.0_alpha4-r3.patch 16585 SHA256 f51cecc73fd1085e65922a6c17168baf667833a8edcb5d89fbe82dcc88d87716 SHA512 768a3d8a14248755157cdf015e058efee9ae1ab3d018b4a94a081ae154ce15509ebc952cda01ca753a4d31695d2e2d114d118d74a16dc3c0e7ecb9d2dfd03742 WHIRLPOOL 0b9091130641b14c2f06ca4afe61aefc4557126289db59f5e550b2fda1a5298dff3823bdff88d8b5eacad76b0b1bf09f5eba7a6ddb71a2f01a2041ab75530a46
AUX calculate-core-3.2.0_alpha4-r4.patch 18361 SHA256 75de26bd326759971c8f380f04ec69071811eef6232a6b8c46b842734ab7e36f SHA512 52516c14935340d38a3b03ed980b8aa5d58129300f384b63081041634fecdb46ada91ab43d555b437c12a448d8352854a7d26241dc8d8f562157064f2ff46628 WHIRLPOOL 0978882b8fb860d54a922e193aa5dba71b5834a30ac35452f6493a816139b38749107b6b4a1d0a3ec3dc50dd0a6448e784db4a14f84381c5445ab57a7915fc8a
AUX calculate-core-3.2.0_alpha4-r5.patch 19063 SHA256 8a04d46c14515b93d44f33cb86f61adc0c97d840250ec9b800d9ce753fea571a SHA512 b6b742012f251e018f399e52bb2dfef7cc1c2f570bc02bef1d57a6d20c840e6f3325ce79cc110f60a7adb7d6e3e8f55d96fb44fd18fd49422db6c0c3b2dca816 WHIRLPOOL af6163d19f5e7c6af050aaf65bfd671c250993212f470a87731a6e6accf512c79b9fce49ff8bd12fbdf2dfb89d4360045690821f6e5aa7e3ba36bbc14278561d
DIST calculate-core-3.2.0_alpha1.tar.bz2 83658 SHA256 780a4107fcf2d6ee84be721e571f595ae8eb6cebf313cf6feef9c1d64d3a6575 SHA512 906a653de9286cd4d1d922937aa6afafef9a854ebf49f0636a4ad7e5e7ae136d353fe4b8c196c037688f8df7fd3df213800d184734193058df0ebb42090866d0 WHIRLPOOL ca8fe5f238111d78a65f2d42e8f3c169b7074cd5ebd7b8a653824b23d59cdcbfbfc7146ab7d96cc34300a7d418a036729a8c7931fd020c993e97103440e90c4c
DIST calculate-core-3.2.0_alpha2.tar.bz2 84591 SHA256 bed467810d02c14ac9e501a0057b652b8e610960193cf3d64c6a78acc5eb5140 SHA512 e77bf6f102c02006d559b96ca51cdb84d25ba9a4b1170c61fbe5158f2539e91acab2ae857a940b030d5b37d430822aa5e2cfe1fbe903436e284d43a3eeec3e09 WHIRLPOOL b299b1a43dbd70fb68efb6ea21b8d8beeef63985b5e0a5deb66668a76e46b7c621af19bf442bbc6cbb289a05beb59e69e3e3464fa392d4c2da56307daa960c20
DIST calculate-core-3.2.0_alpha3.tar.bz2 84808 SHA256 271d4d5752e26f0e4d435b2cad825fbeedeb146418f42f387fcdfc4ead683a0d SHA512 7dbd5a693eebd5d931f3ec8a377c613a6fbaa757bb48cfa90921fd608ce311deac32dee48d619a05f8b24781551142ca1af4d5fc437bedea4d259eaafb0aa52f WHIRLPOOL 5a2ec89684cfcbdb9afdb860b97e331d39ec4bdae5234bdafe856e2d69aa9e1367a184cce8e98a5b68ee5c108d84f6eadaeb94dfb6bde793af0cbc9be5302139
@ -15,5 +16,6 @@ EBUILD calculate-core-3.2.0_alpha4-r1.ebuild 1271 SHA256 f8a79b4bec6d2549705ecdd
EBUILD calculate-core-3.2.0_alpha4-r2.ebuild 1271 SHA256 527901c373e6bc466bb2651f42fe339871037046f4e1c9b91eddddfd17b97a2b SHA512 74d0638e7072cdf64f646696c313e563404fc1096cf24b71bf42d0d288c4da106b27c8ea4b0f84e6a1c0a97fd3fd9dae4ce69868608e894216f944bb1296b17c WHIRLPOOL 42f765c5f85388eb05ffa83d6f67c584e99ac6ab4426f53e50544f9560bdcbdd81bb1036df382ad29dda69240aed85a9bc83b328a95e34c0dd662e0f9c3b35a8
EBUILD calculate-core-3.2.0_alpha4-r3.ebuild 1271 SHA256 0ce1729ff0a879ed40c4254d380f75239dbad7c5de4be59a4658cc7c58d2846e SHA512 d19f6f95c97604d46d69175ea0f0589270cde657b5f024bb80ed18f21e7ea271a8dd09566b7520a75345b125419f6efa2ca46f7ac3987cdb25d4f89a864e3a07 WHIRLPOOL 9398a93b877c21ed99ee94a5bf206d198a2720f28cfa6183a68b1cad4e60edf3cac4cd77fdf2456657be46699f76f03aba10ecc62fc4c848e6385cf9e1ed3d72
EBUILD calculate-core-3.2.0_alpha4-r4.ebuild 1271 SHA256 951eca9ef8a4e21138f1fe91ba44d71b3d3390550fe36e5624d5b91d8ed8873b SHA512 b6d4d4678f3292516da6d99afea353e1437a5502391746f2ff334af7f259567a8ed3b1ad092a7dc3d50b05bd014576bcdff064283e284a06427ac3afed9eb408 WHIRLPOOL bb2fd032dc4e66bb2c571a6d914c12f38867d0d64236eca212ca6387fdb9a375493393b654079cabce4f04c3339983df0bae5593233b7a4a02a49b457307e843
EBUILD calculate-core-3.2.0_alpha4-r5.ebuild 1271 SHA256 d00f9690196482e10cf788de17c51aaa6581d0040061a22862bd2227f19a0e59 SHA512 6cdc70d1a8aff46dbc2305c377f77fee09adde6612bf2ba01d8ca07a000487958610b7c4fd9e97426df0b81bf1f0eefb7a9277e32e4e6ca2a0eaaa044ed057b3 WHIRLPOOL de0d39e16202a6694c3b62d05ab00a56c3469dd44ce4866ee81dda13255107f0c1a59ac379d4cbcbc756ff601f3a29764ab75752b80ae32f7629d317004384a7
EBUILD calculate-core-3.2.0_alpha4.ebuild 1129 SHA256 5265cd458eaf572bcdc443d19fceaef043ed57855890f0a017810bbbc835523e SHA512 6265973cb9b86ad68d0c2fc6cffceb14e0713fe2b6140c4daff5d18b71286572996332bd6e6b3679238e6e12cedd76f2d0e0b65fd7e0394426bc39ae65bb8d07 WHIRLPOOL d3f62367e9277aae8123efc10a91f4d614568e365ebeceabc22a3782dbbb3711ea3e8686ec8864c2f2f2856a945c66e5125fbb20d1fd07c169d1925e49e7f99d
EBUILD calculate-core-3.2.9999.ebuild 656 SHA256 39383ebc527d7155b147355108ec0b069f7cad95d5fcabc33520f0fe1ee0b971 SHA512 e20a8dea6e20615baeb56069331cdc35a7c37a05afa125c7174c5082852242da446830940c962fd890bb6627d9f5cacf0848834b75bfb1a184a6acfef17f95f8 WHIRLPOOL 3e9f06bf7e2f99a46e3c681fa6f381b7b1883bb15e05c535a7acde55f9092418d0b71d95ce4b2906e8505ea73c4157620303e4e4e4e4de430f11bfd6214b4a88

@ -0,0 +1,51 @@
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $
EAPI="3"
SUPPORT_PYTHON_ABIS="1"
PYTHON_DEPEND="2:2.7"
RESTRICT_PYTHON_ABIS="2.4 2.5 2.6 3.*"
inherit distutils eutils
SRC_URI="ftp://ftp.calculate.ru/pub/calculate/calculate3/${PN}/${P}.tar.bz2"
DESCRIPTION="The WSDL core for Calculate 3"
HOMEPAGE="http://www.calculate-linux.org/main/en/calculate2"
LICENSE="Apache-2.0"
SLOT="3"
KEYWORDS="amd64 x86"
IUSE="minimal"
DEPEND="~sys-apps/calculate-lib-3.2.0_alpha4
>=dev-python/soaplib-1.0
!minimal? ( dev-python/sudsds
net-libs/dslib
dev-python/pyopenssl
dev-libs/openssl
dev-python/m2crypto
dev-python/cherrypy )"
RDEPEND="${DEPEND}"
pkg_preinst() {
dosym /usr/sbin/cl-core /usr/sbin/cl-core-setup
dosym /usr/sbin/cl-core /usr/sbin/cl-core-patch
}
pkg_postinst() {
einfo "For autoconfigure calculate-core for adminuser perform:"
einfo " cl-core --bootstrap <username>"
einfo "For run calculate-core perform:"
einfo " /etc/init.d/calculate-core start"
einfo "Add calcualte core to autorun:"
einfo " rc-update add calculate-core boot"
}
src_unpack() {
unpack "${A}"
cd "${S}"
# apply revision changes
epatch "${FILESDIR}/calculate-core-3.2.0_alpha4-r5.patch"
}

@ -0,0 +1,522 @@
diff --git core/server/api_types.py core/server/api_types.py
index 3863d53..eb205c1 100644
--- core/server/api_types.py
+++ core/server/api_types.py
@@ -164,6 +164,97 @@ class Table(DataVarsSerializer):
self.onClick = onClick
self.addAction = addAction
+class ChoiceValueAdapter(object):
+ def __init__(self, choicevalue):
+ self.choicevalue = choicevalue
+
+ @property
+ def values(self):
+ return self.choicevalue.values.string
+
+ @property
+ def comments(self):
+ return self.choicevalue.comments.string
+
+ @property
+ def onChanged(self):
+ return self.choicevalue.onChanged.string
+
+ def __getattr__(self, item):
+ return getattr(self.choicevalue, item)
+
+ @classmethod
+ def from_detect(cls, choicevalue):
+ if isinstance(choicevalue, ChoiceValue):
+ return choicevalue
+ else:
+ return cls(choicevalue)
+
+class TableAdapter(object):
+ def __init__(self, table):
+ self.table = table
+
+ @property
+ def fields(self):
+ return self.table.fields.string
+
+ @property
+ def head(self):
+ return self.table.head.string
+
+ @property
+ def body(self):
+ if hasattr(self.table.body,'stringArray'):
+ return [row.string
+ for row in self.table.body.stringArray
+ if hasattr(row, "string")]
+ return []
+
+ @property
+ def values(self):
+ return [ChoiceValueAdapter(x) for x in self.table.values.ChoiceValue]
+
+ def __getattr__(self, item):
+ return getattr(self.table, item)
+
+ @classmethod
+ def from_detect(cls, table):
+ if isinstance(table, Table):
+ return table
+ else:
+ return cls(table)
+
+class FieldAdapter(object):
+ def __init__(self, field):
+ self.field = field
+
+ @property
+ def choice(self):
+ return self.field.choice.string
+
+ @property
+ def listvalue(self):
+ return self.field.listvalue.string
+
+ @property
+ def comments(self):
+ return self.field.comments.string
+
+ @property
+ def tablevalue(self):
+ return TableAdapter(self.field.tablevalue)
+
+ def __getattr__(self, item):
+ return getattr(self.field, item)
+
+ @classmethod
+ def from_detect(cls, field):
+ if isinstance(field, Field):
+ return field
+ else:
+ return cls(field)
+
+
class Option(DataVarsSerializer):
shortopt = String
longopt = String
diff --git core/server/replace_class.py core/server/replace_class.py
index 23c5282..6901ef6 100644
--- core/server/replace_class.py
+++ core/server/replace_class.py
@@ -34,6 +34,7 @@ from calculate.lib.utils.colortext.output import BaseOutput
from calculate.lib.cl_print import color_print
from calculate.lib.datavars import VariableError
from calculate.lib.cl_lang import setLocalTranslate
+from calculate.core.server.api_types import FieldAdapter
from methods_func import get_method_argparser, collect_object, \
check_result_msg, get_param_pwd, _print
@@ -44,7 +45,7 @@ from func import shortTraceback, CommonMethods
setLocalTranslate('cl_core3', sys.modules[__name__])
-from itertools import cycle
+from itertools import cycle, izip, ifilter
import time
@@ -411,9 +412,9 @@ class replaceClass():
yes_color, no_color = Colors.GREEN, Colors.LIGHT_RED
else:
yes_color, no_color = Colors.LIGHT_RED, Colors.GREEN
- yes = _print.foreground(yes_color).bold("Yes")
- no = _print.foreground(no_color).bold("No")
- white_message = _print.foreground(Colors.WHITE).bold(
+ yes = _print.foreground(yes_color)("Yes")
+ no = _print.foreground(no_color)("No")
+ white_message = _print.foreground(Colors.WHITE)(
message)
ask = raw_input(white_message + ' (%s/%s): ' % (yes, no))
except KeyboardInterrupt:
@@ -445,7 +446,7 @@ class replaceClass():
useGetChar = False
else:
useGetChar = True
- message = _print.foreground(Colors.WHITE).bold(message)
+ message = _print.foreground(Colors.WHITE)(message)
while True:
outMessage = message + ' (%s): ' % \
@@ -531,7 +532,7 @@ class replaceClass():
def startGroup(self, message):
_print = get_terminal_print()
self.printDefault(
- _print.foreground(TextState.Colors.WHITE).bold(message))
+ _print.foreground(TextState.Colors.WHITE)(message))
#self.addMessage(type='startGroup', message=message)
def endGroup(self):
@@ -766,159 +767,179 @@ def print_brief(view, brief_label):
print_brief_group(Group.fields, Group.name)
-def print_brief_group(Fields, group_name):
- print_group_flag = False
- # if group_name:
- # _print ('\b'+group_name)
- uncompatible_count = 0
- colorPrint = color_print()
- _colorprint = get_terminal_print(_print)
- for field in Fields:
- if field.uncompatible:
- uncompatible_count += 1
- continue
- if field.element in ['input', 'openfile']:
- value = field.value if field.value else ''
- if not print_group_flag:
- if group_name:
- print_group_flag = True
- _colorprint.bold.foreground(
- TextState.Colors.WHITE)(group_name)
- colorPrint.printSUCCESS('%s: %s' % (field.label, value))
-
- elif field.element in ['combo', 'comboEdit', 'radio', 'file']:
- if field.choice:
- if not field.choice[0]:
- field.choice.pop(0)
- if field.comments:
- if not field.comments[0]:
- field.comments.pop(0)
- if field.comments and field.choice:
- if not field.value in field.choice:
- field.choice.append(field.value)
- value = map(lambda x: field.comments[x] \
- if len(field.comments) > x else field.choice[x],
- map(lambda x: field.choice.index(x),
- filter(lambda x: x in field.choice,
- [field.value])))
- value = ', '.join(value)
- else:
- value = field.value if field.value else ''
- if not print_group_flag:
- if group_name:
- print_group_flag = True
- #_print('\b' + group_name)
- _colorprint.bold.foreground(
- TextState.Colors.WHITE)(group_name)
- colorPrint.printSUCCESS('%s: %s' % (field.label, value))
-
- elif field.element in ['multichoice', 'multichoice_add', \
- 'selecttable', 'selecttable_add']:
- if field.choice:
- if not field.choice[0]:
- field.choice.pop(0)
- if field.comments:
- if not field.comments[0]:
- field.comments.pop(0)
- if field.listvalue:
- if not field.listvalue[0]:
- field.listvalue.pop(0)
- if field.choice:
- value = map(lambda x: field.comments[x] \
- if len(field.comments) > x \
- else field.choice[x],
- map(lambda x: field.choice.index(x), \
- field.listvalue))
+class Display(object):
+ def __init__(self):
+ self._print = get_terminal_print(color_print().defaultPrint)
+
+ def print_info(self, label, value):
+ GREEN = TextState.Colors.GREEN
+ self.display_asterisk(GREEN)
+ self._print("%s: " % label)
+ WHITE = TextState.Colors.WHITE
+ self._print.foreground(WHITE)(value)
+ self._print("\n")
+
+ def print_label(self, label):
+ GREEN = TextState.Colors.GREEN
+ self.display_asterisk(GREEN)
+ self._print("%s: " % label)
+ self._print("\n")
+
+ def display_asterisk(self, color):
+ self._print(" ")
+ self._print.foreground(color).bold("*")
+ self._print(" ")
+
+ def print_error(self, message):
+ RED = TextState.Colors.RED
+ self.display_asterisk(RED)
+ self._print(message)
+ self._print("\n")
+
+ def print_table(self, data, head):
+
+ sys.stdout.write('%s\n' % printTable(data, head))
+
+ def print_group(self, label):
+ #WHITE = TextState.Colors.WHITE
+ #self._print.foreground(WHITE).bold(label)
+ #self._print.underline(label)
+ self._print(label)
+ self._print("\n")
+
+
+class InformationElement(object):
+ def __init__(self, field, display):
+ self.value = ""
+ self.label = ""
+ self.display = display
+
+ @classmethod
+ def from_field(cls, field, display):
+ if field.type == 'steps':
+ return None
+ map_elements = {'input': ValueInfo,
+ 'openfile': ValueInfo,
+ 'combo': ChoiceInfo,
+ 'comboEdit': ChoiceInfo,
+ 'radio': ChoiceInfo,
+ 'file': ChoiceInfo,
+ 'multichoice': MultiChoiceInfo,
+ 'multichoice_add': MultiChoiceInfo,
+ 'selecttable': MultiChoiceInfo,
+ 'selecttable_add': MultiChoiceInfo,
+ 'error': ErrorInfo,
+ 'check': CheckInfo,
+ 'check_tristate': CheckInfo,
+ 'table': TableInfo
+ }
+ if field.element in map_elements:
+ return map_elements[field.element](field, display)
+ return None
+
+ def show(self):
+ self.display.print_info(self.label, self.value)
+
+
+class ValueInfo(InformationElement):
+ def __init__(self, field, display):
+ super(ValueInfo, self).__init__(field, display)
+ self.value = field.value or ''
+ self.label = field.label
+
+class CheckInfo(InformationElement):
+ def __init__(self, field, display):
+ super(CheckInfo, self).__init__(field, display)
+ self.label = field.label
+ map_answer = {'on':_('yes'), 'off': _("no"), 'auto': _('auto')}
+ self.value = map_answer.get(field.value, field.value)
+
+class ChoiceInfo(InformationElement):
+ def __init__(self, field, display):
+ super(ChoiceInfo, self).__init__(field, display)
+ self.label = field.label or ''
+ if field.choice and field.comments:
+ map_comment = dict(zip(field.choice, field.comments))
+ self.value = map_comment.get(field.value, field.value) or ''
+ else:
+ self.value = field.value if field.value else ''
+
+
+class MultiChoiceInfo(InformationElement):
+ def __init__(self, field, display):
+ super(MultiChoiceInfo, self).__init__(field, display)
+ self.label = field.label or ''
+ if field.listvalue:
+ value = field.listvalue
+ # удалить пустой первый элемент (особенности wsdl)
+ if value and not value[0]:
+ value.pop(0)
+ if field.choice and field.comments:
+ map_comment = dict(zip(field.choice, field.comments))
else:
- value = []
- value = ', '.join(value)
- if field.listvalue and not value:
- value = ', '.join(field.listvalue)
- elif not value:
- value = field.value if field.value else ''
- if not print_group_flag:
- if group_name:
- print_group_flag = True
- #_print('\b' + group_name)
- _colorprint.bold.foreground(
- TextState.Colors.WHITE)(group_name)
- colorPrint.printSUCCESS('%s: %s' % (field.label, value))
-
- # elif field.element == 'label':
- # print field.label
-
- elif field.element == 'error':
- if not print_group_flag:
- if group_name:
- print_group_flag = True
- _colorprint.bold.foreground(
- TextState.Colors.WHITE)(group_name)
- colorPrint.printERROR(field.label)
-
- elif field.element in ['check', 'check_tristate']:
- if field.value == 'on':
- value = _('yes')
- elif field.value == 'off':
- value = _('no')
- elif field.value == 'auto':
- value = _('auto')
+ map_comment = {}
+ self.value = ", ".join([map_comment.get(x, x) or '' for x in value])
+ else:
+ self.value = field.value or ""
+
+
+class ErrorInfo(InformationElement):
+ def __init__(self, field, display):
+ super(ErrorInfo, self).__init__(field, display)
+ self.label = field.label
+
+ def show(self):
+ self.display.print_error(self.label)
+
+
+class TableInfo(InformationElement):
+ """
+ Табличная информация
+ """
+
+ def map_row(self, row, typedata):
+ map_answer = {'on':_('yes'), 'off': _("no"), 'auto': _('auto')}
+ for cell, typefield in izip(row, typedata):
+ if typefield in ['check', 'check_tristate']:
+ yield map_answer.get(cell, cell) or ""
+ elif "password" in typefield:
+ yield "***"
else:
- value = field.value
- if not print_group_flag:
- if group_name:
- print_group_flag = True
- _colorprint.bold.foreground(
- TextState.Colors.WHITE)(group_name)
- colorPrint.printSUCCESS('%s: %s' % (field.label, value))
-
- elif field.element == 'table' and field.type != 'steps':
- head = field.tablevalue.head
-
- body = []
- for row in field.tablevalue.body:
- if not row[0]:
- row.pop(0)
- body.append(row)
-
- # if empty table
- if not filter(None, map(lambda x: x, body)):
- body = [[''] * len(head)]
- res = printTable(body, head)
- sys.stdout.flush()
- sys.stdout.write(res + "\n")
- continue
- ChoiceValue = field.tablevalue.values
- for row in xrange(len(ChoiceValue)):
- if ChoiceValue[row].typefield in ['check', 'check_tristate']:
- for i in xrange(len(body)):
- if body[i][row] == 'on':
- body[i][row] = _('yes')
- if body[i][row] == 'off':
- body[i][row] = _('no')
- if body[i][row] == 'auto':
- body[i][row] = _('auto')
- if "password" in ChoiceValue[row].typefield:
- for i in xrange(len(body)):
- if body[i][row]:
- body[i][row] = '***'
- data = []
- for body_row in body:
- data.append(map(lambda x: x if x else '', body_row))
- if not print_group_flag:
- if group_name:
- print_group_flag = True
- _colorprint.bold.foreground(
- TextState.Colors.WHITE)(group_name)
- colorPrint.printSUCCESS(field.label + ': ')
- res = printTable(data, head)
- sys.stdout.flush()
- sys.stdout.write(res + "\n")
+ yield cell or ""
+
+ def __init__(self, field, display):
+ super(TableInfo, self).__init__(field, display)
+ self.label = field.label
+ self.head = field.tablevalue.head
+
+ # удаление первого элемента строки (для wsdl)
+ body = [x[1:] if x and not x[0] else x for x in field.tablevalue.body]
+
+ if not filter(None, map(lambda x: x, body)):
+ self.body = None
else:
- uncompatible_count += 1
+ type_values = [x.typefield for x in field.tablevalue.values]
+ self.body = [list(self.map_row(x, type_values)) for x in body]
+
+ def show(self):
+ if self.body:
+ self.display.print_label(self.label)
+ self.display.print_table(self.body, self.head)
-# if uncompatible_count == len (Fields) and group_name:
-# colorPrint.printSUCCESS(_('Not used'))
+def print_brief_group(Fields, group_name):
+ display = Display()
+ show_group = True
+ for element in ifilter(None,
+ (InformationElement.from_field(
+ FieldAdapter.from_detect(x),
+ display)
+ for x in Fields if not x.uncompatible)):
+ if show_group:
+ display.print_group(group_name)
+ show_group = False
+ element.show()
+
class Table(tableReport):
def __init__(self, *args, **kwargs):
@@ -953,4 +974,3 @@ def printTable(data, header=None):
except Exception as e:
print str(e)
raise
-
diff --git core/variables/certificate.py core/variables/certificate.py
index 7cbf9fe..8b1c0cf 100644
--- core/variables/certificate.py
+++ core/variables/certificate.py
@@ -204,7 +204,7 @@ class VariableClCertGroups(Variable):
(OpenSSL.SSL.FILETYPE_PEM, cert)
com = certobj.get_extension(certobj.get_extension_count()-1). \
get_data()
- groups = com.split(':')[1]
+ groups = com.rpartition(':')[2]
groups_list = groups.split(',')
return groups_list
except (OpenSSL.crypto.Error,IOError) as e:
diff --git scripts/cl-core scripts/cl-core
index 02baeff..c923e34 100644
--- scripts/cl-core
+++ scripts/cl-core
@@ -18,6 +18,7 @@
from calculate.core.server.cl_server import main
import sys, os
reload(sys)
+from calculate.lib.datavars import CriticalError
sys.setdefaultencoding("utf-8")
from calculate.lib.cl_lang import setLocalTranslate
setLocalTranslate('cl_core',sys.modules[__name__])
@@ -26,6 +27,9 @@ from traceback import print_exc
if __name__=='__main__':
try:
sys.exit(main())
+ except CriticalError as e:
+ sys.stderr.write("%s\n" % str(e))
+ sys.exit(1)
except ImportError, e:
print_exc()
cannot_import = 'cannot import name '

@ -2,6 +2,7 @@ AUX calculate-lib-3.2.0_alpha1-r1.patch 1248 SHA256 6b1b3d062a082ca34c708d9700d0
AUX calculate-lib-3.2.0_alpha4-r1.patch 6748 SHA256 236837ce239f3f320f6aa1be194b0a5eac34247ea3bcbbb35a4bd1d8c7b1c84e SHA512 4120021db63a44072f472928ad459553aee5f84a52a78afa90387801df7c4dd1832afae771962ee2f9aaf22ffc33faecefa276ee6631080ae8f2db8621321ab9 WHIRLPOOL 8839d8a96f30c6ddbf6221f0a7cb235cf7866c1158030943c2dcc51e5c89e06f1e7a97d4a8aff2170a4f7dd9327831bfe7962d86c7b3b618d479248d6169acf3
AUX calculate-lib-3.2.0_alpha4-r2.patch 7413 SHA256 9e49d514d21f3305cf4ad5052f3c2ab03e2afeed14a24a6ce952e4ebb689142a SHA512 cf84c413dfab87accfa47cc0aac43ecde2b3d014e2b1b23f9c547067a90c0d1cf3b3c287ddfa6564c7aa160211bd91e110c3af34daa9187a07c6cb1811e8ebf6 WHIRLPOOL dd485b0cfc6b45eb6eabd1ca056216a6374ea596c71d184e1ad2306001082954dd09d38415f7729e25527b24345ee7105d83523f01dd500723ec74898ec8040b
AUX calculate-lib-3.2.0_alpha4-r3.patch 7981 SHA256 36b903823d4d2020518beccaa00ef26eeb4dba56fca2d90aeaede9d1e6063dce SHA512 8f91d8f45d505a1ba646152fb0471083bc138162aae8ad48686cb72d20b3e4544fcab3817e5b1e19561813892c8acee162cfb6662886181f872aaf7ead4b9002 WHIRLPOOL 77f16da7c30008a2ca57a91ffd92345204c53f294a3b01a73e29c8bf2abe6735d3010143231b846d57c66f941e4d2a4cade6187fe203e4d415ee681d1d6efe39
AUX calculate-lib-3.2.0_alpha4-r4.patch 8366 SHA256 dc0315ac1befc048c883bae6184ff29d9c500b518c21637253a4a5931e398bd8 SHA512 a090bb31503906e44248bdf67925a1f1410c008fbc48538bd9ca3ea3abe23465c0701c5cabd2986a023ca95b6b9ccac46f89acf2946e82162fa1001ccaaa6f0a WHIRLPOOL 9060bf90752afd6ac153876baad960ba9ab86b360738d98aa3a9d9718bc6abd208ce3474f9f11680b1ffcb3327a8e1aa4c50f928531437163829dacb08e8ecb0
DIST calculate-lib-3.2.0_alpha1.tar.bz2 121698 SHA256 a1c605690dbb8c9fa6bcccd1a3bd1ff6500e4566e9d9a8ddc1ef4967ea38fbb8 SHA512 30196b7cba04f218c2e3105951fdaaa1a8c916d5b2265a4a09d1cce7b317f7ec501cd2edb70ecb41f25a1ee4ecfa89e23e3255a4adbfbf3ba7715c384171d0a3 WHIRLPOOL 0e9525e2b728a98c02b0a11f70dc13fb3922fd7e5ac01b168d9aeaa8c2544707533a1ecbd6aea4dd28a7836288efd8a8393216a68176c32615af8417e1acd4fc
DIST calculate-lib-3.2.0_alpha2.tar.bz2 131437 SHA256 726e062234ea0d668c1f05c8ab9a3093d25faf2825f028a0879339471d80de97 SHA512 9f7d1de80ac08b15b575ffb396ac01fbbf94cb6d57960854175256274039f83b619849d4930830682d110df7d28a789ac2b23ea5c3e5fb73dd06a48b4c28e455 WHIRLPOOL 2b5feb2d7aa97861ad2691056ecd8a8f43fc837b4f95e83b23780f53db8285950cc3a029acd83b6f287ef76d29a29c3fe896c920c633b81a235c5d124f650e24
DIST calculate-lib-3.2.0_alpha3.tar.bz2 131427 SHA256 17851382ad90e511132428fdbc3e4736ad78e6add64174b863f4470e86ad9ebc SHA512 46f2c2d9e31e88f215037935ac8b0dc0086ed98663a2174e425f77d3b9256345837c7803ae3c55dbd9ce9d38609d776b3058a128b1d12f621e64b4a2fe92d606 WHIRLPOOL 90d81f3adbda01b99b3b09f1cc1fd13d87580b0586c7a28e93968ceabf79eee7328c6fd272237d13985d9ebac2e7f0645f9b101a326b6105b36ea19c5f0e561f
@ -13,5 +14,6 @@ EBUILD calculate-lib-3.2.0_alpha3.ebuild 690 SHA256 c89c29f5de3f70146e98f1503536
EBUILD calculate-lib-3.2.0_alpha4-r1.ebuild 831 SHA256 edd3d3445555f8482283f1afcb7c74de1e76034f7f3d682b0b83a47f782ad0b8 SHA512 f0fe1fbdd5576e27ccdd407f1234589b143410e75dfc762ae7608a162dd5ade63c3d31dc5a1bfbc86a26f04a8cb40286dbcbcc2f5c6b88da6a22dfae398c9ed0 WHIRLPOOL 62e69309a12642d3c453cac64598d544c9a76d167a6cf268d4c23e532237c6f6b41d71b4611f4953b8d9180806c4d5a259316d2365ba7dada9bc240d4f54a4bc
EBUILD calculate-lib-3.2.0_alpha4-r2.ebuild 831 SHA256 813deccd2d61926b871cfae98ced012826925fdcc51920f454da772dfb396dab SHA512 140bf8eda9a45fdc0448c701f00756c85dbfa9f1114afdc3547cb26cacf2b8f45e11b33577b3f042ba6c8979f18398189a4dfe1f3b0d1b795050eddef48ef4cd WHIRLPOOL f074d1fa5741f5a3232457149b5529677ddac206a6189094285e8ff3b9179515954b3b94403fb25cb102035d032e985cfaedd2054ac27e7d3b930ac18df4413c
EBUILD calculate-lib-3.2.0_alpha4-r3.ebuild 831 SHA256 73b2a4f12533a0433348a26317bda4755fe21590cf20fa485fb4bf721e7773bc SHA512 2492796b8076452c100efbe65be5b44cff6326c983f6150bf3a70c145a8c5510e490e8d140f01f9e717e9a0dfd8e8a817f9bbe0d05c7585d2b5b2f444c6b01e9 WHIRLPOOL 251e14554cb1978c041f7899493a22d40afe3c5d42a95286d42da8ed4dba78def4e2f5f1315643bd079eb353fc99785129d28c808f3292062f565e877c6e5c90
EBUILD calculate-lib-3.2.0_alpha4-r4.ebuild 831 SHA256 386989bbe8d25706366a6e4692abd29a343779d95103ba933001b0169121f24a SHA512 51929ff7c30f2fa06e7c7cbbcd017f59621dbc7e173e0122cd888bb37912d9736847cc414dc993085695cc90028aa17e3b5e4dab2d12f4dc9614cfeed0062ef1 WHIRLPOOL 2a40557669bfdc8e3892947f272e83e90943bdd7db955f5f9f890bc638ee235c09622c3f5e48a25971b1ab8d6f88f761de02d144d5bb4e7bf991ff0a53280cf5
EBUILD calculate-lib-3.2.0_alpha4.ebuild 690 SHA256 c89c29f5de3f70146e98f15035366506933f03e8a5066b1ad55aeccbebdeae2c SHA512 a7277c2e5fa64a5e5840be7fc8d3df9a31f41926386c5fe6a9bed31eeed6321af5881c218d9ce7eeb12aee518edb682b438e10397dcb815cc63645100430e43e WHIRLPOOL 8f19e4d46381e26fec81e20fa35599f4658b3891d6372c921a8b1354ad3b1821ea9c78f71caebf54610e0b5aacfb6e6ded018e155e1979322406a0ac1e823d09
EBUILD calculate-lib-3.2.9999.ebuild 708 SHA256 a1d64b7f014831bf6b0a38928d53cb55758b7a12e5f3e98fffd28025ffacbce1 SHA512 3873859a791941d421e2338b437521955da383ce986408f1a951305e2dd75a1a4f771c9ec2caa096c5c8ea6a1776d6d0ed99e025ffa786ba029cafdbadfa439b WHIRLPOOL 5ac1a10b53f810ab527a0ebe52bc87e8397e61375cf6e0acbed89d8f6b8385e72bf234e0fdce479c3a3f1652bb6e520710ce9356750a97d644c0db0a33f6facb

@ -0,0 +1,36 @@
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $
EAPI="3"
SUPPORT_PYTHON_ABIS="1"
PYTHON_DEPEND="2:2.7"
RESTRICT_PYTHON_ABIS="2.4 2.5 2.6 3.*"
inherit distutils eutils
SRC_URI="ftp://ftp.calculate.ru/pub/calculate/calculate3/${PN}/${P}.tar.bz2"
DESCRIPTION="The library for Calculate 3"
HOMEPAGE="http://www.calculate-linux.org/main/en/calculate2"
LICENSE="Apache-2.0"
SLOT="3"
KEYWORDS="amd64 x86"
IUSE="minimal"
DEPEND="!minimal? ( dev-python/py-smbpasswd )
>=dev-python/pyxml-0.8
sys-apps/iproute2
sys-apps/pciutils
sys-fs/lvm2
sys-fs/mdadm
dev-python/pyinotify
sys-apps/file[python]"
RDEPEND="${DEPEND}"
src_unpack() {
unpack "${A}"
cd "${S}"
# apply revision changes
epatch "${FILESDIR}/calculate-lib-3.2.0_alpha4-r4.patch"
}

@ -0,0 +1,201 @@
diff --git calculate/lib/cl_progressbar.py calculate/lib/cl_progressbar.py
index 36bb6c4..5734d28 100644
--- calculate/lib/cl_progressbar.py
+++ calculate/lib/cl_progressbar.py
@@ -110,6 +110,7 @@ try:
def __init__(self):
self.outQueue = Queue()
+ self.finished = False
self.inQueue = Queue()
Process(target=self.runProgress,
args=(self.outQueue,self.inQueue)).start()
@@ -127,6 +128,7 @@ try:
def quit(self):
self.outQueue.put(("quit",(),False))
+ self.finished = True
self.outQueue.close()
self.inQueue.close()
except:
diff --git calculate/lib/datavars.py calculate/lib/datavars.py
index 1881294..b5f2d33 100644
--- calculate/lib/datavars.py
+++ calculate/lib/datavars.py
@@ -48,6 +48,9 @@ def itemgetter(*args,**kwargs):
return lambda x:(x[args[0]],)
return operator.itemgetter(*args)
+class CriticalError(Exception):
+ """Critical error"""
+
class DataVarsError(Exception):
"""Exception of getting variable values"""
@@ -1017,9 +1020,13 @@ class DataVars(SimpleDataVars):
"""
if not self.iniCache:
# get initialized section names
- if os.path.exists('/etc/make.profile'):
+ try:
+ make_profile = self.Get('main.cl_make_profile')
+ except VariableError as e:
+ raise CriticalError(str(e))
+ if os.path.exists(make_profile):
profiles = [('profile',
- path.join('/etc',os.readlink('/etc/make.profile')))]
+ path.join('/etc',os.readlink(make_profile)))]
else:
profiles = []
for iniName,iniFile in profiles+\
diff --git calculate/lib/utils/colortext/printing.py calculate/lib/utils/colortext/printing.py
index 147d1d7..75227ee 100644
--- calculate/lib/utils/colortext/printing.py
+++ calculate/lib/utils/colortext/printing.py
@@ -32,6 +32,11 @@ class Print(object):
self.buffer.append(self.output.setBold())
return self
+ @property
+ def underline(self):
+ self.buffer.append(self.output.setUnderline())
+ return self
+
def foreground(self, color):
self.buffer.append(self.output.setForeground(color))
return self
diff --git calculate/lib/variables/env.py calculate/lib/variables/env.py
index ab295ca..87d43cc 100644
--- calculate/lib/variables/env.py
+++ calculate/lib/variables/env.py
@@ -414,6 +414,17 @@ class VariableClMakeProfile(Variable):
"""
Путь до актуального make.profile
"""
+ systemRoot = "/"
+
+ def get_work_link(self, *links):
+ for link in links:
+ if path.exists(link):
+ return link
+
def get(self):
- # TODO: заглушка, нужно учитывать /etc/portage/make.profile
- return "/etc/make.profile"
+ files = ["etc/portage/make.profile", "etc/make.profile"]
+ val = self.get_work_link(
+ *[path.join(self.systemRoot, x) for x in files])
+ if not val:
+ raise VariableError(_("Failed to detect system profile"))
+ return val
diff --git calculate/lib/variables/linux.py calculate/lib/variables/linux.py
index 5d907f6..d49c773 100644
--- calculate/lib/variables/linux.py
+++ calculate/lib/variables/linux.py
@@ -18,10 +18,10 @@ import os
from os import path
import re
import platform
-from calculate.lib.datavars import Variable,ReadonlyVariable,SimpleDataVars
+from calculate.lib.datavars import Variable, SimpleDataVars
from calculate.lib.utils.portage import isPkgInstalled
-from calculate.lib.utils.files import countFiles,readFile
-import calculate.lib.cl_template as cl_template
+from calculate.lib.utils.files import readFile
+from env import VariableClMakeProfile
class Linux:
dictLinuxName = {"CLD":"Calculate Linux Desktop",
@@ -51,7 +51,7 @@ class Linux:
def getShortnameByMakeprofile(self,systemroot):
"""Get shortname by symlink of make.profile"""
- makeprofile = path.join(systemroot,'etc/make.profile')
+ makeprofile = self.Get('cl_make_profile')
if path.exists(makeprofile):
link = os.readlink(makeprofile)
reMakeProfileLink = re.compile('/calculate/(desktop|server)/(%s)/'%
@@ -78,11 +78,11 @@ class Linux:
def detectOtherShortname(self,systemroot):
"""Detect other system. Now only Gentoo."""
- gentooFile = path.join(systemroot,"etc/gentoo-release")
+ gentooFile = path.join(systemroot, "etc/gentoo-release")
if path.exists(gentooFile):
return "Gentoo"
- if all(map(lambda x:path.lexists(path.join(systemroot,x)),
- ['bin','var','lib','etc'])):
+ if all(map(lambda x: path.lexists(path.join(systemroot, x)),
+ ['bin', 'var', 'lib', 'etc'])):
return "Linux"
return None
@@ -92,17 +92,17 @@ class Linux:
"""
overlayPath = 'var/lib/layman/calculate'
releaseFile = 'profiles/calculate-release'
- return readFile(path.join(systemroot,overlayPath,releaseFile))
+ return readFile(path.join(systemroot, overlayPath, releaseFile))
def getVersionFromMetapackage(self,systemroot,shortname):
"""Get version from meta package"""
- for pkg in ("app-misc/calculate-meta","app-misc/%s-meta"%shortname):
- calcMeta = isPkgInstalled(pkg,systemroot)
+ for pkg in ("app-misc/calculate-meta", "app-misc/%s-meta" % shortname):
+ calcMeta = isPkgInstalled(pkg, systemroot)
if calcMeta:
return calcMeta[0]['PV']
return None
- def getVersionFromCalculateIni(self,systemroot):
+ def getVersionFromCalculateIni(self, systemroot):
"""Get version from calculate ini"""
pathname = path.join(systemroot,
'etc/calculate/calculate.ini')
@@ -124,11 +124,9 @@ class Linux:
def getVersionFromGentooFiles(self,systemroot):
"""Get version from gentoo files"""
gentooFile = path.join(systemroot,"etc/gentoo-release")
- systemVersion = ""
- flagGentoo = False
reVer=re.compile("^(\d+\.)*\d+$",re.S)
if path.exists(gentooFile):
- gentooLink = path.join(systemroot,"etc/make.profile")
+ gentooLink = self.Get('cl_make_profile')
if path.islink(gentooLink):
vers = filter(reVer.search,
os.readlink(gentooLink).split('/'))
@@ -227,9 +225,10 @@ class VariableOsLinuxFiles(Variable,Linux):
class LinuxDataVars(SimpleDataVars):
- def __init__(self,systemRoot="/"):
+ def __init__(self, systemRoot="/"):
self.systemRoot = systemRoot
SimpleDataVars.__init__(self,
+ VariableClMakeProfile(systemRoot=systemRoot),
VariableOsLinuxShortname(systemRoot=systemRoot),
VariableOsLinuxName(systemRoot=systemRoot),
VariableOsLinuxSubname(systemRoot=systemRoot),
@@ -238,14 +237,12 @@ class LinuxDataVars(SimpleDataVars):
VariableOsLinuxSystem(systemRoot=systemRoot),
VariableOsLinuxVer(systemRoot=systemRoot),
VariableOsLinuxBuild(systemRoot=systemRoot))
- makeprofile = path.join(systemRoot,'etc/make.profile')
+ makeprofile = self.Get('cl_make_profile')
if os.path.exists(makeprofile):
- inifile = path.join(systemRoot,'etc',
- os.readlink(path.join(systemRoot,'etc/make.profile')))
+ inifile = path.join(systemRoot, 'etc',
+ os.readlink(makeprofile))
self.flIniFileFrom(inifile)
- inifile = "etc/calculate/calculate.env"
- self.flIniFileFrom(path.join(systemRoot,inifile))
- iniFile = "etc/calculate/calculate3.env"
- self.flIniFileFrom(path.join(systemRoot,iniFile))
- iniFile = "etc/calculate/calculate2.env"
- self.flIniFileFrom(path.join(systemRoot,iniFile))
+ for inifile in ("etc/calculate/calculate.env",
+ "etc/calculate/calculate3.env",
+ "etc/calculate/calculate2.env"):
+ self.flIniFileFrom(path.join(systemRoot, inifile))

@ -10,5 +10,6 @@ EBUILD calculate-utilities-3.2.0_alpha4-r3.ebuild 827 SHA256 55e3c689f7b9f63d44d
EBUILD calculate-utilities-3.2.0_alpha4-r4.ebuild 827 SHA256 af1f37610602ad63affaabdb89a4fc86176712346021b82dfae9cbed3c525dc0 SHA512 83569e0abda57714131f63e0bd6188e9f26fe76d0246de6ed4e9e72dcd6568e1f35bf6da5680a283fc4c57caf64d0eca8bd59cef33d9643dcf828948a0746037 WHIRLPOOL 1636428c5177413bd18d461d5724d5e75dd60edf1fe573c53e0f0a3ba6147167ceddf4b3b86b38745b5fb51b1a6d1ec4ca9ef90e33a698c936480ce61c5d6f60
EBUILD calculate-utilities-3.2.0_alpha4-r5.ebuild 827 SHA256 788046721074b571d1da3ddcebdff9b512c7f4e53535a38ad7271b41a7bc60e2 SHA512 ce858fa8da3fa4bff0ce56b22b4a09f0d323cf755da48b957622e4268c67f4382beab9160f4416050885838fe3d43dc54e9275526e695e9042f11728bf34fa55 WHIRLPOOL 814f7cbb331444df618d1a5a8b106612118616f172fa7462c5070021cf7832daf385482e23d281eb745938045f6ef0bd8ee0a87483d627568fd17729695f12c1
EBUILD calculate-utilities-3.2.0_alpha4-r6.ebuild 827 SHA256 567baddea480a7bc2f14796ec1751b525d79d844dc6c231708d28052bcbd635d SHA512 9fbc4bf9103efba1dfd62cdcfd0eb8f1d2f7ba77be7c8daa4a4014929efe38f7627309b19fdfd5e90a2d5bc55b964096d5a16a56488e060ae1843850c453fb34 WHIRLPOOL b99b8964c5d565846ef88f7fce6a85611383efa9b2fd799f44d0894a707fff69956d0e7a2e95f544be3e0feb642845b5846d4468d5cc01804483c115fd0f6518
EBUILD calculate-utilities-3.2.0_alpha4-r7.ebuild 827 SHA256 a7a927dc84f6373b8c2f9745d1c825f850692e71f7c712cbe1b6fc23d6ebabfa SHA512 e97694376075af4086931f3530f86ef6975ba43e96e66fc7ec869b349e4055e5ed8763fc80e580f46c726df70cf2fd444326a1a00cdd671f83f2cd0f4faac8b1 WHIRLPOOL 765774a2696c65bde9f90b1fdd551308a4a2e43bde865fa63d909217faea6bda7aaa7d3ddf2fd1c69d31726d04336db77808e4ff008affc18b2476dd152be706
EBUILD calculate-utilities-3.2.0_alpha4.ebuild 812 SHA256 c3528f2fcb9980d90b8948fe672a64c0a899364a4a8f7a8290990536f7f31631 SHA512 ffad0effd883749802e6dc12779054010949aa2eccf68ee3560f5239c2b45f683cc5ae00d7582fec7d1d0382a35fc6a73411abf1aa58e43417e26b52130885a8 WHIRLPOOL 56d339c417b70eb53d942d533e56bc530e85fdc4f3bf6c8c30ff07af69e0bd98d373d6dbb27b944af4c8e9d596cd1b75424699391cd49b21a48a3ae8bc014fa1
EBUILD calculate-utilities-3.2.9999.ebuild 800 SHA256 acbb7a4e34387baa1ade9bf97637972fbfc97afa56367381d622198b5237e983 SHA512 9e0c74eb499157b6d3ace20d7e9da630660e46b74a6d575e222e1638c87f85660635187489b9312a45f193780c301d87c1dbb9a0f60414e178e8f54080c71ffd WHIRLPOOL 9b56f590f36d29d3518c66c453f97b14d083e36b62adb70a8916ae4e30b527431602a9edd40d703e5cb4296a01f8c982157b602651ee57a9c0ddb7a4c6aa2fe1

@ -0,0 +1,26 @@
# Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $
EAPI=4
DESCRIPTION="Calculate Utilities meta package"
HOMEPAGE="http://www.calculate-linux.org/main/en/calculate2"
SRC_URI=""
LICENSE="Apache-2.0"
SLOT="3"
KEYWORDS="amd64 x86"
IUSE="cl_consolegui cl_client cl_desktop cl_console"
RDEPEND="${RDEPEND}
=sys-apps/calculate-install-3.2.0_alpha4-r1
=sys-apps/calculate-i18n-3.2.0_alpha4
=sys-apps/calculate-lib-3.2.0_alpha4-r4
=sys-apps/calculate-core-3.2.0_alpha4-r5
=sys-apps/calculate-update-3.2.0_alpha4-r4
cl_client? ( =sys-apps/calculate-client-3.2.0_alpha4 )
cl_desktop? ( =sys-apps/calculate-desktop-3.2.0_alpha4 )
cl_consolegui? ( =sys-apps/calculate-console-gui-3.2.0_alpha4 )
cl_console? ( =sys-apps/calculate-console-3.2.0_alpha4-r1 )
"
Loading…
Cancel
Save