import os
import sys
import typing as t
from datetime import datetime
from flask import Flask, jsonify
app = Flask(__name__)
app.config['JSONIFY_PRETTYPRINT_REGULAR'] = True
app.config['JSON_SORT_KEYS'] = False
def count_connection(username: str) -> int:
command = 'ps -u %s' % username
result = os.popen(command).readlines()
return len([line for line in result if 'sshd' in line])
def get_expiration_date(username: str) -> t.Optional[str]:
command = 'chage -l %s' % username
result = os.popen(command).readlines()
for line in result:
line = list(map(str.strip, line.split(':')))
if line[0].lower() == 'account expires' and line[1] != 'never':
return datetime.strptime(line[1], '%b %d, %Y').strftime('%d/%m/%Y')
return None
def get_expiration_days(date: str) -> int:
if not isinstance(date, str) or date.lower() == 'never' or not isinstance(date, str):
return -1
return (datetime.strptime(date, '%d/%m/%Y') - datetime.now()).days
def get_time_online(username: str) -> t.Optional[str]:
command = 'ps -u %s -o etime --no-headers' % username
result = os.popen(command).readlines()
return result[0].strip() if result else None
@app.route('/check/<string:username>')
def check_user(username):
try:
count = count_connection(username)
expiration_date = get_expiration_date(username)
return jsonify(
{
'username': username,
'count_connection': count,
'expiration_date': expiration_date,
'expiration_days': get_expiration_days(expiration_date),
'time_online': get_time_online(username),
}
)
except Exception as e:
return jsonify({'error': str(e)})
if __name__ == '__main__':
app.run(
host='0.0.0.0',
port=int(sys.argv[1]) if len(sys.argv) > 1 else 2095,
)