add certificate.py, fix view_cert_meth

master3.3
Спиридонов Денис 12 years ago
parent da0d05d221
commit 70af9fed6d

@ -430,168 +430,3 @@ class Basic (DefinitionBase) :
@Dec.check_permissions(["cl_login"])
def cl_login ( self, login, password) :
return cl_login.serv_cl_login (login, password)
#@rpc(Integer, _returns = Array(String))
#@Dec.check_permissions(["view_cert_right"])
#@Dec.console('view-cert-right')
#@Dec.gui('System')
#def view_cert_right ( self, cert_id) :
#return self.serv_view_cert_right (cert_id, self.data_path)
class ViewCert (ClassSerializer):
cert_id = Integer
def view_cert_meth (self, cert_id, data_path):
""" rights for the selected certificate """
try:
# Помещение данных в словарь процессов
self.briefParams('cert_view')
try:
cert_id = int(cert_id)
except:
self.printERROR("Error input certificate ID!")
return True
cert_file = data_path+'/client_certs/%s.crt' %str(cert_id)
if not os.path.exists(cert_file):
self.printERROR ("Certificate not found in server!")
return True
cert = open(cert_file, 'r').read()
#try:
certobj = OpenSSL.crypto.load_certificate \
(OpenSSL.SSL.FILETYPE_PEM, cert)
com = certobj.get_extension(certobj.get_extension_count()-1).get_data()
groups = com.split(':')[1]
groups_list = groups.split(',')
#except:
#return ['-1']
# if group = all and not redefined group all
if 'all' in groups_list:
find_flag = False
fd = open(self.group_rights, 'r')
t = fd.read()
# find all in group_rights file
for line in t.splitlines():
if line.split()[0] == 'all':
find_flag = True
break
if not find_flag:
self.printSUCCESS(_("Certificate %d can run all methods!") \
%cert_id)
else:
results = []
if not os.path.exists (self.group_rights):
open(self.group_rights, 'w')
with open(self.group_rights) as fd:
t = fd.read()
for line in t.splitlines():
words = line.split()
# first word in line equal name input method
if words[0] in groups_list:
methods = words[1].split(',')
for i in methods:
results.append(i.strip())
results = uniq(results)
add_list_rights = []
del_list_rights = []
with open(self.rights) as fr:
t = fr.read()
for line in t.splitlines():
words = line.split()
meth = words[0]
for word in words:
try:
word = int(word)
except:
continue
# compare with certificat number
if cert_id == word:
# if has right
add_list_rights.append(meth)
if cert_id == -word:
del_list_rights.append(meth)
results += add_list_rights
results = uniq(results)
for method in results:
if method in del_list_rights:
results.remove(method)
if results == []:
results.append("No Methods")
self.printSUCCESS(_("Certificate %d can run: ") %cert_id)
for i in results:
self.printSUCCESS(i)
b = '<b>'
_b = '</b>'
self.printSUCCESS(b+_('Certificate groups:')+_b+'\n' + \
reduce (lambda x, y: x + '\n' + y, groups_list))
self.printSUCCESS(b+_("Fingerprint = ") +_b+\
certobj.digest('SHA1'))
self.printSUCCESS(b+_("Serial Number = </b>") +_b +\
str(certobj.get_serial_number()))
self.printSUCCESS(' ')
Issuer = certobj.get_issuer().get_components()
self.printSUCCESS (b+_("\nIssuer") +_b)
for i in Issuer:
self.printSUCCESS ("%s : %s" %(i[0], i[1]))
Subject = certobj.get_subject().get_components()
self.printSUCCESS (b+_("\nSubject") +_b)
for item in Subject:
self.printSUCCESS ("%s : %s" %(item[0], item[1]))
return True
# Обработка сигнала прерывания работы процесса
except KeyboardInterrupt:
# Необходимо передать Fasle для сохранения данных о процессе
return False
#except:
#return False
@rpc(Integer, ViewCert, _returns = Array(ReturnedMessage))
@Dec.check_permissions(["view_cert"])
@Dec.console('view_cert')
@Dec.gui('Api', 'View Cert', 'certificate-server,application-certificate')
def view_cert ( self, sid, VC):
cert_id = VC.cert_id
name_meth = 'view_cert'
#sh = self.get_cache(sid, name_meth, VC)
#if sh == None:
#sh = self.ViewCert()
#sh.cert_id = cert_id
#cert_id = sh.cert_id
#self.set_cache(sid, name_meth, sh)
view_cert_meth = type("CommonInstall",(self.Common, Basic, object), {})
pid = self.startprocess(sid, target=view_cert_meth, \
method="view_cert_meth", method_name='view_cert', \
args_proc = (cert_id, self.data_path))
returnmess = ReturnedMessage(type = 'pid', message = pid)
return [returnmess]
@rpc(Integer, _returns = ViewInfo)
def view_cert_view (self,step):
view = ViewInfo(groups=[])
group = GroupField(name=_("View rights certificate"),nextlabel=_("Next"),last=True)
group.fields = []
group.fields.append(Field(
name = "cert_id",
label = _("Certificate id: "),
type = "int",
opt = Option(longopt="--id",
metavalue="CertId"),
help = \
_("Enter Certificate id"),
element = "input"))
view.groups.append(group)
return view

