Compare commits
61 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
09fcce6be5 | ||
|
|
cf40e0b6b5 | ||
|
|
fddf51b7bf | ||
|
|
a72f303b68 | ||
|
|
f2607b5b4a | ||
|
|
5f4d044cb0 | ||
|
|
9d5b10625f | ||
|
|
e56baff565 | ||
| d056af8001 | |||
|
|
6ff1142ead | ||
|
|
9725c985f5 | ||
|
|
6db5904a31 | ||
|
|
d4c812f214 | ||
|
|
c4de2f6025 | ||
|
|
b38c70a425 | ||
|
|
a0f4a7a262 | ||
|
|
a3a8f86885 | ||
|
|
e140cc59f5 | ||
|
|
be0d38db70 | ||
|
|
1aba5c038c | ||
|
|
1c5d01a492 | ||
|
|
8332d6240d | ||
|
|
8133bc1058 | ||
|
|
dcfd3098a5 | ||
|
|
e1283d95e8 | ||
|
|
20cbc0cbd4 | ||
|
|
39c839a33d | ||
|
|
ebfbd41801 | ||
|
|
2eaddcb743 | ||
|
|
1ac46c0b22 | ||
|
|
d8480e8946 | ||
| 6c88bbf40a | |||
| c64f489c95 | |||
| 911cfef9e7 | |||
| d38a7e126d | |||
| 858b11ba23 | |||
| f60ffe3525 | |||
| a10c6f76d3 | |||
| 5d5f096033 | |||
| b8dc73a720 | |||
| 27280e8d45 | |||
| 8c5e12960d | |||
| 849dc9b0ee | |||
| 617d94add8 | |||
| 427fa2ffed | |||
| 7b7d706681 | |||
|
|
ebf0988f7d | ||
| 202e106486 | |||
| 3507540770 | |||
| a4579b399e | |||
| 73c6eae26a | |||
|
|
eb0f36d314 | ||
| 7be52a79d6 | |||
| 5f2e956e80 | |||
| 242137d421 | |||
| 0c2b7ae461 | |||
| bb4d1439cf | |||
| d8b07d11a1 | |||
| 3e75a5b445 | |||
| 46177264a1 | |||
| ec9e6ca83c |
8
.deepsource.toml
Normal file
8
.deepsource.toml
Normal file
@@ -0,0 +1,8 @@
|
||||
version = 1
|
||||
|
||||
[[analyzers]]
|
||||
name = "go"
|
||||
enabled = true
|
||||
|
||||
[analyzers.meta]
|
||||
import_root = "github.com/luketainton/iPilot"
|
||||
58
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
58
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
---
|
||||
name: "Bug Report"
|
||||
description: "Submit a bug report"
|
||||
labels: ["bug"]
|
||||
assignees: ["luketainton"]
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: checks
|
||||
attributes:
|
||||
label: First Check
|
||||
description: Please confirm and check all the following options.
|
||||
options:
|
||||
- label: This is not a feature request
|
||||
required: true
|
||||
- label: I added a descriptive title to this issue.
|
||||
required: true
|
||||
- label: I used the GitHub search to find a similar issue and didn't find one.
|
||||
required: true
|
||||
- type: input
|
||||
id: ipilot-version
|
||||
attributes:
|
||||
label: iPilot Version
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: What is the issue you are experiencing?
|
||||
placeholder: A clear and concise description of what the bug is.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: reproduction
|
||||
attributes:
|
||||
description: If you do not provide a way to reproduce the issue, your issue will likely be closed.
|
||||
label: How can the maintainer reproduce the issue?
|
||||
placeholder: A clear step-by-step guide on how to reproduce the issue.
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: os
|
||||
attributes:
|
||||
label: Deployment
|
||||
description: What Deployment system are you using?
|
||||
multiple: true
|
||||
options:
|
||||
- Docker
|
||||
- Native (Windows)
|
||||
- Native (MacOS)
|
||||
- Native (Linux)
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: os-details
|
||||
attributes:
|
||||
label: Deployment Details
|
||||
description: You can add more details about your operating system here, in particular if you chose "Other".
|
||||
63
.github/workflows/build.yml
vendored
Normal file
63
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
name: Build
|
||||
on:
|
||||
push:
|
||||
tags: '*'
|
||||
|
||||
jobs:
|
||||
prepare-data:
|
||||
name: Prepare Data
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
tag: ${{ steps.prepare.outputs.SOURCE_TAG }}
|
||||
repo: ${{ steps.prepare.outputs.REPO }}
|
||||
lrepo: ${{ steps.prepare.outputs.LREPO }}
|
||||
steps:
|
||||
- id: prepare
|
||||
name: Prepare environment variables
|
||||
run: |
|
||||
echo ::set-output name=SOURCE_NAME::${GITHUB_REF#refs/*/}
|
||||
echo ::set-output name=SOURCE_BRANCH::${GITHUB_REF#refs/heads/}
|
||||
echo ::set-output name=SOURCE_TAG::${GITHUB_REF#refs/tags/}
|
||||
echo ::set-output name=REPO::${GITHUB_REPOSITORY#luketainton/}
|
||||
echo ::set-output name=LREPO::${GITHUB_REPOSITORY#luketainton/} | tr '[:upper:]' '[:lower:]'
|
||||
|
||||
docker:
|
||||
name: GitHub Package Registry
|
||||
runs-on: ubuntu-latest
|
||||
needs: [prepare-data]
|
||||
steps:
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
- name: Login to GitHub Package Registry
|
||||
run: echo ${{ secrets.PAT }} | docker login ghcr.io -u luketainton --password-stdin
|
||||
- name: Build image for GitHub Package Registry
|
||||
run: docker build . --file Dockerfile --tag ghcr.io/luketainton/${{ needs.prepare-data.outputs.lrepo }}:${{ needs.prepare-data.outputs.tag }} --tag ghcr.io/luketainton/${{ needs.prepare-data.outputs.lrepo }}:latest
|
||||
- name: Push image to GitHub Package Registry
|
||||
run: |
|
||||
docker push ghcr.io/luketainton/${{ needs.prepare-data.outputs.lrepo }}:latest
|
||||
docker push ghcr.io/luketainton/${{ needs.prepare-data.outputs.lrepo }}:${{ needs.prepare-data.outputs.tag }}
|
||||
|
||||
build:
|
||||
name: Build and Release
|
||||
runs-on: ubuntu-latest
|
||||
needs: [prepare-data]
|
||||
steps:
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
- name: Build artifacts
|
||||
run: |
|
||||
docker run --rm -w /go/src/app -v ${PWD}:/go/src/app -e CGO_ENABLED=0 -e GOARCH=amd64 -e GOOS=darwin golang:alpine go build -o /go/src/app/${{ needs.prepare-data.outputs.repo }}-${{ needs.prepare-data.outputs.tag }}-darwin-amd64
|
||||
docker run --rm -w /go/src/app -v ${PWD}:/go/src/app -e CGO_ENABLED=0 -e GOARCH=arm64 -e GOOS=darwin golang:alpine go build -o /go/src/app/${{ needs.prepare-data.outputs.repo }}-${{ needs.prepare-data.outputs.tag }}-darwin-arm64
|
||||
docker run --rm -w /go/src/app -v ${PWD}:/go/src/app -e CGO_ENABLED=0 -e GOARCH=amd64 -e GOOS=linux golang:alpine go build -o /go/src/app/${{ needs.prepare-data.outputs.repo }}-${{ needs.prepare-data.outputs.tag }}-linux-amd64
|
||||
docker run --rm -w /go/src/app -v ${PWD}:/go/src/app -e CGO_ENABLED=0 -e GOARCH=amd64 -e GOOS=windows golang:alpine go build -o /go/src/app/${{ needs.prepare-data.outputs.repo }}-${{ needs.prepare-data.outputs.tag }}-win-amd64.exe
|
||||
docker run --rm -w /go/src/app -v ${PWD}:/go/src/app -e CGO_ENABLED=0 -e GOARCH=386 -e GOOS=windows golang:alpine go build -o /go/src/app/${{ needs.prepare-data.outputs.repo }}-${{ needs.prepare-data.outputs.tag }}-win-x86.exe
|
||||
- uses: meeDamian/github-release@v2.0.3
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
tag: ${{ needs.prepare-data.outputs.tag }}
|
||||
gzip: false
|
||||
files: >
|
||||
${{ needs.prepare-data.outputs.repo }}-${{ needs.prepare-data.outputs.tag }}-darwin-amd64
|
||||
${{ needs.prepare-data.outputs.repo }}-${{ needs.prepare-data.outputs.tag }}-darwin-arm64
|
||||
${{ needs.prepare-data.outputs.repo }}-${{ needs.prepare-data.outputs.tag }}-linux-amd64
|
||||
${{ needs.prepare-data.outputs.repo }}-${{ needs.prepare-data.outputs.tag }}-win-amd64.exe
|
||||
${{ needs.prepare-data.outputs.repo }}-${{ needs.prepare-data.outputs.tag }}-win-x86.exe
|
||||
|
||||
70
.github/workflows/codeql-analysis.yml
vendored
Normal file
70
.github/workflows/codeql-analysis.yml
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ main ]
|
||||
schedule:
|
||||
- cron: '18 1 * * 1'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'go' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v3
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
||||
15
.github/workflows/issues.yml
vendored
Normal file
15
.github/workflows/issues.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
name: Issue assignment
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
jobs:
|
||||
auto-assign:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 'Auto-assign issue'
|
||||
uses: pozil/auto-assign-issue@v1
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
assignees: luketainton
|
||||
42
.github/workflows/test.yml
vendored
Normal file
42
.github/workflows/test.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
name: Test
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened]
|
||||
push:
|
||||
branches: [ main ]
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: 1.19
|
||||
- name: Create golangci-lint report
|
||||
run: |
|
||||
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.42.1
|
||||
$(go env GOPATH)/bin/golangci-lint run --out-format checkstyle -D deadcode,unused --build-tags=integration --timeout 10m --issues-exit-code 0 ./... > report.xml
|
||||
sed -i 's+<file name="+<file name="go/+g' report.xml
|
||||
cat report.xml
|
||||
- name: Test
|
||||
run: go test -short -coverprofile=coverage.out
|
||||
continue-on-error: true
|
||||
- name: SonarCloud Scan
|
||||
uses: SonarSource/sonarcloud-github-action@master
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN_CLOUD }}
|
||||
# - uses: sonarsource/sonarqube-scan-action@master
|
||||
# env:
|
||||
# SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
# SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
|
||||
# - uses: sonarsource/sonarqube-quality-gate-action@master
|
||||
# timeout-minutes: 5
|
||||
# env:
|
||||
# SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/.vscode
|
||||
/.idea
|
||||
11
API.go
11
API.go
@@ -19,15 +19,12 @@ func getLocalIP() string {
|
||||
return ""
|
||||
}
|
||||
body, _ := ioutil.ReadAll(resp.Body)
|
||||
return string(body[:])
|
||||
return string(body)
|
||||
}
|
||||
|
||||
func checkIPSyntax(ipaddress string) bool {
|
||||
func isIPAddress(ipaddress string) bool {
|
||||
addr := net.ParseIP(ipaddress)
|
||||
if addr == nil {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
return addr != nil
|
||||
}
|
||||
|
||||
func resolveDNSHostname(hostname string) string {
|
||||
@@ -53,7 +50,7 @@ func getIPInfo(ipaddress string) IPAddressInfo {
|
||||
return info
|
||||
}
|
||||
|
||||
func getBGPPrefixes(as string) {
|
||||
func printBGPPrefixes(as string) {
|
||||
apiEndpoint := "https://api.hackertarget.com/aslookup/?q=" + as
|
||||
resp, err := http.Get(apiEndpoint)
|
||||
if err != nil {
|
||||
|
||||
10
Dockerfile
Normal file
10
Dockerfile
Normal file
@@ -0,0 +1,10 @@
|
||||
FROM golang:1.21-alpine as build
|
||||
WORKDIR /go/src/app
|
||||
COPY . /go/src/app
|
||||
RUN CGO_ENABLED=0 go build -o /go/bin/app
|
||||
|
||||
FROM gcr.io/distroless/base-debian10
|
||||
LABEL maintainer="Luke Tainton <luke@tainton.uk>"
|
||||
LABEL org.opencontainers.image.source="https://github.com/luketainton/iPilot"
|
||||
COPY --from=build /go/bin/app /
|
||||
CMD ["/app"]
|
||||
@@ -32,8 +32,8 @@ func printIPInfo(input string, wantPrefixes bool) {
|
||||
fmt.Println("Timezone: ", IPInfo.Timezone)
|
||||
fmt.Println("ISP: ", IPInfo.ISP)
|
||||
fmt.Println("BGP AS: ", bgpAS)
|
||||
if wantPrefixes == true {
|
||||
if wantPrefixes {
|
||||
fmt.Println("\nBGP Prefixes:")
|
||||
getBGPPrefixes(bgpAS)
|
||||
printBGPPrefixes(bgpAS)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 Luke Tainton
|
||||
Copyright (c) 2022 Luke Tainton
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
25
Main.go
25
Main.go
@@ -33,21 +33,20 @@ func main() {
|
||||
if input == "" {
|
||||
fmt.Println("FATAL: No IP address or domain name was specified.")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if input == "me" {
|
||||
input = getLocalIP()
|
||||
}
|
||||
if isIPAddress(input) {
|
||||
printIPInfo(input, wantPrefixes)
|
||||
} else {
|
||||
if input == "me" {
|
||||
input = getLocalIP()
|
||||
}
|
||||
var isIPCorrect bool = checkIPSyntax(input)
|
||||
if isIPCorrect == true {
|
||||
printIPInfo(input, wantPrefixes)
|
||||
ipaddress := resolveDNSHostname(input)
|
||||
if isIPAddress(ipaddress) {
|
||||
fmt.Println("Domain Name: ", input)
|
||||
printIPInfo(ipaddress, wantPrefixes)
|
||||
} else {
|
||||
ipaddress := resolveDNSHostname(input)
|
||||
if checkIPSyntax(ipaddress) == true {
|
||||
fmt.Println("Domain Name: ", input)
|
||||
printIPInfo(ipaddress, wantPrefixes)
|
||||
} else {
|
||||
fmt.Println("Invalid query.")
|
||||
}
|
||||
fmt.Println("Invalid query.")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,5 +16,8 @@ Here are some ways that you can run the script:
|
||||
| `./iPilot -i google.com` | Run against the domain name `google.com` |
|
||||
| `./iPilot -i google.com -p` | Run against the domain name `google.com` and lists BGP prefixes |
|
||||
|
||||
## Support
|
||||
For support please open an issue on [GitLab](https://gitlab.com/luketainton/iPilot) or email [ipilot@help.tainton.uk](mailto:ipilot@help.tainton.uk).
|
||||
|
||||
## Credits
|
||||
This script runs thanks to the APIs provided by [IP-API](http://ip-api.com) and [HackerTarget](https://hackertarget.com/as-ip-lookup).
|
||||
|
||||
29
ipilot_test.go
Normal file
29
ipilot_test.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package main
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestGetCurrentIP(t *testing.T) {
|
||||
myip := getLocalIP()
|
||||
if myip == "" {
|
||||
t.Log("could not retrieve current IP")
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsIPAddress(t *testing.T) {
|
||||
ipaddress := "192.168.0.1"
|
||||
isIP := isIPAddress(ipaddress)
|
||||
if isIP == false {
|
||||
t.Log("could not verify " + ipaddress + " is an IP address")
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
func TestResolveDNSHostname(t *testing.T) {
|
||||
hostname := "one.one.one.one"
|
||||
ipaddress := resolveDNSHostname(hostname)
|
||||
if ipaddress != "1.1.1.1" {
|
||||
t.Log("could not resolve IP for " + hostname)
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
16
renovate.json
Normal file
16
renovate.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"extends": ["config:base"],
|
||||
"platformCommit": true,
|
||||
"dependencyDashboardAutoclose": true,
|
||||
"assignAutomerge": true,
|
||||
"assigneesFromCodeOwners": true,
|
||||
"rebaseWhen": "behind-base-branch",
|
||||
"rollbackPrs": true,
|
||||
"labels": ["dependencies"],
|
||||
"vulnerabilityAlerts": {
|
||||
"enabled": true,
|
||||
"labels": ["security"],
|
||||
"commitMessagePrefix": "[SECURITY] ",
|
||||
"prCreation": "immediate"
|
||||
}
|
||||
}
|
||||
11
sonar-project.properties
Normal file
11
sonar-project.properties
Normal file
@@ -0,0 +1,11 @@
|
||||
sonar.organization=luketainton
|
||||
sonar.projectKey=luketainton_iPilot
|
||||
# sonar.projectKey=luketainton_iPilot_AYKYmHI397IDIMpeRtF7
|
||||
sonar.projectName=iPilot
|
||||
sonar.projectVersion=1.3.9
|
||||
sonar.sources=.
|
||||
sonar.exclusions=,.github/**,.gitignore,CODEOWNERS,CHANGELOG.md,LICENSE.md,README.md,renovate.json,**/*_test.go
|
||||
sonar.tests=.
|
||||
sonar.test.inclusions=**/*_test.go
|
||||
sonar.go.golangci-lint.reportPaths=report.xml
|
||||
sonar.go.coverage.reportPaths=coverage.out
|
||||
Reference in New Issue
Block a user