diff --git a/.gitignore b/.gitignore index eb46fb9..ec79565 100644 --- a/.gitignore +++ b/.gitignore @@ -3,9 +3,6 @@ venv meshbooks .vscode -# temporary or to prevent big commits -examples/ - # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/README.md b/README.md index 5fbc162..6775ad7 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,8 @@ So to target for example a mesh/group in MeshCentral called: "Nerthus" do: --- name: example configuration group: "Nerthus" -#target_os: "Linux" # <--- according to os_categories.json +#target_os: "Linux" # <--- according to os_categories.json. +powershell: True # <--- this can be important for Windows clients. variables: - name: var1 value: "This is the first variable" @@ -107,6 +108,12 @@ The tasks you want to run should be contained under the `tasks:` with two fields The name field is for the user of meshbook, to clarify what the following command does in a summary.
The command field actually gets executed on the end-point.
+### Windows Client Extra-information: + +If you want to launch commands at Windows machines, make sure you have your `os_categories.conf` up-to-date with the correct reported Windows versions.
+And then make sure to create compatible commands, see: [windows examples](./examples/windows)
+Related is the yaml option: `powershell: True`. + ### Granual Operating System filtering: I have made the program so it can have a filter with the Operating systems. If you have a mixed group, please read: diff --git a/examples/all_variable_usage_example.yaml b/examples/all_variable_usage_example.yaml new file mode 100644 index 0000000..c6deac6 --- /dev/null +++ b/examples/all_variable_usage_example.yaml @@ -0,0 +1,19 @@ +--- +name: Ping Multiple Points +group: "Kubernetes" +#target_os: "Debian" +variables: + - name: host1 + value: "1.1.1.1" + - name: host2 + value: "9.9.9.9" + - name: command1 + value: "ping" + - name: cmd_arguments + value: "-c 4" +tasks: + - name: Ping host1 + command: "{{ command1 }} {{ host1 }} {{ cmd_arguments }}" + + - name: Ping host2 + command: "{{ command1 }} {{ host2 }} {{ cmd_arguments }}" \ No newline at end of file diff --git a/examples/linux/aggregate_example.yaml b/examples/linux/aggregate_example.yaml new file mode 100644 index 0000000..00305a3 --- /dev/null +++ b/examples/linux/aggregate_example.yaml @@ -0,0 +1,32 @@ +--- +name: Echo some text in the terminal of the device +group: "Development" +target_os: "Linux" # <---- +variables: + - name: package_manager + value: "apt" + - name: google_dns + value: "8.8.8.8" + - name: "quad9_dns" + value: "9.9.9.9" +tasks: + - name: refresh the cache + command: "{{ package_manager }} update" + + - name: display available upgrades + command: "{{ package_manager }} list --upgradable" + + - name: apply upgrades + command: "{{ package_manager }} upgrade -y" + + - name: cleanup remaining packages + command: "{{ package_manager }} autoremove -y" + + - name: run autoclean + command: "{{ package_manager }} autoclean -y" + + - name: Ping Google DNS + command: "ping {{ google_dns }} -c 4" + + - name: Ping Quad9 DNS + command: "ping {{ quad9_dns }} -c 4" \ No newline at end of file diff --git a/examples/linux/apt_update_example.yaml b/examples/linux/apt_update_example.yaml new file mode 100644 index 0000000..cb0aa92 --- /dev/null +++ b/examples/linux/apt_update_example.yaml @@ -0,0 +1,13 @@ +--- +name: Refresh the apt cache +device: "" +#target_os: "Linux" +variables: + - name: package_manager + value: "apt" +tasks: + - name: refresh the {{ package_manager }} cache + command: "{{ package_manager }} update" + + - name: display available upgrades with {{ package_manager }} + command: "{{ package_manager }} list --upgradable" \ No newline at end of file diff --git a/examples/linux/apt_upgrade_example.yaml b/examples/linux/apt_upgrade_example.yaml new file mode 100644 index 0000000..3b8b60f --- /dev/null +++ b/examples/linux/apt_upgrade_example.yaml @@ -0,0 +1,19 @@ +--- +name: Refresh the apt cache +group: "Dev" +#target_os: "Linux" +variables: + - name: package_manager + value: "apt" +tasks: + - name: refresh the cache + command: "{{ package_manager }} update" + + - name: display available upgrades + command: "{{ package_manager }} list --upgradable" + + - name: apply upgrades + command: "{{ package_manager }} upgrade -y" + + - name: cleanup remaining packages + command: "{{ package_manager }} autoremove -y" \ No newline at end of file diff --git a/examples/linux/echo_example.yaml b/examples/linux/echo_example.yaml new file mode 100644 index 0000000..4c3f03f --- /dev/null +++ b/examples/linux/echo_example.yaml @@ -0,0 +1,10 @@ +--- +name: Echo a string to the terminal through the meshbook example. +group: "Development" +target_os: "Linux" +variables: + - name: file + value: "/etc/os-release" +tasks: + - name: Echo! + command: "echo $(cat {{ file }})" \ No newline at end of file diff --git a/examples/windows/get_sys_info.yaml b/examples/windows/get_sys_info.yaml new file mode 100644 index 0000000..cd9bec2 --- /dev/null +++ b/examples/windows/get_sys_info.yaml @@ -0,0 +1,11 @@ +--- +name: Echo a string to the terminal through the meshbook example. +group: "Endpoint" +target_os: "Windows" +powershell: True +#variables: +# - name: file +# value: "/etc/os-release" +tasks: + - name: Echo! + command: "Get-ComputerInfo | Select-Object CsName, OsName, OsArchitecture, OsLastBootUpTime | Write-Output" diff --git a/examples/windows/get_update_info.yaml b/examples/windows/get_update_info.yaml new file mode 100644 index 0000000..ae14d05 --- /dev/null +++ b/examples/windows/get_update_info.yaml @@ -0,0 +1,8 @@ +--- +name: Echo a string to the terminal through the meshbook example. +group: "Endpoint" +target_os: "Windows" +powershell: True +tasks: + - name: Get some update information + command: "Get-HotFix | Select-Object PSComputerName, HotFixID, InstalledOn" diff --git a/examples/windows/multiline_example.yaml b/examples/windows/multiline_example.yaml new file mode 100644 index 0000000..f9ebc93 --- /dev/null +++ b/examples/windows/multiline_example.yaml @@ -0,0 +1,16 @@ +--- +name: Echo a string to the terminal through the meshbook example. +group: "Endpoint" +target_os: "Windows" +powershell: True +#variables: +# - name: file +# value: "/etc/os-release" +tasks: + - name: Echo! + command: > + $systemInfo = Get-ComputerInfo | Select-Object CsName, OsName, OsArchitecture, OsLastBootUpTime; + $systemInfo | Format-Table -AutoSize; + Write-Output "I like monkeys."; + Get-SystemLanguage | Write-Output; + Get-ComputerInfo | Format-List; \ No newline at end of file diff --git a/meshbook.py b/meshbook.py index a188b39..1669ea9 100644 --- a/meshbook.py +++ b/meshbook.py @@ -260,13 +260,16 @@ async def execute_meshbook(session: meshctrl.Session, targets: dict, meshbook: d ''' Actual function that handles meshbook execution, also responsible for formatting the resulting JSON. ''' - + responses_list = {} round = 1 for task in meshbook["tasks"]: console(text_color.green + str(round) + ". Running: " + task["name"]) - response = await session.run_command(nodeids=targets, command=task["command"],ignore_output=False,timeout=900) + if meshbook["powershell"]: + response = await session.run_command(nodeids=targets, command=task["command"],powershell=True,ignore_output=False,timeout=900) + else: + response = await session.run_command(nodeids=targets, command=task["command"],ignore_output=False,timeout=900) task_batch = [] for device in response: @@ -325,7 +328,11 @@ async def main(): console("meshbook: " + text_color.yellow + args.meshbook) console("Operating System Categorisation file: " + text_color.yellow + args.oscategories) console("Configuration file: " + text_color.yellow + args.conf) - console("Target Operating System category given: " + text_color.yellow + meshbook["target_os"]) + if "target_os" in meshbook: + console("Target Operating System category given: " + text_color.yellow + meshbook["target_os"]) + else: + console("Target Operating System category given: " + text_color.yellow + "All") + if "device" in meshbook: console("Target device: " + text_color.yellow + str(meshbook["device"])) diff --git a/os_categories.json b/os_categories.json index 9213310..3397846 100644 --- a/os_categories.json +++ b/os_categories.json @@ -1,3 +1,4 @@ + { "Linux": { "Debian": [ @@ -14,5 +15,11 @@ "Sequoia": [ "macOS 15.0.1" ] + }, + "Windows": { + "11": [ + "Microsoft Windows 11 Home - 24H2/26100", + "Microsoft Windows 11 Pro - 24H2/26100" + ] } -} \ No newline at end of file +}