Create, Get, Update, and Delete Regex
This sample code has basic functions for manipulating regexes. It logs in to rWeb, finds the target zone, and adds two regexes. Then it updates the first regex and deletes the second.
#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "requests",
# ]
# ///
import requests
import json
import urllib.parse
# Put your rWeb address here
BASE_URL = "https://rweb.local.com"
HEADERS = {'Content-Type': 'application/json',
'Accept':'application/json'}
# Put in your user credentials here
CREDENTIALS = {'login':'admin', 'password':'admin123'}
def wrap(data):
return json.dumps({'data': data})
def url(resource, params=None):
querystring = ""
if params != None:
querystring = "?"+urllib.parse.urlencode(params)
return BASE_URL + resource + querystring
def login(session):
result = session.post(url('/authentication'),
wrap(CREDENTIALS))
assert(result.status_code == requests.codes.created)
def logout(session):
session.delete(url('/authentication'))
def find_group(session, name):
result = session.get(url('/groups', {'name':name}))
assert(result.status_code == requests.codes.ok)
group_list = json.loads(result.content)
assert(group_list['rows']==1)
return group_list['data'][0]
def find_zone(session, group, name):
result = session.get(url(group['zones_resource'],{'name':name}))
assert(result.status_code == requests.codes.ok)
zone_list = json.loads(result.content)
assert(zone_list['rows']==1)
return zone_list['data'][0]
def find_current_revision(session, zone):
result = session.get(url(zone['revision_current_resource']))
current = json.loads(result.content)
return current
def find_revision_regex_resource(session, zone):
current = find_current_revision(session, zone)
regex_resource = current['regex_resource']
return regex_resource
def get_regexes(session, zone):
result = session.get(url(find_revision_regex_resource(session, zone)))
regexes = json.loads(result.content)
return regexes['data']
def add_regex(session, zone, params):
payload = wrap(params) # Create payload first
result = session.post(url(find_revision_regex_resource(session, zone)), data=payload)
assert(result.status_code == requests.codes.created)
if result.status_code != requests.codes.created:
raise Exception(f"Failed to create regex. Status: {result.status_code}, Response: {result.text}")
def delete_regex(session, resource):
result = session.delete(url(resource))
assert(result.status_code == requests.codes.ok)
def update_regex(session, resource, params):
result = session.put(url(resource), wrap(params))
assert(result.status_code == requests.codes.ok)
def main():
with requests.session() as session:
session.headers = HEADERS
# This is insecure but may be needed if you haven't set up an SSL certificate for rWeb yet
session.verify = False
login(session)
group = find_group(session, 'Default')
zone = find_zone(session, group, 'Test')
add_regex(session, zone, {
'protocol': 'TCP',
'application': 'regex',
'port': 80,
'description': 'Scripted Entry 1',
'enabled': True,
'rules': [
{
'field': 'Regex',
'predicate': 'is',
'value': 'test'
}
]})
add_regex(session, zone, {
'protocol': 'TCP',
'application': 'regex',
'port': 80,
'description': 'Scripted Entry 2',
'enabled': True,
'rules': [
{
'field': 'Regex',
'predicate': 'is',
'value': 'test2'
}
]})
regex = get_regexes(session, zone)[0]
print(f"Existing regexes: {regex}")
regex['description'] = 'Scripting disabled entry'
regex['enabled'] = 'false'
ruleset = regex.pop('ruleset_resource')
regex['rules'][0].pop('rule_resource')
update_regex(session, ruleset, regex)
# Update reorders the regexes, 2nd regex is now first
regex = get_regexes(session, zone)[0]
print(f"Existing regexes: {regex}")
delete_regex(session, regex['ruleset_resource'])
logout(session)
if __name__ == '__main__':
main()