@ -0,0 +1,284 @@
#-*- coding: utf-8 -*-
# Copyright 2010-2012 Calculate Ltd. http://www.calculate-linux.org
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys, os
import subprocess
import OpenSSL
from soaplib.serializers.primitive import String, Integer, Boolean
from soaplib.serializers.clazz import Array, ClassSerializer
from soaplib.service import rpc
from calculate.api.server.api_types import ReturnedMessage, getViewForVariables
from calculate.api.server.api_types import Field, GroupField, ViewInfo
from calculate.lib.datavars import VariableError
from calculate.api import datavars
import traceback
class CertificateInfo(ClassSerializer):
"""Parameters for method install"""
cl_cert_id = String
def catchExcept():
class wrapper:
def __init__(self,f):
self.f = f
self.func_name = f.func_name
self.func_code = f.func_code
self.__doc__ = f.__doc__
self.__name__ = f.__name__
def __call__(self,selfobj,*args,**kwargs):
try:
return self.f(selfobj,*args,**kwargs)
except BaseException as e:
view = ViewInfo(groups=[])
group = GroupField(name=_("Error"),last=True)
group.fields = []
group.fields.append(Field(
name = "error",
label = str(e),
default = 'color:red;',
element = "error"))
view.groups.append(group)
print "!!!!EXCEPTION!!!!"
for i in apply(traceback.format_exception, sys.exc_info()):
print i
return view
return wrapper
class ApiWsdl:
def view_cert_meth (self, dv):
""" rights for the selected certificate """
try:
cert_id = dv.Get('cl_cert_id')
data_path = dv.Get('cl_api_data')
group_rights = dv.Get('cl_api_group_rights')
rights = dv.Get('cl_api_rights')
# Помещение данных в словарь процессов
self.briefParams('cert_view')
if cert_id != 'all':
try:
cert_id_list = [int(cert_id)]
except:
self.printERROR("Error input certificate ID!")
return True
else:
cert_id_list = dv.Get('cl_all_cert_id')
for cert_id in map(lambda x: int(x), cert_id_list):
cert_file = data_path+'/client_certs/%s.crt' %str(cert_id)
if not os.path.exists(cert_file):
self.printERROR ("Certificate not found in server!")
return True
cert = open(cert_file, 'r').read()
#try:
certobj = OpenSSL.crypto.load_certificate \
(OpenSSL.SSL.FILETYPE_PEM, cert)
com = certobj.get_extension(certobj.get_extension_count()-1). \
get_data()
groups = com.split(':')[1]
groups_list = groups.split(',')
#except:
#return ['-1']
# if group = all and not redefined group all
if 'all' in groups_list:
find_flag = False
fd = open(group_rights, 'r')
t = fd.read()
# find all in group_rights file
for line in t.splitlines():
if line.split()[0] == 'all':
find_flag = True
break
if not find_flag:
self.printSUCCESS(_("Certificate %d can run all methods!") \
%cert_id)
else:
results = []
if not os.path.exists (group_rights):
open(group_rights, 'w')
with open(group_rights) as fd:
t = fd.read()
for line in t.splitlines():
words = line.split()
# first word in line equal name input method
if words[0] in groups_list:
methods = words[1].split(',')
for i in methods:
results.append(i.strip())
results = uniq(results)
add_list_rights = []
del_list_rights = []
with open(rights) as fr:
t = fr.read()
for line in t.splitlines():
words = line.split()
meth = words[0]
for word in words:
try:
word = int(word)
except:
continue
# compare with certificat number
if cert_id == word:
# if has right
add_list_rights.append(meth)
if cert_id == -word:
del_list_rights.append(meth)
results += add_list_rights
results = uniq(results)
for method in results:
if method in del_list_rights:
results.remove(method)
if results == []:
results.append("No Methods")
self.printSUCCESS(_("Certificate %d can run: ") %cert_id)
for i in results:
self.printSUCCESS(i)
b = '<b>'
_b = '</b>'
self.printSUCCESS(b+_('Certificate groups')+':'+_b+'\n' + \
reduce (lambda x, y: x + ', \n' + y, groups_list))
self.printSUCCESS(b+_("Fingerprint = ") +_b+\
certobj.digest('SHA1'))
self.printSUCCESS(b+_("Serial Number = ") +_b +\
str(certobj.get_serial_number()))
self.printSUCCESS(' ')
Issuer = certobj.get_issuer().get_components()
self.printSUCCESS (b+_("\nIssuer") +_b)
for i in Issuer:
self.printSUCCESS ("%s : %s" %(i[0], i[1]))
Subject = certobj.get_subject().get_components()
self.printSUCCESS (b+_("\nSubject") +_b)
for item in Subject:
self.printSUCCESS ("%s : %s" %(item[0], item[1]))
self.printSUCCESS(' ')
self.printSUCCESS(' ')
return True
# Обработка сигнала прерывания работы процесса
except KeyboardInterrupt:
# Необходимо передать Fasle для сохранения данных о процессе
return False
############################################
def check_cert_params (self, dv, info,allvars=False,ordered=None):
errors = []
keys = sorted(filter(lambda x:x.lower() == x,
info._type_info.keys()))
if ordered:
keys = ordered + filter(lambda x:not x in ordered,
keys)
for var in keys:
# get value of variable from info
val = info.__getattribute__(var)
# check value if value send of check allvariables
if val != None or allvars:
try:
# if value not send, then get from datavars
if val == None:
val = dv.Get(var)
else:
uncomperr = dv.Uncompatible(var)
if uncomperr:
raise VariableError(uncomperr)
if not dv.Uncompatible(var):
dv.Set(var, val)
except VariableError, e:
mess = ''
messages = e.message if type(e.message) == list else [e.message]
for error in messages:
mess += str(error) + '\n'
errors.append(ReturnedMessage(type = 'error', field = var,
message = mess))
return errors
from calculate.api.server.baseClass import Basic
from calculate.api.server.decorators import Dec
def certificateCommon(self,sid,info,methodname):
"""
Install common method
"""
try:
dv = self.get_cache(sid,methodname,"vars")
if not dv:
#reload(cl_install)
dv = datavars.DataVarsApi()
dv.importApi()
dv.flIniFile()
errors = self.check_cert_params(dv, info,
ordered=['cl_cert_id'],
allvars=True)
if errors:
return errors
certificate_meth = type("certificateCommon",(self.Common,
ApiWsdl, object), {})
pid = self.startprocess(sid, target=certificate_meth,
method="view_cert_meth",
auto_delete = True,
args_proc = (dv,))
returnmess = ReturnedMessage(type = 'pid', message = pid, expert = True)
returnmess.type = "pid"
returnmess.message = pid
dv = self.clear_cache(sid,methodname)
return [returnmess]
finally:
if dv:
self.set_cache(sid,methodname,"vars",dv,smart=False)
return []
@rpc(Integer, CertificateInfo, _returns = Array(ReturnedMessage))
@Dec.check_permissions(["view_cert"])
@Dec.console('view_cert')
@Dec.gui('Api', 'View Cert', 'certificate-server,application-certificate')
def view_cert ( self, sid, info):
if not info:
errors = []
mess = 'Certificate Identificator must be int or "all"!'
errors.append(ReturnedMessage(type = 'error', field = 'cl_cert_id',
message = mess))
return errors
dv = datavars.DataVarsApi()
dv.importApi()
dv.flIniFile()
dv.Set('cl_cert_id', info.cl_cert_id)
self.set_cache(sid, 'view_cert', "vars", dv, smart=False)
return self.certificateCommon(sid,info,'view_cert')
@rpc(Integer, Integer, Boolean,_returns = ViewInfo)
@catchExcept()
def view_cert_view (self, sid, step, expert):
dv = datavars.DataVarsApi()
dv.importApi()
dv.flIniFile()
dv.addGroup(_("Certificate View"),
normal=('cl_cert_id',),
next_label=_("View"))
view = getViewForVariables (dv,step,expert)
self.set_cache(sid, 'view_cert', "vars", dv, smart=False)
return view

