160 lines
4.8 KiB
Python
Executable File
160 lines
4.8 KiB
Python
Executable File
#! /usr/bin/python3
|
|
#
|
|
# ufw: front-end for Linux firewalling (cli)
|
|
#
|
|
# Copyright 2008-2021 Canonical Ltd.
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License version 3,
|
|
# as published by the Free Software Foundation.
|
|
#
|
|
# 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/>.
|
|
#
|
|
|
|
from __future__ import print_function
|
|
import os
|
|
import sys
|
|
import warnings
|
|
|
|
import ufw.frontend
|
|
from ufw.common import UFWError
|
|
from ufw.util import error, warn, msg, _findpath, create_lock, release_lock
|
|
|
|
import gettext
|
|
kwargs = {}
|
|
if sys.version_info[0] < 3:
|
|
# In Python 2, ensure that the _() that gets installed into built-ins
|
|
# always returns unicodes. This matches the default behavior under Python
|
|
# 3, although that keyword argument is not present in the Python 3 API.
|
|
kwargs['unicode'] = True
|
|
gettext.install(ufw.common.programName, **kwargs)
|
|
|
|
version = "0.36.1"
|
|
|
|
# relocate root and data directories if specified
|
|
args = []
|
|
rootdir = None
|
|
datadir = None
|
|
for i in sys.argv:
|
|
if i.startswith('--rootdir='):
|
|
if len(i.split('=')) == 2:
|
|
rootdir = i.split('=')[1]
|
|
else:
|
|
error('--rootdir is empty')
|
|
elif i.startswith('--datadir='):
|
|
if len(i.split('=')) == 2:
|
|
datadir = i.split('=')[1]
|
|
else:
|
|
error('--datadir is empty')
|
|
else:
|
|
args.append(i)
|
|
|
|
# Internationalization
|
|
gettext.bindtextdomain(ufw.common.programName, \
|
|
os.path.join(_findpath(ufw.common.trans_dir, rootdir),
|
|
'messages'))
|
|
gettext.textdomain(ufw.common.programName)
|
|
try:
|
|
# BAW: I'm not sure why both this and the .install() above is here, but
|
|
# let's roll with it for now. This is the Python 2 version, which ensures
|
|
# we get unicodes.
|
|
_ = gettext.ugettext
|
|
except AttributeError:
|
|
# Python 3 always returns unicodes.
|
|
_ = gettext.gettext
|
|
|
|
if sys.version_info[0] < 2 or \
|
|
(sys.version_info[0] == 2 and sys.version_info[1] < 6):
|
|
msg(ufw.common.programName + _(": Need at least python 2.6)\n"), \
|
|
sys.stderr)
|
|
sys.exit(1)
|
|
|
|
|
|
def clean_warning(message, category, filename, lineno, file=None, line=""):
|
|
warn(message)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
warnings.showwarning = clean_warning
|
|
app_action = False
|
|
pr = None
|
|
|
|
# Remember, will have to take --force into account if we use it with 'app'
|
|
idx = 1
|
|
if len(args) > 1 and args[1].lower() == "--dry-run":
|
|
idx += 1
|
|
|
|
if len(args) > idx and args[idx].lower() == "app":
|
|
app_action = True
|
|
|
|
try:
|
|
pr = ufw.frontend.parse_command(args)
|
|
except ValueError:
|
|
msg(ufw.frontend.get_command_help())
|
|
sys.exit(1)
|
|
except UFWError as e:
|
|
error(e.value)
|
|
except Exception:
|
|
raise
|
|
|
|
if pr.action == "help" or pr.action == "--help":
|
|
msg(ufw.frontend.get_command_help())
|
|
sys.exit(0)
|
|
elif pr.action == "version" or pr.action == "--version":
|
|
msg(ufw.common.programName + " " + version)
|
|
msg("Copyright 2008-2021 Canonical Ltd.")
|
|
sys.exit(0)
|
|
|
|
try:
|
|
ui = ufw.frontend.UFWFrontend(pr.dryrun, rootdir=rootdir,
|
|
datadir=datadir)
|
|
except UFWError as e:
|
|
error(e.value)
|
|
except Exception:
|
|
raise
|
|
|
|
if datadir is None:
|
|
lockfile = '/run/ufw.lock'
|
|
if os.getuid() != 0 or 'TESTSTATE' in os.environ:
|
|
lockfile = os.path.join(ufw.common.state_dir, 'ufw.lock')
|
|
else:
|
|
lockfile = os.path.join(_findpath(ufw.common.state_dir, datadir),
|
|
'ufw.lock')
|
|
|
|
lock = create_lock(lockfile=lockfile, dryrun=pr.dryrun)
|
|
res = ""
|
|
try:
|
|
if app_action and 'type' in pr.data and pr.data['type'] == 'app':
|
|
res = ui.do_application_action(pr.action, pr.data['name'])
|
|
else:
|
|
bailout = False
|
|
if pr.action == "enable" and not pr.force and \
|
|
not ui.continue_under_ssh():
|
|
res = _("Aborted")
|
|
bailout = True
|
|
|
|
if not bailout:
|
|
if 'rule' in pr.data:
|
|
res = ui.do_action(pr.action, pr.data['rule'], \
|
|
pr.data['iptype'], pr.force)
|
|
else:
|
|
res = ui.do_action(pr.action, "", "", pr.force)
|
|
|
|
if res != "":
|
|
msg(res)
|
|
|
|
except UFWError as e:
|
|
error(e.value)
|
|
except Exception:
|
|
raise
|
|
finally:
|
|
release_lock(lock)
|
|
|
|
sys.exit(0)
|