mirror of https://github.com/Aidaho12/haproxy-wi
parent
f82b036ef8
commit
d190583abd
11
api/api.py
11
api/api.py
|
@ -66,7 +66,8 @@ def index():
|
|||
'haproxy/<id,hostname,ip>/log': 'show HAProxy logs by id or hostname or ip. May to have config next Headers: rows(format INT) default: 10 grep, waf(if needs WAF log) default: 0, start_hour(format: 24) default: 00, start_minute, end_hour(format: 24) default: 24, end_minute. METHOD: GET',
|
||||
'haproxy/<id,hostname,ip>/section': 'show a certain section, headers: section-name. METHOD: GET',
|
||||
'haproxy/<id,hostname,ip>/section/add': 'add a section to the HAProxy config by id or hostname or ip. Has to have config header with section and action header for action after upload. Section header must consist type: listen, frontend, etc. Action header accepts next value: save, test, reload and restart. Can be empty for just save. METHOD: POST',
|
||||
'haproxy/<id,hostname,ip>/section/edit': 'edit a section in the HAProxy config by id or hostname or ip. Has to have config header with section, action header for action after upload and body of a new section configuration. Section header must consist type: listen, frontend, etc. Action header accepts next value: save, test, reload and restart. Can be empty for just save. METHOD: POST',
|
||||
'haproxy/<id,hostname,ip>/section/edit': 'edit a section in the HAProxy config by id or hostname or ip. Has to have config header section-name, action header for action after upload and body of a new section configuration. Section header must consist type: listen, frontend, etc. Action header accepts next value: save, test, reload and restart. Can be empty for just save. METHOD: POST',
|
||||
'haproxy/<id,hostname,ip>/section/delete': 'delete a section in the HAProxy config by id or hostname or ip. Has to have config header section-name, action header for action after upload and body of a new section configuration. Section header must consist type: listen, frontend, etc. Action header accepts next value: save, test, reload and restart. Can be empty for just save. METHOD: POST',
|
||||
'haproxy/<id,hostname,ip>/acl': 'add an acl to certain section. Must be JSON body: "section-name", "if", "then", "if_value", "then_value" and "action" for action after upload. Action accepts next value: "save", "test", "reload" and "restart". METHOD: POST',
|
||||
'haproxy/<id,hostname,ip>/acl': 'delete an acl to certain section. Must be JSON body: "section-name", "if", "then", "if_value", "then_value" and "action" for action after upload. Action accepts next value: "save", "test", "reload" and "restart". METHOD: DELETE',
|
||||
'nginx/<id,hostname,ip>': 'show info about the NGINX by id or hostname or ip. METHOD: GET',
|
||||
|
@ -218,6 +219,14 @@ def haproxy_section_add(haproxy_id):
|
|||
return api_funct.add_to_config(haproxy_id)
|
||||
|
||||
|
||||
@route('/haproxy/<haproxy_id>/section/delete', method=['POST'])
|
||||
@route('/haproxy/<haproxy_id:int>/section/delete', method=['POST'])
|
||||
def haproxy_section_add(haproxy_id):
|
||||
if not check_login(required_service=1):
|
||||
return dict(error=_error_auth)
|
||||
return api_funct.edit_section(haproxy_id, delete=1)
|
||||
|
||||
|
||||
@route('/haproxy/<haproxy_id>/section/edit', method=['POST'])
|
||||
@route('/haproxy/<haproxy_id:int>/section/edit', method=['POST'])
|
||||
def haproxy_sectiond_edit(haproxy_id):
|
||||
|
|
|
@ -57,7 +57,7 @@ def get_token():
|
|||
if login in user.username and password == user.password:
|
||||
import uuid
|
||||
user_token = str(uuid.uuid4())
|
||||
role_id = sql.get_role_id_by_name(user.role)
|
||||
role_id = sql.get_role_id(user.user_id, group_id)
|
||||
sql.write_api_token(user_token, group_id, role_id, user.username)
|
||||
return user_token
|
||||
else:
|
||||
|
@ -340,7 +340,7 @@ def get_section(server_id):
|
|||
return dict(section=data)
|
||||
|
||||
|
||||
def edit_section(server_id):
|
||||
def edit_section(server_id, delete=0):
|
||||
body = request.body.getvalue().decode('utf-8')
|
||||
section_name = request.headers.get('section-name')
|
||||
save = request.headers.get('action')
|
||||
|
@ -356,6 +356,12 @@ def edit_section(server_id):
|
|||
elif save == 'reload':
|
||||
save = 'reload'
|
||||
|
||||
if delete == 1:
|
||||
body = ''
|
||||
action = 'deleted'
|
||||
else:
|
||||
action = 'edited'
|
||||
|
||||
for s in servers:
|
||||
ip = s[2]
|
||||
cfg = f'/tmp/{ip}.cfg'
|
||||
|
@ -376,9 +382,9 @@ def edit_section(server_id):
|
|||
return_mess = 'section has been updated'
|
||||
os.system(f"/bin/cp {cfg} {cfg_for_save}")
|
||||
out = config_mod.master_slave_upload_and_restart(ip, cfg, save, login=login)
|
||||
roxywi_common.logging('localhost', f" section {section_name} has been edited via API", login=login)
|
||||
roxywi_common.logging('localhost', f" section {section_name} has been {action} via API", login=login)
|
||||
roxywi_common.logging(
|
||||
ip, f'Section {section_name} has been edited via API', roxywi=1,
|
||||
ip, f'Section {section_name} has been {action} via API', roxywi=1,
|
||||
login=login, keep_history=1, service='haproxy'
|
||||
)
|
||||
|
||||
|
|
106
app/create_db.py
106
app/create_db.py
|
@ -148,9 +148,9 @@ def default_values():
|
|||
print(str(e))
|
||||
|
||||
data_source = [
|
||||
{'username': 'admin', 'email': 'admin@localhost', 'password': '21232f297a57a5a743894a0e4a801fc3', 'role': 'superAdmin', 'groups': '1'},
|
||||
{'username': 'editor', 'email': 'editor@localhost', 'password': '5aee9dbd2a188839105073571bee1b1f', 'role': 'admin', 'groups': '1'},
|
||||
{'username': 'guest', 'email': 'guest@localhost', 'password': '084e0343a0486ff05530df6c705c8bb4', 'role': 'guest', 'groups': '1'}
|
||||
{'username': 'admin', 'email': 'admin@localhost', 'password': '21232f297a57a5a743894a0e4a801fc3', 'role': '1', 'groups': '1'},
|
||||
{'username': 'editor', 'email': 'editor@localhost', 'password': '5aee9dbd2a188839105073571bee1b1f', 'role': '2', 'groups': '1'},
|
||||
{'username': 'guest', 'email': 'guest@localhost', 'password': '084e0343a0486ff05530df6c705c8bb4', 'role': '4', 'groups': '1'}
|
||||
]
|
||||
|
||||
try:
|
||||
|
@ -681,78 +681,6 @@ def update_db_v_4_3_0():
|
|||
print("An error occurred:", e)
|
||||
|
||||
|
||||
def update_db_v_5_2_4():
|
||||
cursor = conn.cursor()
|
||||
sql = """ALTER TABLE `user` ADD COLUMN user_services varchar(20) DEFAULT '1 2 3 4';"""
|
||||
try:
|
||||
cursor.execute(sql)
|
||||
except Exception as e:
|
||||
if str(e) == 'duplicate column name: user_services' or str(e) == '(1060, "Duplicate column name \'user_services\'")':
|
||||
print('Updating... DB has been updated to version 5.2.4')
|
||||
else:
|
||||
print("An error occurred:", e)
|
||||
else:
|
||||
print("Updating... DB has been updated to version 5.2.4")
|
||||
|
||||
|
||||
def update_db_v_5_2_4_1():
|
||||
cursor = conn.cursor()
|
||||
sql = """ALTER TABLE `servers` ADD COLUMN nginx_metrics integer DEFAULT 0;"""
|
||||
try:
|
||||
cursor.execute(sql)
|
||||
except Exception as e:
|
||||
if str(e) == 'duplicate column name: nginx_metrics' or str(e) == '(1060, "Duplicate column name \'nginx_metrics\'")':
|
||||
print('Updating... DB has been updated to version 5.2.4-1')
|
||||
else:
|
||||
print("An error occurred:", e)
|
||||
else:
|
||||
print("Updating... DB has been updated to version 5.2.4-1")
|
||||
|
||||
|
||||
def update_db_v_5_2_5_1():
|
||||
query = User.update(role='user').where(User.role == 'editor')
|
||||
try:
|
||||
query.execute()
|
||||
except Exception as e:
|
||||
print("An error occurred:", e)
|
||||
else:
|
||||
print("Updating... DB has been updated to version 5.2.5-1")
|
||||
|
||||
|
||||
def update_db_v_5_2_5_2():
|
||||
query = Role.delete().where(Role.name == 'editor')
|
||||
try:
|
||||
query.execute()
|
||||
except Exception as e:
|
||||
print("An error occurred:", e)
|
||||
else:
|
||||
print("Updating... DB has been updated to version 5.2.5-2")
|
||||
|
||||
|
||||
def update_db_v_5_2_5_3():
|
||||
cursor = conn.cursor()
|
||||
sql = list()
|
||||
sql.append("alter table user add column last_login_date timestamp default '0000-00-00 00:00:00'")
|
||||
sql.append("alter table user add column last_login_ip VARCHAR ( 64 )")
|
||||
for i in sql:
|
||||
try:
|
||||
cursor.execute(i)
|
||||
except Exception:
|
||||
pass
|
||||
else:
|
||||
print('Updating... DB has been updated to version 5.2.5-3')
|
||||
|
||||
|
||||
def update_db_v_5_2_6():
|
||||
query = Setting.delete().where(Setting.param == 'haproxy_enterprise')
|
||||
try:
|
||||
query.execute()
|
||||
except Exception as e:
|
||||
print("An error occurred:", e)
|
||||
else:
|
||||
print("Updating... DB has been updated to version 5.2.6")
|
||||
|
||||
|
||||
def update_db_v_5_3_0():
|
||||
groups = ''
|
||||
query = Groups.select()
|
||||
|
@ -996,9 +924,28 @@ def update_db_v_6_3_5():
|
|||
print("Updating... DB has been updated to version 6.3.5.0")
|
||||
|
||||
|
||||
def update_db_v_6_3_6():
|
||||
cursor = conn.cursor()
|
||||
sql = list()
|
||||
sql.append("ALTER TABLE `user_groups` ADD COLUMN user_role_id integer;")
|
||||
if mysql_enable == '1':
|
||||
sql.append("update user_groups u_g inner join user as u on u_g.user_id = u.id inner join role as r on r.name = u.role set user_role_id = r.id where u_g.user_role_id is NULL;")
|
||||
sql.append("update user u inner join role as r on r.name = u.role set u.role = r.id;")
|
||||
else:
|
||||
sql.append("update user_groups as u_g set user_role_id = (select r.id from role as r inner join user as u on u.role = r.name where u_g.user_id = u.id) where user_role_id is null;")
|
||||
sql.append("update user as u set role = (select r.id from role as r where r.name = u.role);")
|
||||
for i in sql:
|
||||
try:
|
||||
cursor.execute(i)
|
||||
except Exception:
|
||||
pass
|
||||
else:
|
||||
print("Updating... DB has been updated to version 6.3.6.0")
|
||||
|
||||
|
||||
def update_ver():
|
||||
try:
|
||||
Version.update(version='6.3.6.0').execute()
|
||||
Version.update(version='6.3.7.0').execute()
|
||||
except Exception:
|
||||
print('Cannot update version')
|
||||
|
||||
|
@ -1016,12 +963,6 @@ def update_all():
|
|||
if check_ver() is None:
|
||||
update_db_v_3_4_5_22()
|
||||
update_db_v_4_3_0()
|
||||
update_db_v_5_2_4()
|
||||
update_db_v_5_2_4_1()
|
||||
update_db_v_5_2_5_1()
|
||||
update_db_v_5_2_5_2()
|
||||
update_db_v_5_2_5_3()
|
||||
update_db_v_5_2_6()
|
||||
update_db_v_5_3_0()
|
||||
update_db_v_5_3_1()
|
||||
update_db_v_5_3_2_2()
|
||||
|
@ -1036,6 +977,7 @@ def update_all():
|
|||
update_db_v_6_2_1()
|
||||
update_db_v_6_3_4()
|
||||
update_db_v_6_3_5()
|
||||
update_db_v_6_3_6()
|
||||
update_ver()
|
||||
|
||||
|
||||
|
|
|
@ -185,7 +185,7 @@ except Exception as e:
|
|||
error = f'error: {e}'
|
||||
|
||||
try:
|
||||
role = sql.get_user_role_by_uuid(user_id.value)
|
||||
role = sql.get_user_role_by_uuid(user_id.value, user_group_id)
|
||||
user = sql.get_user_name_by_uuid(user_id.value)
|
||||
except Exception:
|
||||
role = ""
|
||||
|
|
|
@ -25,7 +25,7 @@ def get_config(server_ip, cfg, **kwargs):
|
|||
kwargs.get("nginx") or kwargs.get("service") == 'nginx'
|
||||
or kwargs.get("apache") or kwargs.get("service") == 'apache'
|
||||
):
|
||||
config_path = kwargs.get('config_file_name')
|
||||
config_path = common.checkAjaxInput(kwargs.get('config_file_name'))
|
||||
elif kwargs.get("waf") or kwargs.get("service") == 'waf':
|
||||
if kwargs.get("waf") == 'haproxy':
|
||||
config_path = f'{sql.get_setting("haproxy_dir")}/waf/rules/{kwargs.get("waf_rule_file")}'
|
||||
|
@ -34,6 +34,9 @@ def get_config(server_ip, cfg, **kwargs):
|
|||
else:
|
||||
config_path = sql.get_setting('haproxy_config_path')
|
||||
|
||||
if '..' in config_path:
|
||||
return 'error: nice try'
|
||||
|
||||
try:
|
||||
with mod_ssh.ssh_connect(server_ip) as ssh:
|
||||
ssh.get_sftp(config_path, cfg)
|
||||
|
@ -119,7 +122,7 @@ def upload_and_restart(server_ip: str, cfg: str, **kwargs):
|
|||
login = 1
|
||||
|
||||
try:
|
||||
os.system(f"dos2unix {cfg}")
|
||||
os.system(f"dos2unix -q {cfg}")
|
||||
except OSError:
|
||||
return 'error: there is no dos2unix'
|
||||
|
||||
|
@ -504,7 +507,9 @@ def show_config(server_ip: str) -> None:
|
|||
|
||||
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
|
||||
user_uuid = cookie.get('uuid')
|
||||
role_id = sql.get_user_role_by_uuid(user_uuid.value)
|
||||
group_id = cookie.get('group')
|
||||
group_id = int(group_id.value)
|
||||
role_id = sql.get_user_role_by_uuid(user_uuid.value, group_id)
|
||||
service = form.getvalue('service')
|
||||
try:
|
||||
config_file_name = form.getvalue('config_file_name').replace('/', '92')
|
||||
|
|
|
@ -161,6 +161,7 @@ class Groups(BaseModel):
|
|||
class UserGroups(BaseModel):
|
||||
user_id = IntegerField()
|
||||
user_group_id = IntegerField()
|
||||
user_role_id = IntegerField()
|
||||
|
||||
class Meta:
|
||||
table_name = 'user_groups'
|
||||
|
|
|
@ -73,18 +73,22 @@ def add_user(user, email, password, role, activeuser, group):
|
|||
if password != 'aduser':
|
||||
try:
|
||||
hashed_pass = roxy_wi_tools.Tools.get_hash(password)
|
||||
User.insert(
|
||||
last_id = User.insert(
|
||||
username=user, email=email, password=hashed_pass, role=role, activeuser=activeuser, groups=group
|
||||
).execute()
|
||||
except Exception as e:
|
||||
out_error(e)
|
||||
else:
|
||||
return last_id
|
||||
else:
|
||||
try:
|
||||
User.insert(
|
||||
last_id = User.insert(
|
||||
username=user, email=email, role=role, ldap_user=1, activeuser=activeuser, groups=group
|
||||
).execute()
|
||||
except Exception as e:
|
||||
out_error(e)
|
||||
else:
|
||||
return last_id
|
||||
|
||||
|
||||
def update_user(user, email, role, user_id, activeuser):
|
||||
|
@ -99,16 +103,6 @@ def update_user(user, email, role, user_id, activeuser):
|
|||
return True
|
||||
|
||||
|
||||
def update_user_groups(groups, user_group_id):
|
||||
try:
|
||||
UserGroups.insert(user_id=user_group_id, user_group_id=groups).execute()
|
||||
except Exception as e:
|
||||
out_error(e)
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
|
||||
def delete_user_groups(user_id):
|
||||
group_for_delete = UserGroups.delete().where(UserGroups.user_id == user_id)
|
||||
try:
|
||||
|
@ -440,9 +434,16 @@ def select_user_groups_with_names(user_id, **kwargs):
|
|||
query = (UserGroups.select(
|
||||
UserGroups.user_group_id, UserGroups.user_id, Groups.name
|
||||
).join(Groups, on=(UserGroups.user_group_id == Groups.group_id)))
|
||||
elif kwargs.get("user_not_in_group") is not None:
|
||||
query = (Groups.select(
|
||||
Groups.group_id, Groups.name
|
||||
).join(UserGroups, on=(
|
||||
(UserGroups.user_group_id == Groups.group_id) &
|
||||
(UserGroups.user_id == user_id)
|
||||
), join_type=JOIN.LEFT_OUTER).group_by(Groups.name).where(UserGroups.user_id.is_null(True)))
|
||||
else:
|
||||
query = (UserGroups.select(
|
||||
UserGroups.user_group_id, Groups.name
|
||||
UserGroups.user_group_id, UserGroups.user_role_id, Groups.name, Groups.group_id
|
||||
).join(Groups, on=(UserGroups.user_group_id == Groups.group_id)).where(UserGroups.user_id == user_id))
|
||||
try:
|
||||
query_res = query.execute()
|
||||
|
@ -767,27 +768,21 @@ def get_user_id_by_username(username: str):
|
|||
return query
|
||||
|
||||
|
||||
def get_user_role_by_uuid(uuid):
|
||||
def get_user_role_by_uuid(uuid, group_id):
|
||||
query = (
|
||||
Role.select(Role.role_id).join(User, on=(Role.name == User.role)).join(
|
||||
UUID, on=(User.user_id == UUID.user_id)
|
||||
).where(UUID.uuid == uuid))
|
||||
UserGroups.select(UserGroups.user_role_id).join(UUID, on=(UserGroups.user_id == UUID.user_id)
|
||||
).where(
|
||||
(UUID.uuid == uuid) &
|
||||
(UserGroups.user_group_id == group_id)
|
||||
)
|
||||
)
|
||||
try:
|
||||
query_res = query.execute()
|
||||
except Exception as e:
|
||||
out_error(e)
|
||||
else:
|
||||
for user_id in query_res:
|
||||
return int(user_id.role_id)
|
||||
|
||||
|
||||
def get_role_id_by_name(name):
|
||||
try:
|
||||
role_id = Role.get(Role.name == name)
|
||||
except Exception as e:
|
||||
out_error(e)
|
||||
else:
|
||||
return int(role_id.role_id)
|
||||
return int(user_id.user_role_id)
|
||||
|
||||
|
||||
def get_user_telegram_by_group(group):
|
||||
|
@ -3917,3 +3912,19 @@ def get_smon_alert_status(service_ip: str, alert: str) -> int:
|
|||
out_error(e)
|
||||
else:
|
||||
return alert_value
|
||||
|
||||
|
||||
def update_user_role(user_id: int, group_id: int, role_id: int) -> None:
|
||||
try:
|
||||
UserGroups.insert(user_id=user_id, user_group_id=group_id, user_role_id=role_id).on_conflict('replace').execute()
|
||||
except Exception as e:
|
||||
out_error(e)
|
||||
|
||||
|
||||
def get_role_id(user_id: int, group_id: int) -> int:
|
||||
try:
|
||||
role_id = UserGroups.get((UserGroups.user_id == user_id) & (UserGroups.user_group_id == group_id))
|
||||
except Exception as e:
|
||||
out_error(e)
|
||||
else:
|
||||
return int(role_id.user_role_id)
|
||||
|
|
|
@ -42,9 +42,11 @@ def is_admin(level=1, **kwargs):
|
|||
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
|
||||
user_id = cookie.get('uuid')
|
||||
user_id = user_id.value
|
||||
group_id = cookie.get('group')
|
||||
group_id = int(group_id.value)
|
||||
|
||||
try:
|
||||
role = sql.get_user_role_by_uuid(user_id)
|
||||
role = sql.get_user_role_by_uuid(user_id, group_id)
|
||||
except Exception:
|
||||
role = 4
|
||||
pass
|
||||
|
|
|
@ -230,8 +230,16 @@ def get_users_params(**kwargs):
|
|||
except Exception:
|
||||
print('<meta http-equiv="refresh" content="0; url=/app/login.py">')
|
||||
return
|
||||
|
||||
try:
|
||||
role = sql.get_user_role_by_uuid(user_uuid.value)
|
||||
group_id = cookie.get('group')
|
||||
group_id = int(group_id.value)
|
||||
except Exception:
|
||||
print('<meta http-equiv="refresh" content="0; url=/app/login.py">')
|
||||
return
|
||||
|
||||
try:
|
||||
role = sql.get_user_role_by_uuid(user_uuid.value, group_id)
|
||||
except Exception:
|
||||
print('<meta http-equiv="refresh" content="0; url=/app/login.py">')
|
||||
return
|
||||
|
|
|
@ -17,6 +17,7 @@ def user_ovw() -> None:
|
|||
template = env.get_template('ajax/show_users_ovw.html')
|
||||
|
||||
lang = roxywi_common.get_user_lang()
|
||||
roles = sql.select_roles()
|
||||
user_params = roxywi_common.get_users_params()
|
||||
users_groups = sql.select_user_groups_with_names(1, all=1)
|
||||
user_group = roxywi_common.get_user_group(id=1)
|
||||
|
@ -26,7 +27,7 @@ def user_ovw() -> None:
|
|||
else:
|
||||
users = sql.select_users()
|
||||
|
||||
template = template.render(users=users, users_groups=users_groups, lang=lang)
|
||||
template = template.render(users=users, users_groups=users_groups, lang=lang, roles=roles)
|
||||
print(template)
|
||||
|
||||
|
||||
|
@ -113,13 +114,15 @@ def show_overview(serv) -> None:
|
|||
template = env.get_template('overview.html')
|
||||
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
|
||||
user_uuid = cookie.get('uuid')
|
||||
group_id = cookie.get('group')
|
||||
group_id = int(group_id.value)
|
||||
futures = [async_get_overview(server[1], server[2], user_uuid.value, server[0]) for server in
|
||||
sql.select_servers(server=serv)]
|
||||
for i, future in enumerate(asyncio.as_completed(futures)):
|
||||
result = await future
|
||||
servers.append(result)
|
||||
servers_sorted = sorted(servers, key=common.get_key)
|
||||
template = template.render(service_status=servers_sorted, role=sql.get_user_role_by_uuid(user_uuid.value))
|
||||
template = template.render(service_status=servers_sorted, role=sql.get_user_role_by_uuid(user_uuid.value, group_id))
|
||||
print(template)
|
||||
|
||||
ioloop = asyncio.get_event_loop()
|
||||
|
|
|
@ -16,8 +16,13 @@ def create_user(new_user: str, email: str, password: str, role: str, activeuser:
|
|||
|
||||
if roxywi_auth.is_admin(level=2, role_id=kwargs.get('role_id')):
|
||||
try:
|
||||
sql.add_user(new_user, email, password, role, activeuser, group)
|
||||
user_id = sql.add_user(new_user, email, password, role, activeuser, group)
|
||||
sql.update_user_role(user_id, group, role)
|
||||
roxywi_common.logging(f'a new user {new_user}', ' has been created ', roxywi=1, login=1)
|
||||
try:
|
||||
sql.update_user_role(user_id, group_id, role_id)
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
try:
|
||||
if password == 'aduser':
|
||||
password = 'your domain password'
|
||||
|
@ -55,15 +60,16 @@ def delete_user():
|
|||
|
||||
def update_user():
|
||||
email = form.getvalue('email')
|
||||
role = form.getvalue('role')
|
||||
role_id = int(form.getvalue('role'))
|
||||
new_user = form.getvalue('updateuser')
|
||||
user_id = form.getvalue('id')
|
||||
activeuser = form.getvalue('activeuser')
|
||||
role_id = sql.get_role_id_by_name(role)
|
||||
group_id = int(form.getvalue('usergroup'))
|
||||
|
||||
if roxywi_common.check_user_group():
|
||||
if roxywi_auth.is_admin(level=role_id):
|
||||
sql.update_user(new_user, email, role, user_id, activeuser)
|
||||
sql.update_user(new_user, email, role_id, user_id, activeuser)
|
||||
sql.update_user_role(user_id, group_id, role_id)
|
||||
roxywi_common.logging(new_user, ' has been updated user ', roxywi=1, login=1)
|
||||
else:
|
||||
roxywi_common.logging(new_user, ' tried to privilege escalation', roxywi=1, login=1)
|
||||
|
@ -88,11 +94,7 @@ def update_user_password():
|
|||
def get_user_services() -> None:
|
||||
user_id = common.checkAjaxInput(form.getvalue('getuserservices'))
|
||||
lang = roxywi_common.get_user_lang()
|
||||
groups = []
|
||||
u_g = sql.select_user_groups(user_id)
|
||||
services = sql.select_services()
|
||||
for g in u_g:
|
||||
groups.append(g.user_group_id)
|
||||
|
||||
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
|
||||
template = env.get_template('ajax/show_user_services.html')
|
||||
|
@ -101,47 +103,35 @@ def get_user_services() -> None:
|
|||
|
||||
|
||||
def change_user_services() -> None:
|
||||
import json
|
||||
|
||||
user_id = common.checkAjaxInput(form.getvalue('changeUserServicesId'))
|
||||
services = common.checkAjaxInput(form.getvalue('changeUserServices'))
|
||||
user = common.checkAjaxInput(form.getvalue('changeUserServicesUser'))
|
||||
services = ''
|
||||
user_services = json.loads(form.getvalue('jsonDatas'))
|
||||
|
||||
for k, v in user_services.items():
|
||||
for k2, v2 in v.items():
|
||||
services += ' ' + k2
|
||||
|
||||
try:
|
||||
if sql.update_user_services(services=services, user_id=user_id):
|
||||
roxywi_common.logging('Roxy-WI server', f'Access to the services has been updated for user: {user}',
|
||||
roxywi=1, login=1)
|
||||
roxywi_common.logging('Roxy-WI server', f'Access to the services has been updated for user: {user}', roxywi=1, login=1)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
|
||||
def get_user_groups() -> None:
|
||||
user_id = common.checkAjaxInput(form.getvalue('getusergroups'))
|
||||
def move_user_service(action) -> None:
|
||||
service_id = common.checkAjaxInput(form.getvalue('service_id'))
|
||||
service_name = common.checkAjaxInput(form.getvalue('service_name'))
|
||||
length_tr = common.checkAjaxInput(form.getvalue('length_tr'))
|
||||
lang = roxywi_common.get_user_lang()
|
||||
groups = []
|
||||
u_g = sql.select_user_groups(user_id)
|
||||
for g in u_g:
|
||||
groups.append(g.user_group_id)
|
||||
|
||||
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
|
||||
template = env.get_template('ajax/show_user_groups.html')
|
||||
template = template.render(groups=sql.select_groups(), user_groups=groups, id=user_id, lang=lang)
|
||||
template = env.get_template('ajax/move_user_service.html')
|
||||
template = template.render(lang=lang, service_id=service_id, service_name=service_name, length_tr=length_tr, action=action)
|
||||
print(template)
|
||||
|
||||
|
||||
def change_user_group() -> None:
|
||||
group_id = common.checkAjaxInput(form.getvalue('changeUserGroupId'))
|
||||
groups = common.checkAjaxInput(form.getvalue('changeUserGroups'))
|
||||
user = common.checkAjaxInput(form.getvalue('changeUserGroupsUser'))
|
||||
if sql.delete_user_groups(group_id):
|
||||
for group in groups:
|
||||
if group[0] == ',':
|
||||
continue
|
||||
try:
|
||||
sql.update_user_groups(groups=group[0], user_group_id=group_id)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
roxywi_common.logging('Roxy-WI server', f'Groups has been updated for user: {user}', roxywi=1, login=1)
|
||||
|
||||
|
||||
def change_user_active_group() -> None:
|
||||
group_id = common.checkAjaxInput(form.getvalue('changeUserCurrentGroupId'))
|
||||
|
@ -164,3 +154,61 @@ def get_user_active_group(user_id: str, group: str) -> None:
|
|||
template = env.get_template('ajax/show_user_current_group.html')
|
||||
template = template.render(groups=groups, group=group.value, id=group_id, lang=lang)
|
||||
print(template)
|
||||
|
||||
|
||||
def show_user_groups_and_roles() -> None:
|
||||
user_id = common.checkAjaxInput(form.getvalue('user_id'))
|
||||
groups = sql.select_user_groups_with_names(user_id, user_not_in_group=1)
|
||||
roles = sql.select_roles()
|
||||
lang = roxywi_common.get_user_lang()
|
||||
user_groups = sql.select_user_groups_with_names(user_id)
|
||||
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
|
||||
template = env.get_template('ajax/show_user_groups_and_roles.html')
|
||||
template = template.render(groups=groups, user_groups=user_groups, roles=roles, lang=lang)
|
||||
print(template)
|
||||
|
||||
|
||||
def add_user_group_and_role() -> None:
|
||||
group_id = common.checkAjaxInput(form.getvalue('group_id'))
|
||||
group_name = common.checkAjaxInput(form.getvalue('group_name'))
|
||||
length_tr = common.checkAjaxInput(form.getvalue('length_tr'))
|
||||
roles = sql.select_roles()
|
||||
lang = roxywi_common.get_user_lang()
|
||||
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
|
||||
template = env.get_template('ajax/add_user_group_and_role.html')
|
||||
template = template.render(roles=roles, lang=lang, group_id=group_id, group_name=group_name, length_tr=length_tr)
|
||||
print(template)
|
||||
|
||||
|
||||
def remove_user_group_and_role() -> None:
|
||||
group_id = common.checkAjaxInput(form.getvalue('group_id'))
|
||||
group_name = common.checkAjaxInput(form.getvalue('group_name'))
|
||||
length_tr = common.checkAjaxInput(form.getvalue('length_tr'))
|
||||
lang = roxywi_common.get_user_lang()
|
||||
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
|
||||
template = env.get_template('ajax/remove_user_group_and_role.html')
|
||||
template = template.render(lang=lang, group_id=group_id, group_name=group_name, length_tr=length_tr)
|
||||
print(template)
|
||||
|
||||
|
||||
def save_user_group_and_role() -> None:
|
||||
import json
|
||||
|
||||
user = common.checkAjaxInput(form.getvalue('changeUserGroupsUser'))
|
||||
groups_and_roles = json.loads(form.getvalue('jsonDatas'))
|
||||
|
||||
for k, v in groups_and_roles.items():
|
||||
user_id = int(k)
|
||||
if not sql.delete_user_groups(user_id):
|
||||
print('error: cannot delete old groups')
|
||||
for k2, v2 in v.items():
|
||||
group_id = int(k2)
|
||||
role_id = int(v2['role_id'])
|
||||
try:
|
||||
sql.update_user_role(user_id, group_id, role_id)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
break
|
||||
else:
|
||||
roxywi_common.logging('Roxy-WI server', f'Groups and roles have been updated for user: {user}', roxywi=1, login=1)
|
||||
print('ok')
|
||||
|
|
|
@ -21,6 +21,8 @@ def waf_overview(serv, waf_service) -> None:
|
|||
servers = sql.select_servers(server=serv)
|
||||
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
|
||||
user_id = cookie.get('uuid')
|
||||
group_id = cookie.get('group')
|
||||
group_id = int(group_id.value)
|
||||
|
||||
config_path = ''
|
||||
returned_servers = []
|
||||
|
@ -77,7 +79,7 @@ def waf_overview(serv, waf_service) -> None:
|
|||
|
||||
lang = roxywi_common.get_user_lang()
|
||||
servers_sorted = sorted(returned_servers, key=common.get_key)
|
||||
template = template.render(service_status=servers_sorted, role=sql.get_user_role_by_uuid(user_id.value),
|
||||
template = template.render(service_status=servers_sorted, role=sql.get_user_role_by_uuid(user_id.value, group_id),
|
||||
waf_service=waf_service, lang=lang)
|
||||
print(template)
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ import modules.db.sql as sql
|
|||
import modules.server.ssh as mod_ssh
|
||||
import modules.common.common as common
|
||||
import modules.server.server as server_mod
|
||||
import modules.roxywi.common as roxywi_common
|
||||
import modules.roxy_wi_tools as roxy_wi_tools
|
||||
|
||||
time_zone = sql.get_setting('time_zone')
|
||||
|
@ -26,7 +27,9 @@ def check_haproxy_version(server_ip):
|
|||
def is_restarted(server_ip: str, action: str) -> None:
|
||||
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
|
||||
user_uuid = cookie.get('uuid')
|
||||
user_role = sql.get_user_role_by_uuid(user_uuid.value)
|
||||
group_id = cookie.get('group')
|
||||
group_id = int(group_id.value)
|
||||
user_role = sql.get_user_role_by_uuid(user_uuid.value, group_id)
|
||||
|
||||
if sql.is_serv_protected(server_ip) and int(user_role) > 2:
|
||||
print(f'error: This server is protected. You cannot {action} it')
|
||||
|
@ -137,8 +140,8 @@ def overview_backends(server_ip: str, service: str) -> None:
|
|||
import modules.config.section as section_mod
|
||||
import modules.roxywi.common as roxywi_common
|
||||
|
||||
env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True)
|
||||
template = env.get_template('haproxyservers_backends.html')
|
||||
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
|
||||
template = env.get_template('ajax/haproxyservers_backends.html')
|
||||
format_file = 'cfg'
|
||||
|
||||
if service == 'haproxy':
|
||||
|
@ -196,6 +199,8 @@ def overview_service(server_ip: str, server_id: int, name: str, service: str) ->
|
|||
import asyncio
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
user_params = roxywi_common.get_users_params()
|
||||
|
||||
async def async_get_overviewServers(serv1, serv2, service):
|
||||
if service == 'haproxy':
|
||||
cmd = 'echo "show info" |nc %s %s -w 1|grep -e "node\|Nbproc\|Maxco\|MB\|Nbthread"' % (
|
||||
|
@ -217,20 +222,22 @@ def overview_service(server_ip: str, server_id: int, name: str, service: str) ->
|
|||
return server_status
|
||||
|
||||
async def get_runner_overviewServers(**kwargs):
|
||||
env = Environment(loader=FileSystemLoader('templates/ajax'), extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'])
|
||||
template = env.get_template('overviewServers.html')
|
||||
env = Environment(loader=FileSystemLoader('templates/'), extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'])
|
||||
template = env.get_template('ajax/overviewServers.html')
|
||||
|
||||
servers = []
|
||||
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
|
||||
user_id = cookie.get('uuid')
|
||||
role = sql.get_user_role_by_uuid(user_id.value)
|
||||
group_id = cookie.get('group')
|
||||
group_id = int(group_id.value)
|
||||
role = sql.get_user_role_by_uuid(user_id.value, group_id)
|
||||
futures = [async_get_overviewServers(kwargs.get('server1'), kwargs.get('server2'), kwargs.get('service'))]
|
||||
|
||||
for i, future in enumerate(asyncio.as_completed(futures)):
|
||||
result = await future
|
||||
servers.append(result)
|
||||
servers_sorted = sorted(servers, key=common.get_key)
|
||||
template = template.render(service_status=servers_sorted, role=role, id=kwargs.get('id'), service_page=service)
|
||||
template = template.render(service_status=servers_sorted, role=role, id=kwargs.get('id'), service_page=service, lang=user_params['lang'])
|
||||
print(template)
|
||||
|
||||
ioloop = asyncio.get_event_loop()
|
||||
|
|
|
@ -1085,22 +1085,41 @@ if form.getvalue('getuserservices'):
|
|||
|
||||
roxy_user.get_user_services()
|
||||
|
||||
|
||||
if form.getvalue('getusergroups'):
|
||||
if act == 'show_user_group_and_role':
|
||||
import modules.roxywi.user as roxy_user
|
||||
|
||||
roxy_user.get_user_groups()
|
||||
roxy_user.show_user_groups_and_roles()
|
||||
|
||||
if form.getvalue('changeUserGroupId') is not None:
|
||||
if act == 'add_user_group_and_role':
|
||||
import modules.roxywi.user as roxy_user
|
||||
|
||||
roxy_user.change_user_group()
|
||||
roxy_user.add_user_group_and_role()
|
||||
|
||||
if act == 'remove_user_group_and_role':
|
||||
import modules.roxywi.user as roxy_user
|
||||
|
||||
roxy_user.remove_user_group_and_role()
|
||||
|
||||
if act == 'save_user_group_and_role':
|
||||
import modules.roxywi.user as roxy_user
|
||||
|
||||
roxy_user.save_user_group_and_role()
|
||||
|
||||
if form.getvalue('changeUserServicesId') is not None:
|
||||
import modules.roxywi.user as roxy_user
|
||||
|
||||
roxy_user.change_user_services()
|
||||
|
||||
if act == 'add_user_service':
|
||||
import modules.roxywi.user as roxy_user
|
||||
|
||||
roxy_user.move_user_service('add')
|
||||
|
||||
if act == 'remove_user_service':
|
||||
import modules.roxywi.user as roxy_user
|
||||
|
||||
roxy_user.move_user_service('remove')
|
||||
|
||||
if form.getvalue('changeUserCurrentGroupId') is not None:
|
||||
import modules.roxywi.user as roxy_user
|
||||
|
||||
|
@ -1561,7 +1580,9 @@ if any((form.getvalue('do_new_name'), form.getvalue('aws_new_name'), form.getval
|
|||
if is_add:
|
||||
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
|
||||
user_uuid = cookie.get('uuid')
|
||||
role_id = sql.get_user_role_by_uuid(user_uuid.value)
|
||||
group_id = cookie.get('group')
|
||||
group_id = int(group_id.value)
|
||||
role_id = sql.get_user_role_by_uuid(user_uuid.value, group_id)
|
||||
params = sql.select_provisioning_params()
|
||||
providers = sql.select_providers(provider_group, key=provider_token)
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ try:
|
|||
servers = roxywi_common.get_dick_permit(virt=1, disable=0, only_group=1)
|
||||
masters = sql.select_servers(get_master_servers=1, uuid=user_params['user_uuid'].value)
|
||||
is_needed_tool = common.is_tool('ansible')
|
||||
user_roles = sql.select_user_roles_by_group(user_group)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
@ -54,6 +55,6 @@ rendered_template = template.render(
|
|||
token=user_params['token'], settings=settings, backups=sql.select_backups(), page="servers.py",
|
||||
geoip_country_codes=geoip_country_codes, user_services=user_params['user_services'], ldap_enable=ldap_enable,
|
||||
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], gits=gits,
|
||||
is_needed_tool=is_needed_tool, lang=user_params['lang']
|
||||
is_needed_tool=is_needed_tool, lang=user_params['lang'], user_roles=user_roles
|
||||
)
|
||||
print(rendered_template)
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
{% extends "base.html" %}
|
||||
{% block title %}{{lang.words.admin_area|title()}}{% endblock %}
|
||||
{% block h2 %}{{lang.words.admin_area|title()}}{% endblock %}
|
||||
{% block content %}
|
||||
{% from 'include/input_macros.html' import input, select, copy_to_clipboard, checkbox %}
|
||||
<script src="/inc/users.js"></script>
|
||||
|
@ -142,9 +144,6 @@
|
|||
</div>
|
||||
</div>
|
||||
{% include 'include/admins_dialogs.html' %}
|
||||
<div id="change-user-groups-dialog" style="display: none;">
|
||||
<div id="change-user-groups-form"></div>
|
||||
</div>
|
||||
<script>
|
||||
$( function() {
|
||||
{% for user in users %}
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
{% import 'languages/'+lang|default('en')+'.html' as lang %}
|
||||
{% if length_tr|int() % 2 == 1 %}
|
||||
{% set class = 'even' %}
|
||||
{% endif %}
|
||||
<tr class="{{class}}" id="remove_group-{{group_id}}" data-group_name="{{group_name}}">
|
||||
<td class="padding20" style="width: 50%;">{{group_name}}</td>
|
||||
<td style="width: 50%;">
|
||||
<select id="add_role-{{group_id}}">
|
||||
{% for r in roles %}
|
||||
<option value="{{r.role_id}}">{{r.name}}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</td>
|
||||
<td><span class="remove_user_group" onclick="removeGroupFromUser({{group_id}})" title="{{lang.words.delete|title()}} {{lang.words.group2}}">-</span></td>
|
||||
</tr>
|
|
@ -0,0 +1,19 @@
|
|||
{% import 'languages/'+lang|default('en')+'.html' as lang %}
|
||||
{% if length_tr|int() % 2 == 1 %}
|
||||
{% set class = 'even' %}
|
||||
{% endif %}
|
||||
{% if action == 'add' %}
|
||||
{% set tr_id = 'remove_service-' + service_id %}
|
||||
{% else %}
|
||||
{% set tr_id = 'add_service-' + service_id %}
|
||||
{% endif %}
|
||||
<tr class="{{class}}" id="{{tr_id}}" data-service_name="{{service_name}}">
|
||||
<td class="padding20" style="width: 100%;">{{service_name}}</td>
|
||||
<td>
|
||||
{% if action == 'add' %}
|
||||
<span class="remove_user_group" onclick="removeServiceFromUser({{service_id}})" title="{{lang.words.delete|title()}} {{lang.words.service}}">-</span>
|
||||
{% else %}
|
||||
<span class="add_user_group" onclick="addServiceToUser({{service_id}})" title="{{lang.words.add|title()}} {{lang.words.service}}">+</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
|
@ -0,0 +1,8 @@
|
|||
{% import 'languages/'+lang|default('en')+'.html' as lang %}
|
||||
{% if length_tr|int() % 2 == 1 %}
|
||||
{% set class = 'even' %}
|
||||
{% endif %}
|
||||
<tr class="{{class}}" id="add_group-{{group_id}}" data-group_name="{{group_name}}">
|
||||
<td class="padding20" style="width: 100%">{{group_name}}</td>
|
||||
<td><span class="add_user_group" title="{{lang.words.add|title()}} {{lang.words.group2}}" onclick="addGroupToUser({{group_id}})">+</span></td>
|
||||
</tr>
|
|
@ -1,71 +0,0 @@
|
|||
{% import 'languages/'+lang|default('en')+'.html' as lang %}
|
||||
<style>
|
||||
.select-css {
|
||||
display: block;
|
||||
font-size: 16px;
|
||||
font-family: sans-serif;
|
||||
font-weight: 700;
|
||||
color: #444;
|
||||
line-height: 1.3;
|
||||
padding: .6em 1.4em .5em .8em;
|
||||
width: 80%;
|
||||
max-width: 90%;
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
border: 1px solid #aaa;
|
||||
box-shadow: 0 1px 0 1px rgba(0,0,0,.04);
|
||||
-moz-appearance: none;
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
background-color: #f9fcf9;
|
||||
background-size: .65em auto, 100%;
|
||||
}
|
||||
.select-css::-ms-expand {
|
||||
display: none;
|
||||
}
|
||||
.select-css:hover {
|
||||
border-color: #888;
|
||||
}
|
||||
.select-css:focus {
|
||||
border-color: #aaa;
|
||||
box-shadow: 0 0 1px 3px rgba(59, 153, 252, .7);
|
||||
box-shadow: 0 0 0 3px -moz-mac-focusring;
|
||||
color: #222;
|
||||
outline: none;
|
||||
}
|
||||
.select-css option {
|
||||
font-weight:normal;
|
||||
padding: 3px;
|
||||
margin-left: 0;
|
||||
padding-right: 1200px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
*[dir="rtl"] .select-css, :root:lang(ar) .select-css, :root:lang(iw) .select-css {
|
||||
background-position: left .7em top 50%, 0 0;
|
||||
padding: .6em .8em .5em 1.4em;
|
||||
}
|
||||
.select-css:disabled, .select-css[aria-disabled=true] {
|
||||
color: graytext;
|
||||
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'),
|
||||
linear-gradient(to bottom, #ffffff 0%,#e5e5e5 100%);
|
||||
}
|
||||
.select-css:disabled:hover, .select-css[aria-disabled=true] {
|
||||
border-color: #aaa;
|
||||
}
|
||||
</style>
|
||||
<table class="overview">
|
||||
<tr style="border: none;">
|
||||
<td class="padding20" style="width: 40%;"><b>{{lang.words.select|title()}} {{lang.words.one}} {{lang.words.or}} {{lang.words.more}} {{lang.words.groups2}}</b></td>
|
||||
<td>
|
||||
<select id="usergroup-{{id}}" name="usergroup-{{id}}" multiple class="select-css">
|
||||
{% for group in groups %}
|
||||
{% if group.group_id in user_groups %}
|
||||
<option value="{{ group.group_id }}" selected>{{ group.name }}</option>
|
||||
{% else %}
|
||||
<option value="{{ group.group_id }}">{{ group.name }}</option>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
|
@ -0,0 +1,34 @@
|
|||
{% import 'languages/'+lang|default('en')+'.html' as lang %}
|
||||
<table id="all_groups" style="width: 300px;float: left;margin-right: 50px;">
|
||||
<caption class="user_group_caption">{{lang.words.all|title()}} {{lang.words.groups}}</caption>
|
||||
<tbody>
|
||||
{% for group in groups %}
|
||||
<tr class="{{ loop.cycle('odd', 'even') }}" id="add_group-{{group.group_id}}" data-group_name="{{group.name}}">
|
||||
<td class="padding20" style="width: 100%">{{group.name}}</td>
|
||||
<td><span class="add_user_group" title="{{lang.words.add|title()}} {{lang.words.group2}}" onclick="addGroupToUser({{group.group_id}})">+</span></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<table id="checked_groups" style="width: 300px;">
|
||||
<caption class="user_group_caption">{{lang.phrases.user_groups}}</caption>
|
||||
<tbody>
|
||||
{% for u_g in user_groups %}
|
||||
<tr class="{{ loop.cycle('odd', 'even') }}" id="remove_group-{{u_g.groups.group_id}}" data-group_name="{{u_g.groups.name}}">
|
||||
<td class="padding20" style="width: 50%;">{{u_g.groups.name}}</td>
|
||||
<td style="width: 50%;">
|
||||
<select id="add_role-{{u_g.groups.group_id}}">
|
||||
{% for r in roles %}
|
||||
{% if r.role_id == u_g.user_role_id %}
|
||||
<option value="{{r.role_id}}" selected>{{r.name}}</option>
|
||||
{% else %}
|
||||
<option value="{{r.role_id}}">{{r.name}}</option>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
</td>
|
||||
<td><span class="remove_user_group" onclick="removeGroupFromUser({{u_g.groups.group_id}})" title="{{lang.words.delete|title()}} {{lang.words.group2}}">-</span></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
|
@ -1,71 +1,27 @@
|
|||
{% import 'languages/'+lang|default('en')+'.html' as lang %}
|
||||
<style>
|
||||
.select-css {
|
||||
display: block;
|
||||
font-size: 16px;
|
||||
font-family: sans-serif;
|
||||
font-weight: 700;
|
||||
color: #444;
|
||||
line-height: 1.3;
|
||||
padding: .6em 1.4em .5em .8em;
|
||||
width: 80%;
|
||||
max-width: 90%;
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
border: 1px solid #aaa;
|
||||
box-shadow: 0 1px 0 1px rgba(0,0,0,.04);
|
||||
-moz-appearance: none;
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
background-color: #f9fcf9;
|
||||
background-size: .65em auto, 100%;
|
||||
}
|
||||
.select-css::-ms-expand {
|
||||
display: none;
|
||||
}
|
||||
.select-css:hover {
|
||||
border-color: #888;
|
||||
}
|
||||
.select-css:focus {
|
||||
border-color: #aaa;
|
||||
box-shadow: 0 0 1px 3px rgba(59, 153, 252, .7);
|
||||
box-shadow: 0 0 0 3px -moz-mac-focusring;
|
||||
color: #222;
|
||||
outline: none;
|
||||
}
|
||||
.select-css option {
|
||||
font-weight:normal;
|
||||
padding: 3px;
|
||||
margin-left: 0;
|
||||
padding-right: 1200px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
*[dir="rtl"] .select-css, :root:lang(ar) .select-css, :root:lang(iw) .select-css {
|
||||
background-position: left .7em top 50%, 0 0;
|
||||
padding: .6em .8em .5em 1.4em;
|
||||
}
|
||||
.select-css:disabled, .select-css[aria-disabled=true] {
|
||||
color: graytext;
|
||||
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'),
|
||||
linear-gradient(to bottom, #ffffff 0%,#e5e5e5 100%);
|
||||
}
|
||||
.select-css:disabled:hover, .select-css[aria-disabled=true] {
|
||||
border-color: #aaa;
|
||||
}
|
||||
</style>
|
||||
<table class="overview">
|
||||
<tr style="border: none;">
|
||||
<td class="padding20" style="width: 40%;"><b>{{lang.words.select|title()}} {{lang.words.one2}} {{lang.words.or}} {{lang.words.more}} {{lang.words.services2}}</b></td>
|
||||
<td>
|
||||
<select id="userservice-{{id}}" name="userservice-{{id}}" multiple class="select-css">
|
||||
{% for s in services %}
|
||||
{% if s.service_id|string() in user_services %}
|
||||
<option value="{{ s.service_id }}" selected>{{ s.service }}</option>
|
||||
{% else %}
|
||||
<option value="{{ s.service_id }}">{{ s.service }}</option>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<table id="all_services" style="width: 300px;float: left;margin-right: 50px;">
|
||||
<caption class="user_group_caption">{{lang.words.all|title()}} {{lang.words.services}}</caption>
|
||||
<tbody>
|
||||
{% for service in services %}
|
||||
{% if service.service_id|string() not in user_services %}
|
||||
<tr class="{{ loop.cycle('odd', 'even') }}" id="add_service-{{service.service_id}}" data-service_name="{{service.service}}">
|
||||
<td class="padding20" style="width: 100%">{{service.service}}</td>
|
||||
<td><span class="add_user_group" title="{{lang.words.add|title()}} {{lang.words.service}}" onclick="addServiceToUser({{service.service_id}})">+</span></td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<table id="checked_services" style="width: 300px;">
|
||||
<caption class="user_group_caption">{{lang.words.user3|title()}} {{lang.words.services}}</caption>
|
||||
<tbody>
|
||||
{% for service in services %}
|
||||
{% if service.service_id|string() in user_services %}
|
||||
<tr class="{{ loop.cycle('odd', 'even') }}" id="remove_service-{{service.service_id}}" data-service_name="{{service.service}}">
|
||||
<td class="padding20" style="width: 100%;">{{service.service|title()}}</td>
|
||||
<td><span class="remove_user_group" onclick="removeServiceFromUser({{service.service_id}})" title="{{lang.words.delete|title()}} {{lang.words.service}}">-</span></td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
|
@ -24,7 +24,13 @@
|
|||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td>{{ USER.role }}</td>
|
||||
<td>
|
||||
{% for r in roles %}
|
||||
{% if r.role_id == USER.role|int() %}
|
||||
{{ r.name }}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
@ -50,7 +56,13 @@
|
|||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td>{{ USER.role }}</td>
|
||||
<td>
|
||||
{% for r in roles %}
|
||||
{% if r.role_id == USER.role|int() %}
|
||||
{{ r.name }}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
|
|
@ -274,7 +274,7 @@
|
|||
</div>
|
||||
<div id="show-updates" style="display: none;">
|
||||
<div>
|
||||
{{lang.phrases.new_version}} <a href="/app/users.py#updatehapwi" class="link">{{lang.words.update|title()}}</a>
|
||||
{{lang.phrases.new_version}} <a href="/app/users.py#updatehapwi" class="link">{{lang.words.w_update|title()}}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
|
@ -325,9 +325,15 @@
|
|||
{% if lang.lang_short == 'ru' %}
|
||||
<option value="en" title="English">English</option>
|
||||
<option value="ru" title="Русский" selected>Русский</option>
|
||||
<option value="fr" title="Français">Français</option>
|
||||
{% elif lang.lang_short == 'fr' %}
|
||||
<option value="en" title="English">English</option>
|
||||
<option value="ru" title="Русский">Русский</option>
|
||||
<option value="fr" title="Français" selected>Français</option>
|
||||
{% else %}
|
||||
<option value="en" title="English" selected>English</option>
|
||||
<option value="ru" title="Русский">Русский</option>
|
||||
<option value="fr" title="Français">Français</option>
|
||||
{% endif %}
|
||||
</select>
|
||||
</td>
|
||||
|
|
|
@ -7,9 +7,10 @@
|
|||
<th style="width: 10%">{{lang.words.password|title()}}</th>
|
||||
<th style="width: 10%" id="user-active-th">{{lang.words.active|title()}}</th>
|
||||
<th style="width: 20%">{{lang.words.email|title()}}</th>
|
||||
{% if page == "servers.py" %}
|
||||
<th style="width: 10%" id="user-role-th">{{lang.words.role|title()}}</th>
|
||||
{% if page != "servers.py" %}
|
||||
<th style="width: 10%">{{lang.words.groups|title()}}</th>
|
||||
{% else %}
|
||||
<th style="width: 10%" id="user-group-role-th">{{lang.words.groups|title()}} {{lang.words.and}} {{lang.words.roles|title()}}</th>
|
||||
{% endif %}
|
||||
<th style="width: 100%" id="user-services-th">{{lang.words.services|title()}}</th>
|
||||
<th></th>
|
||||
|
@ -55,32 +56,25 @@
|
|||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if page == "servers.py" %}
|
||||
<select id="role-{{user.user_id}}" name="role-{{user.user_id}}" {{disable_superAdmin}}>
|
||||
<option disabled selected>Select a role</option>
|
||||
{% for r in roles %}
|
||||
{% if page == "servers.py" %}
|
||||
{% if r.name != "superAdmin" %}
|
||||
{% if user.role == r.name %}
|
||||
<option value="{{ r.name }}" selected>{{ r.name }}</option>
|
||||
{% for user_role in user_roles %}
|
||||
{% if r.role_id|int() != 1 and user.user_id == user_role.user_id %}
|
||||
{% if user_role.user_role_id == r.role_id %}
|
||||
<option value="{{ r.role_id }}" selected>{{ r.name }}</option>
|
||||
{% else %}
|
||||
<option value="{{ r.name }}">{{ r.name }}</option>
|
||||
<option value="{{ r.role_id }}">{{ r.name }}</option>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if user.role == r.name %}
|
||||
<option value="{{ r.name }}" selected>{{ r.name }}</option>
|
||||
{% else %}
|
||||
<option value="{{ r.name }}">{{ r.name }}</option>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
{% else %}
|
||||
<span title="{{lang.words.change2|title()}} {{lang.words.user3}} {{lang.words.groups}} {{lang.words.and}} {{lang.words.roles}}" style="cursor: pointer; margin-left: 40px;" class="div-pic" onclick="confirmChangeGroupsAndRoles('{{user.user_id}}')">
|
||||
{% endif %}
|
||||
</td>
|
||||
{% if page != "servers.py" %}
|
||||
<td>
|
||||
<span title="{{lang.words.change2|title()}} {{lang.words.user3}} {{lang.words.groups}}" style="cursor: pointer; margin-left: 15px;" class="div-pic" onclick="openChangeUserGroupDialog('{{user.user_id}}')">
|
||||
</td>
|
||||
{% endif %}
|
||||
<td>
|
||||
<span title="{{lang.words.change2|title()}} {{lang.words.user3}} {{lang.words.services}}" style="cursor: pointer; margin-left: 15px;" class="div-pic" onclick="openChangeUserServiceDialog('{{user.user_id}}')">
|
||||
</td>
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<select id="new-role" name="new-role">
|
||||
<option disabled selected>{{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.role}}</option>
|
||||
{% for role in roles %}
|
||||
<option value="{{ role.name }}">{{ role.name }}</option>
|
||||
<option value="{{ role.role_id }}">{{ role.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</td>
|
||||
|
@ -358,7 +358,8 @@
|
|||
<div id="change-user-service-form"></div>
|
||||
</div>
|
||||
<div id="dialog-server-info" style="display: none;">
|
||||
<table class="overview">
|
||||
<table class="overview" style="font-size: 1em;">
|
||||
<tr id="server-info"></tr>
|
||||
</table>
|
||||
</div>
|
||||
<div id="groups-roles"></div>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
|
||||
<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
|
||||
<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
|
||||
<td class="help_cursor" style="width: 20%;" data-intro="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}}Prometheus</td>
|
||||
<td class="help_cursor" style="width: 20%;" data-intro="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
@ -77,7 +77,7 @@
|
|||
<td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
|
||||
<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
|
||||
<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
|
||||
<td class="help_cursor" style="width: 20%;" data-help="lang.admin_page.desc.ext_prom">{{lang.words.external|title()}}Prometheus</td>
|
||||
<td class="help_cursor" style="width: 20%;" data-help="lang.admin_page.desc.ext_prom">{{lang.words.external|title()}} Prometheus</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
@ -108,7 +108,7 @@
|
|||
<td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
|
||||
<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
|
||||
<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
|
||||
<td class="help_cursor" style="width: 20%;" data-help="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}}Prometheus</td>
|
||||
<td class="help_cursor" style="width: 20%;" data-help="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
@ -139,7 +139,7 @@
|
|||
<td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
|
||||
<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
|
||||
<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
|
||||
<td class="help_cursor" style="width: 20%;" title="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}}Prometheus</td>
|
||||
<td class="help_cursor" style="width: 20%;" title="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
@ -170,7 +170,7 @@
|
|||
<td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td>
|
||||
<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td>
|
||||
<td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td>
|
||||
<td class="help_cursor" style="width: 20%;" title="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}}Prometheus</td>
|
||||
<td class="help_cursor" style="width: 20%;" title="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
|
|
@ -0,0 +1,819 @@
|
|||
{% set lang_short = 'fr' %}
|
||||
{% set menu_links = dict() %}
|
||||
{% set menu_links = {
|
||||
"overview": {
|
||||
"link": "Aperçu",
|
||||
"title": "Statut serveur et service",
|
||||
"h2": "Aperçu"
|
||||
},
|
||||
"hapservers": {
|
||||
"link": "Aperçu",
|
||||
"h2": "Aperçu Service",
|
||||
"haproxy": {
|
||||
"title": "Aperçu des serveurs HAProxy"
|
||||
},
|
||||
"nginx": {
|
||||
"title": "Aperçu des serveurs NGINX"
|
||||
},
|
||||
"apache": {
|
||||
"title": "Aperçu des serveurs Apache"
|
||||
},
|
||||
"keepalived": {
|
||||
"title": "Aperçu des serveurs Keepalived"
|
||||
},
|
||||
},
|
||||
"config": {
|
||||
"link": "Configuration",
|
||||
"h2": "Travailler sur les configurations",
|
||||
"haproxy": {
|
||||
"title": "Travailler sur les configurations Haproxy"
|
||||
},
|
||||
"nginx": {
|
||||
"title": "Travailler sur les configurations NGINX"
|
||||
},
|
||||
"apache": {
|
||||
"title": "Travailler sur les configurations Apache"
|
||||
},
|
||||
"keepalived": {
|
||||
"title": "Travailler sur les configurations Keepalived"
|
||||
},
|
||||
},
|
||||
"stats": {
|
||||
"link": "Stats",
|
||||
"h2": "Les statistiques de",
|
||||
"haproxy": {
|
||||
"title": "Statistiques HAProxy"
|
||||
},
|
||||
"nginx": {
|
||||
"title": "Statistiques NGINX"
|
||||
},
|
||||
"apache": {
|
||||
"title": "Statistiques Apache"
|
||||
},
|
||||
},
|
||||
"logs": {
|
||||
"link": "Logs",
|
||||
"title": "logs",
|
||||
"h2": "Les logs de",
|
||||
},
|
||||
"metrics": {
|
||||
"link": "Métriques",
|
||||
"title": "Métriques",
|
||||
"h2": "Métriques de",
|
||||
},
|
||||
"add_proxy": {
|
||||
"link": "Ajout de proxy",
|
||||
"title": "Ajout de proxy: Création de proxy"
|
||||
},
|
||||
"versions": {
|
||||
"link": "Versions",
|
||||
"h2": "Travailler avec les versions de",
|
||||
"haproxy": {
|
||||
"title": "Travailler sur les versions de configuration Haproxy"
|
||||
},
|
||||
"nginx": {
|
||||
"title": "Travaiiler sur les versions de configuration NGINX"
|
||||
},
|
||||
"apache": {
|
||||
"title": "Travailler sur les versions de configuration Apache"
|
||||
},
|
||||
"keepalived": {
|
||||
"title": "Travailler sur les versions de configuration Keepalived"
|
||||
},
|
||||
},
|
||||
"ssl": {
|
||||
"link": "SSL",
|
||||
"title": "Ajout de proxy: Charger les certificats SSL"
|
||||
},
|
||||
"lists": {
|
||||
"link": "Listes",
|
||||
"title": "Ajout de proxy: Créer et charger les listes autorisées ou non autorisées"
|
||||
},
|
||||
"ha": {
|
||||
"title": "Créer et configuer les clusters à haute disponibilité"
|
||||
},
|
||||
"monitoring": {
|
||||
"link": "Monitoring",
|
||||
"title": "Outils de monitoring",
|
||||
"smon": {
|
||||
"dashboard": "SMON: tableau de bord",
|
||||
"history": "SMON: Historique",
|
||||
"admin": "SMON: Panneau administrateur",
|
||||
},
|
||||
"checker_history": "Vérificateur: Historique",
|
||||
"port_scan": "Scanner de port",
|
||||
"net_tools": "Réseau: outils",
|
||||
},
|
||||
"servers": {
|
||||
"link": "Serveurs",
|
||||
"title": "Gestion servers"
|
||||
},
|
||||
"admin_area": {
|
||||
"link": "Zone Admin",
|
||||
"title": "Zone Admin"
|
||||
},
|
||||
"history": {
|
||||
"title": "Historique de"
|
||||
}
|
||||
}
|
||||
%}
|
||||
{% set services = dict() %}
|
||||
{% set services = {
|
||||
"hapservers_desc": "Checker surveille le service. Si le service change d\'état, Vérifier l\'alerte via Telegram, Slack, Email, Web ",
|
||||
"last_edit": "Last edit"
|
||||
}
|
||||
%}
|
||||
{% set errors = dict() %}
|
||||
{% set errors = {
|
||||
"cannot_get_info": "Impossible d\'obtenir des informations sur",
|
||||
"something_wrong": "Un problème est survenu lors de l\'installation",
|
||||
"check_logs": "Vérifier les logs",
|
||||
"select_server": "Selectionner d\'abord un serveur",
|
||||
"empty_name": "Le nom ne peut pas être vide",
|
||||
}
|
||||
%}
|
||||
{% set settings = {
|
||||
"rabbitmq": {
|
||||
"rabbitmq_host": "RabbitMQ-server serveur",
|
||||
"rabbitmq_port": "RabbitMQ-server port",
|
||||
"rabbitmq_vhost": "RabbitMQ-server vhost",
|
||||
"rabbitmq_queue": "RabbitMQ-server queue",
|
||||
"rabbitmq_user": "RabbitMQ-server utilisateur",
|
||||
"rabbitmq_password": "RabbitMQ-server mot de passe",
|
||||
},
|
||||
"nginx": {
|
||||
"nginx_path_logs": "Chemin des logs NGINX",
|
||||
"nginx_stats_user": "Nom de l\'utilisateur pour la page des satistiques NGINX",
|
||||
"nginx_stats_password": "Mot de passe pour la page des satistiques NGINX",
|
||||
"nginx_stats_port": "Port pour la pages des statistiques NGINX",
|
||||
"nginx_stats_page": "URI Stats pour la page NGINX",
|
||||
"nginx_dir": "Chemin vers les dossiers NGINX contenant les fichiers de config",
|
||||
"nginx_config_path": "Chemin vers le fichier de configuration principlal de NGINX",
|
||||
"nginx_container_name": "Nom du container Docker pour le service NGINX",
|
||||
},
|
||||
"monitoring": {
|
||||
"smon_check_interval": "Interval de vérification pour SMON (en minutes)",
|
||||
"port_scan_interval": "Interval de vérification pour Checker (en minutes)",
|
||||
"portscanner_keep_history_range": "Interval de vérification pour scanner (in minutes)",
|
||||
"smon_keep_history_range": "Période de rétention pour l\'historiques de SMON",
|
||||
"checker_keep_history_range": "Période de rétention pour l\'historiques de Checker",
|
||||
"checker_maxconn_threshold": "Période de rétention pour l\'historiques le scanner de Port",
|
||||
"checker_check_interval": "Valeur du seuil pour les alertes maxconn, en %",
|
||||
"smon_ssl_expire_warning_alert": "Alerte type warning dès qu'un certificat SSL expire (en jours)",
|
||||
"smon_ssl_expire_critical_alert": "Alerte tpye critical dès qu'un certificat SSL expire (en jours)",
|
||||
},
|
||||
"main": {
|
||||
"time_zone": "Fuseau horaire",
|
||||
"proxy": "Adresse IP et port du proxy server. format proto://ip:port",
|
||||
"session_ttl": "TTL pour la session utilisateur (en jours)",
|
||||
"token_ttl": "TTL pour le jeton de l\'utilisateur (en jours)",
|
||||
"tmp_config_path": "Chemin pour le dossier temporaire. Un chemin valide doit être spécifier pour ce paramètre. Le répèrtoire doit appartenir au même utilisateur celui spécifié dans les paramètres SSH",
|
||||
"cert_path": "Chemin pour le dossier SSL. Le répèrtoire doit appartenir au même utilisateur celui spécifié dans les paramètres SSH. Le chemin doit éxister",
|
||||
"ssl_local_path": "Chemin pour le dossier local contenant les certificats SSL sauvegardés. La valeur spécifiée est relative au chemin commençant par $HOME_ROXY_WI/app/",
|
||||
"lists_path": "Chemin pour les listes non authorisées ou authorisées. La valeur de ce paramètre est relative au chemin commeçant par $HOME_ROXY-WI",
|
||||
"maxmind_key": "Clé de licence à télécharger sur GeoLite2 DB. Vous pouvez la créer sur maxmind.com",
|
||||
},
|
||||
"mail": {
|
||||
"mail_ssl": "Activer TLS",
|
||||
"mail_from": "Addresse du of sender",
|
||||
"mail_smtp_host": "SMTP server address",
|
||||
"mail_smtp_port": "SMTP server port",
|
||||
"mail_smtp_user": "User for auth",
|
||||
"mail_smtp_password": "Password for auth",
|
||||
},
|
||||
"logs": {
|
||||
"syslog_server_enable": "Activer les logs depuis le serveur syslog",
|
||||
"syslog_server": "Adresse IP du syslog_server",
|
||||
"log_time_storage": "Période de rétention des logs pour l\'activité des utilisateurs (en jours)",
|
||||
"apache_log_path": "Chemin des logs Apache",
|
||||
},
|
||||
"ldap": {
|
||||
"ldap_enable": "Activer LDAP",
|
||||
"ldap_server": "Adresse IP du serveur LDAP",
|
||||
"ldap_port": "Port LDAP (port 389 ou 636 est défini par défaut)",
|
||||
"ldap_user": "Nom d\'utilisateur LDAP",
|
||||
"ldap_password": "Mot de passe LDAP",
|
||||
"ldap_base": "Domain de base. Exemple: dc=domain, dc=com",
|
||||
"ldap_domain": "Domaine LDAP for s'authentifier",
|
||||
"ldap_class_search": "Classe de recherche de l\'utilisateur",
|
||||
"ldap_user_attribute": "Attribut pour rechercher des utilisateurs par",
|
||||
"ldap_search_field": "Adresse e-mail de l\'utilisateur",
|
||||
"ldap_type": "Use LDAPS",
|
||||
},
|
||||
"haproxy": {
|
||||
"haproxy_path_logs": "Chemin pour les logs HAProxy",
|
||||
"stats_user": "Nom d\'utilisateur pour accéder aux Stats HAProxy",
|
||||
"stats_password": "Mot de passe pour la page web des Stats HAProxy",
|
||||
"stats_port": "Port pour la page web des Stats HAProxy",
|
||||
"stats_page": "URI Stats pour la page web HAProxy",
|
||||
"haproxy_dir": "Chemin vers le dossier HAProxy contenant les fichiers de config",
|
||||
"haproxy_config_path": "Chemin vers le fichier de configuration principal de HAProxy",
|
||||
"server_state_file": "Chemin vers le fichier d\'état HAProxy",
|
||||
"haproxy_sock": "Chemin vers le fchier socket HAProxy",
|
||||
"haproxy_sock_port": "Port sock HAProxy",
|
||||
"haproxy_container_name": "Mon du container Docker pour le service HAProxy",
|
||||
},
|
||||
"apache": {
|
||||
"apache_path_logs": "Chemin vers lors logs Apache",
|
||||
"apache_stats_user": "Nom d\'utilisateur pour accéder aux stats Apache",
|
||||
"apache_stats_password": "Mot de passe pour accéder aux stats Apache",
|
||||
"apache_stats_port": "Port pour les Stats de la page web Apache",
|
||||
"apache_stats_page": "URI Stats pour la page web Apache",
|
||||
"apache_dir": "Chemin vers le dossier contenant les fichiers de configuration Apache",
|
||||
"apache_config_path": "Chemin vers le fichier de configuration principale Apache",
|
||||
"apache_container_name": "Nom du container Docker container pour le service Apache",
|
||||
},
|
||||
"keepalived": {
|
||||
"keepalived_config_path": "Chemin vers le dossier contenant le fichier princiaple de Keepalived",
|
||||
"keepalived_path_logs": "chemin vers les logs de Keepalived",
|
||||
},
|
||||
}
|
||||
%}
|
||||
{% set phrases = dict() %}
|
||||
{% set phrases = {
|
||||
"config_file_name": "Nom du fichier de Config",
|
||||
"no_events_added": "Aucun événement ajouté pour le moment.",
|
||||
"upload_and_restart": "Charger et redémarrage",
|
||||
"upload_and_reload": "Charger et rafraîchir",
|
||||
"save_and_restart": "Sauvegarder et redémarrer",
|
||||
"save_and_reload": "Sauvegarder et rafraîchir",
|
||||
"save_title": "Sauvegarder, sans relancer le service",
|
||||
"return_to_config": "Retourner à la vue configuration",
|
||||
"check_config": "Vérifier la config",
|
||||
"master_slave": "Si vous reconfigurer le server Master, Le serveur Slave sera automatiquement reconfiguré",
|
||||
"read_about_files": "Vous pouvez lire la description de tous les fichiers de logs",
|
||||
"read_about_parameters": "Vous pouvez lire la description de tous les paramètres",
|
||||
"read_howto": "lire le HowTo",
|
||||
"howto_user": "Comment utilser",
|
||||
"select_file": "Selectionner un fichier",
|
||||
"read_how_it_works": "Vous pouvez lire comment cela fonctionne",
|
||||
"metrics_not_installed": "Vous n'avez pas installer le service Metrics.",
|
||||
"how_to_install_metrics": "Comment installer le service Metrics",
|
||||
"enable_avg_table": "Activer l\'affichage du tableau des moyennes",
|
||||
"disable_avg_table": "Désactiver l\'affichage du tableau des moyennes",
|
||||
"protected_title": "Si la protection est activée, le serveur est inaccessible pour modification par tout le monde, sauf par le rôle d\'administrateur.",
|
||||
"slave_for_title": "Les actions effectuées avec la configuration du maître seront automatiquement appliquées sur l\'esclave.",
|
||||
"server_unknown": "l\'état du serveur est inconnu",
|
||||
"no_sub": "Vous n'êtes pas inscrit",
|
||||
"pls_sub": "Veuillez vous inscrire pour avoir accès à cette fonctionnalité",
|
||||
"no_av_feat": "Cette fonction n'est pas disponible pour votre plan",
|
||||
"fwd_warn": "Il y a des règles uniquement dans les chaînes INPUT, IN_public_allow et OUTPUT",
|
||||
"search_in_ad": "Rechercher un utilisateur dans AD",
|
||||
"are_you_sure": "Vous êtes sûr ?",
|
||||
"delete_dialog": "La suppression est irrécupérable, toutes les données seront perdues",
|
||||
"fields_mark": "Les champs marqués d\'un",
|
||||
"are_required": "sont nécessaires",
|
||||
"scan_title": "Analysez le serveur pour les services HAProxy, NGINX, Keepalived et Firewalld",
|
||||
"superAdmin_pass": "Vous ne pouvez pas modifier le mot de passe du rôle superAdmin",
|
||||
"superAdmin_services": "Vous ne pouvez pas modifier les services pour le rôle superAdmin",
|
||||
"pass_mismatched": "Les mots de passe ne correspondent pas",
|
||||
"private_key_note": "Clé privée. Remarque : la clé publique doit être préinstallée sur tous les serveurs auxquels vous prévoyez de vous connecter",
|
||||
"send_test_mes": "Envoyez un message de test",
|
||||
"alert_service_change_status": "Alerte sur le changement de statut du service",
|
||||
"alert_backend_change_status": "Alerte sur le changement d\'état du backend",
|
||||
"alert_number_conn": "Alerte si le nombre de connexions est sur le point d\'atteindre la limite.",
|
||||
"alert_master_backup": "Alert about changing Master/Backup status",
|
||||
"new_version": "Il y a une nouvelle version Roxy-WI. Vérifiez le",
|
||||
"all_alerts_enabled": "Les alertes sont activées",
|
||||
"disable_alerts": "Désactiver les alertes",
|
||||
"work_with_prev": "Ici, vous pouvez travailler avec les versions précédentes des configurations",
|
||||
"roll_back": "Revenir en arrière, afficher ou supprimer",
|
||||
"files_been_deleted": "Les fichiers suivants ont été supprimés",
|
||||
"version_has_been_uploaded": "La version suivante du fichier de configuration a été téléchargée et enregistrée en tant que",
|
||||
"new_config_has_been_saved": "Une nouvelle configuration a été enregistrée comme",
|
||||
"view_and_upload": "Visualisez et téléchargez cette version de la configuration",
|
||||
"int_vrrp": "Interface pour l\'adresse VRRP sur un serveur",
|
||||
"howto_ha": "Comment créer un cluster hautement disponible",
|
||||
"been_installed": "a été installé",
|
||||
"wait_mess": "Veuillez ne pas fermer ou rafraîchir la page. Attendez que le travail soit terminé. Cela peut prendre un certain temps",
|
||||
"you_are_editing": "Vous êtes en train d\'éditer",
|
||||
"section_from_server": "section à partir du serveur",
|
||||
"how_to_install": "comment installer",
|
||||
"port_check": "Check du port",
|
||||
"possible_service_name": "Nom de service possible",
|
||||
"server_info": "Info Serveur",
|
||||
"user_groups": "Groupes utilisateur",
|
||||
}
|
||||
%}
|
||||
{% set roles = {
|
||||
"superAdmin": "Il possède le niveau le plus élevé de permissions administratives et contrôle les actions de tous les autres utilisateurs",
|
||||
"admin": "Accède à tout sauf à la zone d\'administration",
|
||||
"user": "Possède les mêmes droits que l\'administrateur mais n'a pas accès à la page des serveurs.",
|
||||
"guest": "Accès en lecture seule"
|
||||
}
|
||||
%}
|
||||
{% set add_page = {
|
||||
"desc": {
|
||||
"port_check": "Un contrôle de base de la couche TCP tente de se connecter au port TCP du serveur. Le contrôle est valide lorsque le serveur répond par un paquet SYN/ACK.",
|
||||
"maxconn": "Le nombre total de connexions autorisées, à l\'échelle du processus. Cela empêche le processus d\'accepter trop de connexions à la fois, ce qui lui évite de manquer de mémoire.",
|
||||
"server_template": "Créez la liste des serveurs à partir du modèle",
|
||||
"def_check": "Paramètres par défaut",
|
||||
"saved_options": "Ce sont les options que vous avez enregistrées dans l\'onglet 'Options'.",
|
||||
"press_down": "ou appuyez sur le bouton 'bas'",
|
||||
"ip_port": "Si l\'adresse IP du listener est vide, il écoutera sur toutes les adresses IP. Commencez à taper l\'adresse IP ou appuyez sur le bouton bas. Cliquez sur + pour ajouter plusieurs paires IP-port. Si vous utilisez VRRP, laissez le champ IP vide. Si vous attribuez une IP VRRP, le serveur esclave ne démarrera pas.",
|
||||
"listener_desc1": "Une section 'listen' définit un proxy complet avec ses parties 'frontend' et 'backend' combinées en une seule section. Elle est généralement utile pour le trafic TCP uniquement.",
|
||||
"listener_desc2": "Tous les noms de proxy doivent être formés de lettres majuscules et minuscules, de chiffres, de '-' (tiret), de '_' (trait de soulignement), de '.' (point) et de ':' (deux points). Les noms d\'ACL sont sensibles à la casse, ce qui signifie que 'www' et 'WWW' sont deux proxys différents.",
|
||||
"listener_desc3": "Historiquement, tous les noms de proxy pouvaient se chevaucher, cela causait simplement des problèmes dans les journaux. Depuis l\'introduction de la commutation de contenu, il est obligatoire que deux proxy dont les capacités se chevauchent (frontend/backend) aient des noms différents. Cependant, il est toujours permis qu'un frontend et un backend partagent le même nom, car cette configuration semble être fréquemment rencontrée.",
|
||||
"front_desc1": "Une section 'frontend' décrit un ensemble de sockets d\'écoute acceptant les connexions des clients.",
|
||||
"back_des1": "Une section 'backend' décrit un ensemble de serveurs auxquels le proxy se connectera pour transmettre les connexions entrantes.",
|
||||
"ssl_offloading": "Le terme 'terminaison SSL' signifie que vous effectuez tous les cryptages et décryptages à la périphérie de votre réseau, par exemple au niveau de l\'équilibreur de charge.",
|
||||
"http_https": "Activer la redirection de HTTP vers HTTPS",
|
||||
"maxconn_desc": "Cette valeur ne doit pas dépasser le maxconn global. Valeur par défaut du maxconn global",
|
||||
"maxconn_fix": "Fixer le nombre maximum de connexions simultanées sur un frontend",
|
||||
"antibot": "Malheureusement, une grande partie des bots sont utilisés pour des raisons malveillantes. Parmi leurs intentions figurent le scraping de sites Web, le spamming, l\'inondation de requêtes, le forçage brutal et l\'analyse de vulnérabilités. Par exemple, les robots peuvent récupérer vos listes de prix afin que vos concurrents puissent systématiquement vous vendre moins cher ou élaborer une solution concurrentielle à partir de vos données. Ils peuvent aussi essayer de localiser des forums et des sections de commentaires où ils pourront envoyer du spam. Dans d\'autres cas, ils analysent votre site à la recherche de failles de sécurité.",
|
||||
"slow_attack": "Dans une attaque Slow POST, un attaquant commence par envoyer un en-tête HTTP POST légitime à un serveur Web, exactement comme il le ferait dans des circonstances normales. l\'en-tête spécifie la taille exacte du corps du message qui suivra. Cependant, le corps du message est ensuite envoyé à un rythme alarmant, parfois aussi lent qu'un octet toutes les deux minutes environ.",
|
||||
"http_compression": "La compression HTTP permet de réduire le corps d\'une réponse avant qu'elle ne soit relayée au client, ce qui permet d\'utiliser moins de bande passante par demande. Du point de vue du client, cela réduit la latence.",
|
||||
"forward_for": "Lorsque HAProxy Enterprise établit une connexion TCP par procuration, il remplace l\'adresse IP source du client par la sienne lors de la communication avec le serveur backend. Toutefois, lorsqu\'il relaie des messages HTTP, il peut stocker l\'adresse du client dans l\'en-tête HTTP X-Forwarded-For. Le serveur backend peut alors être configuré pour lire la valeur de cet en-tête afin de récupérer l\'adresse IP du client.",
|
||||
"redispatch": "En mode HTTP, si un serveur désigné par un cookie est hors service, les clients peuvent définitivement s'y coller car ils ne peuvent pas vider le cookie, ils ne pourront donc plus accéder au service. La spécification de l\'option 'redispatch' permet au proxy de rompre leur persistance et de les redistribuer à un serveur en fonctionnement. Cela permet également de réessayer les connexions à un autre serveur en cas d\'échecs multiples de connexion. Bien entendu, il faut que la valeur de 'retries' soit différente de zéro.",
|
||||
"force_close": "Puisque HAProxy fonctionne en mode reverse-proxy, les serveurs voient son adresse IP comme leur adresse client. Ceci est parfois gênant lorsque l\'adresse IP du client est attendue dans les journaux du serveur. Pour résoudre ce problème, l\'en-tête HTTP bien connu 'X-Forwarded-For' peut être ajouté par HAProxy à toutes les demandes envoyées au serveur. Cet en-tête contient une valeur représentant l\'adresse IP du client. Étant donné que cet en-tête est toujours ajouté à la fin de la liste des en-têtes existants, le serveur doit être configuré de manière à n'utiliser que la dernière occurrence de cet en-tête. Consultez le manuel du serveur pour savoir comment activer l\'utilisation de cet en-tête standard. Notez que seule la dernière occurrence de l\'en-tête doit être utilisée, car il est tout à fait possible que le client en ait déjà une.",
|
||||
"cookie": "Pour envoyer un client au même serveur que celui où il a été envoyé précédemment afin de réutiliser une session sur ce serveur, vous pouvez activer la persistance de la session basée sur les cookies. Ajoutez une directive cookie à la section backend et définissez le paramètre cookie à une valeur unique sur chaque ligne de serveur.",
|
||||
"c_prefix": "Ce mot-clé indique qu'au lieu de s'appuyer sur un cookie dédié pour la persistance, un cookie existant sera complété.",
|
||||
"c_nocache": "Cette option est recommandée en conjonction avec le mode insertion lorsqu'il existe un cache entre le client et HAProxy",
|
||||
"c_nocache": "Cette option est recommandée en conjonction avec le mode insertion lorsqu'il existe un cache entre le client et HAProxy",
|
||||
"c_postonly": "Cette option garantit que l\'insertion des cookies ne sera effectuée que sur les réponses aux demandes POST",
|
||||
"c_dynamic": "Activer les cookies dynamiques. Lorsqu'elle est utilisée, un cookie de session est créé dynamiquement pour chaque serveur",
|
||||
"def_backend": "Si vous voulez utiliser le backend par défaut",
|
||||
"def_backend_exit": "Le backend doit exister",
|
||||
"port_for_bind": "Port pour la liaison",
|
||||
"bind_ip_pair": "Lier une paire de ports IP supplémentaire",
|
||||
"no_def_backend": "Si aucune condition n'est valide, le backend défini avec 'default_backend' sera utilisé. Si aucun backend par défaut n'est défini, soit les serveurs de la même section sont utilisés (dans le cas d\'une section 'listen'), soit, dans le cas d\'un frontend, aucun serveur n'est utilisé et une réponse 503 service indisponible est retournée",
|
||||
"circuit_breaking": "Le coupe-circuit est un modèle de conception utilisé pour détecter les défaillances et encapsuler la logique permettant d\'empêcher une défaillance de se reproduire constamment. Le modèle de conception du coupe-circuit fonctionne comme un fusible électrique qui est destiné à 'déclencher' ou à ouvrir le circuit lorsqu'une défaillance est détectée.",
|
||||
"peers_master": "Note : Si vous souhaitez utiliser les services HAProxy en tant que cluster Master-Master, vous devez définir les noms d\'hôtes des serveurs locaux comme noms de serveurs peers. Sinon, les peers ne fonctionneront pas",
|
||||
"peers_slave": "Remarque : Si vous souhaitez utiliser les services HAProxy en tant que cluster maître-esclave, vous devez définir le nom d\'hôte du serveur local pour le serveur maître comme nom du serveur pair. Sinon, les pairs ne fonctionneront pas",
|
||||
"peers": "La section peers permet de répliquer les données des tables de bâtonnets entre deux ou plusieurs instances HAProxy",
|
||||
"userlist": "Dans cette section, vous pouvez créer des listes d\'utilisateurs. Et ensuite les utiliser dans les sections 'Add'",
|
||||
"userlist_name": "Nom de la liste des utilisateurs",
|
||||
"userlist_pass": "Mot de passe de l\'utilisateur. Par défaut, il s'agit d\'un mot de passe non sécurisé",
|
||||
"userlist_user_grp": "Groupe d\'utilisateurs",
|
||||
"userlist_user": "Il est également possible de rattacher des groupes à cet utilisateur en utilisant une liste de groupes séparés par des virgules",
|
||||
"userlist_group": "Il est également possible de rattacher des utilisateurs à ce groupe en utilisant une liste de noms séparés par des virgules et précédés du mot-clé 'users'.",
|
||||
"userlist_desc": "Il est possible de contrôler l\'accès aux sections frontend/backend/listen ou aux statistiques http en autorisant uniquement les utilisateurs authentifiés et autorisés. Pour ce faire, il est nécessaire de créer au moins une liste d\'utilisateurs et de définir des utilisateurs",
|
||||
"servers": "Dans cette section, vous pouvez créer, modifier et supprimer des serveurs. Vous pouvez ensuite les utiliser en tant qu'autocomplétion dans les sections 'Ajouter'.",
|
||||
"servers": "Dans cette section, vous pouvez créer, modifier et supprimer des options. Et ensuite les utiliser comme autocomplétion dans les sections 'Ajouter'",
|
||||
"paste_cert": "Collez le contenu du fichier de certificat",
|
||||
"paste_cert_desc": "Ce fichier pem sera utilisé pour créer une connexion https avec HAProxy, NGINX ou Apache",
|
||||
"lists_howto": "Dans cette section, vous pouvez créer et modifier des listes noires et blanches. Vous pouvez ensuite les utiliser dans la configuration de HAProxy ou dans les pages 'Ajouter un proxy'. Lisez comment l\'utiliser dans cette section",
|
||||
"lists_new_line": "Chaque nouvelle adresse doit être spécifiée sur une nouvelle ligne",
|
||||
"was_success_added": "a été ajouté avec succès",
|
||||
"create_ssl_proxy": "Créer un proxy HTTPS avec la terminaison SSL sur HAProxy et le déchargement SSL. HAProxy enverra le trafic HTTP aux backends. Vous devriez l\'\avoir",
|
||||
"create_ssl_front": "Créez un front-end HTTPS avec la terminaison SSL sur HAProxy et le déchargement SSL. HAProxy enverra le trafic HTTP aux backends. Vous devriez avoir",
|
||||
"create_ssl_backend": "Créez un backend HTTPS avec la terminaison SSL sur HAProxy et le déchargement SSL. HAProxy enverra le trafic HTTP aux backends. Vous devez avoir",
|
||||
"create_https_proxy": "Créer un proxy HTTPS sans la terminaison SSL sur HAProxy et le déchargement SSL. HAProxy enverra le trafic HTTPS aux backends",
|
||||
"create_https_front": "Créez un Frontend HTTPS sans la terminaison SSL sur HAProxy et le SSL offload. HAProxy enverra le trafic HTTPS aux backends",
|
||||
"create_https_backend": "Créer un backend HTTPS sans la terminaison SSL sur HAProxy et le SSL offload. HAProxy enverra le trafic HTTPS aux backends",
|
||||
"option_temp": "Créer, modifier et supprimer des options avec des paramètres donnés. Et ensuite les utiliser comme autocomplétion dans les sections 'Ajouter'",
|
||||
"server_temp": "Créer, modifier et supprimer des serveurs. Et par la suite, utilisez-les en tant que liste déroulante dans les sections 'Ajouter'",
|
||||
"use_add": "Et utilisez-le dans les sections 'Ajouter'.",
|
||||
},
|
||||
"buttons": {
|
||||
"disable_ssl_check": "Désactiver la vérification SSL",
|
||||
"disable_ssl_verify": "Désactiver la vérification SSL sur les serveurs",
|
||||
"set_options": "Définir les options",
|
||||
"set_options_m": "Définir les options manuellement",
|
||||
"show_full_settings": "Afficher la liste complète des paramètres",
|
||||
"show_full_settings": "Masquer la liste complète des paramètres",
|
||||
}
|
||||
}
|
||||
%}
|
||||
{% set add_nginx_page = {
|
||||
"desc": {
|
||||
"upstream_desc1": "Le module 'upstream' est utilisé pour définir des groupes de serveurs.",
|
||||
"upstream_desc2": "Définit un groupe de serveurs. Les serveurs peuvent écouter sur différents ports. En outre, les serveurs écoutant sur des sockets TCP et UNIX peuvent être mélangés.",
|
||||
"upstream_desc3": "Par défaut, les demandes sont réparties entre les serveurs selon une méthode d\'équilibrage round-robin pondérée.",
|
||||
"keepalive": "Le paramètre connections définit le nombre maximal de connexions keepalive inactives vers des serveurs en amont qui sont conservées dans le cache de chaque processus d\'un job. Lorsque ce nombre est dépassé, les connexions les moins récemment utilisées sont fermées.",
|
||||
"fail_timeout": "Le temps pendant lequel le nombre spécifié de tentatives infructueuses de communication avec le serveur doit se produire pour considérer le serveur comme indisponible ; et la période pendant laquelle le serveur sera considéré comme indisponible.",
|
||||
"max_fails": "Définit le nombre de tentatives infructueuses de communication avec le serveur qui doivent se produire dans la durée définie par le paramètre fail_timeout pour considérer le serveur comme indisponible pendant une durée également définie par le paramètre fail_timeout. Par défaut, le nombre de tentatives infructueuses est fixé à 1.",
|
||||
}
|
||||
}
|
||||
%}
|
||||
{% set admin_page = {
|
||||
"desc": {
|
||||
"latest_repo": "Roxy-WI va essayer d\'installer la dernière version du service à partir du dépôt officiel.",
|
||||
"install_as_docker": "Installer le service comme un conteneur Docker",
|
||||
"ext_prom": "Cet Exporter sera utilisé par un Prometheus externe. Utilisez également cette case à cocher si vous mettez à jour l\'Exporter",
|
||||
"no_ansible": "Vous n'avez pas installé",
|
||||
"before_install": "Avant d\'installer l\Exporter, installez le d\'abord",
|
||||
"been_installed": "les serveurs ont été installés",
|
||||
"there_are_no": "Il n'y a pas de serveurs Grafana ni Prometheus.",
|
||||
"country_codes": "codes des pays",
|
||||
"smon_desc": "SMON stands for <b>S</b>imple <b>MON</b>itoring",
|
||||
"checker_desc": "Checker est conçu pour surveiller les services HAProxy, Nginx, Apache et Keepalived ainsi que les backends HAProxy et maxconn.",
|
||||
"auto_start_desc": "Le service Auto Start permet de redémarrer les services HAProxy, NGINX, Apache et Keepalived s'ils sont hors service.",
|
||||
"metrics_desc": "Collecte du nombre de connexions pour les services HAProxy, NGINX, Apache et HAProxy WAF",
|
||||
"p_s_desc": "Vérifie les ports ouverts du serveur et enregistre l\'historique.",
|
||||
"socket_desc": "Socket est un service permettant d\'envoyer des alertes et des notifications.",
|
||||
"a_new_version": "Il existe une version plus récente",
|
||||
"no_new_version": "Il n'existe pas de version plus récente",
|
||||
"main_app": "Application principale",
|
||||
"for_updating": "Pour la mise à jour, vous devez utiliser Roxy-WI RPM ou DEB.",
|
||||
"how_to_using_repo": "how to start using repository.",
|
||||
"proxy_settings": "Si le serveur Roxy-WI utilise un proxy pour se connecter à Internet, ajoutez les paramètres du proxy à yum.conf.",
|
||||
}
|
||||
}
|
||||
%}
|
||||
{% set smon_page = {
|
||||
"desc": {
|
||||
"before_use": "avant l\'utilisation",
|
||||
"smon_is_not_run": "Le service SMON n'est pas exécuté.",
|
||||
"run_smon": "Exécutez le service SMON",
|
||||
"not_installed": "Vous n'avez pas installé le service SMON",
|
||||
"not_added": "Vous n'avez pas ajouté de serveurs dans le service SMON",
|
||||
"create_server": "Créez votre premier serveur",
|
||||
"see_check": "pour voir si de nouveaux contrôles ont été ajoutés",
|
||||
"do_not_sort": "Ne pas trier",
|
||||
"do_not_sort_by_status": "Ne pas trier par statut",
|
||||
"sort_status": "Trier par statut",
|
||||
"status_summary": "Résumé du statut",
|
||||
"enabled_checks": "Contrôles activés",
|
||||
"http_status_check": "Vérification du statut HTTP",
|
||||
"body_status_check": "Vérification de la réponse du corps",
|
||||
"resp_time": "Temps de réponse",
|
||||
"last_resp_time": "Dernier temps de réponse",
|
||||
"UP": "UP",
|
||||
"DOWN": "DOWN",
|
||||
"HTTP_FAILURE": "ECHEC HTTP",
|
||||
"BODY_FAILURE": " DÉFAILLANCE DU CORPS",
|
||||
"UNKNOWN": "INCONNU",
|
||||
"PORT_DOWN": "PORT DOWN",
|
||||
}
|
||||
}
|
||||
%}
|
||||
{% set p_s_page = {
|
||||
"desc": {
|
||||
"is_enabled_and_up": "Le scanner de port est activé et le service est UP",
|
||||
"is_enabled_and_down": "Le scanner de port est activé, mais le service est DOWN",
|
||||
"scanning_ports": "Analyse des ports ouverts/filtrés pour le serveur",
|
||||
"total_open_ports": "Total des ports ouverts",
|
||||
}
|
||||
}
|
||||
%}
|
||||
{% set words = {
|
||||
"cache": "cache",
|
||||
"compression": "compression",
|
||||
"acceleration": "accélération",
|
||||
"start": "commencer",
|
||||
"start2": "commencer",
|
||||
"stop": "stop",
|
||||
"restart": "redémarrer",
|
||||
"service": "service",
|
||||
"service2": "service",
|
||||
"services": "services",
|
||||
"services2": "services",
|
||||
"services3": "services",
|
||||
"services4": "services",
|
||||
"started": "a démarré",
|
||||
"reload": "recharger",
|
||||
"reloading": "rechargement",
|
||||
"stopped": "arrêté",
|
||||
"no_desc": "pas de description",
|
||||
"process_num": "process_num",
|
||||
"version": "version",
|
||||
"version2": "version",
|
||||
"versions": "versions",
|
||||
"error": "erreur",
|
||||
"addresses": "adresses",
|
||||
"address": "adresse",
|
||||
"virtual": "virtuel",
|
||||
"hosts": "serveurs",
|
||||
"time_range": "Période de temps",
|
||||
"server": "serveur",
|
||||
"server2": "serveur",
|
||||
"status": "Statut",
|
||||
"current": "courant",
|
||||
"current2": "courant",
|
||||
"total": "total",
|
||||
"server_status": "statut serveur",
|
||||
"services_status": "Statut des services",
|
||||
"compare": "comparer",
|
||||
"map": "plan",
|
||||
"about": "à propos de",
|
||||
"help": "aide",
|
||||
"contacts": "contacts",
|
||||
"cabinet": "cabinet",
|
||||
"legal": "legal",
|
||||
"alert": "alerte",
|
||||
"alert2": "alerte",
|
||||
"alerts": "alertes",
|
||||
"manage": "gérer",
|
||||
"user": "utilisateur",
|
||||
"user2": "utilisateur",
|
||||
"users": "utilisateurs",
|
||||
"users2": "usutilisateurs",
|
||||
"username": "nom d\'utilisateur",
|
||||
"servers": "serveurs",
|
||||
"servers2": "serveurs",
|
||||
"creds": "identifiants",
|
||||
"creds2": "identifiants",
|
||||
"settings": "paramètres",
|
||||
"settings2": "paramètres",
|
||||
"install": "installer",
|
||||
"installation": "installation",
|
||||
"installing": "installation en cours",
|
||||
"proxy": "proxy",
|
||||
"provisioning": "approvisionnement",
|
||||
"backup": "sauvegarde",
|
||||
"backup2": "sauvegarde",
|
||||
"configs": "configs",
|
||||
"configs2": "configs",
|
||||
"config": "config",
|
||||
"from": "de",
|
||||
"view": "vue",
|
||||
"internal": "interne",
|
||||
"internal2": "interne",
|
||||
"log": "log",
|
||||
"logs": "logs",
|
||||
"logs2": "logs",
|
||||
"admin_area": "zone admin",
|
||||
"group": "groupe",
|
||||
"group2": "groupe",
|
||||
"groups": "groupes",
|
||||
"groups2": "groupes",
|
||||
"groups3": "groupes",
|
||||
"w_update": "mise à jour",
|
||||
"updating": "mise à jour en cours",
|
||||
"monitoring": "surveillance",
|
||||
"auto": "auto",
|
||||
"refresh": "rafraîchir",
|
||||
"refresh2": "rafraîchir",
|
||||
"no": "non",
|
||||
"not": "pas",
|
||||
"yes": "oui",
|
||||
"interval": "intervalle",
|
||||
"desc": "description",
|
||||
"login": "connexion",
|
||||
"role": "rôle",
|
||||
"roles": "rôles",
|
||||
"subs": "abonnement",
|
||||
"show_all": "tout montrer",
|
||||
"plan": "plan",
|
||||
"pay_method": "méthode de paiement",
|
||||
"active": "actif",
|
||||
"open": "ouvert",
|
||||
"opened": "ouvert",
|
||||
"edit": "éditer",
|
||||
"delete": "supprimer",
|
||||
"add": "ajout",
|
||||
"save": "sauvegarder",
|
||||
"saved": "sauvegardé",
|
||||
"saving": "sauvegarde en cours",
|
||||
"expand_all": "tout développer",
|
||||
"collapse_all": "tout réduirel",
|
||||
"raw": "brut",
|
||||
"stats": "stats",
|
||||
"note": "note",
|
||||
"back": "retour",
|
||||
"show": "montrer",
|
||||
"run": "exécuter",
|
||||
"running": "exécution en cours",
|
||||
"statistics": "statistiques",
|
||||
"rollback": "retour en arrière",
|
||||
"previous": "précédent",
|
||||
"to": "à",
|
||||
"listener": "listener",
|
||||
"frontends": "frontends",
|
||||
"frontend": "frontend",
|
||||
"backends": "backends",
|
||||
"backend": "backend",
|
||||
"maintain": "maintain",
|
||||
"drain": "drain",
|
||||
"number": "nombre",
|
||||
"rows": "rangées",
|
||||
"row": "rangée",
|
||||
"find": "trouver",
|
||||
"exclude": "exclure",
|
||||
"file": "fichier",
|
||||
"file2": "fichier",
|
||||
"files": "fichiers",
|
||||
"here": "ici",
|
||||
"action": "action",
|
||||
"actions": "actions",
|
||||
"command": "commande",
|
||||
"save": "sauvegarder",
|
||||
"change": "changer",
|
||||
"change2": "changer",
|
||||
"enter": "entrer",
|
||||
"enter2": "entrer",
|
||||
"lists": "listes",
|
||||
"list": "liste",
|
||||
"sessions": "sessions",
|
||||
"session": "session",
|
||||
"and": "et",
|
||||
"select": "sélectionnez",
|
||||
"select2": "sélectionnez",
|
||||
"new": "nouveau",
|
||||
"new2": "nouveau",
|
||||
"port": "port",
|
||||
"ports": "ports",
|
||||
"table": "table",
|
||||
"w_get": "obtenir",
|
||||
"dynamically": "dynamiquement",
|
||||
"set": "définir",
|
||||
"type": "type",
|
||||
"typing": "typing",
|
||||
"site": "taille",
|
||||
"is": "est",
|
||||
"w_empty": "vide",
|
||||
"used": "used",
|
||||
"w_clear": "clair",
|
||||
"this": "ce",
|
||||
"this2": "ce",
|
||||
"this3": "ce",
|
||||
"this4": "ce",
|
||||
"entry": "entrée",
|
||||
"age": "age",
|
||||
"protocol": "protocole",
|
||||
"rate": "taux",
|
||||
"expire": "expire",
|
||||
"more": "plus",
|
||||
"info": "info",
|
||||
"source": "source",
|
||||
"overview": "vue d\'ensemble",
|
||||
"personal": "personnel",
|
||||
"read": "lire",
|
||||
"second": "seconde",
|
||||
"seconds": "secondes",
|
||||
"seconds2": "secondes",
|
||||
"minute": "minute",
|
||||
"minute2": "minute",
|
||||
"minutes": "minutes",
|
||||
"hour": "heure",
|
||||
"hours": "heures",
|
||||
"hours2": "heures",
|
||||
"day": "jour",
|
||||
"days": "jours",
|
||||
"metrics": "métriques",
|
||||
"every": "tous",
|
||||
"every2": "tous",
|
||||
"every3": "tous",
|
||||
"hide": "cacher",
|
||||
"average": "Moyenne",
|
||||
"peak": "pic",
|
||||
"connect": "connecter",
|
||||
"connections": "connections",
|
||||
"connections2": "connections",
|
||||
"enable": "activer",
|
||||
"enabled": "activé",
|
||||
"virt": "virt",
|
||||
"virtual": "virtuel",
|
||||
"check": "check",
|
||||
"checking": "vérifier",
|
||||
"protected": "protégé",
|
||||
"slave_for": "Esclave de",
|
||||
"name": "nom",
|
||||
"article": "article",
|
||||
"w_copy": "copie",
|
||||
"for": "pour",
|
||||
"history": "histoire",
|
||||
"history2": "histoire",
|
||||
"history3": "histoire",
|
||||
"rule": "règle",
|
||||
"rules": "règles",
|
||||
"rules2": "règles",
|
||||
"on": "on",
|
||||
"dest": "destination",
|
||||
"target": "cible",
|
||||
"w_input": "entrée",
|
||||
"output": "sortie",
|
||||
"password": "mot de passe",
|
||||
"email": "e-mail",
|
||||
"w_a": "un(e)",
|
||||
"w_an": "un(e)",
|
||||
"key": "clé",
|
||||
"token": "jeton",
|
||||
"channel": "canal",
|
||||
"channels": "canals",
|
||||
"job": "job",
|
||||
"cancel": "annuler",
|
||||
"repository": "dépôt",
|
||||
"init": "init",
|
||||
"period": "periode",
|
||||
"the": "le",
|
||||
"scan": "scan",
|
||||
"is_there": "Est ici",
|
||||
"confirm": "confirmer",
|
||||
"confirmation": "confirmation",
|
||||
"one": "une",
|
||||
"one2": "une",
|
||||
"or": "ou",
|
||||
"upload": "téléverser",
|
||||
"uploading": "téléverser",
|
||||
"uploaded": "téléversé",
|
||||
"test": "test",
|
||||
"test2": "test",
|
||||
"disabled": "désactivé",
|
||||
"via": "via",
|
||||
"web_panel": "volet webl",
|
||||
"message": "message",
|
||||
"menu": "menu",
|
||||
"language": "langage",
|
||||
"apply": "appliquer",
|
||||
"logout": "déconnexion",
|
||||
"last": "dernier",
|
||||
"last2": "dernier",
|
||||
"activity": "activité",
|
||||
"never": "jamais",
|
||||
"is_online": "est en ligne",
|
||||
"is_offline": "est hors ligne",
|
||||
"valid": "valide",
|
||||
"remote": "distant",
|
||||
"remote2": "distant",
|
||||
"local": "local",
|
||||
"path": "chemin",
|
||||
"create": "créer",
|
||||
"created": "créé",
|
||||
"creating": "En création",
|
||||
"diff": "diff",
|
||||
"diff2": "diff",
|
||||
"diff3": "diff",
|
||||
"master": "master",
|
||||
"slave": "slave",
|
||||
"interface": "interface",
|
||||
"as": "comme",
|
||||
"stay": "rester",
|
||||
"protection": "protection",
|
||||
"return": "retourner",
|
||||
"cluster": "cluster",
|
||||
"existing": "exitstant",
|
||||
"success": "succès",
|
||||
"option": "option",
|
||||
"option2": "option",
|
||||
"options": "options",
|
||||
"template": "modèle",
|
||||
"templates": "modèles",
|
||||
"userlists": "listes d\'utilisateurs",
|
||||
"whitelist": "liste authorisée",
|
||||
"whitelists": "listes authorisées",
|
||||
"blacklist": "liste non authorisée",
|
||||
"blacklists": "listes non authorisées",
|
||||
"mode": "mode",
|
||||
"balance": "balance",
|
||||
"health": "santé",
|
||||
"cert": "certificats",
|
||||
"cert_name": "non du certificate",
|
||||
"certs": "certificats",
|
||||
"certs2": "certificats",
|
||||
"advanced": "avancé",
|
||||
"generate": "générer",
|
||||
"generated": "généré",
|
||||
"server_template": "Modèle-de-server",
|
||||
"custom": "personnalisé",
|
||||
"param": "param",
|
||||
"param2": "param",
|
||||
"params": "params",
|
||||
"of": "de",
|
||||
"display": "affichage",
|
||||
"default_backend": "backend par défaut",
|
||||
"rule": "règle",
|
||||
"existing": "existant",
|
||||
"domain": "domaine",
|
||||
"all": "tout",
|
||||
"just": "juste",
|
||||
"without": "sans",
|
||||
"work": "travail",
|
||||
"working": "travail",
|
||||
"section": "section",
|
||||
"section2": "section",
|
||||
"use": "utiliser",
|
||||
"available": "disponible",
|
||||
"external": "externe",
|
||||
"in": "dans",
|
||||
"folder": "dossier",
|
||||
"folder2": "dossier",
|
||||
"clone": "clone",
|
||||
"date": "date",
|
||||
"time": "heure",
|
||||
"page": "page",
|
||||
"pages": "pages",
|
||||
"body": "corps",
|
||||
"level": "niveau",
|
||||
"host": "serveur",
|
||||
"uptime": "Temps de fonctionnement",
|
||||
"downtime": "Temps d\'arrêt",
|
||||
"record_type": "Type d\'enregistrement",
|
||||
"upstream": "en amont",
|
||||
"haproxy": "HAProxy",
|
||||
"nginx": "NGINX",
|
||||
"apache": "Apache",
|
||||
"keepalived": "Keepalived",
|
||||
"scan": "scan",
|
||||
"notify": "avertir",
|
||||
"notification": "notification",
|
||||
"keeping": "gardant",
|
||||
"keep": "garder",
|
||||
"close": "fermer",
|
||||
"state": "état",
|
||||
"latest": "dernier",
|
||||
"cloud": "cloud",
|
||||
"provider": "provider",
|
||||
"region": "région",
|
||||
"OS": "OS",
|
||||
"created_at": "Créé à",
|
||||
"edited_at": "Édité à",
|
||||
"instance_type": "Type d\'instance",
|
||||
"filter": "filtrer",
|
||||
"rule_name": "Nom de la règle",
|
||||
"rule": "règle",
|
||||
"rules": "règles",
|
||||
"send": "envoyer",
|
||||
}
|
||||
%}
|
|
@ -41,14 +41,9 @@ except Exception as e:
|
|||
user_subscription = roxywi_common.return_unsubscribed_user_status()
|
||||
roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1)
|
||||
|
||||
if user_params['lang'] == 'ru':
|
||||
title = 'Админка'
|
||||
else:
|
||||
title = 'Admin area'
|
||||
|
||||
rendered_template = template.render(
|
||||
title=title, role=user_params['role'], user=user_params['user'], users=users, groups=sql.select_groups(),
|
||||
servers=sql.select_servers(full=1), roles=sql.select_roles(), masters=masters, sshs=sql.select_ssh(),
|
||||
role=user_params['role'], user=user_params['user'], users=users, groups=sql.select_groups(),
|
||||
servers=sql.select_servers(full=1), masters=masters, sshs=sql.select_ssh(),
|
||||
settings=settings, backups=sql.select_backups(), services=services, timezones=pytz.all_timezones,
|
||||
page="users.py", user_services=user_params['user_services'], ldap_enable=ldap_enable, gits=gits, guide_me=1,
|
||||
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], token=user_params['token'],
|
||||
|
|
|
@ -31,4 +31,21 @@
|
|||
display: none;
|
||||
clear: both;
|
||||
height: 60px;
|
||||
}
|
||||
}
|
||||
.user_group_caption {
|
||||
text-align: center;
|
||||
font-size: 1.3em;
|
||||
padding-bottom: 5px;
|
||||
margin-bottom: 5px;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
.add_user_group, .remove_user_group {
|
||||
background: var(--right-menu-blue-rolor);
|
||||
border-radius: 4px;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
padding: 10px 14px 10px 13px;
|
||||
}
|
||||
.remove_user_group {
|
||||
padding: 10px 14px 10px 15px;
|
||||
}
|
||||
|
|
188
inc/users.js
188
inc/users.js
|
@ -2220,9 +2220,6 @@ function checkSshConnect(ip) {
|
|||
function openChangeUserPasswordDialog(id) {
|
||||
changeUserPasswordDialog(id);
|
||||
}
|
||||
function openChangeUserGroupDialog(id) {
|
||||
changeUserGroupDialog(id);
|
||||
}
|
||||
function openChangeUserServiceDialog(id) {
|
||||
changeUserServiceDialog(id);
|
||||
}
|
||||
|
@ -2296,47 +2293,6 @@ function changeUserPassword(id, d) {
|
|||
} );
|
||||
}
|
||||
}
|
||||
function changeUserGroupDialog(id) {
|
||||
var cancel_word = $('#translate').attr('data-cancel');
|
||||
var groups_word = $('#translate').attr('data-groups');
|
||||
var save_word = $('#translate').attr('data-save');
|
||||
var change_word = $('#translate').attr('data-change');
|
||||
$.ajax( {
|
||||
url: "options.py",
|
||||
data: {
|
||||
getusergroups: id,
|
||||
token: $('#token').val()
|
||||
},
|
||||
type: "POST",
|
||||
success: function( data ) {
|
||||
if (data.indexOf('danger') != '-1') {
|
||||
toastr.error(data);
|
||||
} else {
|
||||
toastr.clear();
|
||||
$('#change-user-groups-form').html(data);
|
||||
$( "#change-user-groups-dialog" ).dialog({
|
||||
resizable: false,
|
||||
height: "auto",
|
||||
width: 450,
|
||||
modal: true,
|
||||
title: change_word+" "+$('#login-'+id).val()+" "+groups_word,
|
||||
buttons: [{
|
||||
text: save_word,
|
||||
click: function () {
|
||||
$(this).dialog("close");
|
||||
changeUserGroup(id);
|
||||
}
|
||||
}, {
|
||||
text: cancel_word,
|
||||
click: function () {
|
||||
$(this).dialog("close");
|
||||
}
|
||||
}]
|
||||
});
|
||||
}
|
||||
}
|
||||
} );
|
||||
}
|
||||
function changeUserServiceDialog(id) {
|
||||
var cancel_word = $('#translate').attr('data-cancel');
|
||||
var manage_word = $('#translate').attr('data-manage');
|
||||
|
@ -2383,29 +2339,6 @@ function changeUserServiceDialog(id) {
|
|||
}
|
||||
} );
|
||||
}
|
||||
function changeUserGroup(id) {
|
||||
var groups = $('#usergroup-'+id).val().toString();
|
||||
$.ajax( {
|
||||
url: "options.py",
|
||||
data: {
|
||||
changeUserGroupId: id,
|
||||
changeUserGroups: groups,
|
||||
changeUserGroupsUser: $('#login-'+id).val(),
|
||||
token: $('#token').val()
|
||||
},
|
||||
type: "POST",
|
||||
success: function( data ) {
|
||||
if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') {
|
||||
toastr.error(data);
|
||||
} else {
|
||||
$("#user-" + id).addClass("update", 1000);
|
||||
setTimeout(function () {
|
||||
$("#user-" + id).removeClass("update");
|
||||
}, 2500);
|
||||
}
|
||||
}
|
||||
} );
|
||||
}
|
||||
function changeUserServices(id) {
|
||||
var services = $('#userservice-'+id).val().toString();
|
||||
$.ajax( {
|
||||
|
@ -2447,21 +2380,26 @@ function addUserGroup(id) {
|
|||
} );
|
||||
}
|
||||
function confirmAjaxServiceAction(action, service) {
|
||||
var cancel_word = $('#translate').attr('data-cancel');
|
||||
var action_word = $('#translate').attr('data-'+action);
|
||||
$( "#dialog-confirm-services" ).dialog({
|
||||
resizable: false,
|
||||
height: "auto",
|
||||
width: 400,
|
||||
modal: true,
|
||||
title: "Are you sure you want to "+ action + " " + service+"?",
|
||||
buttons: {
|
||||
"Sure": function() {
|
||||
$( this ).dialog( "close" );
|
||||
title: action_word + " " + service+"?",
|
||||
buttons: [{
|
||||
text: action_word,
|
||||
click: function () {
|
||||
$(this).dialog("close");
|
||||
ajaxActionServies(action, service)
|
||||
},
|
||||
Cancel: function() {
|
||||
}
|
||||
}, {
|
||||
text: cancel_word,
|
||||
click: function() {
|
||||
$( this ).dialog( "close" );
|
||||
}
|
||||
}
|
||||
}]
|
||||
});
|
||||
}
|
||||
function ajaxActionServies(action, service) {
|
||||
|
@ -3148,3 +3086,105 @@ function serverIsUp(server_ip, server_id) {
|
|||
}
|
||||
});
|
||||
}
|
||||
function confirmChangeGroupsAndRoles(user_id) {
|
||||
var cancel_word = $('#translate').attr('data-cancel');
|
||||
var action_word = $('#translate').attr('data-save');
|
||||
var user_groups_word = $('#translate').attr('data-user_groups');
|
||||
$.ajax({
|
||||
url: "options.py",
|
||||
data: {
|
||||
act: 'show_user_group_and_role',
|
||||
user_id: user_id,
|
||||
token: $('#token').val()
|
||||
},
|
||||
type: "POST",
|
||||
success: function (data) {
|
||||
$("#groups-roles").html(data);
|
||||
$("#groups-roles").dialog({
|
||||
resizable: false,
|
||||
height: "auto",
|
||||
width: 700,
|
||||
modal: true,
|
||||
title: user_groups_word,
|
||||
buttons: [{
|
||||
text: action_word,
|
||||
click: function () {
|
||||
saveGroupsAndRoles(user_id);
|
||||
$(this).dialog("close");
|
||||
}
|
||||
}, {
|
||||
text: cancel_word,
|
||||
click: function () {
|
||||
$(this).dialog("close");
|
||||
}
|
||||
}]
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
function addGroupToUser(group_id) {
|
||||
var group_name = $('#add_group-'+group_id).attr('data-group_name');
|
||||
$.ajax({
|
||||
url: "options.py",
|
||||
data: {
|
||||
act: 'add_user_group_and_role',
|
||||
group_id: group_id,
|
||||
group_name: group_name,
|
||||
length_tr: $('#checked_groups tbody tr').length,
|
||||
token: $('#token').val()
|
||||
},
|
||||
type: "POST",
|
||||
success: function (data) {
|
||||
$('#add_group-'+group_id).remove();
|
||||
$("#checked_groups tbody").append(data);
|
||||
}
|
||||
});
|
||||
}
|
||||
function removeGroupFromUser(group_id) {
|
||||
var group_name = $('#remove_group-'+group_id).attr('data-group_name');
|
||||
$.ajax({
|
||||
url: "options.py",
|
||||
data: {
|
||||
act: 'remove_user_group_and_role',
|
||||
group_id: group_id,
|
||||
group_name: group_name,
|
||||
length_tr: $('#all_groups tbody tr').length,
|
||||
token: $('#token').val()
|
||||
},
|
||||
type: "POST",
|
||||
success: function (data) {
|
||||
$('#remove_group-'+group_id).remove();
|
||||
$("#all_groups tbody").append(data);
|
||||
}
|
||||
});
|
||||
}
|
||||
function saveGroupsAndRoles(user_id) {
|
||||
var length_tr = $('#checked_groups tbody tr').length;
|
||||
var jsonData = {};
|
||||
jsonData[user_id] = {};
|
||||
$('#checked_groups tbody tr').each(function () {
|
||||
var this_id = $(this).attr('id').split('-')[1];
|
||||
var role_id = $('#add_role-'+this_id).val();
|
||||
jsonData[user_id][this_id] = {'role_id': role_id};
|
||||
});
|
||||
console.log(jsonData);
|
||||
$.ajax({
|
||||
url: "options.py",
|
||||
data: {
|
||||
act: 'save_user_group_and_role',
|
||||
jsonDatas: JSON.stringify(jsonData),
|
||||
token: $('#token').val()
|
||||
},
|
||||
type: "POST",
|
||||
success: function (data) {
|
||||
if (data.indexOf('error: ') != '-1') {
|
||||
toastr.warning(data);
|
||||
} else {
|
||||
$("#user-"+user_id).addClass( "update", 1000 );
|
||||
setTimeout(function() {
|
||||
$( "#user-"+user_id ).removeClass( "update" );
|
||||
}, 2500 );
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue