Skip to content

Commit

Permalink
hook2snow proxy
Browse files Browse the repository at this point in the history
  • Loading branch information
Wade Wells committed Jul 22, 2023
1 parent 10b0a4b commit 0f6778b
Show file tree
Hide file tree
Showing 5 changed files with 348 additions and 126 deletions.
96 changes: 48 additions & 48 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -1,49 +1,49 @@
{
"version": "2.0.0",
// None of this is used
// sed -i 's/"default": .*/"default": "show poop"/' .vscode/launch.json
"tasks": [
{
// pickString input allows you to select previous but not to provide a new option. promptString allows you to input, but doesn't show history
// This is a compromise... using promptString and will echo the previous to the terminal... can copy/paste into window from history
// disregard... This didn't work, the promptString executes prior to the task
"label": "show-prev-args",
"type": "shell",
"command": "[[ -f ${workspaceFolder}/.vscode/prev_args ]] && cat ${workspaceFolder}/.vscode/prev_args && sleep 3"
},
{
"label": "pre-get-args",
"type": "shell",
"command": "[[ -f ${workspaceFolder}/.vscode/vscargs.sh ]] && echo found vscargs && . ${workspaceFolder}/.vscode/vscargs.sh && echo Source Success && export VSC_PREV_ARGS=${env:VSC_PREV_ARGS} || echo Something went wrong"
},
{
"label": "post-export-args",
"type": "shell",
"command": "echo VSC_PREV_ARGS: $VSC_PREV_ARGS"
},
{
"label": "central cli arguments",
"type": "shell",
"command": "[ -f ${workspaceFolder}/.vscode/envvars ] && . ${workspaceFolder}/.vscode/envvars; echo export PREV_ARGS=\\'${input:command}\\' > ${workspaceFolder}/.vscode/envvars"
},
{
"label": "printenv",
"type": "shell",
"command": "printenv",
},
{
"label": "ECHO",
"type": "shell",
"command": "echo ${env:VSC_PREV_ARGS} ${workspaceFolder}",
}
],
"inputs": [
{
"description": "arguments to pass to Aruba Central CLI",
"id": "command",
"type": "promptString",
"default": "${env:PREV_ARGS}"
// type specific configuration attributes
}
]
}
"version": "2.0.0",
// None of this is used
// sed -i 's/"default": .*/"default": "show poop"/' .vscode/launch.json
"tasks": [
{
// pickString input allows you to select previous but not to provide a new option. promptString allows you to input, but doesn't show history
// This is a compromise... using promptString and will echo the previous to the terminal... can copy/paste into window from history
// disregard... This didn't work, the promptString executes prior to the task
"label": "show-prev-args",
"type": "shell",
"command": "[[ -f ${workspaceFolder}/.vscode/prev_args ]] && cat ${workspaceFolder}/.vscode/prev_args && sleep 3"
},
{
"label": "pre-get-args",
"type": "shell",
"command": "[[ -f ${workspaceFolder}/.vscode/vscargs.sh ]] && echo found vscargs && . ${workspaceFolder}/.vscode/vscargs.sh && echo Source Success && export VSC_PREV_ARGS=${env:VSC_PREV_ARGS} || echo Something went wrong"
},
{
"label": "post-export-args",
"type": "shell",
"command": "echo VSC_PREV_ARGS: $VSC_PREV_ARGS"
},
{
"label": "central cli arguments",
"type": "shell",
"command": "[ -f ${workspaceFolder}/.vscode/envvars ] && . ${workspaceFolder}/.vscode/envvars; echo export PREV_ARGS=\\'${input:command}\\' > ${workspaceFolder}/.vscode/envvars"
},
{
"label": "printenv",
"type": "shell",
"command": "printenv"
},
{
"label": "ECHO",
"type": "shell",
"command": "echo ${env:VSC_PREV_ARGS} ${workspaceFolder}"
}
],
"inputs": [
{
"description": "arguments to pass to Aruba Central CLI",
"id": "command",
"type": "promptString",
"default": "${env:PREV_ARGS}"
// type specific configuration attributes
}
]
}
50 changes: 49 additions & 1 deletion centralcli/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
from rich import print
from rich.prompt import Prompt, Confirm
from rich.console import Console
from pydantic import BaseModel, Field, HttpUrl, ValidationError
from yarl import URL
# from pydantic import ConfigDict # pydantic 2 not supported yet

import tablib
import yaml
Expand All @@ -22,6 +25,40 @@
except Exception:
pass

# class BaseModel(PydanticBaseModel):
# class Config:
# arbitrary_types_allowed = True

class Token(BaseModel):
access: str = Field(..., alias="access_token")
refresh : str = Field(..., alias="refresh_token")

class WebHook(BaseModel):
token: str
port: int = 9443

class ServiceNow(BaseModel):
# model_config = ConfigDict(arbitrary_types_allowed=True) pydantic 2 / not supported yet
id: str
base_url: HttpUrl = Field(..., alias="url")
port: int = None
incident_path: str
refresh_path: str = "oauth_token.do"
client_id: str
client_secret: str
token: Token = None
tok_file: Path = None