@ -41,7 +41,7 @@ class Table (ClassSerializer):
list_module = ["clean", "gen_pid", "check_rights", "cl_template", \
"sid_pid_file", "gen_sid", "func", "api_types", 'test', 'test2', \
'system_update', 'request']
'system_update', 'request', 'certificate']
imported_modules = []
pack = "calculate.api.server"

@ -274,9 +274,9 @@ class ApiWsdl:
name = "isopath_file",
label = _("select ISO"),
default = '/var/calculate',
choice = ['first', 'second'],
choice = ['first', 'second'],
value = 'Python files (*.py, *.pyc)',
choice = ['one', 'two'],
comments = ['first', 'second'],
value = '/home/guest/1',
type = 'files',
opt = Option(longopt="--times",
metavalue="TIMES"),

@ -19,6 +19,7 @@ from calculate.api.datavars import __version__,__app__
import api
import request
import certificate
section = "api"

@ -0,0 +1,71 @@
#-*- coding: utf-8 -*-
# Copyright 2010-2012 Calculate Ltd. http://www.calculate-linux.org
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0 #
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# mode - read only or writeable variable
# value - default variable value
# select - list of posible values for variable
# hide - flag, if it is True, then the variable is not printable
# printval - print value of variable
from calculate.lib.datavars import Variable,ReadonlyVariable,VariableError
import os, glob, sys
from os import path
import OpenSSL
from calculate.lib.cl_lang import setLocalTranslate
from calculate.lib.utils.files import readLinesFile
#from calculate.api.cert_cmd import find_id_cert
setLocalTranslate('cl_api',sys.modules[__name__])
class VariableClAllCertId(Variable):
def get(self):
data_path = self.Get('cl_api_data')
result = []
cert_dir = data_path + '/client_certs/'
for filename in glob.glob(cert_dir+"*"):
if filename.endswith('.crt'):
temp = filename.split('.')[0].split('/')
id = temp[len(temp)-1]
try:
result.append(id)
except:
pass
return result
class VariableClCertId(Variable):
"""
Certificate Identification
"""
type = "choice"
opt = ["-c"]
metavalue = "CERT_ID"
def init(self):
self.help = _("Certificate Identification")
self.label = _("Certificate Identification")
def choice(self):
return self.Get('cl_all_cert_id')+['all']
def get(self):
return self.choice()[0]
def check(self, cert_id):
if cert_id != 'all':
try:
int(cert_id)
except ValueError:
raise VariableError(_("Certificate id must be int"))

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: calculate-api\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-04-12 14:08+0300\n"
"PO-Revision-Date: 2012-04-12 14:08+0300\n"
"POT-Creation-Date: 2012-04-13 13:13+0300\n"
"PO-Revision-Date: 2012-04-13 13:13+0300\n"
"Last-Translator: Denis <ds@mail.ru>\n"
"Language-Team: \n"
"Language: \n"
@ -774,7 +774,7 @@ msgstr "Завершаю все процессы"
msgid "All processes are closed."
msgstr "Все процессы закрыты."
#: /var/calculate/mydir/git/calculate-api/api/server/baseClass.py:481
#: /var/calculate/mydir/git/calculate-api/api/server/baseClass.py:480
#, python-format
msgid "Certificate %d can run all methods!"
msgstr "Сертификат %d может запускать все методы!"
@ -784,21 +784,31 @@ msgstr "Сертификат %d может запускать все метод
msgid "Certificate %d can run: "
msgstr "Сертификат %d может запускать: "
#: /var/calculate/mydir/git/calculate-api/api/server/baseClass.py:568
#: /var/calculate/mydir/git/calculate-api/api/server/baseClass.py:534
msgid "Certificate groups"
msgstr "Группы сертификата"
#: /var/calculate/mydir/git/calculate-api/api/server/baseClass.py:536
#: /var/calculate/mydir/git/calculate-api/api/server/cert_cmd.py:485
#: /var/calculate/mydir/git/calculate-api/api/server/cert_cmd.py:760
msgid "Fingerprint = "
msgstr "Отпечаток = "
#: /var/calculate/mydir/git/calculate-api/api/server/baseClass.py:583
msgid "View rights certificate"
msgstr "Просмотр прав сертификата"
#: /var/calculate/mydir/git/calculate-api/api/server/baseClass.py:568
#: /var/calculate/mydir/git/calculate-api/api/server/baseClass.py:583
#: /var/calculate/mydir/git/calculate-api/api/server/test2.py:222
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:438
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:430
msgid "Next"
msgstr "Далее"
#: /var/calculate/mydir/git/calculate-api/api/server/baseClass.py:573
#: /var/calculate/mydir/git/calculate-api/api/server/baseClass.py:588
msgid "Certificate id: "
msgstr "Номер сертификата: "
#: /var/calculate/mydir/git/calculate-api/api/server/baseClass.py:578
#: /var/calculate/mydir/git/calculate-api/api/server/baseClass.py:593
msgid "Enter Certificate id"
msgstr "Введите номер сертификата"
@ -866,60 +876,64 @@ msgid "Secound group"
msgstr "Вторая группа"
#: /var/calculate/mydir/git/calculate-api/api/server/test2.py:225
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:528
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:520
msgid "Done"
msgstr "Готово"
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:241
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:438
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:132
msgid "Interrupted by user"
msgstr "Прервано пользователем"
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:236
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:430
msgid "TEST_METHOD"
msgstr "Тестовый метод"
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:246
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:241
msgid "YOUR NAME: "
msgstr "Ваше имя: "
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:253
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:248
msgid "Please, enter your name"
msgstr "Пожалуйста, введите Ваше имя"
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:257
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:252
msgid "TIMES: "
msgstr "Время: "
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:264
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:276
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:288
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:259
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:271
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:284
msgid "Enter times"
msgstr "Введите время"
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:269
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:280
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:264
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:275
msgid "select ISO"
msgstr "Выберите ISO образ"
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:292
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:288
msgid "Mount Points: "
msgstr "Точки монтирования: "
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:338
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:383
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:334
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:379
msgid "Press for advanced settings..."
msgstr "Нажмите для дополнительных настроек..."
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:478
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:489
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:501
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:470
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:481
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:493
msgid "check population: "
msgstr "Количество населения: "
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:485
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:497
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:508
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:477
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:489
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:500
msgid "you not human? This is a anti-bot test"
msgstr "Анти-бот тест"
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:528
#: /var/calculate/mydir/git/calculate-api/api/server/test.py:520
msgid "Gratulations!"
msgstr "Поздравляю!"
@ -967,11 +981,6 @@ msgstr "для изменения прав сертификата использ
msgid "file %s not found!"
msgstr "файл %s не найден!"
#: /var/calculate/mydir/git/calculate-api/api/server/cert_cmd.py:485
#: /var/calculate/mydir/git/calculate-api/api/server/cert_cmd.py:760
msgid "Fingerprint = "
msgstr "Отпечаток = "
#: /var/calculate/mydir/git/calculate-api/api/server/cert_cmd.py:496
msgid ""
"\n"
@ -1236,9 +1245,9 @@ msgid "Requests"
msgstr "Запросы"
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:263
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:418
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:425
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:573
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:419
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:426
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:574
msgid "Requests detail"
msgstr "Подробности запроса на подпись сертификата"
@ -1254,17 +1263,21 @@ msgstr "Подтвердить"
msgid "Delete"
msgstr "Удалено"
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:488
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:335
msgid "Confirm Request"
msgstr "Подтверждение запроса"
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:489
#, python-format
msgid "Request and certificate with id = %s not found!"
msgstr "Запрос или сертификат с идентификатором = %s не найден!"
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:537
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:538
#, python-format
msgid "Exception!%s"
msgstr "Исключение: %s"
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:566
#: /var/calculate/mydir/git/calculate-api/api/server/request.py:567
msgid "Requests delete"
msgstr "Запрос на подпись сертификата удалён"
@ -1344,6 +1357,10 @@ msgstr "Сертификат сервера не найден"
msgid "use cl-api-server with key --gen-cert-by HOST (--get-cert-from HOST) or --use-root-as-server)"
msgstr "используйте cl-api-server с ключом --gen-cert-by HOST (--get-cert-from HOST) или --use-root-as-server)"
#, fuzzy
#~ msgid "Serial Number = </b>"
#~ msgstr "Серийный номер = "
#~ msgid "For autopartition need select install device"
#~ msgstr "For autopartition need select install device"

Loading…
Cancel
Save