Skip to content

Commit

Permalink
refactor: restructure
Browse files Browse the repository at this point in the history
  • Loading branch information
jedrw committed Sep 10, 2023
1 parent 41e3501 commit 9ba2fe6
Show file tree
Hide file tree
Showing 14 changed files with 203 additions and 126 deletions.
86 changes: 86 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
version: 2.1

jobs:
build:
docker:
- image: cimg/go:1.20
steps:
- run:
name: Install upx
command: sudo apt update && sudo apt install upx -y
- checkout
- restore_cache:
keys:
- go-mod-v1-{{ checksum "go.sum" }}
- go-mod-v1
- run:
name: Install Dependencies
command: go get ./...
- save_cache:
key: go-mod-v1-{{ checksum "go.sum" }}
paths:
- "/go/pkg/mod"
- run:
name: Build
command: go build -C cmd/gowake/ -v -ldflags="-w -s"
- run:
name: Upx
command: upx ./cmd/gowake/gowake
- persist_to_workspace:
root: ~/project
paths:
- cmd/gowake/gowake
release:
docker:
- image: cimg/base:current
steps:
- attach_workspace:
at: ./
- run:
name: Package
command: tar cvfz ${CIRCLE_PROJECT_REPONAME}_${CIRCLE_TAG}_linux_amd64.tar.gz cmd/${CIRCLE_PROJECT_REPONAME}/${CIRCLE_PROJECT_REPONAME}
- run:
name: Release
command: |
curl -v \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${GITHUB_TOKEN}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/lupinelab/${CIRCLE_PROJECT_REPONAME}/releases \
-d '{"tag_name":"'$CIRCLE_TAG'","draft":false,"prerelease":false}'
RELEASE_ID=$(curl -s \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${GITHUB_TOKEN}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/lupinelab/${CIRCLE_PROJECT_REPONAME}/releases/tags/${CIRCLE_TAG} \
| jq '.id')
curl -v \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer $GITHUB_TOKEN"\
-H "X-GitHub-Api-Version: 2022-11-28" \
-H "Content-Type: $(file -b --mime-type ${CIRCLE_PROJECT_REPONAME}_${CIRCLE_TAG}_linux_amd64.tar.gz)" \
https://uploads.github.com/repos/lupinelab/${CIRCLE_PROJECT_REPONAME}/releases/$RELEASE_ID/assets?name=$(basename ${CIRCLE_PROJECT_REPONAME}_${CIRCLE_TAG}_linux_amd64.tar.gz) \
--data-binary @${CIRCLE_PROJECT_REPONAME}_${CIRCLE_TAG}_linux_amd64.tar.gz
workflows:
build_and_release:
jobs:
- build:
filters:
tags:
only: /v\d+\.\d+\.\d+/
- release:
context:
- github
requires:
- build
filters:
branches:
ignore: /.*/
tags:
only: /v\d+\.\d+\.\d+/

2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
gowake
./gowake
Binary file added cmd/gowake/gowake
Binary file not shown.
34 changes: 19 additions & 15 deletions cmd/gowake.go → cmd/gowake/gowake.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package cmd
package main

import (
"fmt"
"regexp"
"github.com/lupinelab/gowake/pkg"

"github.com/lupinelab/gowake"
"github.com/lupinelab/gowake/cmd/listen"
"github.com/spf13/cobra"
)

Expand Down Expand Up @@ -31,32 +33,34 @@ var gowakeCmd = &cobra.Command{
}

// Build packet
mp, err := pkg.BuildMagicPacket(args[0])
mp, err := gowake.NewMagicPacket(args[0])
if err != nil {
fmt.Println(err.Error())
return
}

sendoptions := pkg.SendOptions{Mp: mp, Port: port, IP: ip}

// Send packet
pkg.SendMagicPacket(sendoptions)
err = gowake.SendMagicPacket(*mp, ip, port)
if err != nil {
fmt.Println(err.Error())
}

fmt.Printf("Sent magic packet to %v\n", args[0])
},
}

func Execute() error {
return gowakeCmd.Execute()
}