@property
def incident_url(self) -> URL:
return URL(f"{self.base_url.rstrip('/')}:{self.port or self.base_url.port}/{self.incident_path.lstrip('/')}?sysparm_display_value=true")

@property
def refresh_url(self) -> URL:
return URL(f"{self.base_url.rstrip('/')}:{self.port or self.base_url.port}/{self.refresh_path.lstrip('/')}")



clear = Console().clear
class ClusterName(str, Enum):
internal = "internal"
Expand Down Expand Up @@ -182,6 +219,16 @@ def __init__(self, base_dir: Path = None):
self.debugv: bool = self.data.get("debugv", False)
self.sanitize: bool = self.data.get("sanitize", False)
self.account = self.get_account_from_args()
try:
self.webhook = WebHook(**self.data[self.account].get("webhook", {}))
except ValidationError:
self.webhook = None
try:
snow_cache = f'{self.cache_dir}/snow_tok_{self.data[self.account]["customer_id"]}_{self.data[self.account]["client_id"]}.json'
self.snow = ServiceNow(**{**self.data[self.account].get("snow", {}), **{"tok_file": snow_cache}})
except ValidationError:
self.snow = None

self.defined_accounts: List[str] = [k for k in self.data if k not in NOT_ACCOUNT_KEYS]

def __bool__(self):
Expand Down Expand Up @@ -224,7 +271,8 @@ def last_command_file(self):

@property
def wh_port(self):
return self.data.get("webclient_info", {}).get("port", 9443)
_acct_specific = self.webhook.get("port")
return _acct_specific or self.data.get("webclient_info", {}).get("port", 9443)

def get(self, key: str, default: Any = None) -> Any:
if key in self.data:
Expand Down
84 changes: 83 additions & 1 deletion centralcli/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from __future__ import annotations
from datetime import datetime
from typing import List, Optional, Union

Expand Down Expand Up @@ -76,4 +77,85 @@ class Client(BaseModel):
connected_name: str = Field(default_factory=str)
site: str = Field(default_factory=str)
group: str = Field(default_factory=str)
last_connected: datetime = Field(default=None)
last_connected: datetime = Field(default=None)

# SNOW Response

class SysTargetSysId(BaseModel):
display_value: Optional[str] = None
link: Optional[str] = None


class SysImportSet(BaseModel):
display_value: Optional[str] = None
link: Optional[str] = None


class ImportSetRun(BaseModel):
display_value: Optional[str] = None
link: Optional[str] = None


class SysTransformMap(BaseModel):
display_value: Optional[str] = None
link: Optional[str] = None


class Result(BaseModel):
u_comments_to_customer: Optional[str] = None
template_import_log: Optional[str] = None
u_service_offering: Optional[str] = None
sys_updated_on: Optional[str] = None
u_urgency: Optional[str] = None
sys_target_sys_id: SysTargetSysId
u_watch_list: Optional[str] = None
u_reported_by: Optional[str] = None
u_business_service: Optional[str] = None
sys_updated_by: Optional[str] = None
u_short_description: Optional[str] = None
sys_created_on: Optional[str] = None
sys_import_set: SysImportSet
u_additional_comments: Optional[str] = None
sys_created_by: Optional[str] = None
sys_import_row: Optional[str] = None
sys_row_error: Optional[str] = None
u_work_notes: Optional[str] = None
u_subcategory: Optional[str] = None
u_state: Optional[str] = None
u_attachment_type: Optional[str] = None
import_set_run: ImportSetRun
u_contact_type: Optional[str] = None
u_attachment_encoded_code: Optional[str] = None
u_description: Optional[str] = None
u_close_notes: Optional[str] = None
u_call_back: Optional[str] = None
sys_import_state_comment: Optional[str] = None
sys_class_name: Optional[str] = None
u_priority: Optional[str] = None
sys_id: Optional[str] = None
u_external_source: Optional[str] = None
sys_transform_map: SysTransformMap
u_external_ticket: Optional[str] = None
u_servicenow_number: Optional[str] = None
u_resolved_by_group: Optional[str] = None
u_assigned_to: Optional[str] = None
u_raised_severity: Optional[str] = None
u_hold_reason: Optional[str] = None
sys_target_table: Optional[str] = None
sys_mod_count: Optional[str] = None
u_assignment_group: Optional[str] = None
u_affected_user: Optional[str] = None
u_impact: Optional[str] = None
sys_tags: Optional[str] = None
sys_import_state: Optional[str] = None
u_contact_number: Optional[str] = None
u_category: Optional[str] = None
u_cause_code: Optional[str] = None
u_close_code: Optional[str] = None
u_configuration_item: Optional[str] = None
u_cause_sub_code: Optional[str] = None
u_attachment_name: Optional[str] = None


class SnowResponse(BaseModel):
result: Result
Loading

0 comments on commit 0f6778b

Please sign in to comment.