10 Commits

Author SHA1 Message Date
Sascha Seidel
5841f74693 Update index.html 2021-07-16 18:11:50 +02:00
Holger Cremer
7797f25911 update to new wifi session format 2020-09-25 20:49:55 +02:00
Holger Cremer
09524c20a6 fixes the build chain for docker 2020-01-11 20:44:08 +01:00
Holger Cremer
250568578a adds a docker image to build the binary 2020-01-04 19:02:40 +01:00
Holger Cremer
8270fdff90 don't send a zero update when using listUnknown 2019-11-29 23:29:25 +01:00
Holger Cremer
acf1c71198 moves the vendor db 2019-11-29 22:59:27 +01:00
Holger Cremer
973d9fcacb adds a 'listUnknown' binary 2019-11-29 22:49:44 +01:00
Holger Cremer
06f8a14444 fixes IsMacLocallyAdministered check 2019-11-29 22:37:29 +01:00
Holger Cremer
2f7f2df786 ipv6 support 2019-04-28 00:17:57 +02:00
Holger Cremer
02c7464ce2 changes project layout 2018-08-25 15:18:40 +02:00
27 changed files with 1096 additions and 221 deletions

6
.gitignore vendored
View File

@@ -3,4 +3,8 @@
config.toml config.toml
vendor/ vendor/
userDb.json userDb.json
masterDb.json masterDb.json
extras/*.csv
macVendorDb.csv
listUnkown
spaceDevices

819
Gopkg.lock generated
View File

@@ -2,116 +2,873 @@
[[projects]] [[projects]]
branch = "default"
digest = "1:948d94ecc3bcce79f850400744f69d795ef7a750e7486ef8d0ef40a95eb9c3ee"
name = "bitbucket.org/bodhisnarkva/cbor"
packages = ["go"]
pruneopts = ""
revision = "113f42203c941470c98f7174065ba9b384cff727"
[[projects]]
digest = "1:cb193a00b8b032b70a5bad3b57da90867fcfea7e3d23581e71dda50fca9cecd5"
name = "cloud.google.com/go"
packages = [
".",
"compute/metadata",
"iam",
"internal",
"internal/optional",
"internal/trace",
"internal/version",
"storage",
]
pruneopts = ""
revision = "e5804108aed715c49f731aab1a847f063fb23681"
version = "v0.50.0"
[[projects]]
digest = "1:289dd4d7abfb3ad2b5f728fbe9b1d5c1bf7d265a3eb9ef92869af1f7baba4c7a"
name = "github.com/BurntSushi/toml" name = "github.com/BurntSushi/toml"
packages = ["."] packages = ["."]
pruneopts = ""
revision = "b26d9c308763d68093482582cea63d69be07a0f0" revision = "b26d9c308763d68093482582cea63d69be07a0f0"
version = "v0.3.0" version = "v0.3.0"
[[projects]] [[projects]]
digest = "1:a8062972611c57205bf50c1a6fd639883b8a18288e8423549c27f6adac055ea7"
name = "github.com/DataDog/zstd"
packages = ["."]
pruneopts = ""
revision = "8fdb579680349497546a04291cedfff98a7829a0"
version = "v1.4.4"
[[projects]]
digest = "1:4139df3eb46aea1ebebee02c0453bd45850c21db8ced404b0f13289f21d11bbd"
name = "github.com/Sereal/Sereal"
packages = ["Go/sereal"]
pruneopts = ""
revision = "df33d1c458d3baeb3c34ef319f30b940688a1964"
version = "v1.0"
[[projects]]
digest = "1:0deddd908b6b4b768cfc272c16ee61e7088a60f7fe2f06c547bd3d8e1f8b8e77"
name = "github.com/davecgh/go-spew" name = "github.com/davecgh/go-spew"
packages = ["spew"] packages = [
revision = "346938d642f2ec3594ed81d874461961cd0faa76" "spew",
version = "v1.1.0" "spew/testdata",
]
pruneopts = ""
revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73"
version = "v1.1.1"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:c5c7cef0066cca569e1f59c7856ab897c288a7b19bb0e829793a012189dd06cf"
name = "github.com/davecgh/go-xdr"
packages = ["xdr2"]
pruneopts = ""
revision = "e6a2ba005892b6a5b27cb5352f64c2e96942dd28"
[[projects]]
branch = "master"
digest = "1:899ab67e7a794d8c454b4e6088c7cb85e6b7b4ec9cf5c94d6c742eb8b2e7da26"
name = "github.com/dchest/uniuri" name = "github.com/dchest/uniuri"
packages = ["."] packages = ["."]
pruneopts = ""
revision = "8902c56451e9b58ff940bbe5fec35d5f9c04584a" revision = "8902c56451e9b58ff940bbe5fec35d5f9c04584a"
[[projects]] [[projects]]
digest = "1:eecb3e6cef98036972582ffff7d3e340aef15f075236da353aa3e7fb798fdb21"
name = "github.com/eclipse/paho.mqtt.golang" name = "github.com/eclipse/paho.mqtt.golang"
packages = [".","packets"] packages = [
".",
"packets",
]
pruneopts = ""
revision = "aff15770515e3c57fc6109da73d42b0d46f7f483" revision = "aff15770515e3c57fc6109da73d42b0d46f7f483"
version = "v1.1.0" version = "v1.1.0"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:b3e8b1876d3d7179138781b0ef9673554ae103c8002e7d7fea281cfb885e8c80"
name = "github.com/gin-contrib/gzip" name = "github.com/gin-contrib/gzip"
packages = ["."] packages = ["."]
revision = "9b22cb967bcc8481c9fe3ab99f70d715f88980f0" pruneopts = ""
revision = "3b307ae37dc29cf63f95d0952158172927d7861c"
[[projects]] [[projects]]
branch = "master" digest = "1:e35353e6b5c1a1350832f2f5ea87f1d42d491ce519bc6e2c65d5dd6d020e2a01"
name = "github.com/gin-contrib/sse" name = "github.com/gin-contrib/sse"
packages = ["."] packages = ["."]
revision = "22d885f9ecc78bf4ee5d72b937e4bbcdc58e8cae" pruneopts = ""
revision = "54d8467d122d380a14768b6b4e5cd7ca4755938f"
version = "v0.1.0"
[[projects]] [[projects]]
digest = "1:e11e53fe8a044e4a1e4f4dbec534f00e19d0132535c7fb2e94c7b98ab4c65af8"
name = "github.com/gin-gonic/gin" name = "github.com/gin-gonic/gin"
packages = [".","binding","render"] packages = [
revision = "d459835d2b077e44f7c9b453505ee29881d5d12d" ".",
version = "v1.2" "binding",
"internal/json",
"render",
"testdata/protoexample",
]
pruneopts = ""
revision = "b75d67cd51eb53c3c3a2fc406524c940021ffbda"
version = "v1.4.0"
[[projects]]
digest = "1:9b65ba1b0091274d19622cdb1f230771df68716ab9ca340c44e45597a72e290b"
name = "github.com/go-playground/locales"
packages = [
".",
"currency",
"en",
"en_CA",
"fr",
"id",
"ja",
"nl",
"pt_BR",
"tr",
"zh",
"zh_Hant_TW",
]
pruneopts = ""
revision = "9f105231d3a5f6877a2bf8321dfa15ea6f844b1b"
version = "v0.13.0"
[[projects]]
digest = "1:b7edb31103e55ef4cf5f6a2b790b34f68f1209590f7f8008115ca09f1fa2a853"
name = "github.com/go-playground/universal-translator"
packages = ["."]
pruneopts = ""
revision = "f87b1403479a348651dbf5f07f5cc6e5fcf07008"
version = "v0.17.0"
[[projects]]
digest = "1:a01080d20c45c031c13f3828c56e58f4f51d926a482ad10cc0316225097eb7ea"
name = "github.com/go-stack/stack"
packages = ["."]
pruneopts = ""
revision = "2fee6af1a9795aafbe0253a0cfbdf668e1fb8a9a"
version = "v1.8.0"
[[projects]] [[projects]]
branch = "master" branch = "master"
name = "github.com/golang/protobuf" digest = "1:bd738ea0dd7d1ce14f6410e1a966c946bcb1855db767a16836d5c56ca3f2f2a0"
packages = ["proto"] name = "github.com/golang/groupcache"
revision = "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" packages = ["lru"]
pruneopts = ""
revision = "215e87163ea771ffa998a96c611387313bb5a403"
[[projects]] [[projects]]
digest = "1:b852d2b62be24e445fcdbad9ce3015b44c207815d631230dfce3f14e7803f5bf"
name = "github.com/golang/protobuf"
packages = [
"descriptor",
"jsonpb/jsonpb_test_proto",
"proto",
"proto/proto3_proto",
"proto/test_proto",
"protoc-gen-go",
"protoc-gen-go/descriptor",
"protoc-gen-go/generator",
"protoc-gen-go/generator/internal/remap",
"protoc-gen-go/grpc",
"protoc-gen-go/plugin",
"ptypes",
"ptypes/any",
"ptypes/duration",
"ptypes/struct",
"ptypes/timestamp",
"ptypes/wrappers",
]
pruneopts = ""
revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7"
version = "v1.3.2"
[[projects]]
digest = "1:6a6322a15aa8e99bd156fbba0aae4e5d67b4bb05251d860b348a45dfdcba9cce"
name = "github.com/golang/snappy"
packages = ["."]
pruneopts = ""
revision = "2a8bb927dd31d8daada140a5d09578521ce5c36a"
version = "v0.0.1"
[[projects]]
digest = "1:8d4a577a9643f713c25a32151c0f26af7228b4b97a219b5ddb7fd38d16f6e673"
name = "github.com/google/gofuzz"
packages = ["."]
pruneopts = ""
revision = "f140a6486e521aad38f5917de355cbf147cc0496"
version = "v1.0.0"
[[projects]]
digest = "1:6120f027b9d68ef460b8731e27b0dcf2017f80605c17eb0b4cc151866ba38f6d"
name = "github.com/googleapis/gax-go"
packages = ["v2"]
pruneopts = ""
revision = "bd5b16380fd03dc758d11cef74ba2e3bc8b0e8c2"
version = "v2.0.5"
[[projects]]
digest = "1:fb8bce9822eac1e2aeee6c2621cf25c6dec8f8f5f50a09a4a894d7932bfb2106"
name = "github.com/json-iterator/go"
packages = ["."]
pruneopts = ""
revision = "acfec88f7a0d5140ace3dcdbee10184e3684a9e1"
version = "v1.1.9"
[[projects]]
digest = "1:79842ff66af8c6fbebb418e3403fa3e9fde8e6c82ebffc5272a3dfeaa64c0665"
name = "github.com/jstemmer/go-junit-report"
packages = [
".",
"formatter",
"parser",
]
pruneopts = ""
revision = "cc1f095d5cc5eca2844f5c5ea7bb37f6b9bf6cac"
version = "v0.9.1"
[[projects]]
digest = "1:0f51cee70b0d254dbc93c22666ea2abf211af81c1701a96d04e2284b408621db"
name = "github.com/konsorten/go-windows-terminal-sequences"
packages = ["."]
pruneopts = ""
revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e"
version = "v1.0.2"
[[projects]]
digest = "1:374148f8cffff6c4fc9def73674b6c104c54b9fe5957f93798b62fa6e1930f29"
name = "github.com/kr/pretty"
packages = ["."]
pruneopts = ""
revision = "4e0886370c3a67530192c6a238cff68f56c141b0"
version = "v0.2.0"
[[projects]]
digest = "1:11b056b4421396ab14e384ab8ab8c2079b03f1e51aa5eb4d9b81f9e0d1aa8fbf"
name = "github.com/kr/text"
packages = ["."]
pruneopts = ""
revision = "e2ffdb16a802fe2bb95e2e35ff34f0e53aeef34f"
version = "v0.1.0"
[[projects]]
digest = "1:eadc94347700e0ea690190ca59cbe66cd9997633fee4344206419e6fc878373e"
name = "github.com/leodido/go-urn"
packages = ["."]
pruneopts = ""
revision = "a0f5013415294bb94553821ace21a1a74c0298cc"
version = "v1.2.0"
[[projects]]
digest = "1:263db331ad7732d9d1e45003031dd3d6295c0c4be232f99596dde34fa51e3df9"
name = "github.com/mailru/easyjson"
packages = [
".",
"buffer",
"jlexer",
"jwriter",
]
pruneopts = ""
revision = "1b2b06f5f209fea48ff5922d8bfb2b9ed5d8f00b"
version = "v0.7.0"
[[projects]]
digest = "1:f438921468fbc770ac4c97628f188913a099d4f004226e4aeb6e0f62f5b14fd1"
name = "github.com/mattn/go-isatty" name = "github.com/mattn/go-isatty"
packages = ["."] packages = ["."]
revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" pruneopts = ""
version = "v0.0.3" revision = "31745d66dd679ac0ac4f8d3ecff168fce6170c6a"
version = "v0.0.11"
[[projects]] [[projects]]
digest = "1:0c0ff2a89c1bb0d01887e1dac043ad7efbf3ec77482ef058ac423d13497e16fd"
name = "github.com/modern-go/concurrent"
packages = ["."]
pruneopts = ""
revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94"
version = "1.0.3"
[[projects]]
digest = "1:e32bdbdb7c377a07a9a46378290059822efdce5c8d96fe71940d87cb4f918855"
name = "github.com/modern-go/reflect2"
packages = ["."]
pruneopts = ""
revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd"
version = "1.0.1"
[[projects]]
digest = "1:210286d0cb60ffe28f1ca00b664029e8943009f95d06d8f8c336301b28e1aee5"
name = "github.com/philhofer/fwd"
packages = ["."]
pruneopts = ""
revision = "bb6d471dc95d4fe11e432687f8b70ff496cf3136"
version = "v1.0.0"
[[projects]]
digest = "1:256484dbbcd271f9ecebc6795b2df8cad4c458dd0f5fd82a8c2fa0c29f233411"
name = "github.com/pmezard/go-difflib" name = "github.com/pmezard/go-difflib"
packages = ["difflib"] packages = ["difflib"]
pruneopts = ""
revision = "792786c7400a136282c1664665ae0a8db921c6c2" revision = "792786c7400a136282c1664665ae0a8db921c6c2"
version = "v1.0.0" version = "v1.0.0"
[[projects]] [[projects]]
name = "github.com/sirupsen/logrus" branch = "master"
packages = ["."] digest = "1:e5971c451b4b385d0b39f6d4fc846d31bb356d80c7ee537f7c40b3b2e496d63b"
revision = "f006c2ac4710855cf0f916dd6b77acf6b048dc6e" name = "github.com/pquerna/ffjson"
version = "v1.0.3" packages = [
"ffjson",
"fflib/v1",
"fflib/v1/internal",
]
pruneopts = ""
revision = "aa0246cd15f76c96de6b96f22a305bdfb2d1ec02"
[[projects]] [[projects]]
digest = "1:3fcbf733a8d810a21265a7f2fe08a3353db2407da052b233f8b204b5afc03d9b"
name = "github.com/sirupsen/logrus"
packages = [
".",
"hooks/syslog",
]
pruneopts = ""
revision = "3e01752db0189b9157070a0e1668a620f9a85da2"
version = "v1.0.6"
[[projects]]
digest = "1:88e031206b52c11a8442f3f07e9bcddc1b248274d0506c768a948e7e254b84bb"
name = "github.com/stretchr/objx"
packages = ["."]
pruneopts = ""
revision = "ea4fe68685ee0d3cee7032121851b57e7494e8ea"
version = "v0.2.0"
[[projects]]
digest = "1:3926a4ec9a4ff1a072458451aa2d9b98acd059a45b38f7335d31e06c3d6a0159"
name = "github.com/stretchr/testify" name = "github.com/stretchr/testify"
packages = ["assert"] packages = [
"assert",
"http",
"mock",
"require",
]
pruneopts = ""
revision = "69483b4bd14f5845b5a1e55bca19e954e827f1d0" revision = "69483b4bd14f5845b5a1e55bca19e954e827f1d0"
version = "v1.1.4" version = "v1.1.4"
[[projects]] [[projects]]
branch = "master" digest = "1:ba0b08150469673dc06b947a6deb2907831b3b02eb65026393788e8712c5b087"
name = "github.com/tinylib/msgp"
packages = ["msgp"]
pruneopts = ""
revision = "490d90d0e69181d9cfedd28343d876cd361adcc3"
version = "v1.1.1"
[[projects]]
digest = "1:152bb9c7b128f6d8204e1676bb1a79cdaac9b3d40e495048282823ff6f5fb3d4"
name = "github.com/ugorji/go" name = "github.com/ugorji/go"
packages = ["codec"] packages = ["codec"]
revision = "459bba837a9de7a4d9c58fa5a1171a2a3c96d0d0" pruneopts = ""
revision = "23ab95ef5dc3b70286760af84ce2327a2b64ed62"
version = "v1.1.7"
[[projects]]
digest = "1:79491b4217db33faa5486cc3787691997e108334ea1940b34aef5aa3af92ea63"
name = "go.mongodb.org/mongo-driver"
packages = [
"bson",
"bson/bsoncodec",
"bson/bsonoptions",
"bson/bsonrw",
"bson/bsontype",
"bson/primitive",
"x/bsonx/bsoncore",
]
pruneopts = ""
revision = "b414b897457665f12997cefd10ad934ccb9dfb3e"
version = "v1.2.0"
[[projects]]
digest = "1:61ff2a14b0f9a396d92bb6967ecd1ae4c4767ff3e008acdfd8291af134336d9f"
name = "go.opencensus.io"
packages = [
".",
"internal",
"internal/tagencoding",
"metric/metricdata",
"metric/metricproducer",
"plugin/ochttp",
"plugin/ochttp/propagation/b3",
"resource",
"stats",
"stats/internal",
"stats/view",
"tag",
"trace",
"trace/internal",
"trace/propagation",
"trace/tracestate",
]
pruneopts = ""
revision = "aad2c527c5defcf89b5afab7f37274304195a6b2"
version = "v0.22.2"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:9c14800d0148726e982a53610f1a040b26070101e3fb6f8cf8071ed987c8a401"
name = "go4.org"
packages = ["syncutil/singleflight"]
pruneopts = ""
revision = "c7e774b10ea04ad8fe5241e62ac4bf676c1d6b16"
[[projects]]
branch = "master"
digest = "1:1dd434964af165b5ff841d0ba04c25d7a69ddb555d151c7ff413362393f56e81"
name = "golang.org/x/build"
packages = ["autocertcache"]
pruneopts = ""
revision = "17a7d8724fa7128cd79bcb78e1fbe087043bf810"
[[projects]]
branch = "master"
digest = "1:623570fddb99ef064b125c7bf3161f14aba21fdb787896b6c5070d34187c86f8"
name = "golang.org/x/crypto" name = "golang.org/x/crypto"
packages = ["ssh/terminal"] packages = [
revision = "2509b142fb2b797aa7587dad548f113b2c0f20ce" "acme",
"acme/autocert",
"ssh/terminal",
]
pruneopts = ""
revision = "53104e6ec876ad4e22ad27cce588b01392043c1b"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:3eff8962ec764e09945f32199ca343c798c79b25e69bf5fd813e1aafcd3e50b7"
name = "golang.org/x/exp"
packages = [
"apidiff",
"cmd/apidiff",
]
pruneopts = ""
revision = "da58074b429933d2abeae71d6ef619366febf38e"
[[projects]]
branch = "master"
digest = "1:465c831311f144be27d64ae3cb416b243ff67e73407852bc4265d09efbb66283"
name = "golang.org/x/lint"
packages = [
".",
"golint",
]
pruneopts = ""
revision = "fdd1cda4f05fd1fd86124f0ef9ce31a0b72c8448"
[[projects]]
branch = "master"
digest = "1:cab37ea831bb9be343b41a7673e64b6bb8399bc0f051180c04ce561573ed2c89"
name = "golang.org/x/net" name = "golang.org/x/net"
packages = ["proxy","websocket"] packages = [
revision = "c73622c77280266305273cb545f54516ced95b93" "context",
"context/ctxhttp",
"dns/dnsmessage",
"http/httpguts",
"http/httpproxy",
"http2",
"http2/hpack",
"idna",
"internal/socks",
"internal/sockstest",
"internal/timeseries",
"nettest",
"proxy",
"trace",
"websocket",
]
pruneopts = ""
revision = "c0dbc17a35534bf2e581d7a942408dc936316da4"
[[projects]] [[projects]]
branch = "master" branch = "master"
name = "golang.org/x/sys" digest = "1:44d75e002fa89506cca17f921eb07aee69526d7519bb7f1f2b0e017380c5e011"
packages = ["unix","windows"] name = "golang.org/x/oauth2"
revision = "661970f62f5897bc0cd5fdca7e087ba8a98a8fa1" packages = [
".",
"google",
"internal",
"jws",
"jwt",
]
pruneopts = ""
revision = "858c2ad4c8b6c5d10852cb89079f6ca1c7309787"
[[projects]] [[projects]]
branch = "master"
digest = "1:8c945c7d15d859d00371d42149761229fcc8dcd839ff2b998defba22fc9f7d24"
name = "golang.org/x/sys"
packages = [
"cpu",
"unix",
"windows",
"windows/registry",
"windows/svc",
"windows/svc/debug",
"windows/svc/eventlog",
"windows/svc/mgr",
]
pruneopts = ""
revision = "a1369afcdac740082c63165b07ec83b531884be2"
[[projects]]
digest = "1:740b51a55815493a8d0f2b1e0d0ae48fe48953bf7eaf3fcc4198823bf67768c0"
name = "golang.org/x/text"
packages = [
"collate",
"collate/build",
"internal/colltab",
"internal/gen",
"internal/language",
"internal/language/compact",
"internal/tag",
"internal/triegen",
"internal/ucd",
"language",
"secure/bidirule",
"transform",
"unicode/bidi",
"unicode/cldr",
"unicode/norm",
"unicode/rangetable",
]
pruneopts = ""
revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475"
version = "v0.3.2"
[[projects]]
branch = "master"
digest = "1:a4eb4cc7790e58abb47866069f3ef5033c226cded13b9955d6b3af2de34266ac"
name = "golang.org/x/tools"
packages = [
"cmd/goimports",
"go/analysis",
"go/analysis/passes/inspect",
"go/ast/astutil",
"go/ast/inspector",
"go/buildutil",
"go/gcexportdata",
"go/internal/gcimporter",
"go/internal/packagesdriver",
"go/packages",
"go/types/objectpath",
"go/types/typeutil",
"internal/fastwalk",
"internal/gopathwalk",
"internal/imports",
"internal/module",
"internal/semver",
]
pruneopts = ""
revision = "774c71fcf11405d0a5ce0aba75dc113822d62178"
[[projects]]
digest = "1:1e9e6f4d4ca4c890f3de6dbaf071a9a428991c571fbaeae210981729cd19cd1a"
name = "google.golang.org/api"
packages = [
"googleapi",
"googleapi/transport",
"internal",
"internal/gensupport",
"internal/third_party/uritemplates",
"iterator",
"option",
"storage/v1",
"transport/http",
"transport/http/internal/propagation",
]
pruneopts = ""
revision = "aa5d4e47691e7ae1aebb5221ff8e4beea23fad72"
version = "v0.15.0"
[[projects]]
digest = "1:c4404231035fad619a12f82ae3f0f8f9edc1cc7f34e7edad7a28ccac5336cc96"
name = "google.golang.org/appengine"
packages = [
".",
"datastore",
"datastore/internal/cloudkey",
"datastore/internal/cloudpb",
"internal",
"internal/app_identity",
"internal/base",
"internal/datastore",
"internal/log",
"internal/modules",
"internal/remote_api",
"internal/urlfetch",
"urlfetch",
]
pruneopts = ""
revision = "971852bfffca25b069c31162ae8f247a3dba083b"
version = "v1.6.5"
[[projects]]
branch = "master"
digest = "1:ba64d3acd79ad4dee34b76de29a73959114a204f1f35791807171a152d41aa38"
name = "google.golang.org/genproto"
packages = [
"googleapis/api/annotations",
"googleapis/iam/v1",
"googleapis/rpc/code",
"googleapis/rpc/status",
"googleapis/type/expr",
]
pruneopts = ""
revision = "f3c370f40bfba3cb25c5c2f823a1a8031b5ad724"
[[projects]]
digest = "1:7af390490e636a6adc9c76b37a3c823195fbf375a02c4d9506b4dd49d5d2409a"
name = "google.golang.org/grpc"
packages = [
".",
"attributes",
"backoff",
"balancer",
"balancer/base",
"balancer/roundrobin",
"binarylog/grpc_binarylog_v1",
"codes",
"connectivity",
"credentials",
"credentials/internal",
"encoding",
"encoding/proto",
"grpclog",
"internal",
"internal/backoff",
"internal/balancerload",
"internal/binarylog",
"internal/buffer",
"internal/channelz",
"internal/envconfig",
"internal/grpcrand",
"internal/grpcsync",
"internal/resolver/dns",
"internal/resolver/passthrough",
"internal/syscall",
"internal/transport",
"keepalive",
"metadata",
"naming",
"peer",
"resolver",
"serviceconfig",
"stats",
"status",
"tap",
]
pruneopts = ""
revision = "f5b0812e6fe574d90da76b205e9eb51f6ddb1919"
version = "v1.26.0"
[[projects]]
branch = "v1"
digest = "1:bfac5904967a4e939d169f6584184c86a67346d6efa2c02eef110d4d7179ba1f"
name = "gopkg.in/check.v1"
packages = ["."]
pruneopts = ""
revision = "41f04d3bba152ddec2103e299fed053415705330"
[[projects]]
digest = "1:0b15aebd8a84d06f487fddc8a8ffc8be02c23faf1a382b06d3a0c56f32417614"
name = "gopkg.in/go-playground/assert.v1"
packages = ["."]
pruneopts = ""
revision = "4f4dfbc7d1c48336cf93399deae81aa9067e88af"
version = "v1.2.1"
[[projects]]
digest = "1:dd549e360e5a8f982a28c2bcbe667307ceffe538ed9afc7c965524f1ac285b3f"
name = "gopkg.in/go-playground/validator.v8" name = "gopkg.in/go-playground/validator.v8"
packages = ["."] packages = ["."]
pruneopts = ""
revision = "5f1438d3fca68893a817e4a66806cea46a9e4ebf" revision = "5f1438d3fca68893a817e4a66806cea46a9e4ebf"
version = "v8.18.2" version = "v8.18.2"
[[projects]]
digest = "1:a4b477a58cba8512494a4cacd5c1beb61c17ac04599da9910cac40a413686449"
name = "gopkg.in/go-playground/validator.v9"
packages = ["."]
pruneopts = ""
revision = "21c910fc6d9c3556c28252b04beb17de0c2d40ec"
version = "v9.31.0"
[[projects]] [[projects]]
branch = "v2" branch = "v2"
digest = "1:e56755c5336ff37d20befca76df29097085c85ea1fe58af746e3df6b815decfa"
name = "gopkg.in/mgo.v2"
packages = [
"bson",
"internal/json",
]
pruneopts = ""
revision = "a6b53ec6cb22a3699387a57a161566f9402ee85b"
[[projects]]
digest = "1:73e1c6c853e6e6d8aa8f7f04de048430cac006b0c8d1153775304297aca6eea7"
name = "gopkg.in/vmihailenco/msgpack.v2"
packages = [
".",
"codes",
]
pruneopts = ""
revision = "f4f8982de4ef0de18be76456617cc3f5d8d8141e"
version = "v2.9.1"
[[projects]]
digest = "1:5a53f6ef09fb1ac261a97f8a72e8837ff53cbaa969022a6679da210e4cbe9b0f"
name = "gopkg.in/yaml.v2" name = "gopkg.in/yaml.v2"
packages = ["."] packages = ["."]
revision = "eb3733d160e74a9c7e442f435eb3bea458e1d19f" pruneopts = ""
revision = "1f64d6156d11335c3f22d9330b0ad14fc1e789ce"
version = "v2.2.7"
[[projects]]
digest = "1:afc5a2804ec9be0562c937b0c684bbaf5a9c4aef7511677b539c3806be3f4783"
name = "honnef.co/go/tools"
packages = [
"arg",
"cmd/staticcheck",
"config",
"deprecated",
"facts",
"functions",
"go/types/typeutil",
"internal/cache",
"internal/passes/buildssa",
"internal/renameio",
"internal/sharedcheck",
"lint",
"lint/lintdsl",
"lint/lintutil",
"lint/lintutil/format",
"loader",
"printf",
"simple",
"ssa",
"ssautil",
"staticcheck",
"staticcheck/vrp",
"stylecheck",
"unused",
"version",
]
pruneopts = ""
revision = "afd67930eec2a9ed3e9b19f684d17a062285f16a"
version = "2019.2.3"
[solve-meta] [solve-meta]
analyzer-name = "dep" analyzer-name = "dep"
analyzer-version = 1 analyzer-version = 1
inputs-digest = "13743fcc4cbd00e607d2f15ef32adb097b9e3fec858d56d2ffb0d753b998f7ee" input-imports = [
"bitbucket.org/bodhisnarkva/cbor/go",
"cloud.google.com/go/storage",
"github.com/BurntSushi/toml",
"github.com/Sereal/Sereal/Go/sereal",
"github.com/davecgh/go-spew/spew",
"github.com/davecgh/go-spew/spew/testdata",
"github.com/davecgh/go-xdr/xdr2",
"github.com/dchest/uniuri",
"github.com/eclipse/paho.mqtt.golang",
"github.com/eclipse/paho.mqtt.golang/packets",
"github.com/gin-contrib/gzip",
"github.com/gin-gonic/gin",
"github.com/gin-gonic/gin/internal/json",
"github.com/gin-gonic/gin/testdata/protoexample",
"github.com/go-playground/locales",
"github.com/go-playground/locales/currency",
"github.com/go-playground/locales/en",
"github.com/go-playground/locales/en_CA",
"github.com/go-playground/locales/fr",
"github.com/go-playground/locales/id",
"github.com/go-playground/locales/ja",
"github.com/go-playground/locales/nl",
"github.com/go-playground/locales/pt_BR",
"github.com/go-playground/locales/tr",
"github.com/go-playground/locales/zh",
"github.com/go-playground/locales/zh_Hant_TW",
"github.com/go-playground/universal-translator",
"github.com/golang/protobuf/descriptor",
"github.com/golang/protobuf/jsonpb/jsonpb_test_proto",
"github.com/golang/protobuf/proto",
"github.com/golang/protobuf/proto/proto3_proto",
"github.com/golang/protobuf/proto/test_proto",
"github.com/golang/protobuf/protoc-gen-go/descriptor",
"github.com/golang/protobuf/protoc-gen-go/generator",
"github.com/golang/protobuf/protoc-gen-go/generator/internal/remap",
"github.com/golang/protobuf/protoc-gen-go/grpc",
"github.com/golang/protobuf/protoc-gen-go/plugin",
"github.com/golang/protobuf/ptypes",
"github.com/golang/protobuf/ptypes/any",
"github.com/golang/protobuf/ptypes/duration",
"github.com/golang/protobuf/ptypes/struct",
"github.com/golang/protobuf/ptypes/timestamp",
"github.com/golang/protobuf/ptypes/wrappers",
"github.com/google/gofuzz",
"github.com/json-iterator/go",
"github.com/konsorten/go-windows-terminal-sequences",
"github.com/leodido/go-urn",
"github.com/mailru/easyjson",
"github.com/mattn/go-isatty",
"github.com/modern-go/concurrent",
"github.com/modern-go/reflect2",
"github.com/pmezard/go-difflib/difflib",
"github.com/pquerna/ffjson/ffjson",
"github.com/sirupsen/logrus",
"github.com/sirupsen/logrus/hooks/syslog",
"github.com/stretchr/objx",
"github.com/stretchr/testify/assert",
"github.com/stretchr/testify/http",
"github.com/stretchr/testify/mock",
"github.com/stretchr/testify/require",
"github.com/tinylib/msgp/msgp",
"github.com/ugorji/go/codec",
"go.mongodb.org/mongo-driver/bson",
"go4.org/syncutil/singleflight",
"golang.org/x/build/autocertcache",
"golang.org/x/crypto/acme/autocert",
"golang.org/x/crypto/ssh/terminal",
"golang.org/x/net/dns/dnsmessage",
"golang.org/x/net/http/httpguts",
"golang.org/x/net/http/httpproxy",
"golang.org/x/net/http2",
"golang.org/x/net/http2/hpack",
"golang.org/x/net/idna",
"golang.org/x/net/internal/socks",
"golang.org/x/net/internal/sockstest",
"golang.org/x/net/nettest",
"golang.org/x/net/proxy",
"golang.org/x/net/websocket",
"golang.org/x/sys/cpu",
"golang.org/x/sys/unix",
"golang.org/x/sys/windows",
"golang.org/x/sys/windows/registry",
"golang.org/x/sys/windows/svc",
"golang.org/x/sys/windows/svc/debug",
"golang.org/x/sys/windows/svc/eventlog",
"golang.org/x/sys/windows/svc/mgr",
"golang.org/x/text/unicode/cldr",
"golang.org/x/tools/go/packages",
"gopkg.in/check.v1",
"gopkg.in/go-playground/assert.v1",
"gopkg.in/go-playground/validator.v9",
"gopkg.in/mgo.v2/bson",
"gopkg.in/vmihailenco/msgpack.v2",
"gopkg.in/yaml.v2",
]
solver-name = "gps-cdcl" solver-name = "gps-cdcl"
solver-version = 1 solver-version = 1

View File

@@ -20,14 +20,15 @@
# name = "github.com/x/y" # name = "github.com/x/y"
# version = "2.4.0" # version = "2.4.0"
ignored = ["github.com/sirupsen/logrus/internal/testutils"]
[[constraint]] [[constraint]]
name = "github.com/sirupsen/logrus" name = "github.com/sirupsen/logrus"
version = "1.0.3" version = "=1.0.6"
[[constraint]] [[constraint]]
name = "github.com/gin-gonic/gin" name = "github.com/gin-gonic/gin"
version = "1.2.0" version = "=1.4.0"
[[constraint]] [[constraint]]
branch = "master" branch = "master"
@@ -35,15 +36,15 @@
[[constraint]] [[constraint]]
name = "github.com/BurntSushi/toml" name = "github.com/BurntSushi/toml"
version = "0.3.0" version = "=0.3.0"
[[constraint]] [[constraint]]
name = "github.com/eclipse/paho.mqtt.golang" name = "github.com/eclipse/paho.mqtt.golang"
version = "1.1.0" version = "=1.1.0"
[[constraint]] [[constraint]]
name = "github.com/stretchr/testify" name = "github.com/stretchr/testify"
version = "1.1.4" version = "=1.1.4"
[[constraint]] [[constraint]]
branch = "master" branch = "master"

View File

@@ -4,10 +4,10 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/ktt-ol/spaceDevices/conf" "github.com/ktt-ol/spaceDevices/internal/conf"
"github.com/ktt-ol/spaceDevices/db" "github.com/ktt-ol/spaceDevices/internal/db"
"github.com/ktt-ol/spaceDevices/mqtt" "github.com/ktt-ol/spaceDevices/internal/mqtt"
"github.com/ktt-ol/spaceDevices/webService" "github.com/ktt-ol/spaceDevices/internal/webService"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@@ -31,8 +31,9 @@ func main() {
userDb := db.NewUserDb(config.MacDb) userDb := db.NewUserDb(config.MacDb)
masterDb := db.NewMasterDb(config.MacDb) masterDb := db.NewMasterDb(config.MacDb)
mqttHandler := mqtt.NewMqttHandler(config.Mqtt) mqttHandler := mqtt.NewMqttHandler(config.Mqtt, false)
data := mqtt.NewDeviceData(config.Locations, mqttHandler, masterDb, userDb) data := mqtt.NewDeviceData(config.Locations, mqttHandler, masterDb, userDb)
data.ListenAndUpdatePeopleData()
webService.StartWebService(config.Server, data, userDb) webService.StartWebService(config.Server, data, userDb)
} }

View File

@@ -0,0 +1,73 @@
package main
import (
"bufio"
"fmt"
"github.com/ktt-ol/spaceDevices/internal/conf"
"github.com/ktt-ol/spaceDevices/internal/db"
"github.com/ktt-ol/spaceDevices/internal/mqtt"
"os"
"strings"
)
const CONFIG_FILE = "config.toml"
const (
InfoColor = "\033[1;34m%s\033[0m"
NoticeColor = "\033[1;36m%s\033[0m"
WarningColor = "\033[1;33m%s\033[0m"
ErrorColor = "\033[1;31m%s\033[0m"
DebugColor = "\033[0;36m%s\033[0m"
PrintColor = "\033[38;5;%dm%s\033[39;49m\n"
)
func main() {
config := conf.LoadConfig(CONFIG_FILE)
userDb := db.NewUserDb(config.MacDb)
masterDb := db.NewMasterDb(config.MacDb)
mqttHandler := mqtt.NewMqttHandler(config.Mqtt, true)
data := mqtt.NewDeviceData(config.Locations, mqttHandler, masterDb, userDb)
unknownSession := data.GetOneEntry()
macDb := loadMacDb()
for _, s := range unknownSession {
// 5c:51:4f
firstHexBytes := strings.ToUpper(strings.ReplaceAll(s.Mac[0:8], ":", ""))
name, ok := macDb[firstHexBytes]
if !ok {
name = "Unknown"
}
fmt.Printf("%s %s\n", fmt.Sprintf(InfoColor, s.Mac), name)
fmt.Printf("-> %s // %s\n", s.Ipv4, s.Ipv6)
jsonEntry := fmt.Sprintf(`"%s":{"name": "%s", "device-type": "", "visibility": "ignore"},`, s.Mac, name)
fmt.Println(jsonEntry)
fmt.Println("")
}
}
func loadMacDb() map[string]string {
file, err := os.Open("macVendorDb.csv")
check(err)
defer file.Close()
macDb := make(map[string]string)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
assignment := line[0:6]
name := line[7:]
macDb[assignment] = name
}
check(scanner.Err())
return macDb
}
func check(e error) {
if e != nil {
panic(e)
}
}

18
do.sh
View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
usage() { usage() {
echo "Usage $0 (build-linux|test-sync|sync)" echo "Usage $0 (build-linux|docker-image|docker-dep|docker-build|test-sync|sync)"
} }
if [ "$1" == "" ]; then if [ "$1" == "" ]; then
@@ -13,13 +13,23 @@ fi
while (( "$#" )); do while (( "$#" )); do
case "$1" in case "$1" in
build-linux) build-linux)
env GOOS=linux GOARCH=amd64 go build cmd/spaceDevices.go env GOOS=linux GOARCH=amd64 go build cmd/spaceDevices/spaceDevices.go
env GOOS=linux GOARCH=amd64 go build cmd/unkownDevices/listUnkown.go
;;
docker-image)
docker build -t space-devices-build docker/
;;
docker-dep)
docker run --rm -it -v $(pwd):/go/src/github.com/ktt-ol/spaceDevices -u $(id -u):$(id -g) space-devices-build dep ensure -v -vendor-only
;;
docker-build)
docker run --rm -it -v $(pwd):/go/src/github.com/ktt-ol/spaceDevices -u $(id -u):$(id -g) space-devices-build ./do.sh build-linux
;; ;;
test-sync) test-sync)
rsync -n -avzi --delete spaceDevices webUI root@spacegate:/home/status/spaceDevices2/ rsync -n -avzi --delete spaceDevices listUnkown webUI macVendorDb.csv root@spacegate:/home/status/spaceDevices2/
;; ;;
sync) sync)
rsync -avzi --delete spaceDevices webUI root@spacegate:/home/status/spaceDevices2/ rsync -avzi --delete spaceDevices listUnkown webUI macVendorDb.csv root@spacegate:/home/status/spaceDevices2/
;; ;;
*) *)
usage usage

7
docker/Dockerfile Normal file
View File

@@ -0,0 +1,7 @@
FROM golang:1.13
RUN curl -fsSL -o /usr/local/bin/dep https://github.com/golang/dep/releases/download/0.5.2/dep-linux-amd64 && chmod +x /usr/local/bin/dep
RUN mkdir -p /go/src/github.com/ktt-ol/spaceDevices
ENV HOME=/tmp
WORKDIR /go/src/github.com/ktt-ol/spaceDevices

19
docker/README.md Normal file
View File

@@ -0,0 +1,19 @@
# Build with docker
Use the `do.sh` script file in the top directory.
## Build the docker image
```shell script
./do.sh docker-image
```
## Build binary
```shell script
# installs dependencies, only once needed
./do.sh docker-dep
# build the binary
./do.sh docker-build
```

5
extras/README.md Normal file
View File

@@ -0,0 +1,5 @@
# build mac vendor db
1. Download the "MAC Address Block Large" (oui.csv) from here
https://regauth.standards.ieee.org/standards-ra-web/pub/view.html#registries
2. Convert: `./convertOui.py > ../macVendorDb.csv`

12
extras/convertOui.py Executable file
View File

@@ -0,0 +1,12 @@
#!/usr/bin/python3
import csv
with open('oui.csv', newline='') as csvfile:
oui = csv.reader(csvfile, delimiter=',', quotechar='"')
skipFirst = True
for row in oui:
if skipFirst:
skipFirst = False
continue
print('%s,%s' % (row[1], row[2]))

View File

@@ -1,9 +1,9 @@
package conf_test package conf
import ( import (
"testing" "testing"
"github.com/ktt-ol/spaceDevices/conf" "github.com/ktt-ol/spaceDevices/internal/confrnal/conf"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )

View File

@@ -4,7 +4,7 @@ import (
"encoding/json" "encoding/json"
"io/ioutil" "io/ioutil"
"github.com/ktt-ol/spaceDevices/conf" "github.com/ktt-ol/spaceDevices/internal/conf"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@@ -5,7 +5,7 @@ import (
"io/ioutil" "io/ioutil"
"sync" "sync"
"github.com/ktt-ol/spaceDevices/conf" "github.com/ktt-ol/spaceDevices/internal/conf"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@@ -9,6 +9,6 @@ func IsMacLocallyAdministered(mac string) bool {
const mask = 1 << 1 const mask = 1 << 1
first2chars := mac[:2] first2chars := mac[:2]
decimal, _ := strconv.ParseInt(first2chars, 16, 8) decimal, _ := strconv.ParseInt(first2chars, 16, 64)
return (decimal & mask) == mask return (decimal & mask) == mask
} }

View File

@@ -3,13 +3,14 @@ package mqtt
import ( import (
"encoding/json" "encoding/json"
"github.com/ktt-ol/spaceDevices/conf" "github.com/ktt-ol/spaceDevices/internal/conf"
"github.com/ktt-ol/spaceDevices/db" "github.com/ktt-ol/spaceDevices/internal/db"
"github.com/sirupsen/logrus" "bytes"
"crypto/md5" "crypto/md5"
"fmt" "fmt"
"bytes" "github.com/ktt-ol/spaceDevices/pkg/structs"
"github.com/sirupsen/logrus"
"sort" "sort"
"strings" "strings"
) )
@@ -22,7 +23,7 @@ var ddLogger = logrus.WithField("where", "deviceData")
type devicesEntry struct { type devicesEntry struct {
hideName bool hideName bool
showDevices bool showDevices bool
devices []Devices devices []structs.Devices
} }
type DeviceData struct { type DeviceData struct {
@@ -30,7 +31,7 @@ type DeviceData struct {
mqttHandler *MqttHandler mqttHandler *MqttHandler
masterDb db.MasterDb masterDb db.MasterDb
userDb db.UserDb userDb db.UserDb
wifiSessionList []WifiSession wifiSessionList []structs.WifiSession
lastSentHash []byte lastSentHash []byte
@@ -39,15 +40,40 @@ type DeviceData struct {
func NewDeviceData(locations []conf.Location, mqttHandler *MqttHandler, masterDb db.MasterDb, userDb db.UserDb) *DeviceData { func NewDeviceData(locations []conf.Location, mqttHandler *MqttHandler, masterDb db.MasterDb, userDb db.UserDb) *DeviceData {
dd := DeviceData{locations: locations, mqttHandler: mqttHandler, masterDb: masterDb, userDb: userDb} dd := DeviceData{locations: locations, mqttHandler: mqttHandler, masterDb: masterDb, userDb: userDb}
return &dd
}
func (d *DeviceData) ListenAndUpdatePeopleData() {
go func() { go func() {
for { for {
data := <-mqttHandler.GetNewDataChannel() data := <-d.mqttHandler.GetNewDataChannel()
dd.newData(data) d.newData(data)
} }
}() }()
}
return &dd func (d *DeviceData) GetOneEntry() []structs.WifiSession {
data := <-d.mqttHandler.GetNewDataChannel()
sessionsList := d.unmarshal(data)
if sessionsList == nil {
return nil
}
unknownSession := make([]structs.WifiSession, 0, len(sessionsList))
for _, wifiSession := range sessionsList {
_, ok := d.masterDb.Get(wifiSession.Mac)
if ok {
continue
}
_, ok = d.userDb.Get(wifiSession.Mac)
if ok {
continue
}
unknownSession = append(unknownSession, wifiSession)
}
return unknownSession
} }
func (d *DeviceData) newData(data []byte) { func (d *DeviceData) newData(data []byte) {
@@ -74,7 +100,7 @@ func (d *DeviceData) newData(data []byte) {
h := md5.New() h := md5.New()
s := fmt.Sprintf("%v", peopleAndDevices) s := fmt.Sprintf("%v", peopleAndDevices)
hash := h.Sum([]byte(s)) hash := h.Sum([]byte(s))
if bytes.Equal(hash, d.lastSentHash) { if bytes.Equal(hash, d.lastSentHash) {
ddLogger.Debug("Nothing changed in people count, skipping mqtt") ddLogger.Debug("Nothing changed in people count, skipping mqtt")
} else { } else {
d.mqttHandler.SendPeopleAndDevices(peopleAndDevices) d.mqttHandler.SendPeopleAndDevices(peopleAndDevices)
@@ -84,23 +110,47 @@ func (d *DeviceData) newData(data []byte) {
} }
} }
func (d *DeviceData) GetByIp(ip string) (WifiSession, bool) { // finds the session entry for the given ip v4 or v6 address
for _, v := range d.wifiSessionList { func (d *DeviceData) GetByIp(ip string) (structs.WifiSession, bool) {
if v.Ip == ip { if strings.Count(ip, ":") < 2 {
return v, true // v4
for _, v := range d.wifiSessionList {
if v.Ipv4 == ip {
return v, true
}
}
} else {
// v6
for _, v := range d.wifiSessionList {
if len(v.Ipv6) > 0 {
for _, v6 := range v.Ipv6 {
if v6 == ip {
return v, true
}
}
}
} }
} }
return WifiSession{}, false return structs.WifiSession{}, false
} }
func (d *DeviceData) parseWifiSessions(rawData []byte) (sessionsList []WifiSession, peopleAndDevices PeopleAndDevices, success bool) { func (d *DeviceData) unmarshal(rawData []byte) []structs.WifiSession {
var sessionData map[string]WifiSession var sessionData []structs.WifiSession
if err := json.Unmarshal(rawData, &sessionData); err != nil { if err := json.Unmarshal(rawData, &sessionData); err != nil {
ddLogger.WithFields(logrus.Fields{ ddLogger.WithFields(logrus.Fields{
"rawData": string(rawData), "rawData": string(rawData),
"error": err, "error": err,
}).Error("Unable to unmarshal wifi session json.") }).Error("Unable to unmarshal wifi session json.")
return nil
}
return sessionData
}
func (d *DeviceData) parseWifiSessions(rawData []byte) (sessionsList []structs.WifiSession, peopleAndDevices structs.PeopleAndDevices, success bool) {
sessionData := d.unmarshal(rawData)
if sessionData == nil {
return return
} }
@@ -134,7 +184,12 @@ SESSION_LOOP:
username2DevicesMap[userInfo.Name] = entry username2DevicesMap[userInfo.Name] = entry
} }
device := Devices{Name: userInfo.DeviceName, Location: d.findLocation(wifiSession.AP)} location := wifiSession.Location
if len(location) == 0 {
// location attribute not set, resolve the location by the access point id
location = d.findLocation(wifiSession.AP)
}
device := structs.Devices{Name: userInfo.DeviceName, Location: location}
entry.devices = append(entry.devices, device) entry.devices = append(entry.devices, device)
if userInfo.Visibility == db.VisibilityIgnore { if userInfo.Visibility == db.VisibilityIgnore {
@@ -162,22 +217,22 @@ SESSION_LOOP:
} }
} }
peopleAndDevices.People = make([]Person, 0, 10) peopleAndDevices.People = make([]structs.Person, 0, 10)
for username, devicesEntry := range username2DevicesMap { for username, devicesEntry := range username2DevicesMap {
if devicesEntry.hideName { if devicesEntry.hideName {
continue continue
} }
var person Person var person structs.Person
if devicesEntry.showDevices { if devicesEntry.showDevices {
person = Person{Name: username, Devices: devicesEntry.devices} person = structs.Person{Name: username, Devices: devicesEntry.devices}
sort.Sort(DevicesSorter(person.Devices)) sort.Sort(structs.DevicesSorter(person.Devices))
} else { } else {
person = Person{Name: username} person = structs.Person{Name: username}
} }
peopleAndDevices.People = append(peopleAndDevices.People, person) peopleAndDevices.People = append(peopleAndDevices.People, person)
} }
sort.Sort(PersonSorter(peopleAndDevices.People)) sort.Sort(structs.PersonSorter(peopleAndDevices.People))
success = true success = true
return return

View File

@@ -3,124 +3,25 @@ package mqtt
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"strconv"
"testing" "testing"
"github.com/ktt-ol/spaceDevices/conf" "github.com/ktt-ol/spaceDevices/internal/conf"
"github.com/ktt-ol/spaceDevices/db" "github.com/ktt-ol/spaceDevices/internal/db"
"github.com/ktt-ol/spaceDevices/pkg/structs"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func Test_parseWifiSessions(t *testing.T) { func Test_parseWifiSessions(t *testing.T) {
const testData = ` const testData = `
{ [
"38126": { {"ipv4": "192.168.2.127", "ipv6": [], "mac": "2c:0e:3d:aa:aa:aa", "ap": 2, "location": "Space"},
"last-auth": 1509210709, {"ipv4": "192.168.2.179", "ipv6": ["6e7b:c7c6:9517:a9d0:958c:3939:c93e:9864", "e759:68b6:4c7d:8483:81b7:be87:119b:7ee1"], "mac": "10:68:3f:bb:bb:bb", "ap": 1, "location": "Radstelle"},
"vlan": "default", {"ipv4": "192.168.2.35", "ipv6": [ "325c:7fa7:cc79:bcb7:a2b1:26f6:a4ef:2501" ], "mac": "20:c9:d0:cc:cc:cc", "ap": 1, "location": "Space"},
"stats": { {"ipv4": "10.18.159.6", "ipv6": [ ], "mac": "b8:53:ac:dd:dd:dd", "ap": 1, "location": ""}
"rx-multicast-pkts": 499, ]
"rx-unicast-pkts": 1817,
"tx-unicast-pkts": 734,
"rx-unicast-bytes": 156208,
"tx-unicast-bytes": 272461,
"rx-multicast-bytes": 76808
},
"ssid": "mainframe",
"ip": "192.168.2.127",
"hostname": "-",
"last-snr": 40,
"last-rate-mbits": "24",
"ap": 2,
"mac": "2c:0e:3d:aa:aa:aa",
"radio": 2,
"userinfo": null,
"session-start": 1509210709,
"last-rssi-dbm": -55,
"last-activity": 1509211581
},
"38134": {
"last-auth": 1509211121,
"vlan": "default",
"stats": {
"rx-multicast-pkts": 0,
"rx-unicast-pkts": 292,
"tx-unicast-pkts": 654,
"rx-unicast-bytes": 20510,
"tx-unicast-bytes": 278565,
"rx-multicast-bytes": 0
},
"ssid": "mainframe",
"ip": "192.168.2.179",
"hostname": "-",
"last-snr": 47,
"last-rate-mbits": "6",
"ap": 1,
"mac": "10:68:3f:bb:bb:bb",
"radio": 2,
"userinfo": {
"name": "Holger",
"visibility": "show",
"ts": 1427737817755
},
"session-start": 1509211121,
"last-rssi-dbm": -48,
"last-activity": 1509211584
},
"38135": {
"last-auth": 1509211163,
"vlan": "default",
"stats": {
"rx-multicast-pkts": 114,
"rx-unicast-pkts": 8119,
"tx-unicast-pkts": 12440,
"rx-unicast-bytes": 1093407,
"tx-unicast-bytes": 15083985,
"rx-multicast-bytes": 20379
},
"ssid": "mainframe",
"ip": "192.168.2.35",
"hostname": "happle",
"last-snr": 39,
"last-rate-mbits": "24",
"ap": 1,
"mac": "20:c9:d0:cc:cc:cc",
"radio": 2,
"userinfo": {
"name": "Holger",
"visibility": "show",
"ts": 1438474581580
},
"session-start": 1509211163,
"last-rssi-dbm": -56,
"last-activity": 1509211584
},
"38137": {
"last-auth": 1509211199,
"vlan": "FreiFunk",
"stats": {
"rx-multicast-pkts": 14,
"rx-unicast-pkts": 931,
"tx-unicast-pkts": 615,
"rx-unicast-bytes": 70172,
"tx-unicast-bytes": 265390,
"rx-multicast-bytes": 1574
},
"ssid": "nordwest.freifunk.net",
"ip": "10.18.159.6",
"hostname": "iPhonevineSager",
"last-snr": 13,
"last-rate-mbits": "2",
"ap": 1,
"mac": "b8:53:ac:dd:dd:dd",
"radio": 1,
"userinfo": null,
"session-start": 1509211199,
"last-rssi-dbm": -82,
"last-activity": 1509211584
}
}
` `
assert := assert.New(t) assert := assert.New(t)
masterDb := &masterDbTest{} masterDb := &masterDbTest{}
@@ -128,19 +29,27 @@ func Test_parseWifiSessions(t *testing.T) {
dd := DeviceData{masterDb: masterDb, userDb: userDb} dd := DeviceData{masterDb: masterDb, userDb: userDb}
sessions, _, ok := dd.parseWifiSessions([]byte(testData)) sessions, _, ok := dd.parseWifiSessions([]byte(testData))
assert.Equal(len(sessions), 4) assert.Equal(4, len(sessions))
assert.True(ok) assert.True(ok)
mustContain := [4]bool{false, false, false, false} v := findByIp(assert, sessions, "192.168.2.127")
for _, v := range sessions { assert.True(v.Mac == "2c:0e:3d:aa:aa:aa" && v.AP == 2 && v.Location == "Space")
mustContain[0] = mustContain[0] || (v.Ip == "192.168.2.127" && v.Mac == "2c:0e:3d:aa:aa:aa" && v.Vlan == "default" && v.AP == 2) assert.Equal(0, len(v.Ipv6))
mustContain[1] = mustContain[1] || (v.Ip == "192.168.2.179" && v.Mac == "10:68:3f:bb:bb:bb" && v.Vlan == "default" && v.AP == 1)
mustContain[2] = mustContain[2] || (v.Ip == "192.168.2.35" && v.Mac == "20:c9:d0:cc:cc:cc" && v.Vlan == "default" && v.AP == 1) v = findByIp(assert, sessions, "192.168.2.179")
mustContain[3] = mustContain[3] || (v.Ip == "10.18.159.6" && v.Mac == "b8:53:ac:dd:dd:dd" && v.Vlan == "FreiFunk" && v.AP == 1) assert.True(v.Mac == "10:68:3f:bb:bb:bb" && v.AP == 1 && v.Location == "Radstelle")
} assert.Equal(2, len(v.Ipv6))
for _, v := range mustContain { assert.Equal("6e7b:c7c6:9517:a9d0:958c:3939:c93e:9864", v.Ipv6[0])
assert.True(v) assert.Equal("e759:68b6:4c7d:8483:81b7:be87:119b:7ee1", v.Ipv6[1])
}
v = findByIp(assert, sessions, "192.168.2.35")
assert.True(v.Mac == "20:c9:d0:cc:cc:cc" && v.AP == 1)
assert.Equal(1, len(v.Ipv6))
assert.Equal("325c:7fa7:cc79:bcb7:a2b1:26f6:a4ef:2501", v.Ipv6[0])
v = findByIp(assert, sessions, "10.18.159.6")
assert.True(v.Mac == "b8:53:ac:dd:dd:dd" && v.AP == 1 && v.Location == "")
assert.Equal(0, len(v.Ipv6))
// don't fail for garbage // don't fail for garbage
sessions, _, ok = dd.parseWifiSessions([]byte("{ totally invalid json }")) sessions, _, ok = dd.parseWifiSessions([]byte("{ totally invalid json }"))
@@ -148,6 +57,17 @@ func Test_parseWifiSessions(t *testing.T) {
assert.Equal(len(sessions), 0) assert.Equal(len(sessions), 0)
} }
func findByIp(assert *assert.Assertions, sessions []structs.WifiSession, ip string) *structs.WifiSession {
for _, v := range sessions {
if v.Ipv4 == ip {
return &v
}
}
assert.Fail("IP not found", ip)
return nil
}
func Test_peopleCalculation(t *testing.T) { func Test_peopleCalculation(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
masterMap := make(map[string]db.MasterDbEntry) masterMap := make(map[string]db.MasterDbEntry)
@@ -206,7 +126,7 @@ func Test_peopleCalculation(t *testing.T) {
} }
} }
func assertPeopleAndDevices(assert *assert.Assertions, peopleArrayCount int, peopleCount uint, deviceCount uint, unknownDevicesCount uint, test PeopleAndDevices) { func assertPeopleAndDevices(assert *assert.Assertions, peopleArrayCount int, peopleCount uint16, deviceCount uint16, unknownDevicesCount uint16, test structs.PeopleAndDevices) {
assert.Equal(peopleArrayCount, len(test.People), "len(People)") assert.Equal(peopleArrayCount, len(test.People), "len(People)")
assert.Equal(peopleCount, test.PeopleCount, "peopleCount") assert.Equal(peopleCount, test.PeopleCount, "peopleCount")
assert.Equal(deviceCount, test.DeviceCount, "deviceCount") assert.Equal(deviceCount, test.DeviceCount, "deviceCount")
@@ -228,8 +148,9 @@ func Test_peopleNeverNil(t *testing.T) {
/****************************************/ /****************************************/
type sessionTestType struct { type sessionTestType struct {
Vlan string `json:"vlan"` Location string `Json:"location"`
IP string `json:"ip"` Ipv4 string `json:"ipv4"`
Ipv6 []string `json:"ipv6"`
Ap float64 `json:"ap"` Ap float64 `json:"ap"`
Mac string `json:"mac"` Mac string `json:"mac"`
} }
@@ -261,14 +182,14 @@ func (db *masterDbTest) Get(mac string) (db.MasterDbEntry, bool) {
} }
func stt(lastIp string, lastMac string) sessionTestType { func stt(lastIp string, lastMac string) sessionTestType {
return sessionTestType{"vlan", "10.1.1." + lastIp, 1, "00:00:00:00:00:" + lastMac} return sessionTestType{"Space", "10.1.1." + lastIp, make([]string, 0, 0),1, "00:00:00:00:00:" + lastMac}
} }
func newSessionTestData(testData ...sessionTestType) []byte { func newSessionTestData(testData ...sessionTestType) []byte {
sessionData := make(map[string]sessionTestType) sessionData := make([]sessionTestType, 0)
for index, val := range testData { for _, val := range testData {
sessionData[strconv.Itoa(index)] = val sessionData = append(sessionData, val)
} }
bytes, err := json.Marshal(sessionData) bytes, err := json.Marshal(sessionData)

View File

@@ -8,7 +8,8 @@ import (
"time" "time"
"github.com/eclipse/paho.mqtt.golang" "github.com/eclipse/paho.mqtt.golang"
"github.com/ktt-ol/spaceDevices/conf" "github.com/ktt-ol/spaceDevices/internal/conf"
"github.com/ktt-ol/spaceDevices/pkg/structs"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -46,7 +47,7 @@ func EnableMqttDebugLogging() {
mqtt.DEBUG.SetOutput(stdLogWriter) mqtt.DEBUG.SetOutput(stdLogWriter)
} }
func NewMqttHandler(conf conf.MqttConf) *MqttHandler { func NewMqttHandler(conf conf.MqttConf, clientOnly bool) *MqttHandler {
opts := mqtt.NewClientOptions() opts := mqtt.NewClientOptions()
opts.AddBroker(conf.Url) opts.AddBroker(conf.Url)
@@ -65,21 +66,25 @@ func NewMqttHandler(conf conf.MqttConf) *MqttHandler {
opts.SetTLSConfig(tlsConf) opts.SetTLSConfig(tlsConf)
opts.SetClientID(CLIENT_ID + GenerateRandomString(4)) opts.SetClientID(CLIENT_ID + GenerateRandomString(4))
opts.SetAutoReconnect(true) if !clientOnly {
opts.SetKeepAlive(10 * time.Second) opts.SetAutoReconnect(true)
opts.SetMaxReconnectInterval(5 * time.Minute) opts.SetKeepAlive(10 * time.Second)
opts.SetWill(conf.DevicesTopic, emptyPeopleAndDevices(), 0, true) opts.SetMaxReconnectInterval(5 * time.Minute)
opts.SetWill(conf.DevicesTopic, emptyPeopleAndDevices(), 0, true)
}
handler := MqttHandler{newDataChan: make(chan []byte), devicesTopic: conf.DevicesTopic, sessionTopic: conf.SessionTopic} handler := MqttHandler{newDataChan: make(chan []byte), devicesTopic: conf.DevicesTopic, sessionTopic: conf.SessionTopic}
opts.SetOnConnectHandler(handler.onConnect) opts.SetOnConnectHandler(handler.onConnect)
opts.SetConnectionLostHandler(handler.onConnectionLost) if !clientOnly {
opts.SetConnectionLostHandler(handler.onConnectionLost)
}
handler.client = mqtt.NewClient(opts) handler.client = mqtt.NewClient(opts)
if tok := handler.client.Connect(); tok.WaitTimeout(5*time.Second) && tok.Error() != nil { if tok := handler.client.Connect(); tok.WaitTimeout(5*time.Second) && tok.Error() != nil {
mqttLogger.WithError(tok.Error()).Fatal("Could not connect to mqtt server.") mqttLogger.WithError(tok.Error()).Fatal("Could not connect to mqtt server.")
} }
if conf.WatchDogTimeoutInMinutes > 0 { if !clientOnly && conf.WatchDogTimeoutInMinutes > 0 {
mqttLogger.Println("Enable mqtt watch dog, timeout in minutes is", conf.WatchDogTimeoutInMinutes) mqttLogger.Println("Enable mqtt watch dog, timeout in minutes is", conf.WatchDogTimeoutInMinutes)
handler.watchDog = NewWatchDog(time.Duration(conf.WatchDogTimeoutInMinutes) * time.Minute) handler.watchDog = NewWatchDog(time.Duration(conf.WatchDogTimeoutInMinutes) * time.Minute)
} }
@@ -91,7 +96,7 @@ func (h *MqttHandler) GetNewDataChannel() chan []byte {
return h.newDataChan return h.newDataChan
} }
func (h *MqttHandler) SendPeopleAndDevices(data PeopleAndDevices) { func (h *MqttHandler) SendPeopleAndDevices(data structs.PeopleAndDevices) {
bytes, err := json.Marshal(data) bytes, err := json.Marshal(data)
if err != nil { if err != nil {
mqttLogger.Errorln("Invalid people json", err) mqttLogger.Errorln("Invalid people json", err)
@@ -119,6 +124,10 @@ func (h *MqttHandler) onConnect(client mqtt.Client) {
h.watchDog.Ping() h.watchDog.Ping()
} }
/*
[{"ipv4": "192.99.99.99", "ipv6": "", "mac": "18:fe:ab:ab:ab:ab", "ap": 105, "location": "Space"} ]
*/
/* /*
mock := []byte(`{ "38134": { mock := []byte(`{ "38134": {
"last-auth": 1509211121, "last-auth": 1509211121,
@@ -198,7 +207,7 @@ func defaultCertPool(certFile string) *x509.CertPool {
} }
func emptyPeopleAndDevices() string { func emptyPeopleAndDevices() string {
pad := PeopleAndDevices{People: []Person{}} pad := structs.PeopleAndDevices{People: []structs.Person{}}
bytes, err := json.Marshal(pad) bytes, err := json.Marshal(pad)
if err != nil { if err != nil {
mqttLogger.WithError(err).Panic() mqttLogger.WithError(err).Panic()

View File

@@ -8,9 +8,9 @@ import (
"github.com/gin-contrib/gzip" "github.com/gin-contrib/gzip"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/ktt-ol/spaceDevices/conf" "github.com/ktt-ol/spaceDevices/internal/conf"
"github.com/ktt-ol/spaceDevices/db" "github.com/ktt-ol/spaceDevices/internal/db"
"github.com/ktt-ol/spaceDevices/mqtt" "github.com/ktt-ol/spaceDevices/internal/mqtt"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )

View File

@@ -1,14 +1,15 @@
package mqtt package structs
import ( import (
"strings" "strings"
) )
type WifiSession struct { type WifiSession struct {
Ip string Ipv4 string
Mac string Ipv6 []string
Vlan string Mac string
AP int AP int
Location string
} }
type Devices struct { type Devices struct {

View File

@@ -46,7 +46,7 @@
<div class="alert alert-warning"> <div class="alert alert-warning">
Achtung, deine Mac Adresse wird zufällig generiert. Evt. ändert die sich bei jeder Verbindung. Achtung, deine Mac Adresse wird zufällig generiert. Evt. ändert die sich bei jeder Verbindung.
<br> <br>
Bei Windows 10 kann man das ändern, indem du das Netzwerk "Privat" und "Öffentlich" ist. Bei Windows 10 kann man das ändern, indem du das Netzwerk von "Öffentlich" auf "Privat" stellst.
</div> </div>
</div> </div>