<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=F5_python_scripts</id>
	<title>F5 python scripts - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=F5_python_scripts"/>
	<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=F5_python_scripts&amp;action=history"/>
	<updated>2026-04-05T19:15:35Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://tech.uvoo.io/index.php?title=F5_python_scripts&amp;diff=4492&amp;oldid=prev</id>
		<title>Busk at 20:35, 15 August 2023</title>
		<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=F5_python_scripts&amp;diff=4492&amp;oldid=prev"/>
		<updated>2023-08-15T20:35:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 20:35, 15 August 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l11&quot; &gt;Line 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 11:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Office365-REST-Python-Client&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Office365-REST-Python-Client&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;flake8&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;flake8&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;f5-sdk&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;f5-icontrol-rest&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;```&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;```&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Busk</name></author>
	</entry>
	<entry>
		<id>https://tech.uvoo.io/index.php?title=F5_python_scripts&amp;diff=4491&amp;oldid=prev</id>
		<title>Busk: Created page with &quot;# F5 Python Scripts  ## requirements.txt ``` requests pydig fuzzywuzzy pandas tabulate office365 Office365-REST-Python-Client flake8 ```  ## setup virtual environment ``` sudo...&quot;</title>
		<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=F5_python_scripts&amp;diff=4491&amp;oldid=prev"/>
		<updated>2023-08-15T20:34:00Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;# F5 Python Scripts  ## requirements.txt ``` requests pydig fuzzywuzzy pandas tabulate office365 Office365-REST-Python-Client flake8 ```  ## setup virtual environment ``` sudo...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;# F5 Python Scripts&lt;br /&gt;
