init commit
This commit is contained in:
3
README.md
Normal file
3
README.md
Normal file
@ -0,0 +1,3 @@
|
||||
Playbooks for the Pi-Top
|
||||
|
||||
Right now there's just the LLDP Scanner
|
||||
44
defaults/main.yaml
Normal file
44
defaults/main.yaml
Normal file
@ -0,0 +1,44 @@
|
||||
---
|
||||
|
||||
lldp_packages:
|
||||
- lldpd
|
||||
- ethtool
|
||||
- dbus-user-session
|
||||
- curl
|
||||
|
||||
default_projects:
|
||||
- "electronics"
|
||||
- "pi_top_4"
|
||||
- "robotics"
|
||||
|
||||
project_path: "/usr/lib/python3/dist-packages/pt_miniscreen/demo_projects"
|
||||
|
||||
archive_path: "/opt/pi-top/archive/projects"
|
||||
|
||||
api_working_dir: "/var/lib/lldp-api"
|
||||
|
||||
lldp_project_working_dir: "/home/{{ admin_username }}/Desktop/Projects/lldp-scan"
|
||||
|
||||
admin_username: pi
|
||||
|
||||
pi_default_password: "pi-top"
|
||||
|
||||
kde_full: false
|
||||
|
||||
rename_host: false
|
||||
|
||||
install_packages: false
|
||||
|
||||
config_smb: true
|
||||
|
||||
save_pi_user: true
|
||||
|
||||
public_deploy: true
|
||||
|
||||
update_grub_timeout: false
|
||||
|
||||
gather_only: false
|
||||
|
||||
deb_base: false
|
||||
|
||||
...
|
||||
47
files/lldp-api.py
Normal file
47
files/lldp-api.py
Normal file
@ -0,0 +1,47 @@
|
||||
import requests
|
||||
import subprocess
|
||||
from lxml import html
|
||||
from flask import Flask, request, jsonify
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
@app.route('/test', methods=['GET'])
|
||||
def test():
|
||||
return {"message": "Hello There"}
|
||||
|
||||
@app.route('/data', methods=['GET'])
|
||||
def get_data():
|
||||
return get_lldp_data()
|
||||
|
||||
def get_lldp_data():
|
||||
# Set commands here
|
||||
commands = {
|
||||
"switch_name": "lldpcli show neighbors | grep SysName | cut -d ':' -f 2 | tr -d ' '",
|
||||
"port_name": "lldpcli show neighbors | grep PortDes | cut -d ':' -f 2 | tr -d ' '",
|
||||
"port_speed": "ethtool eth0 | grep Speed | cut -d ':' -f 2 | tr -d ' '",
|
||||
"vlan_id": "lldpcli show neighbors details | grep VLAN | cut -d ':' -f 2 | cut -d ',' -f 1 | tr -d ' '"
|
||||
}
|
||||
|
||||
# Create an empty dictionary to store the results
|
||||
results = {}
|
||||
# Loop through the commands, run them, and store the output in the results dictionary
|
||||
for key, command in commands.items():
|
||||
try:
|
||||
# Run the command and capture the output
|
||||
result = subprocess.run(command, shell=True, capture_output=True, text=True)
|
||||
|
||||
# Store the output in the dictionary, removing any trailing newlines
|
||||
results[key] = result.stdout.strip()
|
||||
except Exception as e:
|
||||
# Handle any errors by storing the error message in the results
|
||||
results[key] = f"Error: {str(e)}"
|
||||
results['timestamp'] = datetime.now().strftime("%H:%M:%S")
|
||||
# Convert the results dictionary to a JSON string
|
||||
# json_output =
|
||||
return json.dumps(results, indent=4)
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True, host='127.0.0.1', port=5000)
|
||||
|
||||
34
files/lldp-scan.py
Normal file
34
files/lldp-scan.py
Normal file
@ -0,0 +1,34 @@
|
||||
import requests
|
||||
import json
|
||||
from time import sleep
|
||||
from pitop import Pitop
|
||||
|
||||
pitop = Pitop()
|
||||
miniscreen = pitop.miniscreen
|
||||
miniscreen.display_multiline_text("Welcome to LLDP Scanner", font_size=14)
|
||||
sleep (1)
|
||||
|
||||
while not miniscreen.cancel_button.is_pressed:
|
||||
# Query LLDP API
|
||||
api_response = requests.get("http://127.0.0.1:5000/data")
|
||||
api_data = api_response.json()
|
||||
port_name = api_data['port_name']
|
||||
port_speed = api_data['port_speed']
|
||||
switch_name = api_data['switch_name']
|
||||
vlan_id = api_data['vlan_id']
|
||||
lldp_timestamp = api_data['timestamp']
|
||||
|
||||
# Display LLDP data
|
||||
miniscreen.display_multiline_text(f"LLDP Scan Taken {lldp_timestamp}", font_size=14)
|
||||
sleep(4)
|
||||
miniscreen.display_multiline_text(f"Port Name: {port_name}", font_size=12)
|
||||
sleep(4)
|
||||
miniscreen.display_multiline_text(f"Port Speed: {port_speed}", font_size=12)
|
||||
sleep(4)
|
||||
miniscreen.display_multiline_text(f"Switch Name: {switch_name}", font_size=12)
|
||||
sleep(4)
|
||||
miniscreen.display_multiline_text(f"VLAN ID: {vlan_id}", font_size=12)
|
||||
sleep(4)
|
||||
|
||||
miniscreen.display_multiline_text("Ending Application", font_size=14)
|
||||
sleep(2)
|
||||
105
tasks/lldp.yaml
Normal file
105
tasks/lldp.yaml
Normal file
@ -0,0 +1,105 @@
|
||||
---
|
||||
|
||||
# Install Packages
|
||||
- name: prereqs - install apt packages
|
||||
apt:
|
||||
name: "{{ item }}"
|
||||
state: present
|
||||
loop: "{{ lldp_packages }}"
|
||||
|
||||
###############################################
|
||||
# LLDP Python api
|
||||
###############################################
|
||||
|
||||
- name: LLDP API
|
||||
block:
|
||||
|
||||
# Create API Folder
|
||||
- name: lldp - api - create api folder
|
||||
file:
|
||||
path: "{{ api_working_dir }}"
|
||||
state: directory
|
||||
mode: '0755'
|
||||
|
||||
# Copy API Code
|
||||
- name: lldp - api - copy api code
|
||||
copy:
|
||||
src: lldp-api.py
|
||||
dest: "{{ api_working_dir }}/app.py"
|
||||
mode: 0644
|
||||
|
||||
# Create lldp-api python service
|
||||
- name: lldp - api - create service file
|
||||
vars:
|
||||
exec_start: "python3 {{ api_working_dir }}/app.py"
|
||||
svc_desc: "LLDP API"
|
||||
working_dir: "{{ api_working_dir }}"
|
||||
template:
|
||||
src: service_template.j2
|
||||
dest: /etc/systemd/system/lldp_api.service
|
||||
mode: 0644
|
||||
|
||||
# enable and start lldp service
|
||||
- name: lldp - Restart LLDP service
|
||||
service:
|
||||
name: lldpd
|
||||
state: restarted
|
||||
enabled: yes
|
||||
|
||||
# daemon reload
|
||||
- name: lldp - api - daemon reload
|
||||
systemd:
|
||||
daemon_reload: yes
|
||||
|
||||
# Enable and start
|
||||
- name: lldp - api - enable and start api
|
||||
systemd:
|
||||
name: lldp_api.service
|
||||
state: started
|
||||
enabled: yes
|
||||
|
||||
# Test
|
||||
- name: lldp - api - test
|
||||
shell: "curl -S 'http://127.0.0.1:5000/data'"
|
||||
register: api_test
|
||||
|
||||
# Show test results
|
||||
- name: lldp - api - show result
|
||||
debug:
|
||||
msg: "{{ api_test.stdout }}"
|
||||
|
||||
###############################################
|
||||
# LLDP Project
|
||||
###############################################
|
||||
|
||||
# Create working dir
|
||||
- name: LLDP Project - Create Working Directory
|
||||
file:
|
||||
path: "{{ lldp_project_working_dir }}"
|
||||
state: directory
|
||||
owner: "{{ admin_username }}"
|
||||
group: "{{ admin_username }}"
|
||||
mode: '0755'
|
||||
|
||||
# Copy python code
|
||||
- name: LLDP Project - copy app code
|
||||
copy:
|
||||
src: lldp-scan.py
|
||||
dest: "{{ lldp_project_working_dir }}/app.py"
|
||||
owner: "{{ admin_username }}"
|
||||
group: "{{ admin_username }}"
|
||||
mode: 0644
|
||||
|
||||
# Copy project file
|
||||
- name: LLDP Project - copy project code
|
||||
vars:
|
||||
project_title: "LLDP Scanner"
|
||||
working_dir: "{{ lldp_project_working_dir }}"
|
||||
template:
|
||||
src: project_template.j2
|
||||
dest: "{{ lldp_project_working_dir }}/project.cfg"
|
||||
owner: "{{ admin_username }}"
|
||||
group: "{{ admin_username }}"
|
||||
mode: 0644
|
||||
|
||||
...
|
||||
37
tasks/main.yaml
Normal file
37
tasks/main.yaml
Normal file
@ -0,0 +1,37 @@
|
||||
---
|
||||
|
||||
- name: Check for pi user
|
||||
shell: "getent passwd | grep pi"
|
||||
register: pi_user_output
|
||||
ignore_errors: true
|
||||
|
||||
- name: Set pi_user_exists
|
||||
set_fact:
|
||||
pi_user_exists: "{{ not pi_user_output.failed | bool }}"
|
||||
|
||||
- name: Create pi user
|
||||
when: not pi_user_exists | bool
|
||||
user:
|
||||
name: "pi"
|
||||
password: "{{ pi_default_password | password_hash('sha512') }}"
|
||||
shell: /bin/bash
|
||||
|
||||
- name: Check for pi-top platform
|
||||
shell: pi-top --help
|
||||
register: pitop_output
|
||||
ignore_errors: true
|
||||
|
||||
- name: Set deb_base
|
||||
set_fact:
|
||||
deb_base: true
|
||||
when: pitop_output.failed
|
||||
ignore_errors: true
|
||||
|
||||
- name: Onboard if base debian
|
||||
include_tasks: onboard.yaml
|
||||
when: deb_base
|
||||
|
||||
- name: Install the requested project
|
||||
include_tasks: "{{ function }}.yaml"
|
||||
|
||||
...
|
||||
28
tasks/onboard.yaml
Normal file
28
tasks/onboard.yaml
Normal file
@ -0,0 +1,28 @@
|
||||
---
|
||||
|
||||
# Install prereq new APT source
|
||||
- name: prereqs - install apt packages
|
||||
apt:
|
||||
name: pi-top-os-apt-source
|
||||
state: present
|
||||
|
||||
# update APT with new source
|
||||
- name: Update APT
|
||||
apt:
|
||||
update_cache: yes
|
||||
|
||||
# Install pi-top platform
|
||||
- name: Install Pi-Top Platform - Will take less than 10 minutes
|
||||
apt:
|
||||
name:
|
||||
- pt-device-support
|
||||
state: present
|
||||
|
||||
# Install postreq OS utilities needed for user projects
|
||||
- name: postreqs - full OS install, will take 15 minutes or so
|
||||
apt:
|
||||
name: pt-os
|
||||
state: present
|
||||
|
||||
|
||||
...
|
||||
15
tasks/purge-defaults.yaml
Normal file
15
tasks/purge-defaults.yaml
Normal file
@ -0,0 +1,15 @@
|
||||
---
|
||||
|
||||
- name: Create the purge path
|
||||
file:
|
||||
path: "{{ archive_path }}"
|
||||
state: directory
|
||||
mode: '0755'
|
||||
|
||||
- name: Move default projects
|
||||
shell: |
|
||||
mv {{ project_path }}/{{ item }} {{ archive_path }}
|
||||
ignore_errors: true
|
||||
loop: "{{ default_projects }}"
|
||||
|
||||
...
|
||||
5
templates/project_template.j2
Normal file
5
templates/project_template.j2
Normal file
@ -0,0 +1,5 @@
|
||||
[project]
|
||||
title={{ project_title }}
|
||||
start=python3 -B app.py
|
||||
exit_condition=HOLD_CANCEL
|
||||
|
||||
15
templates/service_template.j2
Normal file
15
templates/service_template.j2
Normal file
@ -0,0 +1,15 @@
|
||||
|
||||
[Unit]
|
||||
Description={{ svc_desc }}
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=root
|
||||
Group=root
|
||||
WorkingDirectory={{ working_dir }}
|
||||
ExecStartPre=/bin/sleep 5
|
||||
ExecStart={{ exec_start }}
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
Reference in New Issue
Block a user