mirror of
https://github.com/motioneye-project/motioneyeos.git
synced 2025-04-24 15:27:16 +00:00
243 lines
7.0 KiB
Python
243 lines
7.0 KiB
Python
|
|
# Copyright (c) 2015 Calin Crisan
|
|
# This file is part of motionEyeOS.
|
|
#
|
|
# motionEyeOS is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import logging
|
|
import os.path
|
|
import re
|
|
|
|
from collections import OrderedDict
|
|
|
|
from config import additional_config
|
|
|
|
|
|
STATIC_IP_CONF = '/data/etc/static_ip.conf'
|
|
|
|
|
|
def _get_ip_settings():
|
|
ip = None
|
|
ip_comment = False
|
|
cidr = '24'
|
|
gw = '192.168.1.1'
|
|
gw_comment = False
|
|
dns = '8.8.8.8'
|
|
dns_comment = False
|
|
|
|
if os.path.exists(STATIC_IP_CONF):
|
|
logging.debug('reading ip settings from %s' % STATIC_IP_CONF)
|
|
|
|
with open(STATIC_IP_CONF) as f:
|
|
for line in f:
|
|
line = line.strip()
|
|
if line.startswith('#'):
|
|
comment = True
|
|
line = line.strip('#')
|
|
|
|
else:
|
|
comment = False
|
|
|
|
if not line:
|
|
continue
|
|
|
|
match = re.match('^STATIC_IP="(.*)/(.*)"$', line)
|
|
if match:
|
|
ip, cidr = match.groups()
|
|
ip_comment = comment
|
|
continue
|
|
|
|
match = re.match('^STATIC_GW="(.*)"$', line)
|
|
if match:
|
|
gw = match.group(1)
|
|
gw_comment = comment
|
|
continue
|
|
|
|
match = re.match('^STATIC_DNS="(.*)"$', line)
|
|
if match:
|
|
dns = match.group(1)
|
|
dns_comment = comment
|
|
continue
|
|
|
|
if ip is None or ip_comment:
|
|
type = 'dhcp'
|
|
|
|
else:
|
|
type = 'static'
|
|
|
|
if ip is None:
|
|
ip = '192.168.1.101'
|
|
|
|
bits = 0
|
|
for i in xrange(32 - int(cidr), 32):
|
|
bits |= (1 << i)
|
|
|
|
mask = '%d.%d.%d.%d' % ((bits & 0xff000000) >> 24, (bits & 0xff0000) >> 16, (bits & 0xff00) >> 8 , (bits & 0xff))
|
|
|
|
if gw_comment and type == 'static':
|
|
gw = None
|
|
|
|
if dns_comment and type == 'static':
|
|
dns = None
|
|
|
|
s = {
|
|
'ipConfigType': type,
|
|
'ipConfigStaticAddr': ip,
|
|
'ipConfigStaticMask': mask,
|
|
'ipConfigStaticGw': gw,
|
|
'ipConfigStaticDns': dns
|
|
}
|
|
|
|
logging.debug(('ip settings: type=%(ipConfigType)s, addr=%(ipConfigStaticAddr)s, mask=%(ipConfigStaticMask)s, ' +
|
|
'gw=%(ipConfigStaticGw)s, dns=%(ipConfigStaticDns)s') % s)
|
|
|
|
return s
|
|
|
|
|
|
def _set_ip_settings(s):
|
|
type = s.get('ipConfigType', 'dhcp')
|
|
ip = s.get('ipConfigStaticAddr', '192.168.1.101')
|
|
mask = s.get('ipConfigStaticMask', '255.255.255.0')
|
|
gw = s.get('ipConfigStaticGw', '192.168.1.1')
|
|
dns = s.get('ipConfigStaticDns', '8.8.8.8')
|
|
|
|
logging.debug('writing ip settings to %s: ' % STATIC_IP_CONF +
|
|
('type=%(ipConfigType)s, addr=%(ipConfigStaticAddr)s, mask=%(ipConfigStaticMask)s, ' +
|
|
'gw=%(ipConfigStaticGw)s, dns=%(ipConfigStaticDns)s') % s)
|
|
|
|
cidr = '24'
|
|
if mask:
|
|
binary_str = ''
|
|
for octet in mask.split('.'):
|
|
binary_str += bin(int(octet))[2:].zfill(8)
|
|
cidr = str(len(binary_str.rstrip('0')))
|
|
|
|
current_settings = OrderedDict()
|
|
if os.path.exists(STATIC_IP_CONF):
|
|
with open(STATIC_IP_CONF, 'r') as f:
|
|
for line in f:
|
|
line = line.strip().split('=', 1)
|
|
if len(line) != 2:
|
|
continue
|
|
key, value = line
|
|
if key.startswith('#'):
|
|
current_settings[key.strip('#')] = (value, False)
|
|
|
|
else:
|
|
current_settings[key] = (value, True)
|
|
|
|
enabled = type != 'dhcp'
|
|
current_settings['STATIC_IP'] = ('"%s/%s"' % (ip, cidr), enabled)
|
|
current_settings['STATIC_GW'] = ('"%s"' % gw, enabled)
|
|
current_settings['STATIC_DNS'] = ('"%s"' % dns, enabled)
|
|
|
|
with open(STATIC_IP_CONF, 'w') as f:
|
|
for key, value in current_settings.items():
|
|
(value, enabled) = value
|
|
if not enabled:
|
|
key = '#' + key
|
|
f.write('%s=%s\n' % (key, value))
|
|
|
|
|
|
@additional_config
|
|
def ipSeparator():
|
|
return {
|
|
'type': 'separator',
|
|
'section': 'network'
|
|
}
|
|
|
|
|
|
@additional_config
|
|
def ipConfigType():
|
|
return {
|
|
'label': 'IP Configuration',
|
|
'description': 'select the way your IP address is configured',
|
|
'type': 'choices',
|
|
'choices': [('dhcp', 'Automatic (DHCP)'), ('static', 'Manual (Static IP)')],
|
|
'section': 'network',
|
|
'reboot': True,
|
|
'get': _get_ip_settings,
|
|
'set': _set_ip_settings,
|
|
'get_set_dict': True
|
|
}
|
|
|
|
|
|
@additional_config
|
|
def ipConfigStaticAddr():
|
|
return {
|
|
'label': 'IP Address',
|
|
'description': 'manually set your static IP address',
|
|
'type': 'str',
|
|
'validate': '^[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?$',
|
|
'section': 'network',
|
|
'required': True,
|
|
'depends': ['ipConfigType==static'],
|
|
'reboot': True,
|
|
'get': _get_ip_settings,
|
|
'set': _set_ip_settings,
|
|
'get_set_dict': True,
|
|
}
|
|
|
|
|
|
@additional_config
|
|
def ipConfigStaticMask():
|
|
return {
|
|
'label': 'Network Mask',
|
|
'description': 'manually set your network mask',
|
|
'type': 'str',
|
|
'validate': '^[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?$',
|
|
'section': 'network',
|
|
'required': True,
|
|
'depends': ['ipConfigType==static'],
|
|
'reboot': True,
|
|
'get': _get_ip_settings,
|
|
'set': _set_ip_settings,
|
|
'get_set_dict': True,
|
|
}
|
|
|
|
|
|
@additional_config
|
|
def ipConfigStaticGw():
|
|
return {
|
|
'label': 'Default Gateway',
|
|
'description': 'manually set your default gateway',
|
|
'type': 'str',
|
|
'validate': '^[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?$',
|
|
'section': 'network',
|
|
'required': True,
|
|
'depends': ['ipConfigType==static'],
|
|
'reboot': True,
|
|
'get': _get_ip_settings,
|
|
'set': _set_ip_settings,
|
|
'get_set_dict': True,
|
|
}
|
|
|
|
|
|
@additional_config
|
|
def ipConfigStaticDns():
|
|
return {
|
|
'label': 'DNS Server',
|
|
'description': 'manually set your DNS server',
|
|
'type': 'str',
|
|
'validate': '^[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?$',
|
|
'section': 'network',
|
|
'required': True,
|
|
'depends': ['ipConfigType==static'],
|
|
'reboot': True,
|
|
'get': _get_ip_settings,
|
|
'set': _set_ip_settings,
|
|
'get_set_dict': True,
|
|
}
|
|
|