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/') 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, )