LINUX.ORG.RU

Как узнать подключен ли процесс openvpn к туннельному интерфейсу или висит просто так?

 ,


0

3

Как узнать подключен ли процесс openvpn к туннельному интерфейсу или висит просто так?
ps -ax выводит 18 процессов openvpn, а ifconfig только 15 tap интерфейсов. Значит какие-то отвалились. Как узнать какие это процессы?
Для получения процессов на python использую psutils, а для соединений netifaces.

★★★★★

psutil выдает информацию в следующем виде:

[pconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=('192.168.11.143', 53612), raddr=('91.219.28.11', 443), status='ESTABLISHED')]

Как оттуда вытащить status? Парсингом? или pconn - какой- то объект и можно получить доступ по названиям как-то?

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от alozovskoy

неа не всегда работает(
Вот такой код:

def reconnect():
	conn_names = []
	pids = psutil.pids()
	for pid in pids:
		pid = psutil.Process(pid)
		if (pid.name() == 'openvpn'):
			print(pid.connections()[0].status)


периодически выдает:
Traceback (most recent call last):
  File "vpn_v.py", line 100, in <module>
    reconnect()
  File "vpn_v.py", line 69, in reconnect
    print(pid.connections()[0].status)
IndexError: list index out of range

Почему?

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от trashymichael

Да, я туплю по жесткому. Похоже что изначально думал правильно. А если пуст, то и соединения нет)

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

давай сделаем ревью, только выкладывай в соответствующее место, если кода больше чем ничего, гитхаб подойдет, можешь гистом если один файл

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

Не, выложу сюда, наверно. Там всего 80+ строк. Сейчас

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от trashymichael

Основной файл:

import netifaces
import subprocess
import os
import glob
from pprint import pprint
from time import sleep, time
import psutil
from datetime import datetime

class cd:
	"""Context manager for changing the current working directory"""
	def __init__(self, newPath):
		self.newPath = os.path.expanduser(newPath)

	def __enter__(self):
		self.savedPath = os.getcwd()
		os.chdir(self.newPath)

	def __exit__(self, etype, value, traceback):
		os.chdir(self.savedPath)

def get_taps():
	interfaces = netifaces.interfaces()
	taps = []
	for interface in interfaces:
		if interface[:3] == 'tap':
			taps.append(interface)
	return taps

def tap2num(tap):
	num = tap[3:]
	return int(num)

def reconnect():
	cur_dir = os.path.dirname(os.path.realpath(__file__))
	cur_dt = datetime.now().strftime('%d.%m.%Y %H:%M:%S')
	f = open(cur_dir+'/test2', 'a')
	f.write(cur_dt+'\n')
	f.close()
	conn_names = []
	conn_status = []
	pids = psutil.pids()
	for pid in pids:
		pid = psutil.Process(pid)
		if (pid.name() == 'openvpn'):
			if(len(pid.connections())):
				if(pid.connections()[0].status != 'ESTABLISHED'):
					pid.terminate()
				else:
					conn_status.append(pid.connections()[0].status)
					conn_names.append(pid.cmdline()[3])
			else:
				pid.terminate()

	with cd(cur_dir+'/vpn'):
		taps = list(map(tap2num, get_taps()))
		ovpns = glob.glob('*.ovpn')
		vpn_nums = list(range(len(ovpns)))
		nc_taps = list(set(vpn_nums) - set(taps))
		nc_taps.sort()
		nc_names = list(set(ovpns) - set(conn_names))
		print(nc_names)

		for i in range(len(nc_names)):
			print(i,') sudo', ' openvpn --route-noexec --config ', nc_names[i], ' --dev ', ('tap'+str(nc_taps[i])))
			proc = subprocess.Popen(['nohup', 'sudo', 'openvpn','--route-noexec', '--config', nc_names[i], '--dev', ('tap'+str(nc_taps[i])), '&'], stderr=subprocess.PIPE)
			StartTime = time()
			while True:
				CurTime = time()
				if CurTime - StartTime > 30:
					proc.kill()
					print('VPN ' +  nc_names[i] + ' killed!')
					break
				else:
					sleep(1)
					try:
						ip = netifaces.ifaddresses('tap'+str(nc_taps[i]))[2][0]['addr']
					except:
						pass
					else:
						print(nc_names[i], " - ", ip)
						subprocess.call(['ip', 'rule', 'add', 'from', ip, 'lookup', 'viatap'+str(nc_taps[i])])
						subprocess.call(['ip', 'route', 'add', 'default', 'dev', 'tap'+str(nc_taps[i]), 'table', 'viatap'+str(nc_taps[i])])
						break

		print(len(get_taps()), ' VPNs connected!')

reconnect()	

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от trashymichael

Файл для запуска основного через cron:

import psutil
import subprocess
import os


class cd:
	"""Context manager for changing the current working directory"""
	def __init__(self, newPath):
		self.newPath = os.path.expanduser(newPath)

	def __enter__(self):
		self.savedPath = os.getcwd()
		os.chdir(self.newPath)

	def __exit__(self, etype, value, traceback):
		os.chdir(self.savedPath)

dir_path = os.path.dirname(os.path.realpath(__file__))
flag = False
pids = psutil.pids()
for pid in pids:
	pid = psutil.Process(pid)
	if(pid.name() == 'python3'):
		if(pid.cmdline()[1] == 'vpn_v.py'):
			flag = True

if(flag):
	pass
else:
	with cd(dir_path):
		proc = subprocess.Popen(['nohup', 'python3','vpn_v.py', '&'], stderr=subprocess.PIPE)
	

Qwentor ★★★★★
() автор топика
Последнее исправление: Qwentor (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.