func init() {
var port int
var ip string
gowakeCmd.AddCommand(listen.ListenCmd)
gowakeCmd.PersistentFlags().IntVarP(&port, "port", "p", 9, "Port to send or listen for magic packet")
gowakeCmd.Flags().StringVarP(&ip, "ip", "i", "255.255.255.255", "Destination (IP or broadcast address) for the magic packet")
gowakeCmd.PersistentFlags().BoolP("help", "h", false, "Print help")
gowakeCmd.SetHelpCommand(&cobra.Command{
Hidden: true,
})
gowakeCmd.PersistentFlags().BoolP("help", "h", false, "Print help for command")
cobra.EnableCommandSorting = false
gowakeCmd.CompletionOptions.DisableDefaultCmd = true
gowakeCmd.InitDefaultCompletionCmd()
gowakeCmd.CompletionOptions.DisableDescriptions = true
}

func main() {
gowakeCmd.Execute()
}
13 changes: 6 additions & 7 deletions cmd/listen.go → cmd/listen/listen.go
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
package cmd
package listen

import (
"fmt"

"github.com/lupinelab/gowake/pkg"
"github.com/lupinelab/gowake"
"github.com/spf13/cobra"
)

var listenCmd = &cobra.Command{
var ListenCmd = &cobra.Command{
Use: "listen",
Short: "Listen for a magic packet",
Run: func(cmd *cobra.Command, args []string) {
port, _ := cmd.Flags().GetInt("port")
cont, _ := cmd.Flags().GetBool("continuous")
fmt.Printf("Listening for magic packets on port %d:\n", port)
for true {
remote, macaddr, err := pkg.ListenMagicPacket(port)
for {
remote, macaddr, err := gowake.Listen(port)
if err != nil {
if err.Error() == fmt.Sprintf("listen udp 0.0.0.0:%d: bind: permission denied", port) {
fmt.Println("Please run as elevated user")
Expand All @@ -35,6 +35,5 @@ var listenCmd = &cobra.Command{

func init() {
var continuous bool
listenCmd.Flags().BoolVarP(&continuous, "continuous", "c", false, "Listen continuously for magic packets")
gowakeCmd.AddCommand(listenCmd)
ListenCmd.Flags().BoolVarP(&continuous, "continuous", "c", false, "Listen continuously for magic packets")
}
6 changes: 3 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
module github.com/lupinelab/gowake

go 1.19
go 1.20

require github.com/spf13/cobra v1.5.0
require github.com/spf13/cobra v1.7.0

require (
github.com/inconshreveable/mousetrap v1.0.1 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
)
11 changes: 5 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU=
github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM=
github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
29 changes: 29 additions & 0 deletions listen.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package gowake

import (
"net"
)

func Listen(port int) (*net.UDPAddr, string, error) {
addr := net.UDPAddr{
IP: net.ParseIP("0.0.0.0"),
Port: port,
}

listener, err := net.ListenUDP("udp", &addr)
if err != nil {
return nil, "", err
}
defer listener.Close()

magicPacket := MagicPacket{}
remote := &net.UDPAddr{}
for {
_, remote, err = listener.ReadFromUDP(magicPacket[:])
if err != nil {
return remote, "", err
} else {
return remote, net.HardwareAddr.String(magicPacket[96:]), err
}
}
}
32 changes: 32 additions & 0 deletions magicpacket.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package gowake

import (
"fmt"
"net"
)

type MagicPacket [102]byte

func NewMagicPacket(mac string) (mp *MagicPacket, err error) {
// Parse mac address
hwAddr, err := net.ParseMAC(mac)
if err != nil {
return nil, err
}

if len(hwAddr) != 6 {
return nil, fmt.Errorf("invalid EUI-48 MAC address")
}

// Build magicpacket
magicPacket := MagicPacket{}
copy(magicPacket[:], []byte{255, 255, 255, 255, 255, 255})

offset := 6
for i := 0; i < 16; i++ {
copy(magicPacket[offset:], hwAddr[:])
offset += 6
}

return &magicPacket, err
}
9 changes: 0 additions & 9 deletions main.go

This file was deleted.

30 changes: 0 additions & 30 deletions pkg/listener.go

This file was deleted.

33 changes: 0 additions & 33 deletions pkg/magicpacket.go

This file was deleted.

22 changes: 0 additions & 22 deletions pkg/send.go

This file was deleted.

Loading

0 comments on commit 9ba2fe6

Please sign in to comment.