diff --git a/CLAUDE.md b/CLAUDE.md index d348d4690d..9c4bfbb3e3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -22,7 +22,7 @@ pyRevit is a Rapid Application Development (RAD) environment for Autodesk Revit. - **Python**: IronPython 2.7.12 (default), CPython 3.12.3, IronPython 3.4.0 - **C#**: .NET Framework 4.8 (Revit 2017-2024), .NET 8.0 (Revit 2025+) -- **Go**: Telemetry server (`dev/pyRevitTelemetryServer/`) +- **Go**: pyRevit autocomplete application (`dev/pyRevitLabs/pyRevitCLIAutoComplete`) - **Build Tools**: Visual Studio 2022, pipenv, MSBuild, Inno Setup ## Build Commands @@ -40,7 +40,6 @@ pipenv run pyrevit build products Debug # Build in Debug mode pipenv run pyrevit build labs # Build main project only pipenv run pyrevit build engines # Build Python engines pipenv run pyrevit build installers # Create Inno Setup installers -pipenv run pyrevit build telem # Build telemetry server # Cleaning pipenv run pyrevit clean labs # Clean build artifacts @@ -63,14 +62,6 @@ pipenv run check-docstrings # Lint docstrings with ruff ## Testing -```bash -# Test telemetry server (requires Docker) -pipenv run pyrevit test telem - -# Python unit tests are in pyrevitlib/pyrevit/unittests/ -# C# unit tests are in dev/pyRevitLabs/pyRevitLabs.UnitTests/ -``` - To test in Revit: ```bash pyrevit clones add dev diff --git a/bin/pyrevit-telemetryserver.exe b/bin/pyrevit-telemetryserver.exe deleted file mode 100644 index 4a613eea5e..0000000000 Binary files a/bin/pyrevit-telemetryserver.exe and /dev/null differ diff --git a/dev/_build.py b/dev/_build.py index 2599f54d0f..164c3db9e4 100644 --- a/dev/_build.py +++ b/dev/_build.py @@ -9,7 +9,6 @@ # import _apidocspy as apidocs # not used by new documentation workflow import _autocomplete as autoc import _labs as labs -import _telem as telem import shutil @@ -38,5 +37,4 @@ def build_binaries(_: Dict[str, str]): labs.build_labs(_) labs.build_engines(_) labs.build_runtime(_) - telem.build_telem(_) autoc.build_autocmp(_) diff --git a/dev/_telem.py b/dev/_telem.py deleted file mode 100644 index ca266be272..0000000000 --- a/dev/_telem.py +++ /dev/null @@ -1,90 +0,0 @@ -"""Configure and start the telemetry server""" -import os -import os.path as op -import signal -import sys -from typing import Dict - -from scripts import configs -from scripts import utils - -import _install as install - - -# TODO: ask docker to setup supported servers -def _ensure_db(_: Dict[str, str]): - pass - - -def _get_test_bin(): - bin_fname = "ts" - if sys.platform == "win32": - bin_fname = "ts.exe" - return op.join(configs.TELEMETRYSERVERPATH, bin_fname) - - -def _handle_break(signum, stack): #pylint: disable=unused-argument - os.remove(_get_test_bin()) - print("\nStopped telemetry test server") - sys.exit(0) - - -def build_telem(args: Dict[str, str]): - """Build pyRevit telemetry server""" - # get telemetry dependencies - # configure git globally for `go get` - utils.system( - [ - "git", - "config", - "--global", - "http.https://pkg.re.followRedirects", - "true", - ] - ) - - print("Updating telemetry server dependencies...") - go_tool = install.get_tool("go") - utils.system( - [go_tool, "get", r"./..."], - cwd=op.abspath(configs.TELEMETRYSERVERPATH), - dump_stdout=True - ) - print("Telemetry server dependencies successfully updated") - - print("Building telemetry server...") - output_bin = ( - args[""] - if "" in args - else op.abspath(configs.TELEMETRYSERVERBIN) - ) - utils.system( - [go_tool, "build", "-o", output_bin, op.abspath(configs.TELEMETRYSERVER)], - cwd=op.abspath(configs.TELEMETRYSERVERPATH), - ) - print("Building telemetry server completed successfully") - - -def start_telem(_: Dict[str, str]): - """Start a telemetry test server""" - # make sure db is available - _ensure_db(_) - - test_bin = _get_test_bin() - # build a server binary for testing - build_telem({"": op.basename(test_bin)}) - - # listen for CTRL+C - signal.signal(signal.SIGINT, _handle_break) - - # run it - utils.system( - [ - test_bin, - "mongodb://pyrevit:pyrevit@localhost:27017/pyrevit", - "--scripts=scripts", - "--events=events", - "--port=8090", - ], - dump_stdout=True - ) diff --git a/dev/pyRevitTelemetryServer/.vscode/settings.json b/dev/pyRevitTelemetryServer/.vscode/settings.json deleted file mode 100644 index 4ec39be75c..0000000000 --- a/dev/pyRevitTelemetryServer/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "cSpell.enabled": false -} \ No newline at end of file diff --git a/dev/pyRevitTelemetryServer/cli/args.go b/dev/pyRevitTelemetryServer/cli/args.go deleted file mode 100644 index f677bf1618..0000000000 --- a/dev/pyRevitTelemetryServer/cli/args.go +++ /dev/null @@ -1,61 +0,0 @@ -package cli - -import ( - "os" - "path/filepath" - "strings" - - "github.com/docopt/docopt-go" -) - -type Options struct { - ExeName string `json:"exe_name"` - Version string `json:"version"` - Opts *docopt.Opts - ConnString string `json:"connection_string"` - ScriptsTable string `json:"script_table"` - EventsTable string `json:"events_table"` - Port int `json:"server_port"` - Https bool `json:"https"` - Debug bool `json:"debug_mode"` - Trace bool `json:"trace_mode"` -} - -func getExeName() string { - return strings.TrimSuffix( - filepath.Base(os.Args[0]), - filepath.Ext(os.Args[0]), - ) -} - -func NewOptions() *Options { - argv := os.Args[1:] - - parser := &docopt.Parser{ - HelpHandler: printHelpAndExit, - } - - opts, _ := parser.ParseArgs(help, argv, version) - - connString, _ := opts.String("") - scriptTable, _ := opts.String("--scripts") - eventTable, _ := opts.String("--events") - port, _ := opts.Int("--port") - https, _ := opts.Bool("--https") - - debug, _ := opts.Bool("--debug") - trace, _ := opts.Bool("--trace") - - return &Options{ - ExeName: getExeName(), - Version: version, - Opts: &opts, - ConnString: connString, - ScriptsTable: scriptTable, - EventsTable: eventTable, - Port: port, - Https: https, - Debug: debug, - Trace: trace, - } -} diff --git a/dev/pyRevitTelemetryServer/cli/logger.go b/dev/pyRevitTelemetryServer/cli/logger.go deleted file mode 100644 index dfab80be40..0000000000 --- a/dev/pyRevitTelemetryServer/cli/logger.go +++ /dev/null @@ -1,39 +0,0 @@ -package cli - -import ( - "log" - - "pkg.re/essentialkaos/ek.v10/fmtc" -) - -type Logger struct { - PrintDebug bool - PrintTrace bool -} - -func NewLogger(options *Options) *Logger { - return &Logger{ - PrintDebug: options.Debug, - PrintTrace: options.Trace, - } -} - -func (m *Logger) Fatal(args ...interface{}) { - log.Fatal(args...) -} - -func (m *Logger) Debug(args ...interface{}) { - if m.PrintDebug { - log.Print(args...) - } -} - -func (m *Logger) Trace(args ...interface{}) { - if m.PrintTrace { - log.Print(args...) - } -} - -func (m *Logger) Print(args ...interface{}) { - fmtc.Println(args...) -} diff --git a/dev/pyRevitTelemetryServer/cli/usage.go b/dev/pyRevitTelemetryServer/cli/usage.go deleted file mode 100644 index 66ff1b5148..0000000000 --- a/dev/pyRevitTelemetryServer/cli/usage.go +++ /dev/null @@ -1,51 +0,0 @@ -package cli - -import ( - "fmt" - "os" -) - -const version string = "0.19" -const help string = `Record pyRevit usage logs to database - -Usage: - pyrevit-telemetryserver [--scripts=] [--events=] --port= [--https] [--debug] [--trace] - -Options: - -h --help show this screen - -V --version show version - --scripts= target table or collection for script logs - --events= target table or collection for app event logs - --port= server port number to listen on - --https secure connection, expects ./pyrevit-telemetryserver.key and ./pyrevit-telemetryserver.crt - --debug print debug info - --trace print trace info e.g. full json logs and sql queries - -Supports: - postgresql: using github.com/lib/pq - mongodb: using gopkg.in/mgo.v2 - mysql: using github.com/go-sql-driver/mysql - sqlserver: using github.com/denisenkom/go-mssqldb - sqlite3: using github.com/mattn/go-sqlite3 - -Examples: - pyrevit-telemetryserver postgres://user:pass@data.mycompany.com/mydb --scripts="pyrevitlogs" --events="appevents" --port=8080 --debug - pyrevit-telemetryserver mongodb://user:pass@localhost:27017/mydb --scripts="pyrevitlogs" --events="appevents" --port=8080 - pyrevit-telemetryserver "mysql:user:pass@tcp(localhost:3306)/tests" --scripts="pyrevitlogs" --port=8080 - pyrevit-telemetryserver sqlserver://user:pass@my-azure-db.database.windows.net?database=mydb --scripts="pyrevitlogs" --port=8080 - pyrevit-telemetryserver sqlite3:data.db --scripts="pyrevitlogs" --port=8080 -` - -var printHelpAndExit = func(err error, docoptMessage string) { - if err != nil { - // if err occured print full help - // docopt only includes usage section in its message - fmt.Fprintln(os.Stderr, help) - os.Exit(1) - } else { - // otherwise print whatever docopt says - // e.g. reporting version - fmt.Println(docoptMessage) - os.Exit(0) - } -} diff --git a/dev/pyRevitTelemetryServer/go.mod b/dev/pyRevitTelemetryServer/go.mod deleted file mode 100644 index 24cbcc5060..0000000000 --- a/dev/pyRevitTelemetryServer/go.mod +++ /dev/null @@ -1,30 +0,0 @@ -module pyrevittelemetryserver - -go 1.24.4 - -require ( - github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 - github.com/denisenkom/go-mssqldb v0.12.3 - github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 - github.com/go-sql-driver/mysql v1.9.3 - github.com/gofrs/uuid v4.4.0+incompatible - github.com/gorilla/mux v1.8.1 - github.com/lib/pq v1.12.1 - github.com/mattn/go-sqlite3 v1.14.38 - github.com/pkg/errors v0.9.1 - github.com/satori/go.uuid v1.2.0 - pkg.re/essentialkaos/ek.v10 v12.32.0+incompatible -) - -require ( - filippo.io/edwards25519 v1.1.1 // indirect - github.com/golang-sql/sqlexp v0.1.0 // indirect -) - -require ( - // Indirect dependencies - github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe // indirect - golang.org/x/crypto v0.45.0 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - pkg.re/essentialkaos/check.v1 v1.0.0 // indirect -) diff --git a/dev/pyRevitTelemetryServer/go.sum b/dev/pyRevitTelemetryServer/go.sum deleted file mode 100644 index 8594e8437f..0000000000 --- a/dev/pyRevitTelemetryServer/go.sum +++ /dev/null @@ -1,75 +0,0 @@ -filippo.io/edwards25519 v1.1.1 h1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw= -filippo.io/edwards25519 v1.1.1/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.12.3 h1:pBSGx9Tq67pBOTLmxNuirNTeB8Vjmf886Kx+8Y+8shw= -github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= -github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= -github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= -github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lib/pq v1.12.1 h1:x1nbl/338GLqeDJ/FAiILallhAsqubLzEZu/pXtHUow= -github.com/lib/pq v1.12.1/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= -github.com/mattn/go-sqlite3 v1.14.8 h1:gDp86IdQsN/xWjIEmr9MF6o9mpksUgh0fu+9ByFxzIU= -github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.38 h1:tDUzL85kMvOrvpCt8P64SbGgVFtJB11GPi2AdmITgb4= -github.com/mattn/go-sqlite3 v1.14.38/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -pkg.re/essentialkaos/check.v1 v1.0.0 h1:2V++mhtm9yHqvW7gtXqcU1D+98vTICGnXmaZloLsZVY= -pkg.re/essentialkaos/check.v1 v1.0.0/go.mod h1:B7CoMnGFRnruw7X2Z45kWNvoCW+5OhUsLUm1EBM1aJs= -pkg.re/essentialkaos/ek.v10 v12.32.0+incompatible h1:MSnAZgf9WxV/kBpmPpD7md3ajOSXrugvbGIqRd9AWTI= -pkg.re/essentialkaos/ek.v10 v12.32.0+incompatible/go.mod h1:QhFbmORYfukHQjR05vj21bPWmCRLYlSy0tNGGCQgGnI= diff --git a/dev/pyRevitTelemetryServer/main.go b/dev/pyRevitTelemetryServer/main.go deleted file mode 100644 index 63e628d7f5..0000000000 --- a/dev/pyRevitTelemetryServer/main.go +++ /dev/null @@ -1,36 +0,0 @@ -package main - -import ( - "fmt" - - "pyrevittelemetryserver/cli" - "pyrevittelemetryserver/persistence" - "pyrevittelemetryserver/server" -) - -func main() { - // process command line arguments - options := cli.NewOptions() - - // log options if requested - logger := cli.NewLogger(options) - logger.Trace(options) - for key, value := range *options.Opts { - logger.Debug(fmt.Sprintf("%s=%v", key, value)) - } - - // check connection string and determine target db driver - dbcfg, cErr := persistence.NewConfig(options) - if cErr != nil { - panic(cErr) - } - - // request a db connection to read and write - dbConn, nErr := persistence.NewConnection(dbcfg) - if nErr != nil { - panic(nErr) - } - - // ask server to start and pass db writer interface - server.Start(options, dbConn, logger) -} diff --git a/dev/pyRevitTelemetryServer/persistence/config.go b/dev/pyRevitTelemetryServer/persistence/config.go deleted file mode 100644 index 6ef8609756..0000000000 --- a/dev/pyRevitTelemetryServer/persistence/config.go +++ /dev/null @@ -1,56 +0,0 @@ -package persistence - -import ( - "strings" - - "pyrevittelemetryserver/cli" - - "github.com/pkg/errors" -) - -type DBBackend string - -const ( - Postgres DBBackend = "postgres" - MongoDB DBBackend = "mongodb" - MySql DBBackend = "mysql" - MSSql DBBackend = "sqlserver" - Sqlite DBBackend = "sqlite3" -) - -type Config struct { - Backend DBBackend `json:"backend"` - ConnString string `json:"connection_string"` - ScriptTarget string `json:"script_target"` - EventTarget string `json:"event_target"` -} - -func NewConfig(options *cli.Options) (*Config, error) { - backend, err := parseUri(options.ConnString) - if err != nil { - return nil, err - } - - return &Config{ - Backend: backend, - ConnString: options.ConnString, - ScriptTarget: options.ScriptsTable, - EventTarget: options.EventsTable, - }, nil -} - -func parseUri(connString string) (DBBackend, error) { - if strings.HasPrefix(connString, "postgres:") { - return Postgres, nil - } else if strings.HasPrefix(connString, "mongodb:") { - return MongoDB, nil - } else if strings.HasPrefix(connString, "mysql:") { - return MySql, nil - } else if strings.HasPrefix(connString, "sqlserver:") { - return MSSql, nil - } else if strings.HasPrefix(connString, "sqlite3:") { - return Sqlite, nil - } else { - return "", errors.New("db is not yet supported") - } -} diff --git a/dev/pyRevitTelemetryServer/persistence/connection.go b/dev/pyRevitTelemetryServer/persistence/connection.go deleted file mode 100644 index dff1ca571c..0000000000 --- a/dev/pyRevitTelemetryServer/persistence/connection.go +++ /dev/null @@ -1,55 +0,0 @@ -package persistence - -import ( - "pyrevittelemetryserver/cli" -) - -type ConnectionStatus struct { - Status string `json:"status"` - Version string `json:"version"` - Output string `json:"output"` -} - -// ErroCodes -// 0: All OK -// 1: No data to write -// 2: data is available but did not get pushed under dry run -// 3: headers are required -type Result struct { - ResultCode int - Message string -} - -type DatabaseConnection struct { - Config *Config `json:"db_configs"` -} - -type Connection interface { - GetType() DBBackend - GetVersion(*cli.Logger) string - GetStatus(*cli.Logger) ConnectionStatus - WriteScriptTelemetryV1(*ScriptTelemetryRecordV1, *cli.Logger) (*Result, error) - WriteScriptTelemetryV2(*ScriptTelemetryRecordV2, *cli.Logger) (*Result, error) - WriteEventTelemetryV2(*EventTelemetryRecordV2, *cli.Logger) (*Result, error) - // Read([]ScriptTelemetryRecord, *cli.Logger) (*Result, error) -} - -func NewConnection(dbcfg *Config) (Connection, error) { - w := DatabaseConnection{ - Config: dbcfg, - } - if dbcfg.Backend == Postgres { - return GenericSQLConnection{w}, nil - } else if dbcfg.Backend == MongoDB { - return MongoDBConnection{w}, nil - } else if dbcfg.Backend == MySql { - return GenericSQLConnection{w}, nil - } else if dbcfg.Backend == MSSql { - return GenericSQLConnection{w}, nil - } else if dbcfg.Backend == Sqlite { - return GenericSQLConnection{w}, nil - } - // ... other writers - - panic("should not get here") -} diff --git a/dev/pyRevitTelemetryServer/persistence/genericsql.go b/dev/pyRevitTelemetryServer/persistence/genericsql.go deleted file mode 100644 index 906ce559f7..0000000000 --- a/dev/pyRevitTelemetryServer/persistence/genericsql.go +++ /dev/null @@ -1,328 +0,0 @@ -package persistence - -import ( - "database/sql" - "encoding/json" - "fmt" - "log" - "regexp" - "strconv" - "strings" - - "pyrevittelemetryserver/cli" - - _ "github.com/denisenkom/go-mssqldb" - _ "github.com/go-sql-driver/mysql" - _ "github.com/lib/pq" - _ "github.com/mattn/go-sqlite3" - - uuid "github.com/satori/go.uuid" -) - -type GenericSQLConnection struct { - DatabaseConnection -} - -func (w GenericSQLConnection) GetType() DBBackend { - return w.Config.Backend -} - -func (w GenericSQLConnection) GetVersion(logger *cli.Logger) string { - db, err := openConnection(w.Config.Backend, w.Config.ConnString, logger) - if err != nil { - logger.Debug("error opening connection") - return "" - } - defer db.Close() - - var version string - err = db.QueryRow("select version()").Scan(&version) - if err != nil { - err = db.QueryRow("select @@version").Scan(&version) - if err != nil { - log.Fatal(err) - } - } - return version -} - -func (w GenericSQLConnection) GetStatus(logger *cli.Logger) ConnectionStatus { - return ConnectionStatus{ - Status: "pass", - Version: w.GetVersion(logger), - } -} - -func (w GenericSQLConnection) WriteScriptTelemetryV1(logrec *ScriptTelemetryRecordV1, logger *cli.Logger) (*Result, error) { - // generate generic sql insert query - logger.Debug("generating query") - query, qErr := generateScriptInsertQueryV1(w.Config.ScriptTarget, logrec, logger) - if qErr != nil { - return nil, qErr - } - - return commitSQL(w.Config.Backend, w.Config.ConnString, query, logger) -} - -func (w GenericSQLConnection) WriteScriptTelemetryV2(logrec *ScriptTelemetryRecordV2, logger *cli.Logger) (*Result, error) { - // generate generic sql insert query - logger.Debug("generating query") - query, qErr := generateScriptInsertQueryV2(w.Config.ScriptTarget, logrec, logger) - if qErr != nil { - return nil, qErr - } - - return commitSQL(w.Config.Backend, w.Config.ConnString, query, logger) -} - -func (w GenericSQLConnection) WriteEventTelemetryV2(logrec *EventTelemetryRecordV2, logger *cli.Logger) (*Result, error) { - // generate generic sql insert query - logger.Debug("generating query") - query, qErr := generateEventInsertQueryV2(w.Config.EventTarget, logrec, logger) - if qErr != nil { - return nil, qErr - } - - return commitSQL(w.Config.Backend, w.Config.ConnString, query, logger) -} - -func commitSQL(backend DBBackend, connStr string, query string, logger *cli.Logger) (*Result, error) { - // open connection - db, err := openConnection(backend, connStr, logger) - if err != nil { - logger.Debug("error opening connection") - return nil, err - } - defer db.Close() - - // start transaction - logger.Debug("opening transaction") - tx, beginErr := db.Begin() - if beginErr != nil { - logger.Debug("error opening transaction") - return nil, beginErr - } - defer tx.Rollback() - - // run the insert query - logger.Debug("executing insert query") - _, eErr := db.Exec(query) - if eErr != nil { - return nil, eErr - } - - // commit transaction - logger.Debug("commiting transaction") - txnErr := tx.Commit() - if txnErr != nil { - return nil, txnErr - } - - logger.Debug("preparing report") - return &Result{ - Message: "successfully inserted usage record", - }, nil -} - -func openConnection(backend DBBackend, connStr string, logger *cli.Logger) (*sql.DB, error) { - // open connection - logger.Debug(fmt.Sprintf("opening %s connection", backend)) - cleanConnStr := connStr - if backend == Sqlite || backend == MySql { - cleanConnStr = strings.Replace(connStr, string(backend)+":", "", 1) - } - return sql.Open(string(backend), cleanConnStr) -} - -func generateScriptInsertQueryV1(table string, logrec *ScriptTelemetryRecordV1, logger *cli.Logger) (string, error) { - // read csv file and build sql insert query - var querystr strings.Builder - - logger.Debug("generating insert query with-out headers") - querystr.WriteString(fmt.Sprintf("INSERT INTO %s values ", table)) - - // build sql data info - logger.Debug("building insert query for data") - datalines := make([]string, 0) - - cresults, merr := json.Marshal(logrec.CommandResults) - if merr != nil { - logger.Debug("error logging command results") - } - - // create record based on schema - var record []string - - // generate record id, panic if error - recordId := uuid.NewV4() - - re := regexp.MustCompile(`(\d+:\d+:\d+)`) - record = []string{ - recordId.String(), - logrec.Date, - re.FindString(logrec.Time), - logrec.UserName, - logrec.RevitVersion, - logrec.RevitBuild, - logrec.SessionId, - logrec.PyRevitVersion, - strconv.FormatBool(logrec.IsDebugMode), - strconv.FormatBool(logrec.IsConfigMode), - logrec.CommandName, - logrec.BundleName, - logrec.ExtensionName, - logrec.CommandUniqueName, - strconv.Itoa(logrec.ResultCode), - string(cresults), - logrec.ScriptPath, - logrec.TraceInfo.EngineInfo.Version, - logrec.TraceInfo.IronPythonTraceDump, - logrec.TraceInfo.CLRTraceDump, - } - - datalines = append(datalines, ToSql(&record, true)) - - // add csv records to query string - all_datalines := strings.Join(datalines, ", ") - logger.Trace(all_datalines) - querystr.WriteString(all_datalines) - querystr.WriteString(";\n") - logger.Debug("building query completed") - - // execute query - full_query := querystr.String() - logger.Trace(full_query) - return full_query, nil -} - -func generateScriptInsertQueryV2(table string, logrec *ScriptTelemetryRecordV2, logger *cli.Logger) (string, error) { - // read csv file and build sql insert query - var querystr strings.Builder - - logger.Debug("generating insert query with-out headers") - querystr.WriteString(fmt.Sprintf("INSERT INTO %s values ", table)) - - // build sql data info - logger.Debug("building insert query for data") - datalines := make([]string, 0) - - // marshal json data - engineCfgs, merr := json.Marshal(logrec.TraceInfo.EngineInfo.Configs) - if merr != nil { - logger.Debug("error logging engine configs") - } - - // marshal json data - cresults, merr := json.Marshal(logrec.CommandResults) - if merr != nil { - logger.Debug("error logging command results") - } - - // create record based on schema - var record []string - - // generate record id, panic if error - recordId := uuid.NewV4() - - record = []string{ - recordId.String(), - logrec.TimeStamp, - logrec.UserName, - logrec.HostUserName, - logrec.RevitVersion, - logrec.RevitBuild, - logrec.SessionId, - logrec.PyRevitVersion, - logrec.Clone, - strconv.FormatBool(logrec.IsDebugMode), - strconv.FormatBool(logrec.IsConfigMode), - strconv.FormatBool(logrec.IsExecFromGUI), - logrec.ExecId, - logrec.ExecTimeStamp, - logrec.CommandName, - logrec.BundleName, - logrec.ExtensionName, - logrec.CommandUniqueName, - logrec.DocumentName, - logrec.DocumentPath, - strconv.Itoa(logrec.ResultCode), - string(cresults), - logrec.ScriptPath, - logrec.TraceInfo.EngineInfo.Type, - logrec.TraceInfo.EngineInfo.Version, - strings.Join(logrec.TraceInfo.EngineInfo.SysPaths, ";"), - string(engineCfgs), - logrec.TraceInfo.Message, - } - datalines = append(datalines, ToSql(&record, true)) - - // add csv records to query string - all_datalines := strings.Join(datalines, ", ") - logger.Trace(all_datalines) - querystr.WriteString(all_datalines) - querystr.WriteString(";\n") - logger.Debug("building query completed") - - // execute query - full_query := querystr.String() - logger.Trace(full_query) - return full_query, nil -} - -func generateEventInsertQueryV2(table string, logrec *EventTelemetryRecordV2, logger *cli.Logger) (string, error) { - // read csv file and build sql insert query - var querystr strings.Builder - - logger.Debug("generating insert query with-out headers") - querystr.WriteString(fmt.Sprintf("INSERT INTO %s values ", table)) - - // build sql data info - logger.Debug("building insert query for data") - datalines := make([]string, 0) - - // marshal json data - cresults, merr := json.Marshal(logrec.EventArgs) - if merr != nil { - logger.Debug("error logging command results") - } - - // create record based on schema - var record []string - - // generate record id, panic if error - recordId := uuid.NewV4() - - record = []string{ - recordId.String(), - logrec.TimeStamp, - logrec.HandlerId, - logrec.EventType, - string(cresults), - logrec.UserName, - logrec.HostUserName, - logrec.RevitVersion, - logrec.RevitBuild, - strconv.FormatBool(logrec.Cancellable), - strconv.FormatBool(logrec.Cancelled), - strconv.Itoa(logrec.DocumentId), - logrec.DocumentType, - logrec.DocumentTemplate, - logrec.DocumentName, - logrec.DocumentPath, - logrec.ProjectNumber, - logrec.ProjectName, - } - datalines = append(datalines, ToSql(&record, true)) - - // add csv records to query string - all_datalines := strings.Join(datalines, ", ") - logger.Trace(all_datalines) - querystr.WriteString(all_datalines) - querystr.WriteString(";\n") - logger.Debug("building query completed") - - // execute query - full_query := querystr.String() - logger.Trace(full_query) - return full_query, nil -} diff --git a/dev/pyRevitTelemetryServer/persistence/models.go b/dev/pyRevitTelemetryServer/persistence/models.go deleted file mode 100644 index 0cc6a0cf6c..0000000000 --- a/dev/pyRevitTelemetryServer/persistence/models.go +++ /dev/null @@ -1,208 +0,0 @@ -package persistence - -import ( - "fmt" - - "pyrevittelemetryserver/cli" - - "github.com/asaskevich/govalidator" -) - -// v1.0 -type EngineInfoV1 struct { - Version string `json:"version" bson:"version" valid:"-"` - SysPaths []string `json:"syspath" bson:"syspath" valid:"-"` -} - -type TraceInfoV1 struct { - EngineInfo EngineInfoV1 `json:"engine" bson:"engine" valid:"-"` - IronPythonTraceDump string `json:"ipy" bson:"ipy" valid:"-"` - CLRTraceDump string `json:"clr" bson:"clr" valid:"-"` -} - -type ScriptTelemetryRecordV1 struct { - Date string `json:"date" bson:"date" valid:"-"` - Time string `json:"time" bson:"time" valid:"-"` - UserName string `json:"username" bson:"username" valid:"-"` - RevitVersion string `json:"revit" bson:"revit" valid:"numeric~Invalid revit version"` - RevitBuild string `json:"revitbuild" bson:"revitbuild" valid:"matches(\\d{8}_\\d{4}\\(x\\d{2}\\))~Invalid revit build number"` - SessionId string `json:"sessionid" bson:"sessionid" valid:"uuidv4~Invalid session id"` - PyRevitVersion string `json:"pyrevit" bson:"pyrevit" valid:"-"` - IsDebugMode bool `json:"debug" bson:"debug"` - IsConfigMode bool `json:"config" bson:"config"` - CommandName string `json:"commandname" bson:"commandname" valid:"-"` - CommandUniqueName string `json:"commanduniquename" bson:"commanduniquename" valid:"-"` - BundleName string `json:"commandbundle" bson:"commandbundle" valid:"-"` - ExtensionName string `json:"commandextension" bson:"commandextension" valid:"-"` - ResultCode int `json:"resultcode" bson:"resultcode" valid:"numeric~Invalid result code"` - CommandResults map[string]string `json:"commandresults" bson:"commandresults" valid:"-"` - ScriptPath string `json:"scriptpath" bson:"scriptpath" valid:"-"` - TraceInfo TraceInfoV1 `json:"trace" bson:"trace"` -} - -func (logrec ScriptTelemetryRecordV1) PrintRecordInfo(logger *cli.Logger, message string) { - logger.Print(fmt.Sprintf( - "%s %s-%s %q @ %s:%s [%s.%s] code=%d info=%v", - message, - logrec.Date, - logrec.Time, - logrec.UserName, - logrec.RevitBuild, - logrec.TraceInfo.EngineInfo.Version, - logrec.ExtensionName, - logrec.CommandName, - logrec.ResultCode, - logrec.CommandResults, - )) -} - -func (logrec ScriptTelemetryRecordV1) Validate() error { - // govalidator.SetFieldsRequiredByDefault(true) - - // validate now - _, err := govalidator.ValidateStruct(logrec) - return err -} - -// v2.0 -type EngineInfoV2 struct { - Type string `json:"type" bson:"type" valid:"engine~Invalid executor engine type"` - Version string `json:"version" bson:"version" valid:"-"` - SysPaths []string `json:"syspath" bson:"syspath" valid:"-"` - Configs map[string]interface{} `json:"configs" bson:"configs" valid:"-"` -} - -type TraceInfoV2 struct { - EngineInfo EngineInfoV2 `json:"engine" bson:"engine"` - Message string `json:"message" bson:"message" valid:"-"` -} - -type RecordMetaV2 struct { - SchemaVersion string `json:"schema" bson:"schema" valid:"schema~Invalid schema version"` -} - -type ScriptTelemetryRecordV2 struct { - RecordMeta RecordMetaV2 `json:"meta" bson:"meta"` - TimeStamp string `json:"timestamp" bson:"timestamp" valid:"rfc3339~Invalid timestamp"` - UserName string `json:"username" bson:"username" valid:"-"` - HostUserName string `json:"host_user" bson:"host_user" valid:"-"` - RevitVersion string `json:"revit" bson:"revit" valid:"numeric~Invalid revit version"` - RevitBuild string `json:"revitbuild" bson:"revitbuild" valid:"matches(\\d{8}_\\d{4}\\(x\\d{2}\\))~Invalid revit build number"` - SessionId string `json:"sessionid" bson:"sessionid" valid:"uuidv4~Invalid session id"` - PyRevitVersion string `json:"pyrevit" bson:"pyrevit" valid:"-"` - Clone string `json:"clone" bson:"clone" valid:"-"` - IsDebugMode bool `json:"debug" bson:"debug"` - IsConfigMode bool `json:"config" bson:"config"` - IsExecFromGUI bool `json:"from_gui" bson:"from_gui"` - ExecId string `json:"exec_id" bson:"exec_id" valid:"-"` - ExecTimeStamp string `json:"exec_timestamp" bson:"exec_timestamp" valid:"-"` - CommandName string `json:"commandname" bson:"commandname" valid:"-"` - CommandUniqueName string `json:"commanduniquename" bson:"commanduniquename" valid:"-"` - BundleName string `json:"commandbundle" bson:"commandbundle" valid:"-"` - ExtensionName string `json:"commandextension" bson:"commandextension" valid:"-"` - DocumentName string `json:"docname" bson:"docname" valid:"-"` - DocumentPath string `json:"docpath" bson:"docpath" valid:"-"` - ResultCode int `json:"resultcode" bson:"resultcode" valid:"numeric~Invalid result code"` - CommandResults map[string]interface{} `json:"commandresults" bson:"commandresults" valid:"-"` - ScriptPath string `json:"scriptpath" bson:"scriptpath" valid:"-"` - TraceInfo TraceInfoV2 `json:"trace" bson:"trace"` -} - -func (logrec ScriptTelemetryRecordV2) PrintRecordInfo(logger *cli.Logger, message string) { - logger.Print(fmt.Sprintf( - "%s %s %q %s:%s (%s) [%s.%s] code=%d info=%v", - message, - logrec.TimeStamp, - logrec.UserName, - logrec.RevitBuild, - logrec.TraceInfo.EngineInfo.Version, - logrec.TraceInfo.EngineInfo.Type, - logrec.ExtensionName, - logrec.CommandName, - logrec.ResultCode, - logrec.CommandResults, - )) -} - -func (logrec ScriptTelemetryRecordV2) Validate() error { - // govalidator.SetFieldsRequiredByDefault(true) - - // custom validators - govalidator.TagMap["schema"] = govalidator.Validator(func(str string) bool { - return str == "2.0" - }) - - govalidator.TagMap["engine"] = govalidator.Validator(func(str string) bool { - switch str { - case - "unknown", - "ironpython", - "cpython", - "csharp", - "invoke", - "visualbasic", - "ironruby", - "dynamobim", - "grasshopper", - "content", - "hyperlink": - return true - } - return false - }) - - // validate now - _, err := govalidator.ValidateStruct(logrec) - return err -} - -// introduced with api v2 -type EventTelemetryRecordV2 struct { - RecordMeta RecordMetaV2 `json:"meta" bson:"meta"` - TimeStamp string `json:"timestamp" bson:"timestamp" valid:"rfc3339~Invalid timestamp"` - HandlerId string `json:"handler_id" bson:"handler_id" valid:"-"` - EventType string `json:"type" bson:"type" valid:"-"` - EventArgs map[string]interface{} `json:"args" bson:"args" valid:"-"` - UserName string `json:"username" bson:"username" valid:"-"` - HostUserName string `json:"host_user" bson:"host_user" valid:"-"` - RevitVersion string `json:"revit" bson:"revit" valid:"numeric~Invalid revit version"` - RevitBuild string `json:"revitbuild" bson:"revitbuild" valid:"matches(\\d{8}_\\d{4}\\(x\\d{2}\\))~Invalid revit build number"` - - // general - Cancellable bool `json:"cancellable" bson:"cancellable"` - Cancelled bool `json:"cancelled" bson:"cancelled"` - DocumentId int `json:"docid" bson:"docid" valid:"-"` - DocumentType string `json:"doctype" bson:"doctype" valid:"-"` - DocumentTemplate string `json:"doctemplate" bson:"doctemplate" valid:"-"` - DocumentName string `json:"docname" bson:"docname" valid:"-"` - DocumentPath string `json:"docpath" bson:"docpath" valid:"-"` - ProjectNumber string `json:"projectnum" bson:"projectnum" valid:"-"` - ProjectName string `json:"projectname" bson:"projectname" valid:"-"` -} - -func (logrec EventTelemetryRecordV2) PrintRecordInfo(logger *cli.Logger, message string) { - if logrec.RecordMeta.SchemaVersion == "2.0" { - logger.Print(fmt.Sprintf( - "%s %s [%s] %q @ %s doc=%q @ %s", - message, - logrec.TimeStamp, - logrec.EventType, - logrec.HostUserName, - logrec.RevitBuild, - logrec.DocumentName, - logrec.DocumentPath, - )) - } -} - -func (logrec EventTelemetryRecordV2) Validate() error { - // govalidator.SetFieldsRequiredByDefault(true) - - // custom validators - govalidator.TagMap["schema"] = govalidator.Validator(func(str string) bool { - return str == "2.0" - }) - - _, err := govalidator.ValidateStruct(logrec) - return err -} diff --git a/dev/pyRevitTelemetryServer/persistence/mongo.go b/dev/pyRevitTelemetryServer/persistence/mongo.go deleted file mode 100644 index 195ec120bf..0000000000 --- a/dev/pyRevitTelemetryServer/persistence/mongo.go +++ /dev/null @@ -1,132 +0,0 @@ -package persistence - -import ( - "context" - "fmt" - "pyrevittelemetryserver/cli" - "time" - - _ "github.com/lib/pq" - // "go.mongodb.org/mongo-driver/bson" - // "go.mongodb.org/mongo-driver/mongo" - // "go.mongodb.org/mongo-driver/mongo/options" - // "go.mongodb.org/mongo-driver/mongo/readpref" - // "go.mongodb.org/mongo-driver/x/mongo/driver/connstring" -) - -type MongoDBConnection struct { - DatabaseConnection -} - -func (w MongoDBConnection) GetType() DBBackend { - return w.Config.Backend -} - -func (w MongoDBConnection) GetVersion(logger *cli.Logger) string { - // parse and grab database name from uri - logger.Debug("grabbing db name from connection string") - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - logger.Debug("opening mongodb session") - client, err := mongo.Connect(ctx, options.Client().ApplyURI(w.Config.ConnString)) - - defer func() { - if err = client.Disconnect(ctx); err != nil { - panic(err) - } - }() - - ctx, cancel = context.WithTimeout(context.Background(), 2*time.Second) - defer cancel() - pErr := client.Ping(ctx, readpref.Primary()) - - if pErr != nil { - return "" - } - - // get version from admin DB - // is this the best way of doing this? - logger.Debug("getting mongodb version") - var commandResult bson.M - command := bson.D{{"buildInfo", 1}} - vErr := client.Database("admin").RunCommand(ctx, command).Decode(&commandResult) - - if vErr != nil { - return "" - } - - // parse version field to get version information - ver := fmt.Sprintf("%+v", commandResult["version"]) - return ver -} - -func (w MongoDBConnection) GetStatus(logger *cli.Logger) ConnectionStatus { - return ConnectionStatus{ - Status: "pass", - Version: w.GetVersion(logger), - } -} - -func (w MongoDBConnection) WriteScriptTelemetryV1(logrec *ScriptTelemetryRecordV1, logger *cli.Logger) (*Result, error) { - return commitMongo(w.Config.ConnString, w.Config.ScriptTarget, logrec, logger) -} - -func (w MongoDBConnection) WriteScriptTelemetryV2(logrec *ScriptTelemetryRecordV2, logger *cli.Logger) (*Result, error) { - return commitMongo(w.Config.ConnString, w.Config.ScriptTarget, logrec, logger) -} - -func (w MongoDBConnection) WriteEventTelemetryV2(logrec *EventTelemetryRecordV2, logger *cli.Logger) (*Result, error) { - return commitMongo(w.Config.ConnString, w.Config.EventTarget, logrec, logger) -} - -func commitMongo(connStr string, targetCollection string, logrec interface{}, logger *cli.Logger) (*Result, error) { - // parse and grab database name from uri - logger.Debug("check connection string") - connStringInfo, err := connstring.ParseAndValidate(connStr) - - if err != nil { - return nil, err - } - - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - logger.Debug("opening mongodb session using connection string") - client, err := mongo.Connect(ctx, options.Client().ApplyURI(connStr)) - - if err != nil { - return nil, err - } - - logger.Trace(client) - - logger.Debug("getting target collection") - // db := session.DB(dialinfo.Database) - db := client.Database(connStringInfo.Database) - // c := db.C(targetCollection) - c := db.Collection(targetCollection) - logger.Trace(c) - - logger.Debug("opening bulk operation") - // bulkop := c.Bulk() - - // build sql data info - logger.Debug("building documents") - - iCtx, cancel := context.WithTimeout(context.Background(), 2*time.Second) - defer cancel() - - logger.Debug("inserting new document") - _, txnErr := c.InsertOne(iCtx, logrec) - - if txnErr != nil { - return nil, txnErr - } - - // compact collection if requested - logger.Debug("preparing report") - return &Result{ - Message: "successfully inserted usage document", - }, nil -} diff --git a/dev/pyRevitTelemetryServer/persistence/utils.go b/dev/pyRevitTelemetryServer/persistence/utils.go deleted file mode 100644 index d460268a87..0000000000 --- a/dev/pyRevitTelemetryServer/persistence/utils.go +++ /dev/null @@ -1,35 +0,0 @@ -package persistence - -import ( - "fmt" - "strings" -) - -func ToSql(values *[]string, wrap bool) string { - // wrap values in '' first - cleanedValues := make([]string, 0) - valueFormat := "%s" - if wrap { - for _, value := range *values { - if value != "" { - cleanedValues = append( - cleanedValues, - fmt.Sprintf("'%s'", strings.Replace(value, "'", "''", -1))) - } else { - cleanedValues = append(cleanedValues, "NULL") - } - } - } else { - for _, value := range *values { - cleanedValues = append( - cleanedValues, - fmt.Sprintf(valueFormat, value)) - } - } - // create the (,,,) sql value list - return fmt.Sprintf("(%s)", strings.Join(cleanedValues, ", ")) -} - -func ToMap(fields, values *[]string) map[string]string { - return make(map[string]string) -} diff --git a/dev/pyRevitTelemetryServer/server/events.go b/dev/pyRevitTelemetryServer/server/events.go deleted file mode 100644 index 141818393b..0000000000 --- a/dev/pyRevitTelemetryServer/server/events.go +++ /dev/null @@ -1,74 +0,0 @@ -package server - -import ( - "encoding/json" - "fmt" - "net/http" - - "pyrevittelemetryserver/cli" - "pyrevittelemetryserver/persistence" - - "github.com/gorilla/mux" -) - -func dumpEventAndRespond(logrec interface{}, w http.ResponseWriter, logger *cli.Logger) { - // dump the telemetry record json data if requested - jsonData, responseDataErr := json.Marshal(logrec) - if responseDataErr == nil { - jsonString := string(jsonData) - if logger.PrintTrace { - logger.Trace(jsonString) - } - - // write response - w.Header().Set("Content-Type", "application/json") - _, responseErr := w.Write([]byte(jsonString)) - if responseErr != nil { - logger.Debug(responseErr) - } - } else { - logger.Debug(responseDataErr) - } -} - -func RouteEvents(router *mux.Router, opts *cli.Options, dbConn persistence.Connection, logger *cli.Logger) { - // POST events/ - // create new script telemetry record - // https://stackoverflow.com/a/26212073 - router.HandleFunc("/api/v2/events/", func(w http.ResponseWriter, r *http.Request) { - // parse given json data into a new record - logrec := persistence.EventTelemetryRecordV2{} - decodeErr := json.NewDecoder(r.Body).Decode(&logrec) - if decodeErr != nil { - logger.Debug(decodeErr) - return - } - - err := logrec.Validate() - if err != nil { - // log error - logrec.PrintRecordInfo(logger, fmt.Sprintf("[ {r}%s{!} ]", err.Error())) - // respond with error - w.WriteHeader(http.StatusBadRequest) - respondError(err, w, logger) - } else { - // now write to db - _, dbWriteErr := dbConn.WriteEventTelemetryV2(&logrec, logger) - if dbWriteErr != nil { - logger.Debug(dbWriteErr) - logrec.PrintRecordInfo(logger, fmt.Sprintf("[ {r}%s{!} ]", dbWriteErr)) - } else { - logrec.PrintRecordInfo(logger, OkMessage) - } - // respond with the created data - dumpEventAndRespond(logrec, w, logger) - } - - }).Methods("POST") - - // GET events/ - // get recorded telemetry record - router.HandleFunc("/api/v2/events/", func(w http.ResponseWriter, r *http.Request) { - - }).Methods("GET") -} diff --git a/dev/pyRevitTelemetryServer/server/scripts.go b/dev/pyRevitTelemetryServer/server/scripts.go deleted file mode 100644 index d7d0c02844..0000000000 --- a/dev/pyRevitTelemetryServer/server/scripts.go +++ /dev/null @@ -1,120 +0,0 @@ -package server - -import ( - "encoding/json" - "fmt" - "net/http" - - "pyrevittelemetryserver/cli" - "pyrevittelemetryserver/persistence" - - "github.com/gorilla/mux" -) - -func respondError(err error, w http.ResponseWriter, logger *cli.Logger) { - // write response - message := err.Error() - logger.Debug("vaidation error: ", message) - _, responseErr := w.Write([]byte(message)) - if responseErr != nil { - logger.Debug(responseErr) - } -} - -func dumpScriptAndRespond(logrec interface{}, w http.ResponseWriter, logger *cli.Logger) { - // dump the telemetry record json data if requested - jsonData, responseDataErr := json.Marshal(logrec) - if responseDataErr == nil { - jsonString := string(jsonData) - if logger.PrintTrace { - logger.Trace(jsonString) - } - - // write response - w.Header().Set("Content-Type", "application/json") - _, responseErr := w.Write([]byte(jsonString)) - if responseErr != nil { - logger.Debug(responseErr) - } - } else { - logger.Debug(responseDataErr) - } -} - -func RouteScripts(router *mux.Router, opts *cli.Options, dbConn persistence.Connection, logger *cli.Logger) { - // POST scripts/ - // create new script telemetry record - // https://stackoverflow.com/a/26212073 - router.HandleFunc("/api/v1/scripts/", func(w http.ResponseWriter, r *http.Request) { - // parse given json data into a new record - logrec := persistence.ScriptTelemetryRecordV1{} - decodeErr := json.NewDecoder(r.Body).Decode(&logrec) - if decodeErr != nil { - logger.Debug(decodeErr) - return - } - - err := logrec.Validate() - if err != nil { - // log error - logrec.PrintRecordInfo(logger, fmt.Sprintf("[ {r}%s{!} ]", err.Error())) - // respond with error - w.WriteHeader(http.StatusBadRequest) - respondError(err, w, logger) - } else { - // now write to db - _, dbWriteErr := dbConn.WriteScriptTelemetryV1(&logrec, logger) - if dbWriteErr != nil { - logger.Debug(dbWriteErr) - logrec.PrintRecordInfo(logger, fmt.Sprintf("[ {r}%s{!} ]", dbWriteErr)) - } else { - logrec.PrintRecordInfo(logger, OkMessage) - } - // respond with the created data - dumpScriptAndRespond(logrec, w, logger) - } - - }).Methods("POST") - - router.HandleFunc("/api/v2/scripts/", func(w http.ResponseWriter, r *http.Request) { - // parse given json data into a new record - logrec := persistence.ScriptTelemetryRecordV2{} - decodeErr := json.NewDecoder(r.Body).Decode(&logrec) - if decodeErr != nil { - logger.Debug(decodeErr) - return - } - - // validate - err := logrec.Validate() - if err != nil { - // log error - logrec.PrintRecordInfo(logger, fmt.Sprintf("[ {r}%s{!} ]", err.Error())) - // respond with error - w.WriteHeader(http.StatusBadRequest) - respondError(err, w, logger) - } else { - // now write to db - _, dbWriteErr := dbConn.WriteScriptTelemetryV2(&logrec, logger) - if dbWriteErr != nil { - logger.Debug(dbWriteErr) - logrec.PrintRecordInfo(logger, fmt.Sprintf("[ {r}%s{!} ]", dbWriteErr)) - } else { - logrec.PrintRecordInfo(logger, OkMessage) - } - // respond with the created data - dumpScriptAndRespond(logrec, w, logger) - } - - }).Methods("POST") - - // GET scripts/ - // get recorded telemetry record - router.HandleFunc("/api/v1/scripts/", func(w http.ResponseWriter, r *http.Request) { - - }).Methods("GET") - - router.HandleFunc("/api/v2/scripts/", func(w http.ResponseWriter, r *http.Request) { - - }).Methods("GET") -} diff --git a/dev/pyRevitTelemetryServer/server/server.go b/dev/pyRevitTelemetryServer/server/server.go deleted file mode 100644 index 288743b3c6..0000000000 --- a/dev/pyRevitTelemetryServer/server/server.go +++ /dev/null @@ -1,59 +0,0 @@ -package server - -import ( - "fmt" - "net/http" - - "pyrevittelemetryserver/cli" - "pyrevittelemetryserver/persistence" - - "github.com/gofrs/uuid" - "github.com/gorilla/mux" -) - -var ServerId uuid.UUID - -var OkMessage = "[ {g}OK{!} ]" - -func Start(opts *cli.Options, dbConn persistence.Connection, logger *cli.Logger) { - //create new id for this server instance - ServerId = uuid.Must(uuid.NewV4()) - - // http server router - router := mux.NewRouter().StrictSlash(true) - - // create routes - // create scripts routes - if opts.ScriptsTable != "" { - RouteScripts(router, opts, dbConn, logger) - } - // create events routes - if opts.EventsTable != "" { - RouteEvents(router, opts, dbConn, logger) - } - - RouteStatus(router, opts, dbConn, logger) - - // start listening now - logger.Print(fmt.Sprintf("Server listening on %d...", opts.Port)) - if opts.Https { - logger.Fatal( - http.ListenAndServeTLS( - fmt.Sprintf(":%d", opts.Port), - fmt.Sprintf("%s.crt", opts.ExeName), - fmt.Sprintf("%s.key", opts.ExeName), - router, - )) - - } else { - logger.Fatal( - http.ListenAndServe( - fmt.Sprintf(":%d", opts.Port), - router, - )) - } -} - -func GetStatus() string { - return "pass" // "pass", "fail" or "warn" -} diff --git a/dev/pyRevitTelemetryServer/server/status.go b/dev/pyRevitTelemetryServer/server/status.go deleted file mode 100644 index 91498c9917..0000000000 --- a/dev/pyRevitTelemetryServer/server/status.go +++ /dev/null @@ -1,61 +0,0 @@ -// https://inadarei.github.io/rfc-healthcheck/ -package server - -import ( - "encoding/json" - "net/http" - - "pyrevittelemetryserver/cli" - "pyrevittelemetryserver/persistence" - - "github.com/gorilla/mux" -) - -type ServerStatus struct { - Status string `json:"status"` - Version string `json:"version"` - Output string `json:"output"` - ServiceId string `json:"serviceid"` - Checks map[string]persistence.ConnectionStatus `json:"checks"` -} - -func prepareAndReportStatus(w http.ResponseWriter, opts *cli.Options, dbConn persistence.Connection, logger *cli.Logger) { - // create status report data - jsonData, responseDataErr := json.Marshal( - ServerStatus{ - Status: GetStatus(), - Version: opts.Version, - ServiceId: ServerId.String(), - Checks: map[string]persistence.ConnectionStatus{ - string(dbConn.GetType()): dbConn.GetStatus(logger), - }, - }) - if responseDataErr == nil { - jsonString := string(jsonData) - if logger.PrintTrace { - logger.Trace(jsonString) - } - - // write response - w.Header().Set("Content-Type", "application/health+json") - _, responseErr := w.Write([]byte(jsonString)) - if responseErr != nil { - logger.Debug(responseErr) - } - } else { - logger.Debug(responseDataErr) - } - -} - -func RouteStatus(router *mux.Router, opts *cli.Options, dbConn persistence.Connection, logger *cli.Logger) { - // GET scripts/ - // get recorded telemetry record - router.HandleFunc("/api/v1/status", func(w http.ResponseWriter, r *http.Request) { - prepareAndReportStatus(w, opts, dbConn, logger) - }).Methods("GET") - - router.HandleFunc("/api/v2/status", func(w http.ResponseWriter, r *http.Request) { - prepareAndReportStatus(w, opts, dbConn, logger) - }).Methods("GET") -} diff --git a/dev/pyRevitTelemetryServer/ts.exe b/dev/pyRevitTelemetryServer/ts.exe deleted file mode 100644 index 4a613eea5e..0000000000 Binary files a/dev/pyRevitTelemetryServer/ts.exe and /dev/null differ diff --git a/dev/pyrevit.py b/dev/pyrevit.py index 868efd7db5..cd7d8b2f2c 100644 --- a/dev/pyrevit.py +++ b/dev/pyrevit.py @@ -12,8 +12,7 @@ └── msbuild building msi installers using Wix Tools └── certutil managing signing certificate └── signtool digitally signing binaries - gcc for building sqlite package in telemetry server (http://mingw.org) - go for building telemetry server (https://golang.org) + go for building pyRevit autocomplete application (https://golang.org) Inno Setup Compiler for buidling installers (https://jrsoftware.org/isinfo.php) └── iscc buidling installers from scripts choco for building and publishing choco packages (https://chocolatey.org) @@ -23,7 +22,6 @@ python 3 for the build tools (https://www.python.org/downloads/) pygount for counting code lines (https://pypi.org/project/pygount/) git for creating release reports (https://git-scm.com) - docker for telemetry server tests (https://www.docker.com/products/docker-desktop) Some of the commands call web APIs for necessary information. Access tokens must be set in env vars otherwise access will be @@ -67,7 +65,6 @@ import _hostdata as hostdata import _release as release import _props as props -import _telem as telem import _misc as misc @@ -118,13 +115,10 @@ def print_help(_: Dict[str, str]): Command(name="build", target="labs", args=["[]"], run=labs.build_labs), Command(name="build", target="engines", args=["[]"], run=labs.build_engines), Command(name="build", target="autocmp", args=[], run=autoc.build_autocmp), - Command(name="build", target="telem", args=[], run=telem.build_telem), Command(name="build", target="installers", args=[], run=release.build_installers), Command(name="build", target="choco", args=[], run=release.build_choco), Command(name="build", target="commit", args=[], run=release.commit_and_tag_build), Command(name="clean", target="labs", args=[], run=build.clean_build), - # unit testing - Command(name="test", target="telem", args=[], run=telem.start_telem), # manual data setters Command(name="set", target="year", args=[], run=props.set_year), Command(name="set", target="version", args=[""], run=props.set_ver), diff --git a/dev/scripts/configs.py b/dev/scripts/configs.py index 80bc37234f..ac352578db 100644 --- a/dev/scripts/configs.py +++ b/dev/scripts/configs.py @@ -59,11 +59,6 @@ AUTOCOMP = op.join(AUTOCOMPPATH, "pyrevit-autocomplete.go") AUTOCOMPBIN = op.join(BINPATH, "pyrevit-autocomplete.exe") -# telemetry server files -TELEMETRYSERVERPATH = op.join(DEVPATH, "pyRevitTelemetryServer") -TELEMETRYSERVER = op.join(TELEMETRYSERVERPATH, "main.go") -TELEMETRYSERVERBIN = op.join(BINPATH, "pyrevit-telemetryserver.exe") - # python docs DOCS_DIR = op.join(ROOT, "docs") DOCS_BUILD = op.join(DOCS_DIR, "_build")