&lt;br /&gt;
## requirements.txt&lt;br /&gt;
```&lt;br /&gt;
requests&lt;br /&gt;
pydig&lt;br /&gt;
fuzzywuzzy&lt;br /&gt;
pandas&lt;br /&gt;
tabulate&lt;br /&gt;
office365&lt;br /&gt;
Office365-REST-Python-Client&lt;br /&gt;
flake8&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## setup virtual environment&lt;br /&gt;
```&lt;br /&gt;
sudo apt install expect sqlite3&lt;br /&gt;
python3 -m venv .venv&lt;br /&gt;
. .venv/bin/activate&lt;br /&gt;
&lt;br /&gt;
pip install -r requirements.txt&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Get VS, Pools, Nodes &amp;amp; stats&lt;br /&gt;
```&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
from f5.utils.responses.handlers import Stats&lt;br /&gt;
from IPython.display import display&lt;br /&gt;
from tabulate import tabulate&lt;br /&gt;
import pandas as pd&lt;br /&gt;
import pprint&lt;br /&gt;
pp = pprint.PrettyPrinter(width=1180)&lt;br /&gt;
&lt;br /&gt;
from f5.bigip import BigIP&lt;br /&gt;
from f5.bigip import ManagementRoot&lt;br /&gt;
&lt;br /&gt;
import sqlite3&lt;br /&gt;
# cnx = sqlite3.connect(':memory:')&lt;br /&gt;
cnx = sqlite3.connect('df_sqlite3.db')&lt;br /&gt;
&lt;br /&gt;
F5_HOST = os.getenv('F5_HOST')&lt;br /&gt;
AD_USER = os.getenv('AD_USER')&lt;br /&gt;
AD_PASS = os.environ.get('AD_PASS')&lt;br /&gt;
LTM_API_URL_PREFIX = &amp;quot;https://{F5_HOST}/mgmt/tm/ltm/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mgmt = ManagementRoot(F5_HOST, AD_USER, AD_PASS)&lt;br /&gt;
bigip = BigIP(F5_HOST, AD_USER, AD_PASS)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def get_virtuals(action=&amp;quot;disable&amp;quot;):&lt;br /&gt;
  columns = ['partition', 'name', 'state', 'clientside_totConns', 'clientside_bitsIn', 'clientside_bitsOut', 'type']&lt;br /&gt;
  virtual_rows = []&lt;br /&gt;
  virtuals_df = pd.DataFrame(columns=columns)&lt;br /&gt;
  unused_virtuals_df = pd.DataFrame(columns=columns)&lt;br /&gt;
  used_virtuals_df = pd.DataFrame(columns=columns)&lt;br /&gt;
&lt;br /&gt;
  all_virtuals = mgmt.tm.ltm.virtuals.get_collection()&lt;br /&gt;
  for virtual in all_virtuals:&lt;br /&gt;
    row = {}&lt;br /&gt;
    # pp.pprint(vars(virtual))&lt;br /&gt;
    virtual_stats = Stats(virtual.stats.load())&lt;br /&gt;
    # pp.pprint(virtual_stats.stat)&lt;br /&gt;
    row['partition'] = virtual.partition&lt;br /&gt;
    row['name'] = virtual.name&lt;br /&gt;
    row['state'] = virtual_stats.stat.status_availabilityState['description']&lt;br /&gt;
    row['clientside_totConns'] = virtual_stats.stat.clientside_totConns['value']&lt;br /&gt;
    row['clientside_bitsIn'] = virtual_stats.stat.clientside_bitsIn['value']&lt;br /&gt;
    row['clientside_bitsOut'] = virtual_stats.stat.clientside_bitsOut['value']&lt;br /&gt;
    row['type'] = &amp;quot;virtualserver&amp;quot;&lt;br /&gt;
    virtual_rows.append(row)&lt;br /&gt;
    virtuals_df = pd.concat([virtuals_df, pd.DataFrame([row])], ignore_index=False)&lt;br /&gt;
    if row['clientside_totConns'] != 0:&lt;br /&gt;
      print(f&amp;quot;used: {row}&amp;quot;)&lt;br /&gt;
      unused_virtuals_df = pd.concat([virtuals_df, pd.DataFrame([row])], ignore_index=False)&lt;br /&gt;
    elif row['clientside_totConns'] == 0:&lt;br /&gt;
      print(f&amp;quot;unused: {row}&amp;quot;)&lt;br /&gt;
      used_virtuals_df = pd.concat([virtuals_df, pd.DataFrame([row])], ignore_index=False)&lt;br /&gt;
  return virtuals_df, unused_virtuals_df, used_virtuals_df&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def get_pools(get_members=False, delete=False):&lt;br /&gt;
  columns = ['partition', 'name', 'state', 'serverside_totConns', 'serverside_bitsIn', 'serverside_bitsOut', 'type']&lt;br /&gt;
  pool_rows = []&lt;br /&gt;
  member_rows = []&lt;br /&gt;
  all_pools = mgmt.tm.ltm.pools.get_collection()&lt;br /&gt;
  pools_df = pd.DataFrame(columns=columns)&lt;br /&gt;
  members_df = pd.DataFrame(columns=columns)&lt;br /&gt;
  unused_pools_df = pd.DataFrame(columns=columns)&lt;br /&gt;
  unused_members_df = pd.DataFrame(columns=columns)&lt;br /&gt;
  used_pools_df = pd.DataFrame(columns=columns)&lt;br /&gt;
  used_members_df = pd.DataFrame(columns=columns)&lt;br /&gt;
&lt;br /&gt;
  for pool in all_pools:&lt;br /&gt;
    row = {}&lt;br /&gt;
    pool_stats = Stats(pool.stats.load())&lt;br /&gt;
    # pp.pprint(vars(pool_stats))&lt;br /&gt;
    row['partition'] = pool.partition&lt;br /&gt;
    row['name'] = pool.name&lt;br /&gt;
    row['type'] = &amp;quot;pool&amp;quot;&lt;br /&gt;
    row['state'] = pool_stats.stat.status_availabilityState['description']&lt;br /&gt;
    row['availableMemberCnt'] = pool_stats.stat.availableMemberCnt['value']&lt;br /&gt;
    row['status_enabledState'] = pool_stats.stat.status_enabledState['description']&lt;br /&gt;
    row['serverside_bitsIn'] = pool_stats.stat.serverside_bitsIn['value']&lt;br /&gt;
    row['serverside_bitsOut'] = pool_stats.stat.serverside_bitsOut['value']&lt;br /&gt;
    row['serverside_totConns'] = pool_stats.stat.serverside_totConns['value']&lt;br /&gt;
    row['status_statusReason'] = pool_stats.stat.status_statusReason['description']&lt;br /&gt;
    row['activeMemberCnt'] = pool_stats.stat.activeMemberCnt['value']&lt;br /&gt;
    pool_rows.append(row)&lt;br /&gt;
    pools_df = pd.concat([pools_df, pd.DataFrame([row])], ignore_index=False)&lt;br /&gt;
    if row['serverside_totConns'] == 0:&lt;br /&gt;
      print(f&amp;quot;unused pool: {row}&amp;quot;)&lt;br /&gt;
      unused_pools_df = pd.concat([pools_df, pd.DataFrame([row])], ignore_index=False)&lt;br /&gt;
    elif row['serverside_totConns'] != 0:&lt;br /&gt;
      print(f&amp;quot;used pool: {row}&amp;quot;)&lt;br /&gt;
      used_pools_df = pd.concat([pools_df, pd.DataFrame([row])], ignore_index=False)&lt;br /&gt;
&lt;br /&gt;
    if get_members == True:&lt;br /&gt;
      for member in pool.members_s.get_collection():&lt;br /&gt;
        row = {}&lt;br /&gt;
        member_stats = Stats(member.stats.load())&lt;br /&gt;
        # pp.pprint(vars(member_stats)); break&lt;br /&gt;
        row['partition'] = member.partition&lt;br /&gt;
        row['name'] = member.name&lt;br /&gt;
        row['type'] = &amp;quot;poolmember&amp;quot;&lt;br /&gt;
        row['pool'] = pool.name&lt;br /&gt;
        row['state'] = member_stats.stat.status_availabilityState['description']&lt;br /&gt;
        row['serverside_bitsIn'] = member_stats.stat.serverside_bitsIn['value']&lt;br /&gt;
        row['serverside_bitsOut'] = member_stats.stat.serverside_bitsOut['value']&lt;br /&gt;
        row['serverside_totConns'] = member_stats.stat.serverside_totConns['value']&lt;br /&gt;
        member_rows.append(row)&lt;br /&gt;
        members_df = pd.concat([members_df, pd.DataFrame([row])], ignore_index=False)&lt;br /&gt;
        if row['serverside_totConns'] == 0:&lt;br /&gt;
          print(f&amp;quot;disable member: {row}&amp;quot;)&lt;br /&gt;
          unused_members_df = pd.concat([members_df, pd.DataFrame([row])], ignore_index=False)&lt;br /&gt;
        elif row['serverside_totConns'] != 0:&lt;br /&gt;
          used_members_df = pd.concat([members_df, pd.DataFrame([row])], ignore_index=False)&lt;br /&gt;
&lt;br /&gt;
  return pools_df, members_df, unused_pools_df, unused_members_df, used_pools_df, used_members_df&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def print_unused():&lt;br /&gt;
  print(&amp;quot;To disable =====&amp;quot;)&lt;br /&gt;
  for index, row in virtuals_df.iterrows():&lt;br /&gt;
    if row['clientside_maxConns'] != 0:&lt;br /&gt;
      print(row['clientside_maxConns'])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  virtuals_df, unused_virtuals_df, used_virtuals_df = get_virtuals()&lt;br /&gt;
  pools_df, members_df, unused_pools_df, unused_members_df, used_pools_df, used_members_df = get_pools(get_members=True)&lt;br /&gt;
&lt;br /&gt;
  with pd.ExcelWriter('F5.xlsx') as writer:&lt;br /&gt;
    virtuals_df.to_excel(writer, sheet_name='all_virtuals')&lt;br /&gt;
    pools_df.to_excel(writer, sheet_name='all_pools')&lt;br /&gt;
    members_df.to_excel(writer, sheet_name='all_members')&lt;br /&gt;
    unused_virtuals_df.to_excel(writer, sheet_name='unused_virtuals')&lt;br /&gt;
    unused_pools_df.to_excel(writer, sheet_name='unused_pools')&lt;br /&gt;
    unused_members_df.to_excel(writer, sheet_name='unused_members')&lt;br /&gt;
    used_virtuals_df.to_excel(writer, sheet_name='used_virtuals')&lt;br /&gt;
    used_pools_df.to_excel(writer, sheet_name='used_pools')&lt;br /&gt;
    used_members_df.to_excel(writer, sheet_name='used_members')&lt;br /&gt;
&lt;br /&gt;
  virtuals_df.to_sql(name='virtuals', con=cnx)&lt;br /&gt;
  unused_virtuals_df.to_sql(name='unused_virtuals', con=cnx)&lt;br /&gt;
  used_virtuals_df.to_sql(name='used_virtuals', con=cnx)&lt;br /&gt;
&lt;br /&gt;
  members_df.to_sql(name='members', con=cnx)&lt;br /&gt;
  unused_members_df.to_sql(name='unused_members', con=cnx)&lt;br /&gt;
  used_members_df.to_sql(name='used_members', con=cnx)&lt;br /&gt;
&lt;br /&gt;
  pools_df.to_sql(name='pools', con=cnx)&lt;br /&gt;
  unused_pools_df.to_sql(name='unused_pools', con=cnx)&lt;br /&gt;
  used_pools_df.to_sql(name='used_pools', con=cnx)&lt;br /&gt;
  print(&amp;quot;=====Complete=====&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
  main()&lt;br /&gt;
```&lt;/div&gt;</summary>
		<author><name>Busk</name></author>
	</entry>
</feed>