From c1aaa47c38a03a02624b3997c4bcc660141ba9d6 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 19 Aug 2022 16:01:06 +0500 Subject: [PATCH] Adding proper documentation --- Banner.png | Bin 0 -> 36917 bytes README.md | 145 ++++++++++++++++++---- examples/basicExample/example.go | 56 +++++++++ examples/basicExample/example.md | 2 + examples/client/client.md | 11 ++ examples/endpoints/endpoints.go | 69 ++++++++++ examples/endpoints/endpoints.md | 0 examples/optionalParams/optionalParams.go | 47 +++++++ examples/optionalParams/optionalParams.md | 6 + 9 files changed, 314 insertions(+), 22 deletions(-) create mode 100644 Banner.png create mode 100644 examples/basicExample/example.go create mode 100644 examples/basicExample/example.md create mode 100644 examples/client/client.md create mode 100644 examples/endpoints/endpoints.go create mode 100644 examples/endpoints/endpoints.md create mode 100644 examples/optionalParams/optionalParams.go create mode 100644 examples/optionalParams/optionalParams.md diff --git a/Banner.png b/Banner.png new file mode 100644 index 0000000000000000000000000000000000000000..ca406d3686a535abedfac697dbbe059d15112067 GIT binary patch literal 36917 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%0AruexZi5u& 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 VQmy3EA>#l5002ovPDHLkV1l?Enk4`L literal 0 HcmV?d00001 diff --git a/README.md b/README.md index d8c286c..d9ef361 100644 --- a/README.md +++ b/README.md @@ -1,42 +1,143 @@ -> ⚠️ This repository is incomplete and not ready to be used. +# go-intelowl +[![GitHub issues](https://img.shields.io/github/issues/intelowlproject/go-intelowl?style=plastic)](https://github.com/intelowlproject/go-intelowl/issues) +[![GitHub license](https://img.shields.io/github/license/intelowlproject/go-intelowl?style=plastic)](https://github.com/intelowlproject/go-intelowl/blob/main/LICENSE) -# GoIntelOwl +![go-banner](./Banner.png) +go-intelowl is a client library/SDK that allows developers to easily automate and integrate [IntelOwl](https://github.com/intelowlproject/IntelOwl) with their own set of tools! -IntelOwl client library/SDK written in [Go](https://golang.org/). + +# Table of Contents +- [go-intelowl](#go-intelowl) +- [Getting Started](#getting-started) + - [Pre requisites](#pre-requisites) + - [Installation](#installation) + - [Usage](#usage) + - [Examples](#examples) +- [Contribute](#contribute) +- [Liscence](#liscence) +- [Links](#links) +- [FAQ](#faq) + - [Generate API key](#generate-api-key) + - [v4.0 and above](#v40-and-above) + - [v4.0 below](#v40-below) + +# Getting Started + +## Pre requisites +- Go 1.17+ + ## Installation +Use go get to retrieve the SDK to add it to your GOPATH workspace, or project's Go module dependencies. ```bash $ go get github.com/intelowlproject/go-intelowl ``` -## Using as a library / SDK +## Usage +This library was built with ease of use in mind! Here are some quick examples to get you started. If you need more example you can go to the [examples directory](./examples/) + +To start using the gointelowl library you first need to import it: +``` +import "github.com/intelowlproject/go-intelowl/gointelowl" +``` +Construct a new `IntelOwlClient`, then use the various services to easily access different parts of Intelowl's REST API. Here's an example of getting all jobs: + +```Go +clientOptions := gointelowl.IntelOwlClientOptions{ + Url: "your-cool-URL-goes-here", + Token: "your-super-secret-token-goes-here", + // This is optional + Certificate: "your-optional-certificate-goes-here", +} + +intelowl := gointelowl.NewIntelOwlClient( + &clientOptions, + nil +) + +ctx := context.Background() + +// returns *[]Jobs or an IntelOwlError! +jobs, err := intelowl.JobService.List(ctx) +``` +For easy configuration and set up we opted for `options` structs. Where we can customize the client API or service endpoint to our liking! For more information go [here](). Here's a quick example! + +```Go +// ...Making the client and context! + +tagOptions = gointelowl.TagParams{ + Label: "NEW TAG", + Color: "#ffb703", +} + +createdTag, err := intelowl.TagService.Create(ctx, tagOptions) +if err != nil { + fmt.Println(err) +} else { + fmt.Println(createdTag) +} +``` +## Examples +The [examples](./examples/) directory contains a couple for clear examples, of which one is partially listed here as well: + +```Go +package main -```go import ( - "github.com/intelowlproject/go-intelowl" + "fmt" + + "github.com/intelowlproject/go-intelowl/gointelowl" ) -client := gointelowl.IntelOwlClient{ - Token: "", - URL: "", - Certificate: "optional", + +func main(){ + intelowlOptions := gointelowl.IntelOwlClientOptions{ + Url: "your-cool-url-goes-here", + Token: "your-super-secret-token-goes-here", + } + Certificate: "your-optional-certificate-goes-here", + + client := gointelowl.NewIntelOwlClient( + &intelowlOptions, + nil, + ) + + ctx := context.Background() + + // Get User details! + user, err := client.UserService.Access(ctx) + if err != nil { + fmt.Println("err") + fmt.Println(err) + } else { + fmt.Println("USER Details") + fmt.Println(*user) + } } + ``` + +For complete usage of go-intelowl, see the full [package docs](). -## FAQ +# Contribute +See our [contributor page]() for details how to contribute. If you want to follow the updates, discuss, or just chat then please join our [slack](https://honeynetpublic.slack.com/archives/C01KVGMAKL6) channel we'd love to hear your feedback! -#### Generate API key -You need a valid API key to interact with the IntelOwl server. -Keys should be created from the admin interface of [IntelOwl](https://github.com/intelowlproject/intelowl): you have to go in the *Durin* section (click on `Auth tokens`) and generate a key there. +# Liscence +Licensed under the GNU AFFERO GENERAL PUBLIC LICENSE. -## Checklist +# Links +- [Intelowl](https://github.com/intelowlproject/IntelOwl) +- [Documentation]() -- [ ] `/api/jobs` -- [ ] `/api/tags` -- [ ] send analysis request APIs -- [ ] `/api/ask_analysis_availability` -- [ ] Job actions like: `download_sample`, `kill`, `retry` -- [ ] `/api/get_analyzer_configs` -- [ ] `/api/get_connector_configs` +# FAQ +## Generate API key +You need a valid API key to interact with the IntelOwl server. +### v4.0 and above +You can get an API by doing the following: +1. Log / Signin into intelowl +2. At the upper right click on your profile from the drop down select `API Access/ Sessions` +3. Then generate an API key or see it! +### v4.0 below +Keys should be created from the admin interface of [IntelOwl](https://github.com/intelowlproject/intelowl): you have to go in the *Durin* section (click on `Auth tokens`) and generate a key there. \ No newline at end of file diff --git a/examples/basicExample/example.go b/examples/basicExample/example.go new file mode 100644 index 0000000..c80818c --- /dev/null +++ b/examples/basicExample/example.go @@ -0,0 +1,56 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/intelowlproject/go-intelowl/gointelowl" +) + +func main() { + + // Configuring the IntelOwlClient! + clientOptions := gointelowl.IntelOwlClientOptions{ + Url: "PUT-YOUR-INTELOWL-INSTANCE-URL-HERE", + Token: "PUT-YOUR-TOKEN-HERE", + Certificate: "", + } + + // Making the client! + client := gointelowl.NewIntelOwlClient( + &clientOptions, + nil, + ) + + ctx := context.Background() + + basicAnalysisParams := gointelowl.BasicAnalysisParams{ + User: 1, + Tlp: gointelowl.WHITE, + RuntimeConfiguration: map[string]interface{}{}, + AnalyzersRequested: []string{}, + ConnectorsRequested: []string{}, + TagsLabels: []string{}, + } + + observableAnalysisParams := gointelowl.ObservableAnalysisParams{ + BasicAnalysisParams: basicAnalysisParams, + ObservableName: "192.168.69.42", + ObservableClassification: "ip", + } + + analyzerResponse, err := client.CreateObservableAnalysis(ctx, &observableAnalysisParams) + if err != nil { + fmt.Println("err") + fmt.Println(err) + } else { + analyzerResponseJSON, _ := json.Marshal(analyzerResponse) + fmt.Println("JOB ID") + fmt.Println(analyzerResponse.JobID) + fmt.Println("JOB ID END") + fmt.Println("========== ANALYZER RESPONSE ==========") + fmt.Println(string(analyzerResponseJSON)) + fmt.Println("========== ANALYZER RESPONSE END ==========") + } +} diff --git a/examples/basicExample/example.md b/examples/basicExample/example.md new file mode 100644 index 0000000..dc8d1b9 --- /dev/null +++ b/examples/basicExample/example.md @@ -0,0 +1,2 @@ +# Example +This example will show you how to do a basic scan! \ No newline at end of file diff --git a/examples/client/client.md b/examples/client/client.md new file mode 100644 index 0000000..80ea4df --- /dev/null +++ b/examples/client/client.md @@ -0,0 +1,11 @@ + +# Client +A good client is a client that is easy to use, configurable and customizable to a user’s liking. Hence, the client has 2 great features: +1. Configurable HTTP client +2. Customizable timeouts + +## Configurable HTTP client +Now from the documentation, you can see you can pass your `http.Client`. This is to facilitate each user’s requirement and taste! If you don’t pass one (`nil`) a default `http.Client` will be made for you! + +## Customizable timeouts +From `IntelOwlClientOptions` you can add your own timeout to your requests as well. diff --git a/examples/endpoints/endpoints.go b/examples/endpoints/endpoints.go new file mode 100644 index 0000000..3c06289 --- /dev/null +++ b/examples/endpoints/endpoints.go @@ -0,0 +1,69 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/intelowlproject/go-intelowl/gointelowl" +) + +func main() { + + // Configuring the IntelOwlClient! + clientOptions := gointelowl.IntelOwlClientOptions{ + Url: "PUT-YOUR-INTELOWL-INSTANCE-URL-HERE", + Token: "PUT-YOUR-TOKEN-HERE", + Certificate: "", + } + + // Making the client! + client := gointelowl.NewIntelOwlClient( + &clientOptions, + nil, + ) + + ctx := context.Background() + + /* + Now we can use the client to commnicate with your intelowl instance via the service objects! + For this example I want to Display my tags list and create a new tag! + */ + + fmt.Println("Getting the tag list!") + + // Getting the tag list! + tagList, err := client.TagService.List(ctx) + // checking for any pesky errors if there's any error it'll return an IntelOwlError + if err != nil { + fmt.Println(err) + } else { + // Iterating through the list unless its empty in that case create some using TagService.Create()! + for _, tag := range *tagList { + tagJson, err := json.Marshal(tag) + if err != nil { + fmt.Println(err) + } else { + fmt.Println(string(tagJson)) + } + } + } + + // making the tag parameters! + tagParams := gointelowl.TagParams{ + Label: "your super duper cool tag label!", + Color: "#ffb703", + } + createdTag, err := client.TagService.Create(ctx, &tagParams) + if err != nil { + fmt.Println(err) + } else { + tagJson, err := json.Marshal(createdTag) + if err != nil { + fmt.Println(err) + } else { + fmt.Println(string(tagJson)) + } + } + +} diff --git a/examples/endpoints/endpoints.md b/examples/endpoints/endpoints.md new file mode 100644 index 0000000..e69de29 diff --git a/examples/optionalParams/optionalParams.go b/examples/optionalParams/optionalParams.go new file mode 100644 index 0000000..6964f02 --- /dev/null +++ b/examples/optionalParams/optionalParams.go @@ -0,0 +1,47 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/intelowlproject/go-intelowl/gointelowl" +) + +/* +For this example I'll be using the tag params! +*/ +func main() { + // Configuring the IntelOwlClient! + clientOptions := gointelowl.IntelOwlClientOptions{ + Url: "PUT-YOUR-INTELOWL-INSTANCE-URL-HERE", + Token: "PUT-YOUR-TOKEN-HERE", + Certificate: "", + } + + // Making the client! + client := gointelowl.NewIntelOwlClient( + &clientOptions, + nil, + ) + + ctx := context.Background() + + // making the tag parameters! + tagParams := gointelowl.TagParams{ + Label: "your super duper cool tag label!", + Color: "#ffb703", + } + createdTag, err := client.TagService.Create(ctx, &tagParams) + if err != nil { + fmt.Println(err) + } else { + tagJson, err := json.Marshal(createdTag) + if err != nil { + fmt.Println(err) + } else { + fmt.Println(string(tagJson)) + } + } + +} diff --git a/examples/optionalParams/optionalParams.md b/examples/optionalParams/optionalParams.md new file mode 100644 index 0000000..599c834 --- /dev/null +++ b/examples/optionalParams/optionalParams.md @@ -0,0 +1,6 @@ +# Optional Parameters +For the sake of simplicity, we decided that for some endpoints we’ll be passing `Option Parameters` this is to facilitate easy access, configuration and automation so that you don’t need to pass in many parameters but just a simple struct that can be easily converted to and from JSON! + +For example, let us look at the `TagParams` we use it as an argument for a method `Create` for `TagService`. From a glance, the `TagParams` look simple. They hold 2 fields: `Label`, and `Color` which can be passed seperatly to the method but imagine if you have many fields! (if you don’t believe see the [`ObservableAnalysisParams`](../../gointelowl/analysis.go)) + +For a practical implementation you can see the [example](./optionalParams.go) \ No newline at end of file