mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
[wip] Ask user for keeping or not sshd config
This commit is contained in:
parent
7f3a35dac0
commit
f0d0a71586
2 changed files with 133 additions and 0 deletions
56
src/yunohost/data_migrations/0006_manage_sshd_config.py
Normal file
56
src/yunohost/data_migrations/0006_manage_sshd_config.py
Normal file
|
@ -0,0 +1,56 @@
|
|||
import subprocess
|
||||
import os
|
||||
|
||||
from shutil import copyfile
|
||||
|
||||
from moulinette import m18n
|
||||
from moulinette.core import MoulinetteError
|
||||
from moulinette.utils.log import getActionLogger
|
||||
|
||||
from yunohost.tools import Migration
|
||||
from yunohost.service import service_regen_conf, _get_conf_hashes,
|
||||
_calculate_hash
|
||||
|
||||
logger = getActionLogger('yunohost.migration')
|
||||
|
||||
|
||||
class MyMigration(Migration):
|
||||
"""
|
||||
Ensure SSH conf is managed by YunoHost, reapply initial change and setup an
|
||||
extension dir
|
||||
"""
|
||||
|
||||
def migrate(self):
|
||||
|
||||
# Create sshd_config.d dir
|
||||
if not os.path.exists('/etc/ssh/sshd_config.d'):
|
||||
mkdir('/etc/ssh/sshd_config.d', '0755', uid='root', gid='root')
|
||||
|
||||
# Manage SSHd in all case
|
||||
if os.path.exists('/etc/yunohost/from_script'):
|
||||
rm('/etc/yunohost/from_script')
|
||||
copyfile('/etc/ssh/sshd_config', '/etc/ssh/sshd_config.restore')
|
||||
service_regen_conf(names=['ssh'], force=True)
|
||||
os.rename('/etc/ssh/sshd_config.restore', '/etc/ssh/sshd_config')
|
||||
|
||||
# If custom conf, add 'Include' instruction
|
||||
ynh_hash = _get_conf_hashes('ssh')['/etc/ssh/sshd_config']
|
||||
current_hash = _calculate_hash('/etc/ssh/sshd_config')
|
||||
if ynh_hash == current_hash:
|
||||
return
|
||||
|
||||
add_include = False
|
||||
include_rgx = r'^[ \t]*Include[ \t]+sshd_config\.d/\*[ \t]*(?:#.*)?$'
|
||||
for line in open('/etc/ssh/sshd_config'):
|
||||
if re.match(root_rgx, line) is not None:
|
||||
add_include = True
|
||||
break
|
||||
|
||||
if add_include:
|
||||
with open("/etc/ssh/sshd_config", "a") as conf:
|
||||
conf.write('Include sshd_config.d/*')
|
||||
|
||||
def backward(self):
|
||||
|
||||
raise MoulinetteError(m18n.n("migration_0006_backward_impossible"))
|
||||
|
77
src/yunohost/data_migrations/0007_reset_sshd_config.py
Normal file
77
src/yunohost/data_migrations/0007_reset_sshd_config.py
Normal file
|
@ -0,0 +1,77 @@
|
|||
import subprocess
|
||||
import os
|
||||
|
||||
from shutil import copyfile
|
||||
|
||||
from moulinette import m18n
|
||||
from moulinette.core import MoulinetteError
|
||||
from moulinette.utils.log import getActionLogger
|
||||
|
||||
from yunohost.tools import Migration
|
||||
from yunohost.service import service_regen_conf
|
||||
|
||||
logger = getActionLogger('yunohost.migration')
|
||||
|
||||
|
||||
class MyMigration(Migration):
|
||||
"Reset SSH conf to the YunoHost one"
|
||||
|
||||
mode = "manual"
|
||||
|
||||
def migrate(self):
|
||||
service_regen_conf(names=['ssh'], force=True)
|
||||
|
||||
def backward(self):
|
||||
|
||||
raise MoulinetteError(m18n.n("migration_0007_backward_impossible"))
|
||||
|
||||
@property
|
||||
def disclaimer(self):
|
||||
|
||||
# Avoid having a super long disclaimer
|
||||
ynh_hash = _get_conf_hashes('ssh')['/etc/ssh/sshd_config']
|
||||
current_hash = _calculate_hash('/etc/ssh/sshd_config')
|
||||
if ynh_hash == current_hash:
|
||||
return None
|
||||
|
||||
# Detect major risk to migrate to the new configuration
|
||||
dsa = False
|
||||
port_rgx = r'^[ \t]*Port[ \t]+(\d+)[ \t]*(?:#.*)?$'
|
||||
root_rgx = r'^[ \t]*PermitRootLogin[ \t]([\w-]*)[ \t]*(?:#.*)?$'
|
||||
dsa_rgx = r'^[ \t]*HostKey[ \t]+/etc/ssh/ssh_host_dsa_key[ \t]*(?:#.*)?$'
|
||||
for line in open('/etc/ssh/sshd_config'):
|
||||
|
||||
ports = re.findall(port_rgx, line)
|
||||
|
||||
root_login = re.match(root_rgx, line)
|
||||
if root_login is not None:
|
||||
root_login = root_login.group(1)
|
||||
|
||||
if not dsa and re.match(dsa_rgx, line):
|
||||
dsa = True
|
||||
|
||||
if len(ports) == 0:
|
||||
ports = ['22']
|
||||
|
||||
port = ports != ['22']
|
||||
|
||||
root_user = root_login in ['yes']
|
||||
|
||||
# Build message
|
||||
message = m18n.n("migration_0007_general_warning")
|
||||
|
||||
if port:
|
||||
message += "\n\n" + m18n.n("migration_0007_port")
|
||||
|
||||
if root_user:
|
||||
message += "\n\n" + m18n.n("migration_0007_root")
|
||||
|
||||
if dsa:
|
||||
message += "\n\n" + m18n.n("migration_0007_dsa")
|
||||
|
||||
if port or root_user or dsa:
|
||||
message += "\n\n" + m18n.n("migration_0007_risk")
|
||||
else:
|
||||
message += "\n\n" + m18n.n("migration_0007_no_risk")
|
||||
|
||||
return message
|
Loading…
Add table
Reference in a new issue