48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
|
# SPDX-License-Identifier: GPL-2.0
|
||
|
|
||
|
import json as _json
|
||
|
import subprocess
|
||
|
|
||
|
class cmd:
|
||
|
def __init__(self, comm, shell=True, fail=True, ns=None, background=False):
|
||
|
if ns:
|
||
|
if isinstance(ns, NetNS):
|
||
|
ns = ns.name
|
||
|
comm = f'ip netns exec {ns} ' + comm
|
||
|
|
||
|
self.stdout = None
|
||
|
self.stderr = None
|
||
|
self.ret = None
|
||
|
|
||
|
self.comm = comm
|
||
|
self.proc = subprocess.Popen(comm, shell=shell, stdout=subprocess.PIPE,
|
||
|
stderr=subprocess.PIPE)
|
||
|
if not background:
|
||
|
self.process(terminate=False, fail=fail)
|
||
|
|
||
|
def process(self, terminate=True, fail=None):
|
||
|
if terminate:
|
||
|
self.proc.terminate()
|
||
|
stdout, stderr = self.proc.communicate()
|
||
|
self.stdout = stdout.decode("utf-8")
|
||
|
self.stderr = stderr.decode("utf-8")
|
||
|
self.proc.stdout.close()
|
||
|
self.proc.stderr.close()
|
||
|
self.ret = self.proc.returncode
|
||
|
|
||
|
if self.proc.returncode != 0 and fail:
|
||
|
if len(stderr) > 0 and stderr[-1] == "\n":
|
||
|
stderr = stderr[:-1]
|
||
|
raise Exception("Command failed: %s\n%s" % (self.proc.args, stderr))
|
||
|
|
||
|
|
||
|
def ip(args, json=None, ns=None):
|
||
|
cmd_str = "ip "
|
||
|
if json:
|
||
|
cmd_str += '-j '
|
||
|
cmd_str += args
|
||
|
cmd_obj = cmd(cmd_str, ns=ns)
|
||
|
if json:
|
||
|
return _json.loads(cmd_obj.stdout)
|
||
|
return cmd_obj
|