2021-05-18 15:16:49 -07:00
#!/usr/bin/env python3
# Author: 'UltraDesu <ab@hexor.ru>'
# Home: https://github.com/house-of-vanity/Wireguard-Peer-Manager
2021-05-06 17:36:18 +03:00
import logging
import os
import sys
2022-03-16 14:14:35 +03:00
import configparser
2021-05-06 17:36:18 +03:00
from telegram import InlineKeyboardButton , InlineKeyboardMarkup , Update
from telegram . ext import Updater , MessageHandler , CommandHandler , filters , CallbackQueryHandler , CallbackContext
from gen import add_peer as wg_add_peer
from gen import update_configs
2021-05-07 02:15:06 +03:00
from gen import list_peers as wg_list_peers
from gen import del_peer as wg_del_peer
2021-05-06 17:36:18 +03:00
logging . basicConfig (
level = logging . INFO ,
format = ' %(asctime)s - %(name)s - %(levelname)s - %(message)s ' )
log = logging . getLogger ( __name__ )
token = os . environ . get ( ' TG_TOKEN ' )
2022-04-25 11:56:05 +00:00
admin = os . environ . get ( ' TG_ADMIN ' ) . replace ( ' " ' , ' ' ) . replace ( ' ' , ' ' ) . split ( ' , ' )
2021-05-06 17:36:18 +03:00
if not token or not admin :
log . error ( " Env var TG_TOKEN or TG_ADMIN aren ' t set. " )
sys . exit ( 1 )
2022-03-16 14:14:35 +03:00
wpm_config = configparser . ConfigParser ( )
if wpm_config . read ( ' wpm.conf ' ) :
config = wpm_config [ ' Interface ' ] . get ( ' config ' , ' wg0 ' )
else :
config = " wg0 "
2021-05-06 17:36:18 +03:00
def _help ( update , context ) :
2021-05-07 02:15:06 +03:00
update . message . reply_text ( ' <b>Help:</b> \n <b>*</b> /add <i>peer name</i> \n <b>*</b> /del <i>peer name</i> \n <b>*</b> /list [<i>peer name</i>] ' , parse_mode = ' HTML ' , disable_web_page_preview = True )
2021-05-06 17:36:18 +03:00
2021-05-07 02:15:06 +03:00
def auth ( handler ) :
def wrapper ( update , context ) :
2022-04-25 11:56:05 +00:00
if update . message . chat . username not in admin :
2021-05-07 02:15:06 +03:00
update . message . reply_text (
' You are not allowed to do that. ' , parse_mode = ' HTML ' , disable_web_page_preview = True )
return False
handler ( update , context )
return wrapper
@auth
def list_peers ( update , context ) :
if len ( update . message . text . split ( ) ) == 1 :
n = 1
message = " Peers: \n <code> "
for peer in wg_list_peers ( ) :
message + = f " { n } * { peer [ ' ip ' ] } : { peer [ ' name ' ] } \n "
n + = 1
update . message . reply_text ( f " { message } </code> " , parse_mode = ' HTML ' , disable_web_page_preview = True )
else :
peer_name = " _ " . join ( update . message . text . split ( ) [ 1 : ] )
2022-06-05 16:11:08 +00:00
if peer_name . isnumeric ( ) :
n = 1
for peer in wg_list_peers ( ) :
if int ( peer_name ) == n :
peer_name = peer [ ' name ' ]
break
n + = 1
2021-05-07 02:15:06 +03:00
try :
update . message . reply_photo (
2022-03-16 14:14:35 +03:00
open ( f ' /etc/wireguard/clients_ { config } / { peer_name } -qr.png ' , ' rb ' ) , filename = f ' { peer_name } QR.png ' , quote = True , caption = open ( f ' /etc/wireguard/clients_ { config } / { peer_name } .conf ' , ' r ' ) . read ( ) )
2022-04-25 15:15:56 +03:00
update . message . reply_document ( open ( f ' /etc/wireguard/clients_ { config } / { peer_name } .conf ' , ' rb ' ) )
2021-05-07 02:15:06 +03:00
except :
update . message . reply_text ( " Wrong client name. " )
@auth
def del_peer ( update , context ) :
if len ( update . message . text . split ( ) ) < 2 :
_help ( update , context )
2021-05-06 17:36:18 +03:00
return False
2021-05-07 02:15:06 +03:00
peer_name = " _ " . join ( update . message . text . split ( ) [ 1 : ] )
log . info ( " Deleting peer %s " , peer_name )
wg_del_peer ( peer_name )
update . message . reply_text ( " Done. " )
@auth
def add_peer ( update , context ) :
2021-05-06 17:36:18 +03:00
if len ( update . message . text . split ( ) ) < 2 :
2021-05-07 02:15:06 +03:00
_help ( update , context )
2021-05-06 18:23:36 +03:00
return False
2021-05-06 17:36:18 +03:00
peer_name = " _ " . join ( update . message . text . split ( ) [ 1 : ] )
log . info ( " Creating peer %s " , peer_name )
wg_add_peer ( peer_name )
2022-06-05 16:01:00 +00:00
msg = open ( f ' /etc/wireguard/clients_ { config } / { peer_name } .conf ' , ' r ' ) . read ( )
update . message . reply_photo ( open ( f ' /etc/wireguard/clients_ { config } / { peer_name } -qr.png ' , ' rb ' ) , parse_mode = ' HTML ' , filename = f ' { peer_name } QR.png ' , quote = True , caption = f " Install Wireguard VPN app and scan or open config. \n <code> { msg } </code> " )
2022-03-16 14:14:35 +03:00
update . message . reply_document ( open ( f ' /etc/wireguard/clients_ { config } / { peer_name } .conf ' , ' rb ' ) )
2021-05-06 17:36:18 +03:00
2021-05-07 02:15:06 +03:00
def error ( update , context ) :
update . message . reply_text ( " Something went wrong... " )
2021-05-06 17:36:18 +03:00
def main ( ) :
updater = Updater ( token , use_context = True )
2021-05-07 02:15:06 +03:00
updater . dispatcher . add_error_handler ( error )
2021-05-06 17:36:18 +03:00
updater . dispatcher . add_handler ( CommandHandler ( ' add ' , add_peer ) )
2021-05-07 02:15:06 +03:00
updater . dispatcher . add_handler ( CommandHandler ( ' list ' , list_peers ) )
updater . dispatcher . add_handler ( CommandHandler ( ' del ' , del_peer ) )
2021-05-06 17:36:18 +03:00
updater . dispatcher . add_handler ( MessageHandler ( filters . Filters . text , _help ) )
updater . start_polling ( )
updater . idle ( )
if __name__ == ' __main__ ' :
log = logging . getLogger ( ' WireGuard-GenBot ' )
main ( )