first commit
This commit is contained in:
commit
87492a7afb
15
.vscode/launch.json
vendored
Normal file
15
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Python: Current File",
|
||||||
|
"type": "python",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${file}",
|
||||||
|
"console": "integratedTerminal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
4
.vscode/settings.json
vendored
Normal file
4
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"python.linting.pycodestyleEnabled": true,
|
||||||
|
"python.linting.enabled": true
|
||||||
|
}
|
78
login-log.py
Normal file
78
login-log.py
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
import os
|
||||||
|
from datetime import date
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
|
# Determine if the OS is MS Windows
|
||||||
|
if os.name == 'nt':
|
||||||
|
# Set the location of the file to write to, in the user Documents directory
|
||||||
|
logfile = os.path.join(os.path.join(os.environ['USERPROFILE']),
|
||||||
|
r'Documents\login.log')
|
||||||
|
# For OS which are not MS Windows
|
||||||
|
else:
|
||||||
|
logfile = os.path.join(os.path.join(os.environ['HOME']),
|
||||||
|
r'Documents\login.log')
|
||||||
|
|
||||||
|
# Create the file if it does not exist yet
|
||||||
|
if not os.path.exists(logfile):
|
||||||
|
with open(logfile, 'w'):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Determine the current date and time
|
||||||
|
today = date.today()
|
||||||
|
now = datetime.now()
|
||||||
|
|
||||||
|
current_day = today.strftime("%d.%m.%Y")
|
||||||
|
|
||||||
|
current_time = now.strftime("%H:%M:%S")
|
||||||
|
|
||||||
|
# Determine the client hostname
|
||||||
|
client_hostname = os.getenv("CLIENTNAME")
|
||||||
|
|
||||||
|
|
||||||
|
# Class for prepending the information to the log file
|
||||||
|
class Prepender(object):
|
||||||
|
def __init__(self,
|
||||||
|
file_path,
|
||||||
|
):
|
||||||
|
# Read in the existing file, so we can write it back later
|
||||||
|
with open(file_path, mode='r') as f:
|
||||||
|
self.__write_queue = f.readlines()
|
||||||
|
|
||||||
|
self.__open_file = open(file_path, mode='w')
|
||||||
|
|
||||||
|
def write_line(self, line):
|
||||||
|
self.__write_queue.insert(0,
|
||||||
|
"%s\n" % line,
|
||||||
|
)
|
||||||
|
|
||||||
|
def write_lines(self, lines):
|
||||||
|
lines.reverse()
|
||||||
|
for line in lines:
|
||||||
|
self.write_line(line)
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
self.__exit__(None, None, None)
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, type, value, traceback):
|
||||||
|
if self.__write_queue:
|
||||||
|
self.__open_file.writelines(self.__write_queue)
|
||||||
|
self.__open_file.close()
|
||||||
|
|
||||||
|
|
||||||
|
# Prepend the determined information to the top of the log file
|
||||||
|
with Prepender(logfile) as f:
|
||||||
|
# Must write individual lines in reverse order
|
||||||
|
f.write_line(current_day+' - '+current_time+' - '+client_hostname)
|
||||||
|
|
||||||
|
# with Prepender(logfile) as f:
|
||||||
|
# Or, use write_lines instead - that maintains order.
|
||||||
|
# f.write_lines(
|
||||||
|
# ['This will be line 1',
|
||||||
|
# 'This will be line 2',
|
||||||
|
# 'This will be line 3',
|
||||||
|
# ]
|
||||||
|
# )
|
70
logoff-log.py
Normal file
70
logoff-log.py
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
import os
|
||||||
|
from datetime import date
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
# Set the location of the file to write to, in the user Documents directory
|
||||||
|
logfile = os.path.join(os.path.join(os.environ['USERPROFILE']),
|
||||||
|
r'Documents\logoff.log')
|
||||||
|
|
||||||
|
# Create the file if it does not exist yet
|
||||||
|
if not os.path.exists(logfile):
|
||||||
|
with open(logfile, 'w'):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Determine the current date and time
|
||||||
|
today = date.today()
|
||||||
|
now = datetime.now()
|
||||||
|
|
||||||
|
current_day = today.strftime("%d.%m.%Y")
|
||||||
|
# print("Today's date:", current_day)
|
||||||
|
|
||||||
|
current_time = now.strftime("%H:%M:%S")
|
||||||
|
# print("Current Time =", current_time)
|
||||||
|
|
||||||
|
|
||||||
|
# Class for prepending the date and time to the log file
|
||||||
|
class Prepender(object):
|
||||||
|
def __init__(self,
|
||||||
|
file_path,
|
||||||
|
):
|
||||||
|
# Read in the existing file, so we can write it back later
|
||||||
|
with open(file_path, mode='r') as f:
|
||||||
|
self.__write_queue = f.readlines()
|
||||||
|
|
||||||
|
self.__open_file = open(file_path, mode='w')
|
||||||
|
|
||||||
|
def write_line(self, line):
|
||||||
|
self.__write_queue.insert(0,
|
||||||
|
"%s\n" % line,
|
||||||
|
)
|
||||||
|
|
||||||
|
def write_lines(self, lines):
|
||||||
|
lines.reverse()
|
||||||
|
for line in lines:
|
||||||
|
self.write_line(line)
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
self.__exit__(None, None, None)
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, type, value, traceback):
|
||||||
|
if self.__write_queue:
|
||||||
|
self.__open_file.writelines(self.__write_queue)
|
||||||
|
self.__open_file.close()
|
||||||
|
|
||||||
|
|
||||||
|
# Prepend the determined date and time to the top of the log file
|
||||||
|
with Prepender(logfile) as f:
|
||||||
|
# Must write individual lines in reverse order
|
||||||
|
f.write_line(current_day+' - '+current_time)
|
||||||
|
|
||||||
|
# with Prepender(logfile) as f:
|
||||||
|
# Or, use write_lines instead - that maintains order.
|
||||||
|
# f.write_lines(
|
||||||
|
# ['This will be line 1',
|
||||||
|
# 'This will be line 2',
|
||||||
|
# 'This will be line 3',
|
||||||
|
# ]
|
||||||
|
# )
|
30
sendmail.py
Normal file
30
sendmail.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import smtplib
|
||||||
|
import ssl
|
||||||
|
|
||||||
|
smtp_server = "mail.example.com"
|
||||||
|
port = 465 # For SSL
|
||||||
|
sender_email = "user01@example.com"
|
||||||
|
password = "smtpPassw0rd"
|
||||||
|
# password = input("Type your password and press enter: ") # Interactive
|
||||||
|
receiver_email = "user02@example.com"
|
||||||
|
message = """\
|
||||||
|
From: user01@example.com
|
||||||
|
Subject: Test Email
|
||||||
|
|
||||||
|
This message is sent from Python."""
|
||||||
|
|
||||||
|
# Create a secure SSL context
|
||||||
|
context = ssl.create_default_context()
|
||||||
|
|
||||||
|
# Try to log in to server and send email
|
||||||
|
try:
|
||||||
|
server = smtplib.SMTP_SSL(smtp_server, port, context=context)
|
||||||
|
server.ehlo() # Can be omitted
|
||||||
|
server.login(sender_email, password)
|
||||||
|
# Send email
|
||||||
|
server.sendmail(sender_email, receiver_email, message)
|
||||||
|
except Exception as e:
|
||||||
|
# Print any error messages to stdout
|
||||||
|
print(e)
|
||||||
|
finally:
|
||||||
|
server.quit()
|
170
wol.py
Normal file
170
wol.py
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
"""
|
||||||
|
https://github.com/remcohaszing/pywakeonlan
|
||||||
|
|
||||||
|
A small python module for wake on lan.
|
||||||
|
For more information on the wake on lan protocol
|
||||||
|
please take a look at Wikipedia.
|
||||||
|
http://en.wikipedia.org/wiki/Wake-on-LAN
|
||||||
|
|
||||||
|
Usage
|
||||||
|
To wake up a computer using wake on lan it must first be enabled in the BIOS
|
||||||
|
settings. Please note the computer you are trying to power on does not have an
|
||||||
|
ip address, but it does have a mac address.
|
||||||
|
The package needs to be sent as a broadcast package.
|
||||||
|
|
||||||
|
As a python module
|
||||||
|
Import the module
|
||||||
|
>>> from wakeonlan import send_magic_packet
|
||||||
|
|
||||||
|
Wake up a single computer by its mac address
|
||||||
|
>>> send_magic_packet('ff.ff.ff.ff.ff.ff')
|
||||||
|
|
||||||
|
Wake up multiple computers by their mac addresses.
|
||||||
|
>>> send_magic_packet('ff.ff.ff.ff.ff.ff', '00-00-00-00-00-00',
|
||||||
|
... 'FFFFFFFFFFFF')
|
||||||
|
|
||||||
|
An external host may be specified.
|
||||||
|
Do note that port forwarding on that host is required.
|
||||||
|
The default ip address is 255.255.255.255 and the default port is 9.
|
||||||
|
>>> send_magic_packet('ff.ff.ff.ff.ff.ff',
|
||||||
|
... ip_address='example.com',
|
||||||
|
... port=1337)
|
||||||
|
|
||||||
|
A network adapter may be specified.
|
||||||
|
The magic packet will be routed through this interface.
|
||||||
|
>>> send_magic_packet('ff.ff.ff.ff.ff.ff',
|
||||||
|
... interface='192.168.0.2')
|
||||||
|
|
||||||
|
As a standalone script
|
||||||
|
usage:
|
||||||
|
wakeonlan [-h] [-i ip] [-p port] [-n interface] mac address [mac address ...]
|
||||||
|
|
||||||
|
Wake one or more computers using the wake on lan protocol.
|
||||||
|
|
||||||
|
positional arguments:
|
||||||
|
mac address The mac addresses of the computers you are trying to wake.
|
||||||
|
|
||||||
|
optional arguments:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
-i ip The ip address of the host to send the magic packet to.
|
||||||
|
(default 255.255.255.255)
|
||||||
|
-p port The port of the host to send the magic packet to. (default 9)
|
||||||
|
-n interface The ip address of the network adapter to route the
|
||||||
|
magic packet through. (optional)
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
Python3.x
|
||||||
|
|
||||||
|
License
|
||||||
|
MIT
|
||||||
|
|
||||||
|
"""
|
||||||
|
import argparse
|
||||||
|
import socket
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
|
||||||
|
BROADCAST_IP = "255.255.255.255"
|
||||||
|
DEFAULT_PORT = 9
|
||||||
|
|
||||||
|
|
||||||
|
def create_magic_packet(macaddress: str) -> bytes:
|
||||||
|
"""
|
||||||
|
Create a magic packet.
|
||||||
|
|
||||||
|
A magic packet is a packet that can be used with the wake on lan protocol
|
||||||
|
to wake up a computer. The packet is constructed from the mac address
|
||||||
|
given as a parameter.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
macaddress: the mac address that should be parsed into a magic packet.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if len(macaddress) == 17:
|
||||||
|
sep = macaddress[2]
|
||||||
|
macaddress = macaddress.replace(sep, "")
|
||||||
|
elif len(macaddress) != 12:
|
||||||
|
raise ValueError("Incorrect MAC address format")
|
||||||
|
|
||||||
|
return bytes.fromhex("F" * 12 + macaddress * 16)
|
||||||
|
|
||||||
|
|
||||||
|
def send_magic_packet(
|
||||||
|
*macs: str,
|
||||||
|
ip_address: str = BROADCAST_IP,
|
||||||
|
port: int = DEFAULT_PORT,
|
||||||
|
interface: str = None
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Wake up computers having any of the given mac addresses.
|
||||||
|
|
||||||
|
Wake on lan must be enabled on the host device.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
macs: One or more macaddresses of machines to wake.
|
||||||
|
|
||||||
|
Keyword Args:
|
||||||
|
ip_address: the ip address of the host to send the magic packet to.
|
||||||
|
port: the port of the host to send the magic packet to.
|
||||||
|
interface: the ip address of the network adapter to route the
|
||||||
|
magic packet through.
|
||||||
|
|
||||||
|
"""
|
||||||
|
packets = [create_magic_packet(mac) for mac in macs]
|
||||||
|
|
||||||
|
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
|
||||||
|
if interface is not None:
|
||||||
|
sock.bind((interface, 0))
|
||||||
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
||||||
|
sock.connect((ip_address, port))
|
||||||
|
for packet in packets:
|
||||||
|
sock.send(packet)
|
||||||
|
|
||||||
|
|
||||||
|
def main(argv: List[str] = None) -> None:
|
||||||
|
"""
|
||||||
|
Run wake on lan as a CLI application.
|
||||||
|
|
||||||
|
"""
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Wake one or more computers using the \
|
||||||
|
wake on lan protocol.",
|
||||||
|
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"macs",
|
||||||
|
metavar="mac address",
|
||||||
|
nargs="+",
|
||||||
|
help="The mac addresses of the computers you are trying to wake.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-i",
|
||||||
|
metavar="ip",
|
||||||
|
default=BROADCAST_IP,
|
||||||
|
help="The ip address of the host to send the magic packet to.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-p",
|
||||||
|
metavar="port",
|
||||||
|
type=int,
|
||||||
|
default=DEFAULT_PORT,
|
||||||
|
help="The port of the host to send the magic packet to.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-n",
|
||||||
|
metavar="interface",
|
||||||
|
default=None,
|
||||||
|
help="The ip address of the network adapter to route the \
|
||||||
|
magic packet through.",
|
||||||
|
)
|
||||||
|
args = parser.parse_args(argv)
|
||||||
|
send_magic_packet(*args.macs,
|
||||||
|
ip_address=args.i,
|
||||||
|
port=args.p,
|
||||||
|
interface=args.n)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": # pragma: nocover
|
||||||
|
main()
|
Loading…
x
Reference in New Issue
Block a user