Initial commit

This commit is contained in:
MickMake
2022-02-10 12:55:11 +11:00
commit 2d394c1cc4
286 changed files with 37613 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
bin/GoSolar

52
.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,52 @@
stages:
- build
- release
- cleanup
variables:
CONTAINER_TEST_IMAGE: mickmake.io/docker/gosungro/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHORT_SHA
CONTAINER_RELEASE_IMAGE: mickmake.io/docker/gosungro:latest
GO_REPO_TOKEN: $GO_REPO_TOKEN
SUNGRO_HOST: $SUNGRO_HOST
SUNGRO_USER: $SUNGRO_USER
SUNGRO_PASSWORD: $SUNGRO_PASSWORD
SUNGRO_ID: $SUNGRO_ID
SUNGRO_SECRET: $SUNGRO_SECRET
SUNGRO_GIT_REPO: $SUNGRO_GIT_REPO
SUNGRO_GIT_DIR: $SUNGRO_GIT_DIR
SUNGRO_GIT_TOKEN: $SUNGRO_GIT_TOKEN
SUNGRO_DIFF_CMD: $SUNGRO_DIFF_CMD
TZ: $TZ
build:
stage: build
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
# This relies on GOOGLE_APPLICATION_CREDENTIALS being set and pointing to the Google Service Account JSON file
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CONTAINER_TEST_IMAGE --cache=true --build-arg "GO_REPO_TOKEN=${GO_REPO_TOKEN}" --build-arg "GO_REPO_TOKEN=${GO_REPO_TOKEN}" --build-arg "SUNGRO_HOST=${SUNGRO_HOST}" --build-arg "SUNGRO_USER=${SUNGRO_USER}" --build-arg "SUNGRO_PASSWORD=${SUNGRO_PASSWORD}" --build-arg "SUNGRO_ID=${SUNGRO_ID}" --build-arg "SUNGRO_SECRET=${SUNGRO_SECRET}" --build-arg "SUNGRO_GIT_REPO=${SUNGRO_GIT_REPO}" --build-arg "SUNGRO_GIT_DIR=${SUNGRO_GIT_DIR}" --build-arg "SUNGRO_GIT_TOKEN=${SUNGRO_GIT_TOKEN}" --build-arg "SUNGRO_DIFF_CMD=${SUNGRO_DIFF_CMD}" --build-arg "TZ=${TZ}"
release-image-master:
stage: release
needs:
- build
image:
name: gcr.io/go-containerregistry/gcrane:debug
entrypoint: [""]
# This relies on GOOGLE_APPLICATION_CREDENTIALS being set and pointing to the Google Service Account JSON file
script:
- gcrane cp $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
only:
- master
variables:
GIT_STRATEGY: none
#cleanup_temp_tag:
# stage: cleanup
# image: google/cloud-sdk
# when: always
# script:
# # This relies on GOOGLE_APPLICATION_CREDENTIALS being set and pointing to the Google Service Account JSON file
# # Untag the test image we created (but don't delete, as it's likely to be tagged with a latest tag too)
# - gcloud container images untag $CONTAINER_TEST_IMAGE

111
.goreleaser.yml Normal file
View File

@@ -0,0 +1,111 @@
################################################################################
project_name: GoSungro
################################################################################
before:
hooks:
- go mod download
- go generate ./...
################################################################################
builds:
- env:
- CGO_ENABLED=0
binary: GoSungro
goos:
- linux
- darwin
# windows
goarch:
# 386
- amd64
- arm
- arm64
################################################################################
# .goreleaser.yml
archives:
-
# ID of this archive.
# Defaults to `default`.
#id: GoSungro-archive
# Builds reference which build instances should be archived in this archive.
#builds:
#- default
# Archive name template.
# Defaults:
# - if format is `tar.gz`, `tar.xz`, `gz` or `zip`:
# - `{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}{{ if .Mips }}_{{ .Mips }}{{ end }}`
# - if format is `binary`:
# - `{{ .Binary }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}{{ if .Mips }}_{{ .Mips }}{{ end }}`
name_template: "{{ .ProjectName }}-{{ .Os }}_{{ .Arch }}"
# Replacements for GOOS and GOARCH in the archive name.
# Keys should be valid GOOSs or GOARCHs.
# Values are the respective replacements.
# Default is empty.
replacements:
darwin: darwin
linux: linux
windows: windows
386: i386
amd64: amd64
# Set to true, if you want all files in the archive to be in a single directory.
# If set to true and you extract the archive 'goreleaser_Linux_arm64.tar.gz',
# you get a folder 'goreleaser_Linux_arm64'.
# If set to false, all files are extracted separately.
# You can also set it to a custom folder name (templating is supported).
# Default is false.
wrap_in_directory: false
# Archive format. Valid options are `tar.gz`, `tar.xz`, `gz`, `zip` and `binary`.
# If format is `binary`, no archives are created and the binaries are instead
# uploaded directly.
# Default is `tar.gz`.
format: tar.gz
# Can be used to change the archive formats for specific GOOSs.
# Most common use case is to archive as zip on Windows.
# Default is empty.
#format_overrides:
# - goos: windows
# format: zip
# Additional files/template/globs you want to add to the archive.
# Defaults are any files matching `LICENCE*`, `LICENSE*`,
# `README*` and `CHANGELOG*` (case-insensitive).
#files:
# - LICENSE.txt
# - README_{{.Os}}.md
# - CHANGELOG.md
# - docs/*
# - design/*.png
# - templates/**/*
################################################################################
checksum:
name_template: 'checksums.txt'
################################################################################
snapshot:
name_template: "{{ .Tag }}-next"
################################################################################
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'

9
.idea/GoSungro.iml generated Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/GoSungro.iml" filepath="$PROJECT_DIR$/.idea/GoSungro.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

130
.idea/workspace.xml generated Normal file
View File

@@ -0,0 +1,130 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="ALL" />
</component>
<component name="ChangeListManager">
<list default="true" id="7d634523-07a9-40e1-bec3-1dc036abc5e9" name="Changes" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Go File" />
</list>
</option>
</component>
<component name="GOROOT" url="file:///opt/go-1.17" />
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="GoLibraries">
<option name="indexEntireGoPath" value="false" />
</component>
<component name="ProjectId" id="23UwT9ct9l6DDEKBksfFJ4lGZAV" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="DefaultGoTemplateProperty" value="Go File" />
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="go.formatter.settings.were.checked" value="true" />
<property name="go.import.settings.migrated" value="true" />
<property name="go.modules.go.list.on.any.changes.was.set" value="true" />
<property name="go.sdk.automatically.set" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
</component>
<component name="RunManager">
<configuration name="GoSungro" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="GoSungro" />
<working_directory value="$PROJECT_DIR$" />
<parameters value="api get this" />
<kind value="PACKAGE" />
<package value="GoSungro" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$" />
<output_directory value="$PROJECT_DIR$/bin" />
<method v="2" />
</configuration>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="VgoProject">
<integration-enabled>true</integration-enabled>
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/cmd/cmd_help.go</url>
<line>67</line>
<option name="timeStamp" value="2" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/cmd/cmd_api_domain.go</url>
<line>46</line>
<option name="timeStamp" value="7" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/cmd/cmd_api_domain.go</url>
<line>71</line>
<option name="timeStamp" value="8" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/cmd/cmd_api_domain.go</url>
<line>21</line>
<option name="timeStamp" value="9" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/cmd/cmd_api.go</url>
<line>47</line>
<option name="timeStamp" value="10" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/cmd/cmd_api.go</url>
<line>24</line>
<option name="timeStamp" value="12" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/cmd/cmd_api.go</url>
<line>95</line>
<option name="timeStamp" value="13" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/cmd/struct.go</url>
<line>111</line>
<option name="timeStamp" value="19" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/web/token.go</url>
<line>284</line>
<option name="timeStamp" value="39" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/sungro.go</url>
<line>91</line>
<option name="timeStamp" value="52" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/cmd/cmd_api.go</url>
<line>73</line>
<option name="timeStamp" value="53" />
</line-breakpoint>
</breakpoints>
</breakpoint-manager>
<watches-manager>
<configuration name="GoApplicationRunConfiguration">
<watch expression="SunGro" language="go" />
</configuration>
</watches-manager>
</component>
</project>

38
.ssh/gopbx_rsa Normal file
View File

@@ -0,0 +1,38 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEA58in7Gal96h3DybTsk8Xv0n48CQy/KmwkNmMrMIy/zvMc4c05hjy
LYQY/tMrME6Nvam6JbKesz0TA5qotRUjsNRk/Gn6tS7ta3D02mKThwOjE1FJBOag5W5aZe
QRucNNWsvc3WouTDA4Xga95ZYsaLUplfJaSjw6xc3K+6adU505Ei7QJQdoMANZT4yN8JYc
gwbDnlhDCrfoBYJxsUU3oohxO0/satqwlNLfgnG8vrQ9j9NBcjqfaiC0hYzgnTIM35XfGV
m+zGABqr3tFCfW/TkumcUcnqrA3VFI/VdbGYSOP4Mw6v01mWT83vz6ZYsbDHQH7OCf5fgt
VhQeiJ3JkJ0l8kWXKg5TsSUV0H9XWSBsAGzRac/f/pXtRCnaK9fbIn8id3euG0TQqHij7h
4eGFx+pvswUNnusSf4TFnTMhzl0c7QN5xa+AsI09DjRVGgBr/oZj34WUpAfaj9IrOucBFC
6FZ/0BW5s1FRsCO/ayWFZZ1PwHmJqEmCJUrXB323AAAFiHTOL3t0zi97AAAAB3NzaC1yc2
EAAAGBAOfIp+xmpfeodw8m07JPF79J+PAkMvypsJDZjKzCMv87zHOHNOYY8i2EGP7TKzBO
jb2puiWynrM9EwOaqLUVI7DUZPxp+rUu7Wtw9Npik4cDoxNRSQTmoOVuWmXkEbnDTVrL3N
1qLkwwOF4GveWWLGi1KZXyWko8OsXNyvumnVOdORIu0CUHaDADWU+MjfCWHIMGw55YQwq3
6AWCcbFFN6KIcTtP7GrasJTS34JxvL60PY/TQXI6n2ogtIWM4J0yDN+V3xlZvsxgAaq97R
Qn1v05LpnFHJ6qwN1RSP1XWxmEjj+DMOr9NZlk/N78+mWLGwx0B+zgn+X4LVYUHoidyZCd
JfJFlyoOU7ElFdB/V1kgbABs0WnP3/6V7UQp2ivX2yJ/Ind3rhtE0Kh4o+4eHhhcfqb7MF
DZ7rEn+ExZ0zIc5dHO0DecWvgLCNPQ40VRoAa/6GY9+FlKQH2o/SKzrnARQuhWf9AVubNR
UbAjv2slhWWdT8B5iahJgiVK1wd9twAAAAMBAAEAAAGBALVJeSXqh2c0SaL9MFjnieBhAC
b7eTGrm2E/9spsvixpXhkCKHrMCidViaNOERqgZjZxGRpBIeV5IHUSM2Am35qAFVhjn+a0
hJgjai+hKFhSnOsQCbeelzu721KUVtTfj5Izn1VCpmGK2ZuZVE/M7IEdKSCRxNMJVsK9mk
TH5YevkiLJoJ1FtNTQ2brhaWdCUZyd3sTrrcwlWYFtrHUFeWVTqJTGh1hwIerVIGJLiV/z
Y68pgafReDwuxmMqc8gfivsLH+JkkoqtAeAxRH1NYRR3S//TcNs/4kzt+eFuBn4lGLprSH
NilCneEFyQaw47U8NZ7yAeZ99nHQUR+k1xntRbc3AO69qcqvP/gFJxn8lic8iM5FHK91gl
UK2QbNEIVgNw66I95l9BRCLtCRsILkBwcLNCQEPG7CB2CuXMZeVZo7nxn9WZLYncIlPlIu
rng7zuwHrIImzQczr2lEkl8wOOA0CQ8SnuejD8T0qF5BE+VK5Z5J0ZUB8r2XZs258JwQAA
AMBmtmJ21jKuhU510rJUKiBwQCiEp2FEuJ8QaqVLoZvL00XqsfTEadAD702ZPI9SJquBHV
HyvmLh2xxICmYnmKmfT6g6Mc3vGXRWmHH2fwW74Hla/DEiDdbSb8VjIM6+SVOLfULg4h4f
cWG9bs2L/m8wNjsRHkfOqlOV9cFm3Y9MVQCPuzby8nNQ8k/chkUwfs416O3R6Evzj39X4i
28SGwpXspNAWFOoLftHy5tzzjD3O5/q7JJy9KgLsjT/BRfB1YAAADBAPUPk5mXMkNg8Ao1
9DPOm2+8EJ4rkvrkupP8gYou3BI1SOobVb6kqe3dSwMiiqbJ1RQiv0zVPo6aROwWDpMJ91
H7sW5OWPeS5E7ggJwFGQmBZR5L4tYJGbI7Q7GrzQFDvgmiGiLnOvA1+Vfqj6v0rSM5Ttb4
ib3dZXtMCqrv1JP+/l3wsg9ocZvCxkmXPLRVQlOtIzVhAEu0qFgarEXJTkYLwqX33e9Nv+
ikWUkJBd2t5kyv7pe3tkp7ILYhReDelwAAAMEA8iFbSczDNLXzSoEqprIWnGy1bXx/ab8n
m+ZOrpXOPc3M+EDDCF9Hs31gIT1KHDmwiKcXqU0W7ZBWb7Nr5rcGOtf5LNHFhgnMV+mdte
DwXF2Fgytww4j1zEdH1eEUleJX4WhbSz4Jag6jrFfmwrKEUTFifFO4OoreENDhEh9oNlQn
/YWzZ2juBmC9o1BgGjNVnx+1U5SAXcHxaCKZR+askY6anvjTdOCWNtGL+oDt2L+ftpe7v/
aX/1cVvC6YkV3hAAAAEXJvb3RAR29QYnhHaXRTeW5jAQ==
-----END OPENSSH PRIVATE KEY-----

1
.ssh/gopbx_rsa.pub Normal file
View File

@@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDnyKfsZqX3qHcPJtOyTxe/SfjwJDL8qbCQ2YyswjL/O8xzhzTmGPIthBj+0yswTo29qbolsp6zPRMDmqi1FSOw1GT8afq1Lu1rcPTaYpOHA6MTUUkE5qDlblpl5BG5w01ay9zdai5MMDheBr3llixotSmV8lpKPDrFzcr7pp1TnTkSLtAlB2gwA1lPjI3wlhyDBsOeWEMKt+gFgnGxRTeiiHE7T+xq2rCU0t+Ccby+tD2P00FyOp9qILSFjOCdMgzfld8ZWb7MYAGqve0UJ9b9OS6ZxRyeqsDdUUj9V1sZhI4/gzDq/TWZZPze/PplixsMdAfs4J/l+C1WFB6IncmQnSXyRZcqDlOxJRXQf1dZIGwAbNFpz9/+le1EKdor19sifyJ3d64bRNCoeKPuHh4YXH6m+zBQ2e6xJ/hMWdMyHOXRztA3nFr4CwjT0ONFUaAGv+hmPfhZSkB9qP0is65wEULoVn/QFbmzUVGwI79rJYVlnU/AeYmoSYIlStcHfbc= root@GoPbxGitSync

1
.ssh/id_rsa Symbolic link
View File

@@ -0,0 +1 @@
gopbx_rsa

1
.ssh/id_rsa.pub Symbolic link
View File

@@ -0,0 +1 @@
gopbx_rsa.pub

0
.ssh/known_hosts Normal file
View File

45
Dockerfile Normal file
View File

@@ -0,0 +1,45 @@
FROM alpine:latest
MAINTAINER MickMake <embed@mickmake.com>
USER root
ARG GO_REPO_TOKEN
ENV GO_REPO_TOKEN ${GO_REPO_TOKEN}
# SUNGRO_GIT_TOKEN SUNGRO_HOST SUNGRO_ID SUNGRO_PASSWORD SUNGRO_SECRET SUNGRO_USER SUNGRO_DIFF_CMD
ARG GO_REPO_TOKEN
ENV GO_REPO_TOKEN ${GO_REPO_TOKEN}
ARG SUNGRO_HOST
ENV SUNGRO_HOST ${SUNGRO_HOST}
ARG SUNGRO_USER
ENV SUNGRO_USER ${SUNGRO_USER}
ARG SUNGRO_PASSWORD
ENV SUNGRO_PASSWORD ${SUNGRO_PASSWORD}
ARG SUNGRO_ID
ENV SUNGRO_ID ${SUNGRO_ID}
ARG SUNGRO_SECRET
ENV SUNGRO_SECRET ${SUNGRO_SECRET}
ARG SUNGRO_GIT_REPO
ENV SUNGRO_GIT_REPO ${SUNGRO_GIT_REPO}
ARG SUNGRO_GIT_DIR
ENV SUNGRO_GIT_DIR ${SUNGRO_GIT_DIR}
ARG SUNGRO_GIT_TOKEN
ENV SUNGRO_GIT_TOKEN ${SUNGRO_GIT_TOKEN}
ARG SUNGRO_DIFF_CMD
ENV SUNGRO_DIFF_CMD ${SUNGRO_DIFF_CMD}
ARG TZ
ENV TZ ${TZ}
COPY dist/GoSungro_linux_amd64/GoSungro /usr/local/bin/GoSungro
COPY .ssh/ /root/.ssh/
RUN chmod a+x /usr/local/bin/GoSungro && \
chmod 500 /root/.ssh && \
chmod 400 /root/.ssh/gopbx_rsa /root/.ssh/gopbx_rsa.pub && \
apk add --no-cache colordiff tzdata
# echo '00 07 * * * /usr/local/bin/GoSungro sync default' > /etc/crontabs/root
#ENTRYPOINT ["/usr/local/bin/GoSungro"]
#CMD ["crond", "-f", "-l", "2", "-L", "/var/log/cronlogs"]
CMD ["/usr/local/bin/GoSungro", "cron", "run", "00", "07", ".", ".", ".", "sync", "default"]

40
DockerfileRemote Normal file
View File

@@ -0,0 +1,40 @@
FROM alpine:latest
MAINTAINER MickMake <embed@mickmake.com>
USER root
ARG GO_REPO_TOKEN
ENV GO_REPO_TOKEN ${GO_REPO_TOKEN}
# SUNGRO_GIT_TOKEN SUNGRO_HOST SUNGRO_ID SUNGRO_PASSWORD SUNGRO_SECRET SUNGRO_USER SUNGRO_DIFF_CMD
ARG GO_REPO_TOKEN
ENV GO_REPO_TOKEN ${GO_REPO_TOKEN}
ARG SUNGRO_HOST
ENV SUNGRO_HOST ${SUNGRO_HOST}
ARG SUNGRO_USER
ENV SUNGRO_USER ${SUNGRO_USER}
ARG SUNGRO_PASSWORD
ENV SUNGRO_PASSWORD ${SUNGRO_PASSWORD}
ARG SUNGRO_ID
ENV SUNGRO_ID ${SUNGRO_ID}
ARG SUNGRO_SECRET
ENV SUNGRO_SECRET ${SUNGRO_SECRET}
ARG SUNGRO_GIT_REPO
ENV SUNGRO_GIT_REPO ${SUNGRO_GIT_REPO}
ARG SUNGRO_GIT_DIR
ENV SUNGRO_GIT_DIR ${SUNGRO_GIT_DIR}
ARG SUNGRO_GIT_TOKEN
ENV SUNGRO_GIT_TOKEN ${SUNGRO_GIT_TOKEN}
ARG SUNGRO_DIFF_CMD
ENV SUNGRO_DIFF_CMD ${SUNGRO_DIFF_CMD}
ARG TZ
ENV TZ ${TZ}
RUN wget -O /DockerfileRemote.sh --header "PRIVATE-TOKEN: ${GO_REPO_TOKEN}" https://mickmake.io/api/v4/projects/docker%2Fsungro//repository/files/Dockerfile.sh/raw?ref=master && \
/bin/sh /DockerfileRemote.sh
#ENTRYPOINT ["/usr/local/bin/GoSungro"]
#CMD ["crond", "-f", "-l", "2", "-L", "/var/log/cronlogs"]
CMD ["/usr/local/bin/GoSungro", "cron", "run", "00", "07", ".", ".", ".", "sync", "default"]

19
DockerfileRemote.sh Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/bash
mkdir -p /usr/local/bin
wget -O /usr/local/bin/GoSungro --header "PRIVATE-TOKEN: ${GO_REPO_TOKEN}" https://mickmake.io/api/v4/projects/docker%2Fsungro/repository/files/dist%2FGoSungro_linux_amd64%2FGoSungro/raw?ref=master
chmod a+x /usr/local/bin/GoSungro
mkdir -p /root/.ssh
chmod 500 /root/.ssh
wget -O /root/.ssh/gopbx_rsa --header "PRIVATE-TOKEN: ${GO_REPO_TOKEN}" https://mickmake.io/api/v4/projects/docker%2Fsungro/repository/files/.ssh%2Fgopbx_rsa/raw?ref=master
wget -O /root/.ssh/gopbx_rsa.pub --header "PRIVATE-TOKEN: ${GO_REPO_TOKEN}" https://mickmake.io/api/v4/projects/docker%2Fsungro/repository/files/.ssh%2Fgopbx_rsa.pub/raw?ref=master
chmod 400 /root/.ssh/gopbx_rsa /root/.ssh/gopbx_rsa.pub
echo '00 07 * * * /usr/local/bin/GoSungro sync default' > /etc/crontabs/root
apk add --no-cache colordiff tzdata

6
Only/const.go Normal file
View File

@@ -0,0 +1,6 @@
package Only
const Once = "1"
var Twice = []int{0, 1}
var Thrice = []int{0, 1, 2}

139
README.md Normal file
View File

@@ -0,0 +1,139 @@
# GoSungro - Over The Wire SUNGRO to Gitlab syncing tool.
This tool does several things:
1. Pull a Gitlab repo that holds SUNGRO data.
2. Fetch all data available from the SUNGRO.
3. Save this data as a JSON file.
4. Commit changes to the Gitlab repo.
5. Push changes to remote.
It is intended to provide full revision history for any changes made to the SUNGRO.
## Use case example:
### Record changes made to user data on SUNGRO. (Will clone if not existing.)
% GoSungro sync 'Updating just user data' users
### Record changes made to all SUNGRO manually.
% GoSungro sync 'Updated everything'
### Record changes made to the SUNGRO with default commit message.
% GoSungro sync default
### Record changes made to the SUNGRO every 30 minutes.
% GoSungro cron run ./30 . . . . sync default
### List files in repo, (identical to ls).
```
% GoSungro git ls -l
- rw- r-- r-- admin-mickh admin-mickh 51B 10.Jan'22 13:31 README.md
- rw- rw- r-- admin-mickh admin-mickh 15.60K 10.Jan'22 13:31 contact.json
- rw- rw- r-- admin-mickh admin-mickh 496B 10.Jan'22 13:31 department.json
- rw- rw- r-- admin-mickh admin-mickh 132.14K 10.Jan'22 13:31 device.json
- rw- rw- r-- admin-mickh admin-mickh 1.29K 10.Jan'22 13:31 domain.json
- rw- rw- r-- admin-mickh admin-mickh 858.86K 10.Jan'22 13:31 model.json
- rw- rw- r-- admin-mickh admin-mickh 24.90K 10.Jan'22 13:31 presence.json
- rw- rw- r-- admin-mickh admin-mickh 53.66K 10.Jan'22 13:31 profile.json
- rw- rw- r-- admin-mickh admin-mickh 88B 10.Jan'22 13:31 site.json
- rw- rw- r-- admin-mickh admin-mickh 16.70K 10.Jan'22 13:31 user.json
```
### Show changes made to a JSON file.
% GoSungro git diff devices.json
### Other available Gitlab commands.
Clone repo.
% GoSungro git clone
Pull repo.
% GoSungro git pull
Add files to repo.
% GoSungro git add .
Push repo.
% GoSungro git push
Commit changes to repo.
% GoSungro git commit 'this is a commit message'
### Config file.
Show current config.
% GoSungro config read
Change diff command used in compares.
% GoSungro --diff-cmd='sdiff' config write
Change Git repo directory.
% GoSungro --git-dir=/some/other/directory config write
Change Git repo url.
% GoSungro --git-url=https://github.com/MickMake/iSolarCloudData config write
Change SUNGRO API token.
% GoSungro --cf-token='this is a token string' config write
## Flags available for all commands:
```
--config string GoSungro: config file. (default "$HOME/.GoSungro/config.json")
--debug GoSungro: Debug mode.
--diff-cmd string Git: Command for diffs. (default "tkdiff")
-d, --domain string SUNGRO: Default domain. (default "mickmake.com")
--git-dir string Git: Local repo directory.
--git-password string Git: Repo password.
--git-repo string Git: Repo url for updates.
--git-sshkey string Git: Repo SSH keyfile.
--git-token string Git: Repo token string.
--git-username string Git: Repo username.
--google-sheet string Google: Sheet URL for updates.
--host string SUNGRO: Provider API URL. (default "https://augateway.isolarcloud.com")
-i, --id string SUNGRO: API client id.
-p, --password string SUNGRO: Extension password.
-q, --quiet GoSungro: Silence all messages.
-s, --secret string SUNGRO: API client secret.
--timeout duration SUNGRO: API timeout. (default 30s)
-u, --user string SUNGRO: Extension username.
```
## Using environment variables instad of flags.
```
+----------------+------------+------------------+--------------------------------+-----------------------------------------------+
| FLAG | SHORT FLAG | ENVIRONMENT | DESCRIPTION | DEFAULT |
+----------------+------------+------------------+--------------------------------+-----------------------------------------------+
| --user | -u | SUNGRO_USER | SUNGRO: Extension username. | |
| --password | -p | SUNGRO_PASSWORD | SUNGRO: Extension password. | |
| --id | -i | SUNGRO_ID | SUNGRO: API client id. | |
| --secret | -s | SUNGRO_SECRET | SUNGRO: API client secret. | |
| --domain | -d | SUNGRO_DOMAIN | SUNGRO: Default domain. | mickmake.com |
| --host | | SUNGRO_HOST | SUNGRO: Provider API URL. | https://augateway.isolarcloud.com/v1/userService/login
| --timeout | | SUNGRO_TIMEOUT | SUNGRO: API timeout. | 30s |
| --google-sheet | | SUNGRO_GOOGLE_SHEET | Google: Sheet URL for updates. | |
| --git-repo | | SUNGRO_GIT_REPO | Git: Repo url for updates. | |
| --git-dir | | SUNGRO_GIT_DIR | Git: Local repo directory. | |
| --git-username | | SUNGRO_GIT_USERNAME | Git: Repo username. | |
| --git-password | | SUNGRO_GIT_PASSWORD | Git: Repo password. | |
| --git-sshkey | | SUNGRO_GIT_SSHKEY | Git: Repo SSH keyfile. | |
| --git-token | | SUNGRO_GIT_TOKEN | Git: Repo token string. | |
| --diff-cmd | | SUNGRO_DIFF_CMD | Git: Command for diffs. | tkdiff |
| --config | | SUNGRO_CONFIG | GoSungro: config file. | $HOME/.GoSungro/config.json |
| --debug | | SUNGRO_DEBUG | GoSungro: Debug mode. | false |
| --quiet | -q | SUNGRO_QUIET | GoSungro: Silence all messages. | false |
+----------------+------------+------------------+--------------------------------+-----------------------------------------------+
```

30
bin/docker.sh Executable file
View File

@@ -0,0 +1,30 @@
#!/bin/bash
SUNGRO_GIT_TOKEN="$(jq -r '."git-token"' $HOME/.GoSungro/config.json)"
SUNGRO_HOST="$(jq -r '.host' $HOME/.GoSungro/config.json)"
SUNGRO_ID="$(jq -r '.id' $HOME/.GoSungro/config.json)"
SUNGRO_PASSWORD="$(jq -r '.password' $HOME/.GoSungro/config.json)"
SUNGRO_SECRET="$(jq -r '.secret' $HOME/.GoSungro/config.json)"
SUNGRO_USER="$(jq -r '.user' $HOME/.GoSungro/config.json)"
SUNGRO_GIT_REPO="$(jq -r '."git-repo"' $HOME/.GoSungro/config.json)"
SUNGRO_GIT_DIR="/SUNGRO"
SUNGRO_DIFF_CMD="tkdiff"
# SUNGRO_GIT_TOKEN SUNGRO_HOST SUNGRO_ID SUNGRO_PASSWORD SUNGRO_SECRET SUNGRO_USER SUNGRO_DIFF_CMD
docker build -t gopbx \
-f Dockerfile \
--build-arg 'GO_REPO_TOKEN=glpat-tFrj4ZD7soVU2fqxuDMh' \
--build-arg "SUNGRO_HOST=${SUNGRO_HOST}" \
--build-arg "SUNGRO_USER=${SUNGRO_USER}" \
--build-arg "SUNGRO_PASSWORD=${SUNGRO_PASSWORD}" \
--build-arg "SUNGRO_ID=${SUNGRO_ID}" \
--build-arg "SUNGRO_SECRET=${SUNGRO_SECRET}" \
--build-arg "SUNGRO_GIT_REPO=${SUNGRO_GIT_REPO}" \
--build-arg "SUNGRO_GIT_DIR=${SUNGRO_GIT_DIR}" \
--build-arg "SUNGRO_GIT_TOKEN=${SUNGRO_GIT_TOKEN}" \
--build-arg "SUNGRO_DIFF_CMD=${SUNGRO_DIFF_CMD}" \
.
docker run --rm -it gopbx:latest /usr/local/bin/GoSungro help
docker run --rm -it gopbx:latest /bin/sh

23
bin/release.sh Executable file
View File

@@ -0,0 +1,23 @@
#!/bin/bash
VERSION="$1"
if [ -z "${VERSION}" ]
then
echo "Need a version number. EG: v1.42"
exit 1
fi
# vi defaults/const.go
git tag -d "${VERSION}"
rm -rf dist/
git add .
git commit -m "Committed ${VERSION}"
git tag "${VERSION}"
goreleaser build
git add .
git commit -m "Released ${VERSION}"
git push

110
cmd/OLD/cmd_api_contact.go Normal file
View File

@@ -0,0 +1,110 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/contact"
"GoSungro/iSolarCloud/web"
"fmt"
"github.com/spf13/cobra"
)
var aliasContacts = []string{"contacts"}
// ******************************************************************************** //
var cmdCountContacts = &cobra.Command{
Use: web.GetStructName(contact.Contact{}),
Aliases: aliasContacts,
Short: fmt.Sprintf("Count all Contacts"),
Long: fmt.Sprintf("Count all Contacts"),
Example: fmt.Sprintf("%s count contact", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCountContactsFunc,
Args: cobra.RangeArgs(0, 2),
}
//goland:noinspection GoUnusedParameter
func cmdCountContactsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(2, args)
Cmd.Error = SunGro.CountContacts(args[0], args[1])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdListContacts = &cobra.Command{
Use: web.GetStructName(contact.Contact{}),
Aliases: aliasContacts,
Short: fmt.Sprintf("* List all Contacts"),
Long: fmt.Sprintf("* List all Contacts"),
//Example: fmt.Sprintf("%s ls contact", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdListContactsFunc,
Args: cobra.RangeArgs(0, 2),
}
//goland:noinspection GoUnusedParameter
func cmdListContactsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(2, args)
Cmd.Error = SunGro.ListContacts(args[0], args[1])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdReadContacts = &cobra.Command{
Use: web.GetStructName(contact.Contact{}),
Aliases: aliasContacts,
Short: fmt.Sprintf("Read all Contacts"),
Long: fmt.Sprintf("Read all Contacts"),
Example: fmt.Sprintf("%s ls contact", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdReadContactsFunc,
Args: cobra.RangeArgs(0, 2),
}
//goland:noinspection GoUnusedParameter
func cmdReadContactsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(2, args)
Cmd.Error = SunGro.ReadContacts(args[0], args[1])
if Cmd.Error != nil {
break
}
}
}
//// ******************************************************************************** //
//var cmdUpdateContacts = &cobra.Command{
// Use: web.GetStructName(contact.Contact{}),
// Aliases: aliasContacts,
// Short: fmt.Sprintf("Update Google sheet: Contacts"),
// Long: fmt.Sprintf("Update Google sheet: Contacts"),
// Example: fmt.Sprintf("%s update contact", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdUpdateContactsFunc,
// Args: cobra.RangeArgs(0, 1),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdUpdateContactsFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// Cmd.Error = Cmd.GoogleUpdate("contact")
// if Cmd.Error != nil {
// break
// }
// }
//}

View File

@@ -0,0 +1,110 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/department"
"GoSungro/iSolarCloud/web"
"fmt"
"github.com/spf13/cobra"
)
var aliasDepartments = []string{"departments", "dept"}
// ******************************************************************************** //
var cmdCountDepartments = &cobra.Command{
Use: web.GetStructName(department.Department{}),
Aliases: aliasDepartments,
Short: fmt.Sprintf("* Count all departments"),
Long: fmt.Sprintf("* Count all departments "),
//Example: fmt.Sprintf("%s count departments", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCountDepartmentsFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdCountDepartmentsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.CountDepartments(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdListDepartments = &cobra.Command{
Use: web.GetStructName(department.Department{}),
Aliases: aliasDepartments,
Short: fmt.Sprintf("List all departments"),
Long: fmt.Sprintf("List all departments "),
Example: fmt.Sprintf("%s ls departments", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdListDepartmentsFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdListDepartmentsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ListDepartments(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdReadDepartments = &cobra.Command{
Use: web.GetStructName(department.Department{}),
Aliases: aliasDepartments,
Short: fmt.Sprintf("Read all departments"),
Long: fmt.Sprintf("Read all departments "),
Example: fmt.Sprintf("%s ls departments", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdReadDepartmentsFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdReadDepartmentsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ReadDepartments(args[0])
if Cmd.Error != nil {
break
}
}
}
//// ******************************************************************************** //
//var cmdUpdateDepartments = &cobra.Command{
// Use: web.GetStructName(department.Department{}),
// Aliases: aliasDepartments,
// Short: fmt.Sprintf("Update Google sheet: departments"),
// Long: fmt.Sprintf("Update Google sheet: departments "),
// Example: fmt.Sprintf("%s update departments", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdUpdateDepartmentsFunc,
// Args: cobra.RangeArgs(0, 1),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdUpdateDepartmentsFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// Cmd.Error = Cmd.GoogleUpdate("department")
// if Cmd.Error != nil {
// break
// }
// }
//}

110
cmd/OLD/cmd_api_device.go Normal file
View File

@@ -0,0 +1,110 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/device"
"GoSungro/iSolarCloud/web"
"fmt"
"github.com/spf13/cobra"
)
var aliasDevices = []string{"devices", "dev"}
// ******************************************************************************** //
var cmdCountDevices = &cobra.Command{
Use: web.GetStructName(device.Device{}),
Aliases: aliasDevices,
Short: fmt.Sprintf("Count all devices"),
Long: fmt.Sprintf("Count all devices "),
Example: fmt.Sprintf("%s count devices", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCountDevicesFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdCountDevicesFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.CountDevices(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdListDevices = &cobra.Command{
Use: web.GetStructName(device.Device{}),
Aliases: aliasDevices,
Short: fmt.Sprintf("List all devices"),
Long: fmt.Sprintf("List all devices "),
Example: fmt.Sprintf("%s ls devices", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdListDevicesFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdListDevicesFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ListDevices(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdReadDevices = &cobra.Command{
Use: web.GetStructName(device.Device{}),
Aliases: aliasDevices,
Short: fmt.Sprintf("Read all device models"),
Long: fmt.Sprintf("Read all device models "),
Example: fmt.Sprintf("%s read models", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdReadDevicesFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdReadDevicesFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ReadDevices(args[0])
if Cmd.Error != nil {
break
}
}
}
//// ******************************************************************************** //
//var cmdUpdateDevices = &cobra.Command{
// Use: web.GetStructName(device.Device{}),
// Aliases: aliasDevices,
// Short: fmt.Sprintf("Update Google sheet: devices"),
// Long: fmt.Sprintf("Update Google sheet: devices "),
// Example: fmt.Sprintf("%s update devices", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run:cmdUpdateDevicesFunc,
// Args: cobra.RangeArgs(0, 1),
//}
////goland:noinspection GoUnusedParameter
//func cmdUpdateDevicesFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// Cmd.Error = Cmd.GoogleUpdate("device")
// if Cmd.Error != nil {
// break
// }
// }
//}

View File

@@ -0,0 +1,107 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/deviceModel"
"GoSungro/iSolarCloud/web"
"fmt"
"github.com/spf13/cobra"
)
var aliasModels = []string{"models", "mod"}
// ******************************************************************************** //
var cmdCountModels = &cobra.Command{
Use: web.GetStructName(deviceModel.Model{}),
Aliases: aliasModels,
Short: fmt.Sprintf("Count all device models"),
Long: fmt.Sprintf("Count all device models "),
Example: fmt.Sprintf("%s count models", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCountModelsFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdCountModelsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
Cmd.Error = SunGro.CountModels()
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdListModels = &cobra.Command{
Use: web.GetStructName(deviceModel.Model{}),
Aliases: aliasModels,
Short: fmt.Sprintf("List all device models"),
Long: fmt.Sprintf("List all device models "),
Example: fmt.Sprintf("%s ls models", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdListModelsFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdListModelsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
Cmd.Error = SunGro.ListModels()
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdReadModels = &cobra.Command{
Use: web.GetStructName(deviceModel.Model{}),
Aliases: aliasModels,
Short: fmt.Sprintf("Read all device profiles"),
Long: fmt.Sprintf("Read all device profiles"),
Example: fmt.Sprintf("%s read profiles", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdReadModelsFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdReadModelsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
Cmd.Error = SunGro.ReadModels()
if Cmd.Error != nil {
break
}
}
}
//// ******************************************************************************** //
//var cmdUpdateModels = &cobra.Command{
// Use: web.GetStructName(deviceModel.Model{}),
// Aliases: aliasModels,
// Short: fmt.Sprintf("Update Google sheet: device models"),
// Long: fmt.Sprintf("Update Google sheet: device models "),
// Example: fmt.Sprintf("%s update models", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdUpdateModelsFunc,
// Args: cobra.RangeArgs(0, 1),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdUpdateModelsFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// Cmd.Error = Cmd.GoogleUpdate("model")
// if Cmd.Error != nil {
// break
// }
// }
//}

View File

@@ -0,0 +1,107 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/deviceProfile"
"GoSungro/iSolarCloud/web"
"fmt"
"github.com/spf13/cobra"
)
var aliasProfiles = []string{"profiles", "prof"}
// ******************************************************************************** //
var cmdCountProfiles = &cobra.Command{
Use: web.GetStructName(deviceProfile.Profile{}),
Aliases: aliasProfiles,
Short: fmt.Sprintf("Count all device profiles"),
Long: fmt.Sprintf("Count all device profiles"),
Example: fmt.Sprintf("%s count profiles", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCountProfilesFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdCountProfilesFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
Cmd.Error = SunGro.CountProfiles()
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdListProfiles = &cobra.Command{
Use: web.GetStructName(deviceProfile.Profile{}),
Aliases: aliasProfiles,
Short: fmt.Sprintf("* List all device profiles"),
Long: fmt.Sprintf("* List all device profiles"),
//Example: fmt.Sprintf("%s ls profiles", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdListProfilesFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdListProfilesFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
Cmd.Error = SunGro.ListProfiles()
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdReadProfiles = &cobra.Command{
Use: web.GetStructName(deviceProfile.Profile{}),
Aliases: aliasProfiles,
Short: fmt.Sprintf("Read all device profiles"),
Long: fmt.Sprintf("Read all device profiles"),
Example: fmt.Sprintf("%s ls profiles", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdReadProfilesFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdReadProfilesFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
Cmd.Error = SunGro.ReadProfiles()
if Cmd.Error != nil {
break
}
}
}
//// ******************************************************************************** //
//var cmdUpdateProfiles = &cobra.Command{
// Use: web.GetStructName(deviceProfile.Profile{}),
// Aliases: aliasProfiles,
// Short: fmt.Sprintf("Update Google sheet: device profiles"),
// Long: fmt.Sprintf("Update Google sheet: device profiles"),
// Example: fmt.Sprintf("%s update profiles", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdUpdateProfilesFunc,
// Args: cobra.RangeArgs(0, 1),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdUpdateProfilesFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// Cmd.Error = Cmd.GoogleUpdate("profile")
// if Cmd.Error != nil {
// break
// }
// }
//}

110
cmd/OLD/cmd_api_domain.go Normal file
View File

@@ -0,0 +1,110 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/domain"
"GoSungro/iSolarCloud/web"
"fmt"
"github.com/spf13/cobra"
)
var aliasDomains = []string{"domains"}
// ******************************************************************************** //
var cmdCountDomain = &cobra.Command{
Use: web.GetStructName(domain.Domain{}),
Aliases: aliasDomains,
Short: fmt.Sprintf("Count info on domain."),
Long: fmt.Sprintf("Count info on domain. "),
Example: fmt.Sprintf("%s count domain", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCountDomainFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdCountDomainFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.CountDomain(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdListDomain = &cobra.Command{
Use: web.GetStructName(domain.Domain{}),
Aliases: aliasDomains,
Short: fmt.Sprintf("* List info on domain."),
Long: fmt.Sprintf("* List info on domain. "),
//Example: fmt.Sprintf("%s ls domain", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdListDomainFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdListDomainFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ListDomain(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdReadDomain = &cobra.Command{
Use: web.GetStructName(domain.Domain{}),
Aliases: aliasDomains,
Short: fmt.Sprintf("Read all Domains"),
Long: fmt.Sprintf("Read all Domains"),
Example: fmt.Sprintf("%s read contact", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdReadDomainsFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdReadDomainsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ReadDomain(args[0])
if Cmd.Error != nil {
break
}
}
}
//// ******************************************************************************** //
//var cmdUpdateDomain = &cobra.Command{
// Use: web.GetStructName(domain.ApiAppKey{}),
// Aliases: aliasDomains,
// Short: fmt.Sprintf("Update Google sheet: domain."),
// Long: fmt.Sprintf("Update Google sheet: domain. "),
// Example: fmt.Sprintf("%s update domain", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdUpdateDomainFunc,
// Args: cobra.RangeArgs(0, 1),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdUpdateDomainFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// Cmd.Error = Cmd.GoogleUpdate("domain")
// if Cmd.Error != nil {
// break
// }
// }
//}

110
cmd/OLD/cmd_api_mac.go Normal file
View File

@@ -0,0 +1,110 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/mac"
"GoSungro/iSolarCloud/web"
"fmt"
"github.com/spf13/cobra"
)
var aliasMacs = []string{"macs"}
// ******************************************************************************** //
var cmdCountMacs = &cobra.Command{
Use: web.GetStructName(mac.Mac{}),
Aliases: aliasMacs,
Short: fmt.Sprintf("Count all Macs"),
Long: fmt.Sprintf("Count all Macs"),
Example: fmt.Sprintf("%s count mac", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCountMacsFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdCountMacsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.CountMacs(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdListMacs = &cobra.Command{
Use: web.GetStructName(mac.Mac{}),
Aliases: aliasMacs,
Short: fmt.Sprintf("List all Macs"),
Long: fmt.Sprintf("List all Macs"),
Example: fmt.Sprintf("%s ls mac", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdListMacsFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdListMacsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ListMacs(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdReadMacs = &cobra.Command{
Use: web.GetStructName(mac.Mac{}),
Aliases: aliasMacs,
Short: fmt.Sprintf("Read all Macs"),
Long: fmt.Sprintf("Read all Macs"),
Example: fmt.Sprintf("%s read mac", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdReadMacsFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdReadMacsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ReadMacs(args[0])
if Cmd.Error != nil {
break
}
}
}
//// ******************************************************************************** //
//var cmdUpdateMacs = &cobra.Command{
// Use: web.GetStructName(mac.Mac{}),
// Aliases: aliasMacs,
// Short: fmt.Sprintf("Update Google sheet: Macs"),
// Long: fmt.Sprintf("Update Google sheet: Macs"),
// Example: fmt.Sprintf("%s update ndp", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdUpdateMacsFunc,
// Args: cobra.RangeArgs(0, 1),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdUpdateMacsFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// Cmd.Error = Cmd.GoogleUpdate("macs")
// if Cmd.Error != nil {
// break
// }
// }
//}

View File

@@ -0,0 +1,108 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/ndpServer"
"GoSungro/iSolarCloud/web"
"fmt"
"github.com/spf13/cobra"
)
var aliasNdpServers = []string{"ndpservers", "ndp"}
// ******************************************************************************** //
var cmdCountNdpServers = &cobra.Command{
Use: web.GetStructName(ndpServer.Ndp{}),
Aliases: aliasNdpServers,
Short: fmt.Sprintf("Count all NdpServers"),
Long: fmt.Sprintf("Count all NdpServers"),
Example: fmt.Sprintf("%s count ndp", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCountNdpServersFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdCountNdpServersFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.CountNdpServers()
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdListNdpServers = &cobra.Command{
Use: web.GetStructName(ndpServer.Ndp{}),
Aliases: aliasNdpServers,
Short: fmt.Sprintf("List all NdpServers"),
Long: fmt.Sprintf("List all NdpServers"),
Example: fmt.Sprintf("%s ls ndp", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdListNdpServersFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdListNdpServersFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
Cmd.Error = SunGro.ListNdpServer()
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdReadNdpServers = &cobra.Command{
Use: web.GetStructName(ndpServer.Ndp{}),
Aliases: aliasNdpServers,
Short: fmt.Sprintf("Read all NdpServers"),
Long: fmt.Sprintf("Read all NdpServers"),
Example: fmt.Sprintf("%s read profiles", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdReadNdpServersFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdReadNdpServersFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
Cmd.Error = SunGro.ReadNdpServer()
if Cmd.Error != nil {
break
}
}
}
//// ******************************************************************************** //
//var cmdUpdateNdpServers = &cobra.Command{
// Use: web.GetStructName(ndpServer.Ndp{}),
// Aliases: aliasNdpServers,
// Short: fmt.Sprintf("Update Google sheet: NdpServers"),
// Long: fmt.Sprintf("Update Google sheet: NdpServers"),
// Example: fmt.Sprintf("%s update ndp", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdUpdateNdpServersFunc,
// Args: cobra.RangeArgs(0, 1),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdUpdateNdpServersFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// Cmd.Error = Cmd.GoogleUpdate("ndpserver")
// if Cmd.Error != nil {
// break
// }
// }
//}

110
cmd/OLD/cmd_api_presence.go Normal file
View File

@@ -0,0 +1,110 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/presence"
"GoSungro/iSolarCloud/web"
"fmt"
"github.com/spf13/cobra"
)
var aliasPresence = []string{"state", "online"}
// ******************************************************************************** //
var cmdCountPresence = &cobra.Command{
Use: web.GetStructName(presence.Presence{}),
Aliases: aliasPresence,
Short: fmt.Sprintf("* Count all presence"),
Long: fmt.Sprintf("* Count all presence "),
//Example: fmt.Sprintf("%s count presence", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCountPresenceFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdCountPresenceFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.CountPresence(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdListPresence = &cobra.Command{
Use: web.GetStructName(presence.Presence{}),
Aliases: aliasPresence,
Short: fmt.Sprintf("List all presence"),
Long: fmt.Sprintf("List all presence "),
Example: fmt.Sprintf("%s ls presence", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdListPresenceFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdListPresenceFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ListPresence(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdReadPresence = &cobra.Command{
Use: web.GetStructName(presence.Presence{}),
Aliases: aliasPresence,
Short: fmt.Sprintf("* Read all presence"),
Long: fmt.Sprintf("* Read all presence "),
//Example: fmt.Sprintf("%s ls presence", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdReadPresenceFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdReadPresenceFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ReadPresence(args[0])
if Cmd.Error != nil {
break
}
}
}
//// ******************************************************************************** //
//var cmdUpdatePresence = &cobra.Command{
// Use: web.GetStructName(presence.Presence{}),
// Aliases: aliasPresence,
// Short: fmt.Sprintf("Update Google sheet: presence"),
// Long: fmt.Sprintf("Update Google sheet: presence "),
// Example: fmt.Sprintf("%s update presence", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdUpdatePresenceFunc,
// Args: cobra.RangeArgs(0, 1),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdUpdatePresenceFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// Cmd.Error = Cmd.GoogleUpdate("presence")
// if Cmd.Error != nil {
// break
// }
// }
//}

110
cmd/OLD/cmd_api_site.go Normal file
View File

@@ -0,0 +1,110 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/site"
"GoSungro/iSolarCloud/web"
"fmt"
"github.com/spf13/cobra"
)
var aliasSites = []string{"sites"}
// ******************************************************************************** //
var cmdCountSites = &cobra.Command{
Use: web.GetStructName(site.Site{}),
Aliases: aliasSites,
Short: fmt.Sprintf("Count all sites"),
Long: fmt.Sprintf("Count all sites "),
Example: fmt.Sprintf("%s count sites", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCountSitesFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdCountSitesFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.CountSites(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdListSites = &cobra.Command{
Use: web.GetStructName(site.Site{}),
Aliases: aliasSites,
Short: fmt.Sprintf("List all sites"),
Long: fmt.Sprintf("List all sites "),
Example: fmt.Sprintf("%s ls sites", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdListSitesFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdListSitesFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ListSites(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdReadSites = &cobra.Command{
Use: web.GetStructName(site.Site{}),
Aliases: aliasSites,
Short: fmt.Sprintf("Read all sites"),
Long: fmt.Sprintf("Read all sites "),
Example: fmt.Sprintf("%s read sites", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdReadSitesFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdReadSitesFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ReadSites(args[0])
if Cmd.Error != nil {
break
}
}
}
//// ******************************************************************************** //
//var cmdUpdateSites = &cobra.Command{
// Use: web.GetStructName(site.Site{}),
// Aliases: aliasSites,
// Short: fmt.Sprintf("Update Google sheet: sites"),
// Long: fmt.Sprintf("Update Google sheet: sites "),
// Example: fmt.Sprintf("%s update sites", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdUpdateSitesFunc,
// Args: cobra.RangeArgs(0, 2),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdUpdateSitesFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// Cmd.Error = Cmd.GoogleUpdate("site")
// if Cmd.Error != nil {
// break
// }
// }
//}

View File

@@ -0,0 +1,110 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/subscriber"
"GoSungro/iSolarCloud/web"
"fmt"
"github.com/spf13/cobra"
)
var aliasSubscribers = []string{"users", "user", "subscribers", "sub"}
// ******************************************************************************** //
var cmdCountUsers = &cobra.Command{
Use: web.GetStructName(subscriber.Subscriber{}),
Aliases: aliasSubscribers,
Short: fmt.Sprintf("Count all users"),
Long: fmt.Sprintf("Count all users "),
Example: fmt.Sprintf("%s count users", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCountUsersFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdCountUsersFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.CountUsers(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdListUsers = &cobra.Command{
Use: web.GetStructName(subscriber.Subscriber{}),
Aliases: aliasSubscribers,
Short: fmt.Sprintf("List all users"),
Long: fmt.Sprintf("List all users "),
Example: fmt.Sprintf("%s ls users", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdListUsersFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdListUsersFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.ListUsers(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdReadUsers = &cobra.Command{
Use: web.GetStructName(subscriber.Subscriber{}),
Aliases: aliasSubscribers,
Short: fmt.Sprintf("Read all users"),
Long: fmt.Sprintf("Read all users "),
Example: fmt.Sprintf("%s ls users", DefaultBinaryName),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdReadUsersFunc,
Args: cobra.RangeArgs(0, 2),
}
//goland:noinspection GoUnusedParameter
func cmdReadUsersFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(2, args)
Cmd.Error = SunGro.ReadUsers(args[0], args[1])
if Cmd.Error != nil {
break
}
}
}
//// ******************************************************************************** //
//var cmdUpdateUsers = &cobra.Command{
// Use: web.GetStructName(subscriber.Subscriber{}),
// Aliases: aliasSubscribers,
// Short: fmt.Sprintf("Update Google sheet: users"),
// Long: fmt.Sprintf("Update Google sheet: users "),
// Example: fmt.Sprintf("%s update users", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdUpdateUsersFunc,
// Args: cobra.RangeArgs(0, 1),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdUpdateUsersFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// Cmd.Error = Cmd.GoogleUpdate("user")
// if Cmd.Error != nil {
// break
// }
// }
//}

103
cmd/cmd_api.go Normal file
View File

@@ -0,0 +1,103 @@
package cmd
import (
"GoSungro/Only"
"fmt"
"github.com/spf13/cobra"
)
// ******************************************************************************** //
var cmdApi = &cobra.Command {
Use: "api",
Aliases: []string{},
Short: fmt.Sprintf("List SunGro areas."),
Long: fmt.Sprintf("List SunGro areas."),
Example: PrintExamples("api", "get <endpoint>", "put <endpoint>"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdApiFunc,
Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdApiFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
if len(args) == 0 {
Cmd.Error = cmd.Help()
break
}
}
}
// ******************************************************************************** //
var cmdApiList = &cobra.Command {
Use: "ls",
Aliases: []string{"list"},
Short: fmt.Sprintf("List api endpoints on iSolarCloud"),
Long: fmt.Sprintf("List api endpoints on iSolarCloud"),
Example: PrintExamples("api ls", "", "<endpoint>"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdApiListFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdApiListFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
if len(args) > 0 {
fmt.Println("Unknown sub-command.")
}
_ = cmd.Help()
}
}
// ******************************************************************************** //
var cmdApiGet = &cobra.Command {
Use: "get",
//Aliases: []string{""},
Short: fmt.Sprintf("Get details from iSolarCloud"),
Long: fmt.Sprintf("Get details from iSolarCloud"),
Example: PrintExamples("api get", "<endpoint>"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdApiGetFunc,
Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdApiGetFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
hey := SunGro.GetEndpoint("getPsList")
fmt.Printf("HEY:%v\n", hey)
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdApiPut = &cobra.Command {
Use: "put",
Aliases: []string{"write"},
Short: fmt.Sprintf("Put details onto iSolarCloud"),
Long: fmt.Sprintf("Put details onto iSolarCloud"),
Example: PrintExamples("api put", "<endpoint> <value>"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdApiPutFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdApiPutFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
Cmd.Error = SunGro.Init()
if Cmd.Error != nil {
break
}
}
}

79
cmd/cmd_api_domain.go Normal file
View File

@@ -0,0 +1,79 @@
package cmd
//
//var aliasCharts = []string{"charts"}
//
//// ******************************************************************************** //
//var cmdCountCharts = &cobra.Command{
// Use: web.GetStructName(domain.Domain{}),
// Aliases: aliasCharts,
// Short: fmt.Sprintf("Count all Charts"),
// Long: fmt.Sprintf("Count all Charts"),
// Example: fmt.Sprintf("%s count contact", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdCountChartsFunc,
// Args: cobra.RangeArgs(0, 1),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdCountChartsFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// args = fillArray(1, args)
// Cmd.Error = SunGro.Init()
// if Cmd.Error != nil {
// break
// }
// }
//}
//
//// ******************************************************************************** //
//var cmdListCharts = &cobra.Command{
// Use: web.GetStructName(domain.Domain{}),
// Aliases: aliasCharts,
// Short: fmt.Sprintf("List all Charts"),
// Long: fmt.Sprintf("List all Charts"),
// Example: fmt.Sprintf("%s ls contact", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdListChartsFunc,
// Args: cobra.RangeArgs(0, 1),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdListChartsFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// args = fillArray(1, args)
// Cmd.Error = SunGro.Init()
// if Cmd.Error != nil {
// break
// }
// }
//}
//
//// ******************************************************************************** //
//var cmdReadCharts = &cobra.Command{
// Use: web.GetStructName(domain.Domain{}),
// Aliases: aliasCharts,
// Short: fmt.Sprintf("Read all Charts"),
// Long: fmt.Sprintf("Read all Charts"),
// Example: fmt.Sprintf("%s ls contact", DefaultBinaryName),
// DisableFlagParsing: false,
// DisableFlagsInUseLine: false,
// PreRunE: Cmd.ProcessArgs,
// Run: cmdReadChartsFunc,
// Args: cobra.RangeArgs(0, 1),
//}
//
////goland:noinspection GoUnusedParameter
//func cmdReadChartsFunc(cmd *cobra.Command, args []string) {
// for range Only.Once {
// args = fillArray(1, args)
// Cmd.Error = SunGro.Init()
// if Cmd.Error != nil {
// break
// }
// }
//}

100
cmd/cmd_config.go Normal file
View File

@@ -0,0 +1,100 @@
package cmd
import (
"GoSungro/Only"
"fmt"
"github.com/spf13/cobra"
"os"
)
// ******************************************************************************** //
var cmdConfig = &cobra.Command{
Use: "config",
Short: "Create, update or show config file.",
Long: "Create, update or show config file.",
Example: PrintExamples("config", "read", "write", "write --git-dir=/some/other/directory"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdConfigFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdConfigFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
_, _ = fmt.Fprintf(os.Stderr, "Using config file '%s'\n", rootViper.ConfigFileUsed())
if len(args) == 0 {
_ = cmd.Help()
}
}
}
// ******************************************************************************** //
var cmdConfigWrite = &cobra.Command{
Use: "write",
Short: "Update config file.",
Long: "Update config file from CLI args.",
Example: PrintExamples("config write","", "--git-dir=/some/other/directory", "--diff-cmd=tkdiff"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdConfigWriteFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdConfigWriteFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
if len(args) == 1 {
Cmd.ConfigFile = args[0]
rootViper.SetConfigFile(Cmd.ConfigFile)
}
_, _ = fmt.Fprintf(os.Stderr, "Using config file '%s'\n", rootViper.ConfigFileUsed())
Cmd.Error = openConfig()
if Cmd.Error != nil {
break
}
Cmd.Error = writeConfig()
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdConfigRead = &cobra.Command{
Use: "read",
Short: "Read config file.",
Long: "Read config file.",
Example: PrintExamples("config read", ""),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdConfigReadFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdConfigReadFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
if len(args) == 1 {
Cmd.ConfigFile = args[0]
rootViper.SetConfigFile(Cmd.ConfigFile)
}
_, _ = fmt.Fprintf(os.Stderr, "Using config file '%s'\n", rootViper.ConfigFileUsed())
Cmd.Error = openConfig()
if Cmd.Error != nil {
break
}
PrintConfig(rootCmd)
//Cmd.Error = readConfig()
//if Cmd.Error != nil {
// break
//}
}
}

235
cmd/cmd_cron.go Normal file
View File

@@ -0,0 +1,235 @@
package cmd
import (
"GoSungro/Only"
"fmt"
"github.com/go-co-op/gocron"
"github.com/spf13/cobra"
"os"
"strings"
"time"
)
type CronStruct struct {
Scheduler *gocron.Scheduler
Job *gocron.Job
}
var Cron CronStruct
// ******************************************************************************** //
var cmdCron = &cobra.Command{
Use: "cron",
//Aliases: []string{},
Short: fmt.Sprintf("Run a command via schedule."),
Long: fmt.Sprintf("Run a command via schedule."),
Example: PrintExamples("cron","run 00 18 . . . sync default", "run 42 02 04 . . list all"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCronFunc,
Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdCronFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
if len(args) == 0 {
Cmd.Error = cmd.Help()
break
}
}
}
// ******************************************************************************** //
var cmdCronRun = &cobra.Command{
Use: "run <minute> <hour> <month day> <month> <week day> <command ...>",
//Aliases: []string{},
Short: fmt.Sprintf("Run scheduled a command."),
Long: fmt.Sprintf("Run scheduled a command."),
Example: PrintExamples("cron run","00 18 . . . sync default", "42 02 04 . . list all", "./1 . . . . list all"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCronRunFunc,
Args: cobra.MinimumNArgs(6),
}
//goland:noinspection GoUnusedParameter
func cmdCronRunFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
// */1 * * * * /dir/command args args
cronString := strings.Join(args[0:5], " ")
cronString = strings.ReplaceAll(cronString, ".", "*")
ResetArgs(args[5:]...)
Cron.Scheduler = gocron.NewScheduler(time.UTC)
Cron.Scheduler = Cron.Scheduler.Cron(cronString)
Cron.Scheduler = Cron.Scheduler.SingletonMode()
Cron.Job, Cmd.Error = Cron.Scheduler.Do(ReExecute)
if Cmd.Error != nil {
break
}
LogPrint("Created job schedule using '%s'\n", cronString)
LogPrint("Job command '%s'\n", strings.Join(os.Args, " "))
Cron.Scheduler.StartBlocking()
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdCronAdd = &cobra.Command{
Use: "add",
//Aliases: []string{},
Short: fmt.Sprintf("Add scheduled a command."),
Long: fmt.Sprintf("Add scheduled a command."),
Example: PrintExamples("cron", "add "),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCronAddFunc,
//Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdCronAddFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
fmt.Println("Not yet implemented.")
//var msg string
//switch {
// case args[0] == "":
// fallthrough
// case args[0] == "default":
// //u, _ := user.Current()
// //msg = fmt.Sprintf("Regular sync by %s", u.ApiUsername)
// default:
// msg = args[0]
//}
//
//args = args[1:]
//
////Cmd.Error = Cmd.CronAdd(msg, args...)
//if Cmd.Error != nil {
// break
//}
}
}
// ******************************************************************************** //
var cmdCronRemove = &cobra.Command{
Use: "del",
Aliases: []string{"remove"},
Short: fmt.Sprintf("Remove a scheduled command."),
Long: fmt.Sprintf("Remove a scheduled command."),
Example: PrintExamples("cron", "del "),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCronRemoveFunc,
//Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdCronRemoveFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
fmt.Println("Not yet implemented.")
//var msg string
//switch {
// case args[0] == "":
// fallthrough
// case args[0] == "default":
// //u, _ := user.Current()
// //msg = fmt.Sprintf("Regular sync by %s", u.ApiUsername)
// default:
// msg = args[0]
//}
//
//args = args[1:]
//
////Cmd.Error = Cmd.CronAdd(msg, args...)
//if Cmd.Error != nil {
// break
//}
}
}
// ******************************************************************************** //
var cmdCronList = &cobra.Command{
Use: "list",
//Aliases: []string{},
Short: fmt.Sprintf("List scheduled commands."),
Long: fmt.Sprintf("List scheduled commands."),
Example: PrintExamples("cron", "list "),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdCronListFunc,
//Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdCronListFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
fmt.Println("Not yet implemented.")
//var msg string
// switch {
// case args[0] == "":
// fallthrough
// case args[0] == "default":
// //u, _ := user.Current()
// //msg = fmt.Sprintf("Regular sync by %s", u.ApiUsername)
// default:
// msg = args[0]
//}
//
//args = args[1:]
//
//Cmd.Error = Cmd.CronList(msg, args...)
//if Cmd.Error != nil {
// break
//}
}
}
func timeStamp() string {
return time.Now().UTC().Format(time.UnixDate) + " : "
}
func LogPrint(format string, args ...interface{}) {
format = timeStamp() + format
fmt.Printf(format, args...)
}
func ReExecute() error {
for range Only.Once {
LogPrint("Running scheduled command '%s'\n", strings.Join(os.Args, " "))
//LogPrint("Last run '%s'\n", Cron.Job.LastRun().Format(time.UnixDate))
LogPrint("Next run '%s'\n", Cron.Job.ScheduledTime().Format(time.UnixDate))
LogPrint("Run count '%d'\n", Cron.Job.RunCount())
Cmd.Error = rootCmd.Execute()
if Cmd.Error != nil {
LogPrint("ERROR: %s\n", Cmd.Error)
break
}
}
return Cmd.Error
}
func ResetArgs(args ...string) {
for range Only.Once {
//fmt.Printf("oldArgs: %v\n", os.Args)
newArgs := []string{os.Args[0]}
newArgs = append(newArgs, args...)
os.Args = newArgs
//fmt.Printf("newArgs: %v\n", os.Args)
}
}

280
cmd/cmd_git.go Normal file
View File

@@ -0,0 +1,280 @@
package cmd
import (
"GoSungro/Only"
"fmt"
"github.com/spf13/cobra"
"strings"
)
// ******************************************************************************** //
var cmdGit = &cobra.Command{
Use: "git",
//Aliases: []string{""},
Short: fmt.Sprintf("Git related commands."),
Long: fmt.Sprintf("Git related commands. "),
Example: PrintExamples("git", "clone", "ls -la", "diff generate.org.au.json", "commit"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdGitFunc,
//Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdGitFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
if len(args) == 0 {
_ = cmd.Help()
}
}
}
// ******************************************************************************** //
var cmdSave = &cobra.Command{
Use: "save [area]",
Aliases: []string{},
Short: fmt.Sprintf("Save SunGro areas as JSON files."),
Long: fmt.Sprintf("Save SunGro areas as JSON files."),
Example: PrintExamples("save", "all", "site", "presence", "device"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdSaveFunc,
Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdSaveFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
if len(args) == 0 {
args = DefaultAreas
}
if args[0] == "all" {
args = DefaultAreas
}
Cmd.Error = Git.Connect()
if Cmd.Error != nil {
break
}
Cmd.Error = Cmd.GitSave(args...)
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdGitClone = &cobra.Command{
Use: "clone",
//Aliases: []string{"ls"},
Short: fmt.Sprintf("Clone git repo."),
Long: fmt.Sprintf("Clone git repo. "),
Example: PrintExamples("git clone", ""),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdGitCloneFunc,
//Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdGitCloneFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
Cmd.Error = Git.Clone()
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdGitCommit = &cobra.Command{
Use: "commit [message]",
//Aliases: []string{"ls"},
Short: fmt.Sprintf("Commit git changes."),
Long: fmt.Sprintf("Commit git changes. "),
Example: PrintExamples("git commit", "this is a commit message"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdGitCommitFunc,
Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdGitCommitFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
if args[0] == "" {
_ = cmd.Help()
break
}
Cmd.Error = Git.Connect()
if Cmd.Error != nil {
break
}
Cmd.Error = Git.Commit(strings.Join(args, " "))
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdGitAdd = &cobra.Command{
Use: "add <filename>",
//Aliases: []string{"write"},
Short: fmt.Sprintf("Add files to Git repo."),
Long: fmt.Sprintf("Add files to Git repo. "),
Example: PrintExamples("git add", ".", "generate.org.au.json"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdGitAddFunc,
Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdGitAddFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
if args[0] == "" {
_ = cmd.Help()
break
}
Cmd.Error = Git.Connect()
if Cmd.Error != nil {
break
}
Cmd.Error = Git.Add(args[0])
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdGitPull = &cobra.Command{
Use: "pull",
//Aliases: []string{"write"},
Short: fmt.Sprintf("Pull Git repo."),
Long: fmt.Sprintf("Pull Git repo. "),
Example: PrintExamples("git pull", ""),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdGitPullFunc,
Args: cobra.MaximumNArgs(0),
}
//goland:noinspection GoUnusedParameter
func cmdGitPullFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
Cmd.Error = Git.Connect()
if Cmd.Error != nil {
break
}
Cmd.Error = Git.Pull()
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdGitPush = &cobra.Command{
Use: "push",
//Aliases: []string{"write"},
Short: fmt.Sprintf("Push Git repo."),
Long: fmt.Sprintf("Push Git repo. "),
Example: PrintExamples("git push", ""),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdGitPushFunc,
Args: cobra.MaximumNArgs(0),
}
//goland:noinspection GoUnusedParameter
func cmdGitPushFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
Cmd.Error = Git.Connect()
if Cmd.Error != nil {
break
}
Cmd.Error = Git.Push()
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdGitDiff = &cobra.Command{
Use: "diff <filename>",
//Aliases: []string{"write"},
Short: fmt.Sprintf("Show diffs between current and last version."),
Long: fmt.Sprintf("Show diffs between current and last version. "),
Example: PrintExamples("git diff", "generate.org.au.json"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdGitDiffFunc,
Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdGitDiffFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
args = fillArray(1, args)
if args[0] == "" {
_ = cmd.Help()
break
}
Cmd.Error = Git.Connect()
if Cmd.Error != nil {
break
}
path := AddJsonSuffix(args[0])
Cmd.Error = Git.Diff(path)
if Cmd.Error != nil {
break
}
}
}
// ******************************************************************************** //
var cmdGitLs = &cobra.Command{
Use: "ls <filename>",
Aliases: []string{"list"},
Short: fmt.Sprintf("List files in Git repo."),
Long: fmt.Sprintf("List files in Git repo. "),
Example: PrintExamples("git ls", "-la", "-l README.md"),
DisableFlagParsing: true,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdGitLsFunc,
//Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdGitLsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
//args = fillArray(1, args)
Cmd.Error = Cmd.GitLs(args...)
if Cmd.Error != nil {
break
}
}
}

68
cmd/cmd_google.go Normal file
View File

@@ -0,0 +1,68 @@
package cmd
import (
"GoSungro/Only"
"fmt"
"github.com/spf13/cobra"
)
// ******************************************************************************** //
var cmdGoogle = &cobra.Command{
Use: "google",
//Aliases: []string{"refresh"},
Short: fmt.Sprintf("Update and view Google sheets."),
Long: fmt.Sprintf("Update and view Google sheets."),
Example: PrintExamples("google", "update all", "update users"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdGoogleFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdGoogleFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
switch {
case len(args) == 0:
Cmd.Error = cmd.Help()
case args[0] == "all":
Cmd.Error = Cmd.GoogleUpdate()
default:
fmt.Println("Unknown sub-command.")
_ = cmd.Help()
}
}
}
// ******************************************************************************** //
var cmdGoogleUpdate = &cobra.Command{
Use: "update",
//Aliases: []string{"refresh"},
Short: fmt.Sprintf("Update Google sheets."),
Long: fmt.Sprintf("Update Google sheets."),
Example: PrintExamples("google update", "all", "presence", "user"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdGoogleUpdateFunc,
Args: cobra.RangeArgs(0, 1),
}
//goland:noinspection GoUnusedParameter
func cmdGoogleUpdateFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
switch {
case len(args) == 0:
Cmd.Error = cmd.Help()
case args[0] == "all":
Cmd.Error = Cmd.GoogleUpdate()
default:
fmt.Println("Unknown sub-command.")
_ = cmd.Help()
}
}
}

223
cmd/cmd_help.go Normal file
View File

@@ -0,0 +1,223 @@
package cmd
import (
"GoSungro/Only"
"fmt"
"github.com/olekukonko/tablewriter"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"os"
"strings"
)
const DefaultHelpTemplate = `{{with (or .Long .Short)}}{{. | trimTrailingWhitespaces}}
{{end}}{{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}`
const DefaultUsageTemplate = `Usage:{{if .Runnable}}
{{.UseLine}}{{end}}{{if .HasAvailableSubCommands}}
{{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}}
Aliases:
{{.NameAndAliases}}{{end}}{{if .HasExample}}
Examples:
{{.Example}}{{end}}{{if .HasAvailableSubCommands}}
Available Commands:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "help"))}}
{{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}}
Flags: Use "{{.Root.CommandPath}} help-all" for more info.
Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand }}
{{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}}
Use "{{.CommandPath}} help [command]" for more information about a command.{{end}}
`
const DefaultVersionTemplate = `
{{with .Name}}{{printf "%s " .}}{{end}}{{printf "version %s" .Version}}
`
const DefaultFlagHelpTemplate = `{{if .HasAvailableInheritedFlags}}Flags available for all commands:
{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}
`
// ******************************************************************************** //
var cmdHelpFlags = &cobra.Command{
Use: "help-all",
//Aliases: []string{"flags"},
Short: fmt.Sprintf("Extended help"),
Long: fmt.Sprintf("Extended help"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdHelpFlagsFunc,
Args: cobra.RangeArgs(0, 0),
}
//goland:noinspection GoUnusedParameter
func cmdHelpFlagsFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
if len(args) > 0 {
fmt.Println("Unknown sub-command.")
}
ExtendedHelp()
//cmd.SetUsageTemplate(DefaultFlagHelpTemplate)
cmd.SetUsageTemplate("")
_ = cmd.Help()
PrintFlags(rootCmd)
}
}
func PrintExamples(cmd string, examples ...string) string {
var ret string
for _, example := range examples {
ret += fmt.Sprintf("\t%s %s %s\n", DefaultBinaryName, cmd, example)
}
return ret
}
func PrintFlags(cmd *cobra.Command) {
fmt.Printf("\nUsing environment variables instad of flags.\n")
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{"Flag", "Short flag", "Environment", "Description", "Default"})
table.SetBorder(true)
cmd.PersistentFlags().SortFlags = false
cmd.Flags().SortFlags = false
cmd.Flags().VisitAll(func(flag *pflag.Flag) {
if flag.Hidden {
return
}
sh := ""
if flag.Shorthand != "" {
sh = "-" + flag.Shorthand
}
table.Append([]string{
"--" + flag.Name,
sh,
PrintFlagEnv(flag.Name),
flag.Usage,
flag.DefValue,
//flag.Value.String(),
})
})
table.Render()
}
func PrintConfig(cmd *cobra.Command) {
fmt.Printf("Config file '%s':\n", Cmd.ConfigFile)
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{"Flag", "Short flag", "Environment", "Description", "Value"})
table.SetBorder(true)
cmd.PersistentFlags().SortFlags = false
cmd.Flags().SortFlags = false
cmd.Flags().VisitAll(func(flag *pflag.Flag) {
if flag.Hidden {
return
}
sh := ""
if flag.Shorthand != "" {
sh = "-" + flag.Shorthand
}
table.Append([]string{
"--" + flag.Name,
sh,
PrintFlagEnv(flag.Name),
flag.Usage,
flag.Value.String(),
//flag.Value.String(),
})
})
table.Render()
}
func PrintFlagEnv(flag string) string {
fenv := strings.ReplaceAll(flag, "-", "_")
fenv = strings.ToUpper(fenv)
//ret := fmt.Sprintf("--%s\t%s_%s\n", flag, EnvPrefix, fenv)
ret := fmt.Sprintf("%s_%s", EnvPrefix, fenv)
return ret
}
func ExtendedHelp() {
var str = `
DefaultBinaryName - Over The Wire SunGro to Gitlab syncing tool.
This tool does several things:
1. Pull a Gitlab repo that holds SunGro data.
2. Fetch all data available from the SunGro.
3. Save this data as a JSON file.
4. Commit changes to the Gitlab repo.
5. Push changes to remote.
It is intended to provide full revision history for any changes made to the SunGro.
Use case example:
# Record changes made to user data on SunGro. (Will clone if not existing.)
% DefaultBinaryName sync 'Updated users' users
# Record changes made to all SunGro manually.
% DefaultBinaryName sync 'Updated all zones'
# Record changes made to the SunGro with default commit message.
% DefaultBinaryName sync default
# Record changes made to the SunGro via every 30 minutes.
% DefaultBinaryName cron run ./30 . . . . sync default
# Show changes made to a zone JSON file.
% DefaultBinaryName git diff devices.json
# Other available Gitlab commands.
Clone repo.
% DefaultBinaryName git clone
Pull repo.
% DefaultBinaryName git pull
Add files to repo.
% DefaultBinaryName git add .
Push repo.
% DefaultBinaryName git push
Commit changes to repo.
% DefaultBinaryName git commit 'this is a commit message'
# Config file.
Show current config.
% DefaultBinaryName config read
Change diff command used in compares.
% DefaultBinaryName --diff-cmd='sdiff' config write
Change Git repo directory.
% DefaultBinaryName --git-dir=/some/other/directory config write
Change Git repo url.
% DefaultBinaryName --git-url=https://github.com/MickMake/iSolarData config write
Change SunGro API token.
% DefaultBinaryName --cf-token='this is a token string' config write
`
str = strings.ReplaceAll(str, "DefaultBinaryName", DefaultBinaryName)
fmt.Println(str)
}

28
cmd/cmd_version.go Normal file
View File

@@ -0,0 +1,28 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/defaults"
"fmt"
"github.com/spf13/cobra"
)
// ******************************************************************************** //
var cmdVersion = &cobra.Command{
Use: "version",
Short: "Version info.",
Long: "Version info.",
Example: PrintExamples("version", ""),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdVersionFunc,
Args: cobra.RangeArgs(0, 0),
}
//goland:noinspection GoUnusedParameter
func cmdVersionFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
fmt.Printf("%s v%s\n", DefaultBinaryName, defaults.Version)
}
}

58
cmd/commands.go Normal file
View File

@@ -0,0 +1,58 @@
package cmd
import (
"GoSungro/Only"
"fmt"
"github.com/spf13/cobra"
"os/user"
)
// ******************************************************************************** //
var cmdSync = &cobra.Command{
Use: "sync <commit msg | default> [area]",
Aliases: []string{},
Short: fmt.Sprintf("Sync SunGro to Git repo."),
Long: fmt.Sprintf("Sync SunGro to Git repo."),
Example: PrintExamples("sync", "default", "'updated everything'", "'this is an update' users"),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.ProcessArgs,
Run: cmdSyncFunc,
Args: cobra.MinimumNArgs(1),
}
//goland:noinspection GoUnusedParameter
func cmdSyncFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
if len(args) < 1 {
Cmd.Error = cmd.Help()
break
}
var msg string
switch {
case args[0] == "":
fallthrough
case args[0] == "default":
u, _ := user.Current()
msg = fmt.Sprintf("Regular sync by %s", u.Username)
default:
msg = args[0]
}
args = args[1:]
if len(args) == 0 {
args = DefaultAreas
}
Cmd.Error = Git.Connect()
if Cmd.Error != nil {
break
}
Cmd.Error = Cmd.GitSync(msg, args...)
if Cmd.Error != nil {
break
}
}
}

354
cmd/root.go Normal file
View File

@@ -0,0 +1,354 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/iSolarCloud"
"GoSungro/mmGit"
"fmt"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"
"os"
"path/filepath"
"strings"
)
var SunGro *iSolarCloud.SunGro
var Git *mmGit.Git
var Cmd CommandArgs
var rootViper *viper.Viper
var rootCmd = &cobra.Command{
Use: DefaultBinaryName,
Short: fmt.Sprintf("%s - Manage an SunGro instance", DefaultBinaryName),
Long: fmt.Sprintf("%s - Manage an SunGro instance", DefaultBinaryName),
Run: gbRootFunc,
TraverseChildren: true,
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
// You can bind cobra and viper in a few locations, but PersistencePreRunE on the root command works well
return initConfig(cmd)
},
}
func init() {
for range Only.Once {
rootViper = viper.New()
Cmd.ConfigDir, Cmd.Error = os.UserHomeDir()
if Cmd.Error != nil {
break
}
Cmd.ConfigDir = filepath.Join(Cmd.ConfigDir, "."+DefaultBinaryName)
_, Cmd.Error = os.Stat(Cmd.ConfigDir)
if os.IsExist(Cmd.Error) {
break
}
Cmd.Error = os.MkdirAll(Cmd.ConfigDir, 0700)
if Cmd.Error != nil {
break
}
Cmd.ConfigFile = filepath.Join(Cmd.ConfigDir, defaultConfigFile)
rootCmd.PersistentFlags().StringVarP(&Cmd.ApiUsername, flagApiUsername, "u", "", fmt.Sprintf("SunGro: api username."))
rootViper.SetDefault(flagApiUsername, "")
rootCmd.PersistentFlags().StringVarP(&Cmd.ApiPassword, flagApiPassword, "p", "", fmt.Sprintf("SunGro: api password."))
rootViper.SetDefault(flagApiPassword, "")
rootCmd.PersistentFlags().StringVarP(&Cmd.ApiAppKey, flagApiAppKey, "", "", fmt.Sprintf("SunGro: api application key."))
rootViper.SetDefault(flagApiAppKey, "")
rootCmd.PersistentFlags().StringVarP(&Cmd.ApiUrl, flagApiUrl, "", defaultHost, fmt.Sprintf("SunGro: Provider API URL."))
rootViper.SetDefault(flagApiUrl, "")
rootCmd.PersistentFlags().DurationVarP(&Cmd.ApiTimeout, flagApiTimeout, "", defaultTimeout, fmt.Sprintf("SunGro: API timeout."))
rootViper.SetDefault(flagApiTimeout, "")
rootCmd.PersistentFlags().StringVar(&Cmd.ApiTokenExpiry, flagApiTokenExpiry, "", "SunGro: token expiry.")
rootViper.SetDefault(flagApiTokenExpiry, "")
_ = rootCmd.PersistentFlags().MarkHidden(flagApiTokenExpiry)
rootCmd.PersistentFlags().StringVarP(&Cmd.GoogleSheet, flagGoogleSheet, "", "", fmt.Sprintf("Google: Sheet URL for updates."))
rootViper.SetDefault(flagGoogleSheet, "")
rootCmd.PersistentFlags().BoolVarP(&Cmd.GoogleSheetUpdate, flagGoogleSheetUpdate, "", false, fmt.Sprintf("Update Google sheets."))
rootViper.SetDefault(flagGoogleSheetUpdate, false)
_ = rootCmd.PersistentFlags().MarkHidden(flagGoogleSheetUpdate)
rootCmd.PersistentFlags().StringVarP(&Cmd.GitRepo, flagGitRepo, "", "", fmt.Sprintf("Git: Repo url for updates."))
rootViper.SetDefault(flagGitRepo, "")
rootCmd.PersistentFlags().StringVarP(&Cmd.GitRepoDir, flagGitRepoDir, "", "", fmt.Sprintf("Git: Local repo directory."))
rootViper.SetDefault(flagGitRepoDir, "")
rootCmd.PersistentFlags().StringVarP(&Cmd.GitUsername, flagGitUsername, "", "", fmt.Sprintf("Git: Repo username."))
rootViper.SetDefault(flagGitUsername, "")
rootCmd.PersistentFlags().StringVarP(&Cmd.GitPassword, flagGitPassword, "", "", fmt.Sprintf("Git: Repo password."))
rootViper.SetDefault(flagGitPassword, "")
rootCmd.PersistentFlags().StringVarP(&Cmd.GitKeyFile, flagGitKeyFile, "", "", fmt.Sprintf("Git: Repo SSH keyfile."))
rootViper.SetDefault(flagGitKeyFile, "")
rootCmd.PersistentFlags().StringVarP(&Cmd.GitToken, flagGitToken, "", "", fmt.Sprintf("Git: Repo token string."))
rootViper.SetDefault(flagGitToken, "")
rootCmd.PersistentFlags().StringVarP(&Cmd.GitDiffCmd, flagGitDiffCmd, "", "tkdiff", fmt.Sprintf("Git: Command for diffs."))
rootViper.SetDefault(flagGitDiffCmd, "tkdiff")
rootCmd.PersistentFlags().StringVar(&Cmd.ConfigFile, flagConfigFile, Cmd.ConfigFile, fmt.Sprintf("%s: config file.", DefaultBinaryName))
//_ = rootCmd.PersistentFlags().MarkHidden(flagConfigFile)
rootCmd.PersistentFlags().BoolVarP(&Cmd.Debug, flagDebug, "", false, fmt.Sprintf("%s: Debug mode.", DefaultBinaryName))
rootViper.SetDefault(flagDebug, false)
rootCmd.PersistentFlags().BoolVarP(&Cmd.Quiet, flagQuiet, "q", false, fmt.Sprintf("%s: Silence all messages.", DefaultBinaryName))
rootViper.SetDefault(flagQuiet, false)
//cobra.OnInitialize(initConfig)
cobra.EnableCommandSorting = false
rootCmd.PersistentFlags().SortFlags = false
rootCmd.Flags().SortFlags = false
}
}
func InitCommands() error {
var err error
for range Only.Once {
rootCmd.AddCommand(cmdConfig, cmdSync, cmdApi, cmdGit, cmdGoogle, cmdCron, cmdVersion, cmdHelpFlags)
cmdConfig.AddCommand(cmdConfigWrite, cmdConfigRead)
cmdGit.AddCommand(cmdSave, cmdGitLs, cmdGitDiff, cmdGitClone, cmdGitPull, cmdGitPush, cmdGitCommit, cmdGitAdd)
cmdGoogle.AddCommand(cmdGoogleUpdate)
cmdCron.AddCommand(cmdCronRun, cmdCronAdd, cmdCronRemove, cmdCronList)
cmdApi.AddCommand(cmdApiList, cmdApiPut, cmdApiGet)
//cmdApiList.AddCommand(
// cmdListCharts,
//)
//cmdApiGet.AddCommand(
// cmdCountCharts,
//)
//cmdApiPut.AddCommand(
// cmdReadCharts,
//)
//foo := rootCmd.HelpTemplate()
//foo := rootCmd.UsageTemplate()
//foo := rootCmd.VersionTemplate()
//fmt.Println(foo)
rootCmd.SetHelpTemplate(DefaultHelpTemplate)
rootCmd.SetUsageTemplate(DefaultUsageTemplate)
rootCmd.SetVersionTemplate(DefaultVersionTemplate)
foo := rootCmd.Commands()
foo[0].CommandPath()
}
return err
}
// initConfig reads in config file and ENV variables if set.
func initConfig(cmd *cobra.Command) error {
var err error
for range Only.Once {
rootViper = viper.New()
rootViper.AddConfigPath(Cmd.ConfigDir)
rootViper.SetConfigFile(Cmd.ConfigFile)
//rootViper.SetConfigName("config")
// If a config file is found, read it in.
err = openConfig()
if err != nil {
break
}
rootViper.SetEnvPrefix(EnvPrefix)
rootViper.AutomaticEnv() // read in environment variables that match
err = bindFlags(cmd, rootViper)
if err != nil {
break
}
}
return err
}
func openConfig() error {
var err error
for range Only.Once {
err = rootViper.ReadInConfig()
if _, ok := err.(viper.UnsupportedConfigError); ok {
break
}
if _, ok := err.(viper.ConfigParseError); ok {
break
}
if _, ok := err.(viper.ConfigMarshalError); ok {
break
}
if os.IsNotExist(err) {
rootViper.SetDefault(flagDebug, Cmd.Debug)
rootViper.SetDefault(flagQuiet, Cmd.Quiet)
rootViper.SetDefault(flagApiTokenExpiry, Cmd.ApiTokenExpiry)
rootViper.SetDefault(flagApiUrl, Cmd.ApiUrl)
rootViper.SetDefault(flagApiTimeout, Cmd.ApiTimeout)
rootViper.SetDefault(flagApiUsername, defaultUsername)
rootViper.SetDefault(flagApiPassword, defaultPassword)
rootViper.SetDefault(flagApiAppKey, Cmd.ApiAppKey)
rootViper.SetDefault(flagGoogleSheet, Cmd.GoogleSheet)
rootViper.SetDefault(flagGoogleSheetUpdate, Cmd.GoogleSheetUpdate)
rootViper.SetDefault(flagGitRepo, Cmd.GitRepo)
rootViper.SetDefault(flagGitRepoDir, Cmd.GitRepoDir)
rootViper.SetDefault(flagGitUsername, Cmd.GitUsername)
rootViper.SetDefault(flagGitPassword, Cmd.GitPassword)
rootViper.SetDefault(flagGitKeyFile, Cmd.GitKeyFile)
rootViper.SetDefault(flagGitToken, Cmd.GitToken)
rootViper.SetDefault(flagGitDiffCmd, Cmd.GitDiffCmd)
err = rootViper.WriteConfig()
if err != nil {
break
}
err = rootViper.ReadInConfig()
break
}
if err != nil {
break
}
err = rootViper.MergeInConfig()
if err != nil {
break
}
//err = viper.Unmarshal(Cmd)
}
return err
}
func writeConfig() error {
var err error
for range Only.Once {
err = rootViper.MergeInConfig()
if err != nil {
break
}
rootViper.Set(flagDebug, Cmd.Debug)
rootViper.Set(flagQuiet, Cmd.Quiet)
rootViper.Set(flagApiTokenExpiry, Cmd.ApiTokenExpiry)
rootViper.Set(flagApiUrl, Cmd.ApiUrl)
rootViper.Set(flagApiTimeout, Cmd.ApiTimeout)
rootViper.Set(flagApiUsername, Cmd.ApiUsername)
rootViper.Set(flagApiPassword, Cmd.ApiPassword)
rootViper.Set(flagApiAppKey, Cmd.ApiAppKey)
rootViper.Set(flagGoogleSheet, Cmd.GoogleSheet)
rootViper.Set(flagGoogleSheetUpdate, Cmd.GoogleSheetUpdate)
rootViper.Set(flagGitRepo, Cmd.GitRepo)
rootViper.Set(flagGitRepoDir, Cmd.GitRepoDir)
rootViper.Set(flagGitUsername, Cmd.GitUsername)
rootViper.Set(flagGitPassword, Cmd.GitPassword)
rootViper.Set(flagGitKeyFile, Cmd.GitKeyFile)
rootViper.Set(flagGitToken, Cmd.GitToken)
rootViper.Set(flagGitDiffCmd, Cmd.GitDiffCmd)
err = rootViper.WriteConfig()
if err != nil {
break
}
}
return err
}
func readConfig() error {
var err error
for range Only.Once {
err = rootViper.ReadInConfig()
if err != nil {
break
}
_, _ = fmt.Fprintln(os.Stderr, "Config file settings:")
_, _ = fmt.Fprintf(os.Stderr, "Api Url: %v\n", rootViper.Get(flagApiUrl))
_, _ = fmt.Fprintf(os.Stderr, "Api AppKey: %v\n", rootViper.Get(flagApiAppKey))
_, _ = fmt.Fprintf(os.Stderr, "Api Username: %v\n", rootViper.Get(flagApiUsername))
_, _ = fmt.Fprintf(os.Stderr, "Api Password: %v\n", rootViper.Get(flagApiPassword))
_, _ = fmt.Fprintln(os.Stderr)
_, _ = fmt.Fprintf(os.Stderr, "Git Repo URL: %v\n", rootViper.Get(flagGitRepo))
_, _ = fmt.Fprintf(os.Stderr, "Git Repo Dir: %v\n", rootViper.Get(flagGitRepoDir))
_, _ = fmt.Fprintf(os.Stderr, "Git Repo User: %v\n", rootViper.Get(flagGitUsername))
_, _ = fmt.Fprintf(os.Stderr, "Git Repo ApiPassword: %v\n", rootViper.Get(flagGitPassword))
_, _ = fmt.Fprintf(os.Stderr, "Git SSH keyfile: %v\n", rootViper.Get(flagGitKeyFile))
_, _ = fmt.Fprintf(os.Stderr, "Git Token: %v\n", rootViper.Get(flagGitToken))
_, _ = fmt.Fprintf(os.Stderr, "Git Diff Command: %v\n", rootViper.Get(flagGitDiffCmd))
_, _ = fmt.Fprintln(os.Stderr)
_, _ = fmt.Fprintf(os.Stderr, "Debug: %v\n", rootViper.Get(flagDebug))
_, _ = fmt.Fprintf(os.Stderr, "Quiet: %v\n", rootViper.Get(flagQuiet))
_, _ = fmt.Fprintf(os.Stderr, "ApiTimeout: %v\n", rootViper.Get(flagApiTimeout))
}
return err
}
func bindFlags(cmd *cobra.Command, v *viper.Viper) error {
var err error
cmd.Flags().VisitAll(func(f *pflag.Flag) {
// Environment variables can't have dashes in them, so bind them to their equivalent
// keys with underscores, e.g. --favorite-color to STING_FAVORITE_COLOR
if strings.Contains(f.Name, "-") {
envVarSuffix := strings.ToUpper(strings.ReplaceAll(f.Name, "-", "_"))
err = v.BindEnv(f.Name, fmt.Sprintf("%s_%s", EnvPrefix, envVarSuffix))
}
// Apply the viper config value to the flag when the flag is not set and viper has a value
if !f.Changed && v.IsSet(f.Name) {
val := v.Get(f.Name)
err = cmd.Flags().Set(f.Name, fmt.Sprintf("%v", val))
}
})
return err
}
func gbRootFunc(cmd *cobra.Command, args []string) {
for range Only.Once {
if len(args) == 0 {
_ = cmd.Help()
break
}
}
}
// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() error {
for range Only.Once {
Cmd.Error = InitCommands()
if Cmd.Error != nil {
break
}
err := rootCmd.Execute()
if err != nil {
break
}
if Cmd.Error != nil {
break
}
}
return Cmd.Error
}

380
cmd/struct.go Normal file
View File

@@ -0,0 +1,380 @@
package cmd
import (
"GoSungro/Only"
"GoSungro/google"
"GoSungro/iSolarCloud"
"GoSungro/iSolarCloud/web"
"GoSungro/lsgo"
"GoSungro/mmGit"
"errors"
"fmt"
"github.com/spf13/cobra"
"os"
"strings"
"time"
)
//goland:noinspection SpellCheckingInspection
const (
DefaultBinaryName = "GoSungro"
EnvPrefix = "SunGro"
defaultConfigFile = "config.json"
flagConfigFile = "config"
flagDebug = "debug"
flagQuiet = "quiet"
flagApiUrl = "host"
flagApiTimeout = "timeout"
flagApiUsername = "user"
flagApiPassword = "password"
flagApiAppKey = "appkey"
flagApiTokenExpiry = "token-expiry"
flagGoogleSheet = "google-sheet"
flagGoogleSheetUpdate = "update"
flagGitUsername = "git-username"
flagGitPassword = "git-password"
flagGitKeyFile = "git-sshkey"
flagGitToken = "git-token"
flagGitRepo = "git-repo"
flagGitRepoDir = "git-dir"
flagGitDiffCmd = "diff-cmd"
defaultHost = "https://augateway.isolarcloud.com"
defaultUsername = "harry@potter.net"
defaultPassword = "hogwarts"
defaultTimeout = time.Duration(time.Second * 30)
)
var DefaultAreas = []string{"domain", "site", "department", "user", "presence", "device", "model", "profile", "contact"}
type CommandArgs struct {
ConfigDir string
ConfigFile string
WriteConfig bool
Quiet bool
Debug bool
OutputType string
OutputFile string
// iSolarCloud api
ApiTimeout time.Duration
ApiUrl string
ApiUsername string
ApiPassword string
ApiAppKey string
ApiTokenExpiry string
// Google sheets
GoogleSheet string
GoogleSheetUpdate bool
// GitHub api
GitRepo string
GitRepoDir string
GitUsername string
GitPassword string
GitKeyFile string
GitToken string
GitDiffCmd string
Args []string
Valid bool
Error error
}
func (ca *CommandArgs) IsValid() error {
for range Only.Once {
if !ca.Valid {
ca.Error = errors.New("args are not valid")
break
}
}
return ca.Error
}
//goland:noinspection GoUnusedParameter
func (ca *CommandArgs) ProcessArgs(cmd *cobra.Command, args []string) error {
for range Only.Once {
ca.Args = args
SunGro = iSolarCloud.NewSunGro(ca.ApiUrl)
if SunGro.Error != nil {
break
}
Cmd.Error = SunGro.Init()
if Cmd.Error != nil {
break
}
auth := web.SunGroAuth {
TokenExpiry: ca.ApiTokenExpiry,
AppKey: ca.ApiAppKey,
Username: ca.ApiUsername,
Password: ca.ApiPassword,
}
ca.Error = SunGro.SetAuth(auth)
if ca.Error != nil {
break
}
if SunGro.HasTokenChanged() {
ca.ApiTokenExpiry = SunGro.GetTokenExpiry()
ca.Error = writeConfig()
}
if Cmd.GoogleSheetUpdate {
SunGro.OutputType = iSolarCloud.TypeGoogle
}
//Git.Error = Cmd.GitSet()
//if Cmd.Error != nil {
// break
//}
ca.Valid = true
}
return ca.Error
}
func (ca *CommandArgs) GitSet() error {
for range Only.Once {
if Git != nil {
break
}
Git = mmGit.New()
if Git.Error != nil {
ca.Error = Git.Error
break
}
//Cmd.Error = Git.SetAuth(ca.GitUsername, ca.GitPassword)
//if Cmd.Error != nil {
// break
//}
Cmd.Error = Git.SetKeyFile(ca.GitKeyFile)
if Cmd.Error != nil {
break
}
Cmd.Error = Git.SetToken(ca.GitToken)
if Cmd.Error != nil {
break
}
Cmd.Error = Git.SetRepo(ca.GitRepo)
if Cmd.Error != nil {
break
}
Cmd.Error = Git.SetDir(ca.GitRepoDir)
if Cmd.Error != nil {
break
}
Cmd.Error = Git.SetDiffCmd(ca.GitDiffCmd)
if Cmd.Error != nil {
break
}
}
return Cmd.Error
}
func (ca *CommandArgs) GitLs(options ...string) error {
for range Only.Once {
os.Args = []string{"GitLs"}
os.Args = append(os.Args, options...)
ca.Error = os.Chdir(ca.GitRepoDir)
if ca.Error != nil {
break
}
// ls-go is a standalone GoLang executable,
// but I've modified it to be a package and so directly callable.
ca.Error = lsgo.LsGo()
if ca.Error != nil {
break
}
}
return Cmd.Error
}
func (ca *CommandArgs) GitSync(msg string, entities ...string) error {
for range Only.Once {
Cmd.Error = Git.Pull()
if Cmd.Error != nil {
break
}
Cmd.Error = ca.GitSave(entities...)
if Cmd.Error != nil {
break
}
Cmd.Error = Git.Add(".")
if Cmd.Error != nil {
break
}
if msg == "" {
msg = fmt.Sprintf("Updated %d files.", len(entities))
}
Cmd.Error = Git.Commit(msg)
if Cmd.Error != nil {
break
}
Cmd.Error = Git.Push()
if Cmd.Error != nil {
break
}
}
return Cmd.Error
}
func (ca *CommandArgs) GitSave(entities ...string) error {
for range Only.Once {
if len(entities) == 0 {
entities = DefaultAreas
}
fmt.Printf("Saving %d entities from the SunGro to Git...\n", len(entities))
//SunGro.OutputType = iSolarCloud.StringTypeJson
SunGro.OutputType = iSolarCloud.TypeJson
//domain := SunGro.VerifyDomain("")
//user := SunGro.VerifyUser("")
for _, entity := range entities {
// Remove plurals.
entity = strings.TrimSuffix(entity, "s")
SunGro.OutputString = ""
switch entity {
case "domain":
SunGro.Error = SunGro.Init()
}
if SunGro.Error != nil {
break
}
jf := AddJsonSuffix(entity)
Cmd.Error = Git.SaveFile(jf, []byte(SunGro.OutputString))
if Cmd.Error != nil {
break
}
}
fmt.Printf("Saved %d files.", len(entities))
}
return Cmd.Error
}
func (ca *CommandArgs) GoogleUpdate(entities ...string) error {
for range Only.Once {
SunGro.OutputType = iSolarCloud.TypeGoogle
//domain := SunGro.VerifyDomain("")
//user := SunGro.VerifyUser("")
if len(entities) == 0 {
entities = DefaultAreas
}
fmt.Printf("Saving %d entities from the SunGro to Google Docs...\n", len(entities))
for _, entity := range entities {
switch entity {
case "domain":
ca.Error = SunGro.Init()
if ca.Error != nil {
break
}
}
sheet := google.Sheet {
Id: "",
Credentials: nil,
SheetName: entity,
Range: "",
Data: SunGro.OutputArray,
}
sheet.Set(sheet)
ca.Error = sheet.WriteSheet()
if ca.Error != nil {
break
}
}
}
return ca.Error
}
//func (ca *CommandArgs) UpdateGoogleSheet(name string, data [][]interface{}) error {
//
// for range Only.Once {
// sheet := google.Sheet{
// Id: "",
// Credentials: nil,
// SheetName: name,
// Range: "",
// Data: data,
// }
// sheet.Set(sheet)
// ca.Error = sheet.WriteSheet()
// if ca.Error != nil {
// break
// }
// }
//
// return p.Error
//}
//goland:noinspection GoUnusedFunction
func showArgs(cmd *cobra.Command, args []string) {
for range Only.Once {
flargs := cmd.Flags().Args()
if flargs != nil {
fmt.Printf("'%s' called with '%s'\n", cmd.CommandPath(), strings.Join(flargs, " "))
break
}
fmt.Printf("'%s' called with '%s'\n", cmd.CommandPath(), strings.Join(args, " "))
break
}
fmt.Println("")
}
func fillArray(count int, args []string) []string {
var ret []string
for range Only.Once {
//
//if len(args) == 0 {
// break
//}
ret = make([]string, count)
for i, e := range args {
ret[i] = e
}
}
return ret
}
func AddJsonSuffix(fn string) string {
return strings.TrimSuffix(fn, ".json") + ".json"
}

3
const.go Normal file
View File

@@ -0,0 +1,3 @@
package main
var OnceOnly = "1"

3
defaults/const.go Normal file
View File

@@ -0,0 +1,3 @@
package defaults
const Version = "2.1.3"

66
go.mod Normal file
View File

@@ -0,0 +1,66 @@
module GoSungro
go 1.17
require (
github.com/acarl005/textcol v0.0.0
github.com/go-co-op/gocron v1.11.0
github.com/go-git/go-billy/v5 v5.3.1
github.com/go-git/go-git/v5 v5.4.2
github.com/mattn/go-colorable v0.0.9
github.com/olekukonko/tablewriter v0.0.5
github.com/spf13/cobra v1.2.1
github.com/spf13/pflag v1.0.5
github.com/spf13/viper v1.8.1
github.com/willf/pad v0.0.0-20200313202418-172aa767f2a4
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602
golang.org/x/sys v0.0.0-20210510120138-977fb7262007
google.golang.org/api v0.44.0
gopkg.in/alecthomas/kingpin.v2 v2.2.6
)
require (
cloud.google.com/go v0.81.0 // indirect
github.com/Microsoft/go-winio v0.4.16 // indirect
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
github.com/acomagu/bufpipe v1.0.3 // indirect
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
github.com/emirpasic/gods v1.12.0 // indirect
github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/go-git/gcfg v1.5.0 // indirect
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/googleapis/gax-go/v2 v2.0.5 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/imdario/mergo v0.3.12 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
github.com/magiconair/properties v1.8.5 // indirect
github.com/mattn/go-isatty v0.0.3 // indirect
github.com/mattn/go-runewidth v0.0.9 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.4.1 // indirect
github.com/pelletier/go-toml v1.9.3 // indirect
github.com/robfig/cron/v3 v3.0.1 // indirect
github.com/sergi/go-diff v1.1.0 // indirect
github.com/spf13/afero v1.6.0 // indirect
github.com/spf13/cast v1.3.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/subosito/gotenv v1.2.0 // indirect
github.com/xanzy/ssh-agent v0.3.0 // indirect
go.opencensus.io v0.23.0 // indirect
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/text v0.3.5 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c // indirect
google.golang.org/grpc v1.38.0 // indirect
google.golang.org/protobuf v1.26.0 // indirect
gopkg.in/ini.v1 v1.62.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

694
go.sum Normal file
View File

@@ -0,0 +1,694 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
cloud.google.com/go v0.81.0 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8=
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk=
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ=
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo=
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8=
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
github.com/acarl005/textcol v0.0.0 h1:39UH8Ojpl8SMMKho1HgoQ8mQ7no4281u6SN/MyT5EU4=
github.com/acarl005/textcol v0.0.0/go.mod h1:o8VbpDKrBLFfZtTo/AXk03Zn3dQHYOLJ8v//eaDtl78=
github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk=
github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc=
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-co-op/gocron v1.11.0 h1:ujOMubCpGcTxnnR/9vJIPIEpgwuAjbueAYqJRNr+nHg=
github.com/go-co-op/gocron v1.11.0/go.mod h1:qtlsoMpHlSdIZ3E/xuZzrrAbeX3u5JtPvWf2TcdutU0=
github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34=
github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8=
github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0=
github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4=
github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck=
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
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/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A=
github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ=
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw=
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44=
github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/willf/pad v0.0.0-20200313202418-172aa767f2a4 h1:Y+IMUhhlO9FLTZpNrUAMWOr7Lh0tHDKu0nrDVhp6A7o=
github.com/willf/pad v0.0.0-20200313202418-172aa767f2a4/go.mod h1:+pVHwmjc9CH7ugBFxESIwQkXkVj0gUj4cFp63TLwP1Y=
github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI=
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 h1:0Ja1LBD+yisY6RWM/BH7TJVXWsSjs2VwBSmvSX4HdBc=
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
google.golang.org/api v0.44.0 h1:URs6qR1lAxDsqWITsQXI4ZkGiYJ5dHtRNiCpfs2OeKA=
google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0=
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0=
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
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 h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

9
google/const.go Normal file
View File

@@ -0,0 +1,9 @@
package google
const (
DefaultGoogleClientId = "424242424242-42424242424242424242424242424242.apps.googleusercontent.com"
DefaultGoogleClientSecret = "424242424242424242424242"
DefaultGoogleCredentials = `{"installed":{"client_id":"424242424242-42424242424242424242424242424242.apps.googleusercontent.com","project_id":"isolarcloud","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"424242424242424242424242","redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]}}
`
DefaultAuthTokenFile = "GoogleSheetsAuthToken.json"
)

111
google/sheet.go Normal file
View File

@@ -0,0 +1,111 @@
package google
import (
"GoSungro/Only"
"context"
"encoding/json"
"errors"
"fmt"
"golang.org/x/oauth2"
"net/http"
"os"
)
// Retrieve a token, saves the token, then returns the generated client.
func (s *Sheet) getClient() (*http.Client, error) {
var ret *http.Client
var err error
for range Only.Once {
// The file token.json stores the user's access and refresh tokens, and is
// created automatically when the authorization flow completes for the first
// time.
var err error
err = s.tokenFromFile()
if err != nil {
err = s.getTokenFromWeb()
if err != nil {
break
}
err = s.saveToken()
if err != nil {
break
}
}
ret = s.oAuthConfig.Client(context.Background(), s.token)
}
return ret, err
}
// Request a token from the web, then returns the retrieved token.
func (s *Sheet) getTokenFromWeb() error {
var err error
for range Only.Once {
authURL := s.oAuthConfig.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
fmt.Printf("Allow access to this application by going to this URL:\n%v\n", authURL)
fmt.Printf("\nThen copy-paste the authorization code here: ")
var authCode string
_, err = fmt.Scan(&authCode)
if err != nil {
err = errors.New(fmt.Sprintf("Unable to read authorization code: %v", err))
break
}
s.token, err = s.oAuthConfig.Exchange(context.TODO(), authCode)
if err != nil {
err = errors.New(fmt.Sprintf("Unable to retrieve token from web: %v", err))
break
}
}
return err
}
// Retrieves a token from a local file.
func (s *Sheet) tokenFromFile() error {
var err error
for range Only.Once {
if s.TokenFile == "" {
err = errors.New("Empty token filename")
break
}
var f *os.File
f, err = os.Open(s.TokenFile)
if err != nil {
break
}
defer f.Close()
//ret = &oauth2.token{}
err = json.NewDecoder(f).Decode(s.token)
}
return err
}
// Saves a token to a file path.
func (s *Sheet) saveToken() error {
var err error
for range Only.Once {
fmt.Printf("Saving token file to: %s\n", s.TokenFile)
var f *os.File
f, err = os.OpenFile(s.TokenFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
err = errors.New(fmt.Sprintf("Unable to cache oauth token: %v", err))
break
}
defer f.Close()
err = json.NewEncoder(f).Encode(s.token)
}
return err
}

193
google/struct.go Normal file
View File

@@ -0,0 +1,193 @@
package google
import (
"GoSungro/Only"
"context"
"errors"
"fmt"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"google.golang.org/api/googleapi"
"google.golang.org/api/option"
"google.golang.org/api/sheets/v4"
"net/http"
"os"
"path/filepath"
)
const DefaultId = "1R4OmGyQJZJWBZVgEazNS3UZE5YVkXBa_XFulut3pohQ"
type Sheet struct {
Id string
SheetName string
Range string
Credentials []byte
TokenFile string
token *oauth2.Token
oAuthConfig *oauth2.Config
Data SheetData
}
type SheetData [][]interface{}
func (s *Sheet) Set(cfg Sheet) {
for range Only.Once {
s.Id = cfg.Id
s.SheetName = cfg.SheetName
s.Range = cfg.Range
s.Credentials = cfg.Credentials
s.TokenFile = cfg.TokenFile
s.token = cfg.token
s.Verify()
}
}
func (s *Sheet) Verify() bool {
var ok bool
for range Only.Once {
if s.Id == "" {
s.Id = DefaultId
}
if s.SheetName == "" {
s.SheetName = ""
}
if s.Range == "" {
s.Range = "A1"
}
if len(s.Credentials) == 0 {
s.Credentials = []byte(DefaultGoogleCredentials)
}
// token *oauth2.token
// oAuthConfig *oauth2.Config
if s.oAuthConfig == nil {
s.oAuthConfig = &oauth2.Config{}
}
if s.token == nil {
s.token = &oauth2.Token{}
}
if len(s.TokenFile) == 0 {
var err error
s.TokenFile, err = os.UserHomeDir()
if err != nil {
s.TokenFile = ""
break
}
s.TokenFile = filepath.Join(s.TokenFile, ".GoSungro", DefaultAuthTokenFile)
}
ok = true
}
return ok
}
func (s *Sheet) ReadSheet() (SheetData, error) {
var err error
var csv SheetData
for range Only.Once {
if !s.Verify() {
break
}
// If modifying these scopes, delete your previously saved token.json.
s.oAuthConfig, err = google.ConfigFromJSON(s.Credentials, sheets.SpreadsheetsReadonlyScope)
if err != nil {
err = errors.New(fmt.Sprintf("Unable to parse client secret file to config: %v", err))
break
}
var client *http.Client
client, err = s.getClient()
ctx := context.Background()
var srv *sheets.Service
srv, err = sheets.NewService(ctx, option.WithHTTPClient(client))
if err != nil {
err = errors.New(fmt.Sprintf("Unable to retrieve Sheets client: %v", err))
break
}
readRange := fmt.Sprintf("%s!%s", s.SheetName, s.Range)
var resp *sheets.ValueRange
resp, err = srv.Spreadsheets.Values.Get(s.Id, readRange).Do()
if err != nil {
err = errors.New(fmt.Sprintf("Unable to retrieve data from sheet: %v", err))
break
}
if len(resp.Values) == 0 {
fmt.Println("No data found.")
break
}
for _, row := range resp.Values {
// Print columns A and E, which correspond to indices 0 and 4.
fmt.Printf("%v\n", row)
}
}
return csv, err
}
func (s *Sheet) WriteSheet() error {
var err error
for range Only.Once {
if !s.Verify() {
break
}
// If modifying these scopes, delete your previously saved token.json.
s.oAuthConfig, err = google.ConfigFromJSON(s.Credentials, sheets.SpreadsheetsScope)
if err != nil {
err = errors.New(fmt.Sprintf("Unable to parse client secret file to config: %v", err))
break
}
var client *http.Client
client, err = s.getClient()
//client = getClient(s.oAuthConfig)
ctx := context.Background()
var srv *sheets.Service
srv, err = sheets.NewService(ctx, option.WithHTTPClient(client))
if err != nil {
err = errors.New(fmt.Sprintf("Unable to retrieve Sheets client: %v", err))
break
}
//var itt = srv.Spreadsheets.getSheetByName('_EmailList');
//if (!itt) {
// ss.insertSheet('_EmailList');
//}
vr := sheets.ValueRange{
MajorDimension: "",
Range: s.SheetName + "!" + s.Range,
Values: s.Data,
ServerResponse: googleapi.ServerResponse{},
ForceSendFields: nil,
NullFields: nil,
}
writeRange := fmt.Sprintf("%s!%s", s.SheetName, s.Range)
fmt.Printf("Updating Google sheet '%s'.\n\tWorksheet: %s\n\tStarting from: %s\n",
s.Id,
s.SheetName,
s.Range,
)
_, err = srv.Spreadsheets.Values.Update(s.Id, writeRange, &vr).ValueInputOption("USER_ENTERED").Do() // or "RAW"
if err != nil {
err = errors.New(fmt.Sprintf("Unable to retrieve data from sheet. %v", err))
break
}
}
return err
}

View File

@@ -0,0 +1,123 @@
package agent
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *Agent) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *Agent) Count(domain string) (Count, error) {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count, t.Error
}
func (t *Agent) Create(domain string, device string) (Create, error) {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Device: device,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create, t.Error
}
func (t *Agent) Delete(domain string, device string) (Delete, error) {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Device: device,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete, t.Error
}
func (t *Agent) List(domain string) (List, error) {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list, t.Error
}
func (t *Agent) Read(domain string) (Read, error) {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read, t.Error
}
func (t *Agent) Update(domain string, device string) (Update, error) {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
Device: device,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update, t.Error
}

View File

@@ -0,0 +1,198 @@
package agent
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

View File

@@ -0,0 +1,117 @@
package agent
//goland:noinspection GoNameStartsWithPackageName
import (
"GoSungro/iSolarCloud/web"
"net/url"
)
type Agent struct {
count Count
create Create
delete Delete
list List
read Read
update Update
Web *web.Web
Error error
}
//const CountUrl = "?format=json&object=agent&action=count"
type Count struct {
Url *url.URL
Request CountRequest
Response CountResponse
Error error
}
type CountRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CountResponse struct {
Total int `json:"total"` // Total number of Devices for the specified ApiAppKey/User.
}
//const CreateUrl = "?format=json&object=agent&action=create"
type Create struct {
Url *url.URL
Request CreateRequest
Response CreateResponse
Error error
}
type CreateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CreateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const DeleteUrl = "?format=json&object=agent&action=delete"
type Delete struct {
Url *url.URL
Request DeleteRequest
Response DeleteResponse
Error error
}
type DeleteRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type DeleteResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ListUrl = "?format=json&object=agent&action=list"
type List struct {
Url *url.URL
Request ListRequest
Response ListResponse
Error error
}
type ListRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ListResponse []ListResponseSingle
type ListResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ReadUrl = "?format=json&object=agent&action=read"
type Read struct {
Url *url.URL
Request ReadRequest
Response ReadResponse
Error error
}
type ReadRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ReadResponse []ReadResponseSingle
type ReadResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const UpdateUrl = "?format=json&object=device&action=update"
type Update struct {
Url *url.URL
Request UpdateRequest
Response UpdateResponse
Error error
}
type UpdateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type UpdateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}

View File

@@ -0,0 +1,123 @@
package agentLog
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *AgentLog) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *AgentLog) Count(domain string) (Count, error) {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count, t.Error
}
func (t *AgentLog) Create(domain string, device string) (Create, error) {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Device: device,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create, t.Error
}
func (t *AgentLog) Delete(domain string, device string) (Delete, error) {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Device: device,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete, t.Error
}
func (t *AgentLog) List(domain string) (List, error) {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list, t.Error
}
func (t *AgentLog) Read(domain string) (Read, error) {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read, t.Error
}
func (t *AgentLog) Update(domain string, device string) (Update, error) {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
Device: device,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update, t.Error
}

View File

@@ -0,0 +1,198 @@
package agentLog
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

View File

@@ -0,0 +1,117 @@
package agentLog
//goland:noinspection GoNameStartsWithPackageName
import (
"GoSungro/iSolarCloud/web"
"net/url"
)
type AgentLog struct {
count Count
create Create
delete Delete
list List
read Read
update Update
Web *web.Web
Error error
}
//const CountUrl = "?format=json&object=agentLog&action=count"
type Count struct {
Url *url.URL
Request CountRequest
Response CountResponse
Error error
}
type CountRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CountResponse struct {
Total int `json:"total"` // Total number of Devices for the specified ApiAppKey/User.
}
//const CreateUrl = "?format=json&object=agentLog&action=create"
type Create struct {
Url *url.URL
Request CreateRequest
Response CreateResponse
Error error
}
type CreateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CreateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const DeleteUrl = "?format=json&object=agentLog&action=delete"
type Delete struct {
Url *url.URL
Request DeleteRequest
Response DeleteResponse
Error error
}
type DeleteRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type DeleteResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ListUrl = "?format=json&object=agentLog&action=list"
type List struct {
Url *url.URL
Request ListRequest
Response ListResponse
Error error
}
type ListRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ListResponse []ListResponseSingle
type ListResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ReadUrl = "?format=json&object=agentLog&action=read"
type Read struct {
Url *url.URL
Request ReadRequest
Response ReadResponse
Error error
}
type ReadRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ReadResponse []ReadResponseSingle
type ReadResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const UpdateUrl = "?format=json&object=device&action=update"
type Update struct {
Url *url.URL
Request UpdateRequest
Response UpdateResponse
Error error
}
type UpdateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type UpdateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}

View File

@@ -0,0 +1,96 @@
package iSolarCloud
import (
"GoSungro/Only"
"fmt"
)
func (p *SunGro) CountAgentLogs(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.AgentLog.Count(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("AgentLogs: %v\n", query.Response.Total)
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
}
return p.Error
}
func (p *SunGro) ListAgentLogs(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.AgentLog.List(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("AgentLogs:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}
func (p *SunGro) ReadAgentLogs(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.AgentLog.Read(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("AgentLogs:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}

View File

@@ -0,0 +1,95 @@
package iSolarCloud
import (
"GoSungro/Only"
"fmt"
)
func (p *SunGro) CountAgents(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.Agent.Count(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("Agents: %v\n", query.Response.Total)
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
_, _ = fmt.Printf("%s", query.Response.JsonString())
break
}
}
return p.Error
}
func (p *SunGro) ListAgents(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.Agent.List(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("Agents:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
_, _ = fmt.Printf("%s", query.Response.JsonString())
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}
func (p *SunGro) ReadAgents(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.Agent.Read(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("Agents:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
_, _ = fmt.Printf("%s", query.Response.JsonString())
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}

View File

@@ -0,0 +1,123 @@
package answerRule
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *AnswerRule) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *AnswerRule) Count(domain string) (Count, error) {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count, t.Error
}
func (t *AnswerRule) Create(domain string, device string) (Create, error) {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Device: device,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create, t.Error
}
func (t *AnswerRule) Delete(domain string, device string) (Delete, error) {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Device: device,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete, t.Error
}
func (t *AnswerRule) List(domain string) (List, error) {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list, t.Error
}
func (t *AnswerRule) Read(domain string) (Read, error) {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read, t.Error
}
func (t *AnswerRule) Update(domain string, device string) (Update, error) {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
Device: device,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update, t.Error
}

View File

@@ -0,0 +1,198 @@
package answerRule
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

View File

@@ -0,0 +1,117 @@
package answerRule
//goland:noinspection GoNameStartsWithPackageName
import (
"GoSungro/iSolarCloud/web"
"net/url"
)
type AnswerRule struct {
count Count
create Create
delete Delete
list List
read Read
update Update
Web *web.Web
Error error
}
//const CountUrl = "?format=json&object=answerRule&action=count"
type Count struct {
Url *url.URL
Request CountRequest
Response CountResponse
Error error
}
type CountRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CountResponse struct {
Total int `json:"total"` // Total number of Devices for the specified ApiAppKey/User.
}
//const CreateUrl = "?format=json&object=answerRule&action=create"
type Create struct {
Url *url.URL
Request CreateRequest
Response CreateResponse
Error error
}
type CreateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CreateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const DeleteUrl = "?format=json&object=answerRule&action=delete"
type Delete struct {
Url *url.URL
Request DeleteRequest
Response DeleteResponse
Error error
}
type DeleteRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type DeleteResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ListUrl = "?format=json&object=answerRule&action=list"
type List struct {
Url *url.URL
Request ListRequest
Response ListResponse
Error error
}
type ListRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ListResponse []ListResponseSingle
type ListResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ReadUrl = "?format=json&object=answerRule&action=read"
type Read struct {
Url *url.URL
Request ReadRequest
Response ReadResponse
Error error
}
type ReadRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ReadResponse []ReadResponseSingle
type ReadResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const UpdateUrl = "?format=json&object=device&action=update"
type Update struct {
Url *url.URL
Request UpdateRequest
Response UpdateResponse
Error error
}
type UpdateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type UpdateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}

View File

@@ -0,0 +1,100 @@
package iSolarCloud
import (
"GoSungro/Only"
"fmt"
)
func (p *SunGro) CountAnswerRules(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.AnswerRule.Count(domain)
if err != nil {
p.Error = err
break
}
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("AnswerRules: %v\n", query.Response.Total)
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
}
return p.Error
}
func (p *SunGro) ListAnswerRules(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.AnswerRule.List(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("AnswerRules:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}
func (p *SunGro) ReadAnswerRules(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.AnswerRule.Read(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("AnswerRules:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}

View File

@@ -0,0 +1,123 @@
package audio
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *Audio) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *Audio) Count(domain string) (Count, error) {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count, t.Error
}
func (t *Audio) Create(domain string, device string) (Create, error) {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Device: device,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create, t.Error
}
func (t *Audio) Delete(domain string, device string) (Delete, error) {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Device: device,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete, t.Error
}
func (t *Audio) List(domain string) (List, error) {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list, t.Error
}
func (t *Audio) Read(domain string) (Read, error) {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read, t.Error
}
func (t *Audio) Update(domain string, device string) (Update, error) {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
Device: device,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update, t.Error
}

View File

@@ -0,0 +1,198 @@
package audio
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

View File

@@ -0,0 +1,117 @@
package audio
//goland:noinspection GoNameStartsWithPackageName
import (
"GoSungro/iSolarCloud/web"
"net/url"
)
type Audio struct {
count Count
create Create
delete Delete
list List
read Read
update Update
Web *web.Web
Error error
}
//const CountUrl = "?format=json&object=audio&action=count"
type Count struct {
Url *url.URL
Request CountRequest
Response CountResponse
Error error
}
type CountRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CountResponse struct {
Total int `json:"total"` // Total number of Devices for the specified ApiAppKey/User.
}
//const CreateUrl = "?format=json&object=audio&action=create"
type Create struct {
Url *url.URL
Request CreateRequest
Response CreateResponse
Error error
}
type CreateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CreateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const DeleteUrl = "?format=json&object=audio&action=delete"
type Delete struct {
Url *url.URL
Request DeleteRequest
Response DeleteResponse
Error error
}
type DeleteRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type DeleteResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ListUrl = "?format=json&object=audio&action=list"
type List struct {
Url *url.URL
Request ListRequest
Response ListResponse
Error error
}
type ListRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ListResponse []ListResponseSingle
type ListResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ReadUrl = "?format=json&object=audio&action=read"
type Read struct {
Url *url.URL
Request ReadRequest
Response ReadResponse
Error error
}
type ReadRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ReadResponse []ReadResponseSingle
type ReadResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const UpdateUrl = "?format=json&object=device&action=update"
type Update struct {
Url *url.URL
Request UpdateRequest
Response UpdateResponse
Error error
}
type UpdateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type UpdateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}

View File

@@ -0,0 +1,98 @@
package iSolarCloud
import (
"GoSungro/Only"
"fmt"
)
func (p *SunGro) CountAudios(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.Audio.Count(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("Audios: %v\n", query.Response.Total)
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
}
return p.Error
}
func (p *SunGro) ListAudios(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.Audio.List(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("Audios:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}
func (p *SunGro) ReadAudios(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.Audio.Read(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("Audios:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}

View File

@@ -0,0 +1,123 @@
package call
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *Call) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *Call) Count(domain string) (Count, error) {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count, t.Error
}
func (t *Call) Create(domain string, device string) (Create, error) {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Device: device,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create, t.Error
}
func (t *Call) Delete(domain string, device string) (Delete, error) {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Device: device,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete, t.Error
}
func (t *Call) List(domain string) (List, error) {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list, t.Error
}
func (t *Call) Read(domain string) (Read, error) {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read, t.Error
}
func (t *Call) Update(domain string, device string) (Update, error) {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
Device: device,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update, t.Error
}

View File

@@ -0,0 +1 @@
package call

View File

@@ -0,0 +1,16 @@
package call
const CallRequestCountUrl = "?format=json&object=callrequest&action=count"
type CallRequestCountRequest struct {
}
type CallRequestCountResponse struct {
Total int `json:"total"` // Total number of CallRequests for the specified ApiAppKey/User.
}
const CallRequestReadUrl = "?format=json&object=callrequest&action=read"
type CallRequestReadRequest struct {
}
type CallRequestReadResponse struct {
}

View File

@@ -0,0 +1,198 @@
package call
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

View File

@@ -0,0 +1,117 @@
package call
//goland:noinspection GoNameStartsWithPackageName
import (
"GoSungro/iSolarCloud/web"
"net/url"
)
type Call struct {
count Count
create Create
delete Delete
list List
read Read
update Update
Web *web.Web
Error error
}
//const CountUrl = "?format=json&object=call&action=count"
type Count struct {
Url *url.URL
Request CountRequest
Response CountResponse
Error error
}
type CountRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CountResponse struct {
Total int `json:"total"` // Total number of Devices for the specified ApiAppKey/User.
}
//const CreateUrl = "?format=json&object=call&action=create"
type Create struct {
Url *url.URL
Request CreateRequest
Response CreateResponse
Error error
}
type CreateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CreateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const DeleteUrl = "?format=json&object=call&action=delete"
type Delete struct {
Url *url.URL
Request DeleteRequest
Response DeleteResponse
Error error
}
type DeleteRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type DeleteResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ListUrl = "?format=json&object=call&action=list"
type List struct {
Url *url.URL
Request ListRequest
Response ListResponse
Error error
}
type ListRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ListResponse []ListResponseSingle
type ListResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ReadUrl = "?format=json&object=call&action=read"
type Read struct {
Url *url.URL
Request ReadRequest
Response ReadResponse
Error error
}
type ReadRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ReadResponse []ReadResponseSingle
type ReadResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const UpdateUrl = "?format=json&object=device&action=update"
type Update struct {
Url *url.URL
Request UpdateRequest
Response UpdateResponse
Error error
}
type UpdateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type UpdateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}

View File

@@ -0,0 +1,123 @@
package callQueue
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *CallQueue) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *CallQueue) Count(domain string) (Count, error) {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count, t.Error
}
func (t *CallQueue) Create(domain string, device string) (Create, error) {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Device: device,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create, t.Error
}
func (t *CallQueue) Delete(domain string, device string) (Delete, error) {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Device: device,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete, t.Error
}
func (t *CallQueue) List(domain string) (List, error) {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list, t.Error
}
func (t *CallQueue) Read(domain string) (Read, error) {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read, t.Error
}
func (t *CallQueue) Update(domain string, device string) (Update, error) {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
Device: device,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update, t.Error
}

View File

@@ -0,0 +1,198 @@
package callQueue
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

View File

@@ -0,0 +1,117 @@
package callQueue
//goland:noinspection GoNameStartsWithPackageName
import (
"GoSungro/iSolarCloud/web"
"net/url"
)
type CallQueue struct {
count Count
create Create
delete Delete
list List
read Read
update Update
Web *web.Web
Error error
}
//const CountUrl = "?format=json&object=callQueue&action=count"
type Count struct {
Url *url.URL
Request CountRequest
Response CountResponse
Error error
}
type CountRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CountResponse struct {
Total int `json:"total"` // Total number of Devices for the specified ApiAppKey/User.
}
//const CreateUrl = "?format=json&object=callQueue&action=create"
type Create struct {
Url *url.URL
Request CreateRequest
Response CreateResponse
Error error
}
type CreateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CreateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const DeleteUrl = "?format=json&object=callQueue&action=delete"
type Delete struct {
Url *url.URL
Request DeleteRequest
Response DeleteResponse
Error error
}
type DeleteRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type DeleteResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ListUrl = "?format=json&object=callQueue&action=list"
type List struct {
Url *url.URL
Request ListRequest
Response ListResponse
Error error
}
type ListRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ListResponse []ListResponseSingle
type ListResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ReadUrl = "?format=json&object=callQueue&action=read"
type Read struct {
Url *url.URL
Request ReadRequest
Response ReadResponse
Error error
}
type ReadRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ReadResponse []ReadResponseSingle
type ReadResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const UpdateUrl = "?format=json&object=device&action=update"
type Update struct {
Url *url.URL
Request UpdateRequest
Response UpdateResponse
Error error
}
type UpdateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type UpdateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}

View File

@@ -0,0 +1,123 @@
package callQueueEmailReport
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *CallQueueEmailReport) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *CallQueueEmailReport) Count(domain string) (Count, error) {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count, t.Error
}
func (t *CallQueueEmailReport) Create(domain string, device string) (Create, error) {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Device: device,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create, t.Error
}
func (t *CallQueueEmailReport) Delete(domain string, device string) (Delete, error) {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Device: device,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete, t.Error
}
func (t *CallQueueEmailReport) List(domain string) (List, error) {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list, t.Error
}
func (t *CallQueueEmailReport) Read(domain string) (Read, error) {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read, t.Error
}
func (t *CallQueueEmailReport) Update(domain string, device string) (Update, error) {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
Device: device,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update, t.Error
}

View File

@@ -0,0 +1,198 @@
package callQueueEmailReport
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

View File

@@ -0,0 +1,117 @@
package callQueueEmailReport
//goland:noinspection GoNameStartsWithPackageName
import (
"GoSungro/iSolarCloud/web"
"net/url"
)
type CallQueueEmailReport struct {
count Count
create Create
delete Delete
list List
read Read
update Update
Web *web.Web
Error error
}
//const CountUrl = "?format=json&object=callQueueEmailReport&action=count"
type Count struct {
Url *url.URL
Request CountRequest
Response CountResponse
Error error
}
type CountRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CountResponse struct {
Total int `json:"total"` // Total number of Devices for the specified ApiAppKey/User.
}
//const CreateUrl = "?format=json&object=callQueueEmailReport&action=create"
type Create struct {
Url *url.URL
Request CreateRequest
Response CreateResponse
Error error
}
type CreateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CreateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const DeleteUrl = "?format=json&object=callQueueEmailReport&action=delete"
type Delete struct {
Url *url.URL
Request DeleteRequest
Response DeleteResponse
Error error
}
type DeleteRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type DeleteResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ListUrl = "?format=json&object=callQueueEmailReport&action=list"
type List struct {
Url *url.URL
Request ListRequest
Response ListResponse
Error error
}
type ListRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ListResponse []ListResponseSingle
type ListResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ReadUrl = "?format=json&object=callQueueEmailReport&action=read"
type Read struct {
Url *url.URL
Request ReadRequest
Response ReadResponse
Error error
}
type ReadRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ReadResponse []ReadResponseSingle
type ReadResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const UpdateUrl = "?format=json&object=device&action=update"
type Update struct {
Url *url.URL
Request UpdateRequest
Response UpdateResponse
Error error
}
type UpdateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type UpdateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}

View File

@@ -0,0 +1,98 @@
package iSolarCloud
import (
"GoSungro/Only"
"fmt"
)
func (p *SunGro) CountCallQueueEmailReports(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CallQueueEmailReport.Count(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CallQueueEmailReports: %v\n", query.Response.Total)
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
}
return p.Error
}
func (p *SunGro) ListCallQueueEmailReports(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CallQueueEmailReport.List(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CallQueueEmailReports:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}
func (p *SunGro) ReadCallQueueEmailReports(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CallQueueEmailReport.Read(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CallQueueEmailReports:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}

View File

@@ -0,0 +1,123 @@
package callQueueStat
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *CallQueueStat) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *CallQueueStat) Count(domain string) (Count, error) {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count, t.Error
}
func (t *CallQueueStat) Create(domain string, device string) (Create, error) {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Device: device,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create, t.Error
}
func (t *CallQueueStat) Delete(domain string, device string) (Delete, error) {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Device: device,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete, t.Error
}
func (t *CallQueueStat) List(domain string) (List, error) {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list, t.Error
}
func (t *CallQueueStat) Read(domain string) (Read, error) {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read, t.Error
}
func (t *CallQueueStat) Update(domain string, device string) (Update, error) {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
Device: device,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update, t.Error
}

View File

@@ -0,0 +1,198 @@
package callQueueStat
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

View File

@@ -0,0 +1,117 @@
package callQueueStat
//goland:noinspection GoNameStartsWithPackageName
import (
"GoSungro/iSolarCloud/web"
"net/url"
)
type CallQueueStat struct {
count Count
create Create
delete Delete
list List
read Read
update Update
Web *web.Web
Error error
}
//const CountUrl = "?format=json&object=callQueueStat&action=count"
type Count struct {
Url *url.URL
Request CountRequest
Response CountResponse
Error error
}
type CountRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CountResponse struct {
Total int `json:"total"` // Total number of Devices for the specified ApiAppKey/User.
}
//const CreateUrl = "?format=json&object=callQueueStat&action=create"
type Create struct {
Url *url.URL
Request CreateRequest
Response CreateResponse
Error error
}
type CreateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CreateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const DeleteUrl = "?format=json&object=callQueueStat&action=delete"
type Delete struct {
Url *url.URL
Request DeleteRequest
Response DeleteResponse
Error error
}
type DeleteRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type DeleteResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ListUrl = "?format=json&object=callQueueStat&action=list"
type List struct {
Url *url.URL
Request ListRequest
Response ListResponse
Error error
}
type ListRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ListResponse []ListResponseSingle
type ListResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ReadUrl = "?format=json&object=callQueueStat&action=read"
type Read struct {
Url *url.URL
Request ReadRequest
Response ReadResponse
Error error
}
type ReadRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ReadResponse []ReadResponseSingle
type ReadResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const UpdateUrl = "?format=json&object=device&action=update"
type Update struct {
Url *url.URL
Request UpdateRequest
Response UpdateResponse
Error error
}
type UpdateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type UpdateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}

View File

@@ -0,0 +1,98 @@
package iSolarCloud
import (
"GoSungro/Only"
"fmt"
)
func (p *SunGro) CountCallQueueStats(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CallQueueStat.Count(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CallQueueStats: %v\n", query.Response.Total)
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
}
return p.Error
}
func (p *SunGro) ListCallQueueStats(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CallQueueStat.List(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CallQueueStats:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}
func (p *SunGro) ReadCallQueueStats(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CallQueueStat.Read(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CallQueueStats:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}

View File

@@ -0,0 +1,98 @@
package iSolarCloud
import (
"GoSungro/Only"
"fmt"
)
func (p *SunGro) CountCallQueues(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CallQueue.Count(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CallQueues: %v\n", query.Response.Total)
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
}
return p.Error
}
func (p *SunGro) ListCallQueues(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CallQueue.List(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CallQueues:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}
func (p *SunGro) ReadCallQueues(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CallQueue.Read(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CallQueues:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}

View File

@@ -0,0 +1,98 @@
package iSolarCloud
import (
"GoSungro/Only"
"fmt"
)
func (p *SunGro) CountCalls(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.Call.Count(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("Calls: %v\n", query.Response.Total)
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
}
return p.Error
}
func (p *SunGro) ListCalls(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.Call.List(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("Calls:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}
func (p *SunGro) ReadCalls(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.Call.Read(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("Calls:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}

View File

@@ -0,0 +1,123 @@
package callerIdEmergency
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *CallerIdEmergency) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *CallerIdEmergency) Count(domain string) (Count, error) {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count, t.Error
}
func (t *CallerIdEmergency) Create(domain string, device string) (Create, error) {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Device: device,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create, t.Error
}
func (t *CallerIdEmergency) Delete(domain string, device string) (Delete, error) {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Device: device,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete, t.Error
}
func (t *CallerIdEmergency) List(domain string) (List, error) {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list, t.Error
}
func (t *CallerIdEmergency) Read(domain string) (Read, error) {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read, t.Error
}
func (t *CallerIdEmergency) Update(domain string, device string) (Update, error) {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
Device: device,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update, t.Error
}

View File

@@ -0,0 +1,198 @@
package callerIdEmergency
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

View File

@@ -0,0 +1,117 @@
package callerIdEmergency
//goland:noinspection GoNameStartsWithPackageName
import (
"GoSungro/iSolarCloud/web"
"net/url"
)
type CallerIdEmergency struct {
count Count
create Create
delete Delete
list List
read Read
update Update
Web *web.Web
Error error
}
//const CountUrl = "?format=json&object=callerIdEmergency&action=count"
type Count struct {
Url *url.URL
Request CountRequest
Response CountResponse
Error error
}
type CountRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CountResponse struct {
Total int `json:"total"` // Total number of Devices for the specified ApiAppKey/User.
}
//const CreateUrl = "?format=json&object=callerIdEmergency&action=create"
type Create struct {
Url *url.URL
Request CreateRequest
Response CreateResponse
Error error
}
type CreateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CreateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const DeleteUrl = "?format=json&object=callerIdEmergency&action=delete"
type Delete struct {
Url *url.URL
Request DeleteRequest
Response DeleteResponse
Error error
}
type DeleteRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type DeleteResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ListUrl = "?format=json&object=callerIdEmergency&action=list"
type List struct {
Url *url.URL
Request ListRequest
Response ListResponse
Error error
}
type ListRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ListResponse []ListResponseSingle
type ListResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ReadUrl = "?format=json&object=callerIdEmergency&action=read"
type Read struct {
Url *url.URL
Request ReadRequest
Response ReadResponse
Error error
}
type ReadRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ReadResponse []ReadResponseSingle
type ReadResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const UpdateUrl = "?format=json&object=device&action=update"
type Update struct {
Url *url.URL
Request UpdateRequest
Response UpdateResponse
Error error
}
type UpdateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type UpdateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}

View File

@@ -0,0 +1,98 @@
package iSolarCloud
import (
"GoSungro/Only"
"fmt"
)
func (p *SunGro) CountCallerIdEmergencys(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CallerIdEmergency.Count(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CallerIdEmergencys: %v\n", query.Response.Total)
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
}
return p.Error
}
func (p *SunGro) ListCallerIdEmergencys(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CallerIdEmergency.List(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CallerIdEmergencys:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}
func (p *SunGro) ReadCallerIdEmergencys(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CallerIdEmergency.Read(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CallerIdEmergencys:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}

View File

@@ -0,0 +1,123 @@
package cdr2
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *Cdr2) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *Cdr2) Count(domain string) (Count, error) {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count, t.Error
}
func (t *Cdr2) Create(domain string, device string) (Create, error) {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Device: device,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create, t.Error
}
func (t *Cdr2) Delete(domain string, device string) (Delete, error) {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Device: device,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete, t.Error
}
func (t *Cdr2) List(domain string) (List, error) {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list, t.Error
}
func (t *Cdr2) Read(domain string) (Read, error) {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read, t.Error
}
func (t *Cdr2) Update(domain string, device string) (Update, error) {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
Device: device,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update, t.Error
}

View File

@@ -0,0 +1,198 @@
package cdr2
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

View File

@@ -0,0 +1,117 @@
package cdr2
//goland:noinspection GoNameStartsWithPackageName
import (
"GoSungro/iSolarCloud/web"
"net/url"
)
type Cdr2 struct {
count Count
create Create
delete Delete
list List
read Read
update Update
Web *web.Web
Error error
}
//const CountUrl = "?format=json&object=cdr2&action=count"
type Count struct {
Url *url.URL
Request CountRequest
Response CountResponse
Error error
}
type CountRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CountResponse struct {
Total int `json:"total"` // Total number of Devices for the specified ApiAppKey/User.
}
//const CreateUrl = "?format=json&object=cdr2&action=create"
type Create struct {
Url *url.URL
Request CreateRequest
Response CreateResponse
Error error
}
type CreateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CreateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const DeleteUrl = "?format=json&object=cdr2&action=delete"
type Delete struct {
Url *url.URL
Request DeleteRequest
Response DeleteResponse
Error error
}
type DeleteRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type DeleteResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ListUrl = "?format=json&object=cdr2&action=list"
type List struct {
Url *url.URL
Request ListRequest
Response ListResponse
Error error
}
type ListRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ListResponse []ListResponseSingle
type ListResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ReadUrl = "?format=json&object=cdr2&action=read"
type Read struct {
Url *url.URL
Request ReadRequest
Response ReadResponse
Error error
}
type ReadRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ReadResponse []ReadResponseSingle
type ReadResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const UpdateUrl = "?format=json&object=device&action=update"
type Update struct {
Url *url.URL
Request UpdateRequest
Response UpdateResponse
Error error
}
type UpdateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type UpdateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}

View File

@@ -0,0 +1,98 @@
package iSolarCloud
import (
"GoSungro/Only"
"fmt"
)
func (p *SunGro) CountCdr2s(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.Cdr2.Count(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("Cdr2s: %v\n", query.Response.Total)
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
}
return p.Error
}
func (p *SunGro) ListCdr2s(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.Cdr2.List(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("Cdr2s:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}
func (p *SunGro) ReadCdr2s(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.Cdr2.Read(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("Cdr2s:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}

View File

@@ -0,0 +1,123 @@
package cdrExport
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *CdrExport) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *CdrExport) Count(domain string) (Count, error) {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count, t.Error
}
func (t *CdrExport) Create(domain string, device string) (Create, error) {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Device: device,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create, t.Error
}
func (t *CdrExport) Delete(domain string, device string) (Delete, error) {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Device: device,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete, t.Error
}
func (t *CdrExport) List(domain string) (List, error) {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list, t.Error
}
func (t *CdrExport) Read(domain string) (Read, error) {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read, t.Error
}
func (t *CdrExport) Update(domain string, device string) (Update, error) {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
Device: device,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update, t.Error
}

View File

@@ -0,0 +1,198 @@
package cdrExport
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

View File

@@ -0,0 +1,117 @@
package cdrExport
//goland:noinspection GoNameStartsWithPackageName
import (
"GoSungro/iSolarCloud/web"
"net/url"
)
type CdrExport struct {
count Count
create Create
delete Delete
list List
read Read
update Update
Web *web.Web
Error error
}
//const CountUrl = "?format=json&object=cdrExport&action=count"
type Count struct {
Url *url.URL
Request CountRequest
Response CountResponse
Error error
}
type CountRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CountResponse struct {
Total int `json:"total"` // Total number of Devices for the specified ApiAppKey/User.
}
//const CreateUrl = "?format=json&object=cdrExport&action=create"
type Create struct {
Url *url.URL
Request CreateRequest
Response CreateResponse
Error error
}
type CreateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CreateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const DeleteUrl = "?format=json&object=cdrExport&action=delete"
type Delete struct {
Url *url.URL
Request DeleteRequest
Response DeleteResponse
Error error
}
type DeleteRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type DeleteResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ListUrl = "?format=json&object=cdrExport&action=list"
type List struct {
Url *url.URL
Request ListRequest
Response ListResponse
Error error
}
type ListRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ListResponse []ListResponseSingle
type ListResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ReadUrl = "?format=json&object=cdrExport&action=read"
type Read struct {
Url *url.URL
Request ReadRequest
Response ReadResponse
Error error
}
type ReadRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ReadResponse []ReadResponseSingle
type ReadResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const UpdateUrl = "?format=json&object=device&action=update"
type Update struct {
Url *url.URL
Request UpdateRequest
Response UpdateResponse
Error error
}
type UpdateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type UpdateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}

View File

@@ -0,0 +1,98 @@
package iSolarCloud
import (
"GoSungro/Only"
"fmt"
)
func (p *SunGro) CountCdrExports(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CdrExport.Count(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CdrExports: %v\n", query.Response.Total)
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
}
return p.Error
}
func (p *SunGro) ListCdrExports(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CdrExport.List(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CdrExports:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}
func (p *SunGro) ReadCdrExports(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CdrExport.Read(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CdrExports:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}

View File

@@ -0,0 +1,123 @@
package cdrSchedule
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *CdrSchedule) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *CdrSchedule) Count(domain string) (Count, error) {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count, t.Error
}
func (t *CdrSchedule) Create(domain string, device string) (Create, error) {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Device: device,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create, t.Error
}
func (t *CdrSchedule) Delete(domain string, device string) (Delete, error) {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Device: device,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete, t.Error
}
func (t *CdrSchedule) List(domain string) (List, error) {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list, t.Error
}
func (t *CdrSchedule) Read(domain string) (Read, error) {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read, t.Error
}
func (t *CdrSchedule) Update(domain string, device string) (Update, error) {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
Device: device,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update, t.Error
}

View File

@@ -0,0 +1,198 @@
package cdrSchedule
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

View File

@@ -0,0 +1,117 @@
package cdrSchedule
//goland:noinspection GoNameStartsWithPackageName
import (
"GoSungro/iSolarCloud/web"
"net/url"
)
type CdrSchedule struct {
count Count
create Create
delete Delete
list List
read Read
update Update
Web *web.Web
Error error
}
//const CountUrl = "?format=json&object=cdrSchedule&action=count"
type Count struct {
Url *url.URL
Request CountRequest
Response CountResponse
Error error
}
type CountRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CountResponse struct {
Total int `json:"total"` // Total number of Devices for the specified ApiAppKey/User.
}
//const CreateUrl = "?format=json&object=cdrSchedule&action=create"
type Create struct {
Url *url.URL
Request CreateRequest
Response CreateResponse
Error error
}
type CreateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type CreateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const DeleteUrl = "?format=json&object=cdrSchedule&action=delete"
type Delete struct {
Url *url.URL
Request DeleteRequest
Response DeleteResponse
Error error
}
type DeleteRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type DeleteResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ListUrl = "?format=json&object=cdrSchedule&action=list"
type List struct {
Url *url.URL
Request ListRequest
Response ListResponse
Error error
}
type ListRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ListResponse []ListResponseSingle
type ListResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const ReadUrl = "?format=json&object=cdrSchedule&action=read"
type Read struct {
Url *url.URL
Request ReadRequest
Response ReadResponse
Error error
}
type ReadRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type ReadResponse []ReadResponseSingle
type ReadResponseSingle struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}
//const UpdateUrl = "?format=json&object=device&action=update"
type Update struct {
Url *url.URL
Request UpdateRequest
Response UpdateResponse
Error error
}
type UpdateRequest struct {
Domain string `json:"domain" required:"true"` //
Device string `json:"device"` //
}
type UpdateResponse struct {
Domain string `json:"domain"` //
Device string `json:"device"` //
}

View File

@@ -0,0 +1,98 @@
package iSolarCloud
import (
"GoSungro/Only"
"fmt"
)
func (p *SunGro) CountCdrSchedules(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CdrSchedule.Count(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CdrSchedules: %v\n", query.Response.Total)
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
}
return p.Error
}
func (p *SunGro) ListCdrSchedules(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CdrSchedule.List(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CdrSchedules:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}
func (p *SunGro) ReadCdrSchedules(domain string) error {
for range Only.Once {
domain = p.VerifyDomain(domain)
query, err := p.Areas.CdrSchedule.Read(domain)
if err != nil {
p.Error = err
break
}
if p.OutputType == TypeHuman {
_, _ = fmt.Printf("CdrSchedules:\n%v\n", query.Response.String())
break
}
if p.OutputType == TypeJson {
//_, _ = fmt.Fprintf(os.Stderr, "# Domains ")
//_, _ = fmt.Printf("%s", query.Response.JsonString())
p.OutputString = query.Response.JsonString()
break
}
if p.OutputType == TypeGoogle {
p.OutputArray = query.Response.ToArray()
// data := query.Response.ToArray()
// p.Error = p.UpdateGoogleSheet("device", data)
break
}
}
return p.Error
}

View File

@@ -0,0 +1,126 @@
package chart
import (
"GoSungro/Only"
"errors"
"net/url"
)
func (t *Chart) SetBaseUrl(u string) error {
for range Only.Once {
if u == "" {
t.Error = errors.New("url is empty")
break
}
t.Web.Url, t.Error = url.Parse(u)
if t.Error != nil {
break
}
t.count.Url = t.Web.Url
t.create.Url = t.Web.Url
t.delete.Url = t.Web.Url
t.list.Url = t.Web.Url
t.read.Url = t.Web.Url
t.update.Url = t.Web.Url
}
return t.Error
}
func (t *Chart) Count(domain string) Count {
for range Only.Once {
t.count.Request = CountRequest{
Domain: domain,
}
t.count.Error = t.Web.Get(t.count, t.count.Request, &t.count.Response)
if t.count.Error != nil {
break
}
}
return t.count
}
func (t *Chart) Create(domain string, name string, dashboardId int, chartType string) Create {
for range Only.Once {
t.create.Request = CreateRequest{
Domain: domain,
Name: name,
DashboardId: dashboardId,
Type: chartType,
}
t.create.Error = t.Web.Get(t.create, t.create.Request, &t.create.Response)
if t.create.Error != nil {
break
}
}
return t.create
}
func (t *Chart) Delete(domain string, dashboardId int) Delete {
for range Only.Once {
t.delete.Request = DeleteRequest{
Domain: domain,
Id: dashboardId,
}
t.delete.Error = t.Web.Get(t.delete, t.delete.Request, &t.delete.Response)
if t.delete.Error != nil {
break
}
}
return t.delete
}
func (t *Chart) List(domain string) List {
for range Only.Once {
t.list.Request = ListRequest{
Domain: domain,
}
t.list.Error = t.Web.Get(t.list, t.list.Request, &t.list.Response)
if t.list.Error != nil {
break
}
}
return t.list
}
func (t *Chart) Read(domain string) Read {
for range Only.Once {
t.read.Request = ReadRequest{
Domain: domain,
}
t.read.Error = t.Web.Get(t.read, t.read.Request, &t.read.Response)
if t.read.Error != nil {
break
}
}
return t.read
}
func (t *Chart) Update(domain string, dashboardId int, id int) Update {
for range Only.Once {
t.update.Request = UpdateRequest{
Domain: domain,
DashboardId: dashboardId,
Id: id,
}
t.update.Error = t.Web.Get(t.update, t.update.Request, &t.update.Response)
if t.update.Error != nil {
break
}
}
return t.update
}

View File

@@ -0,0 +1,198 @@
package chart
import (
"GoSungro/Only"
"GoSungro/iSolarCloud/web"
"fmt"
)
func (t *CountResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%d", t.Total)
}
return str
}
func (t *CountResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *CreateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *CreateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *DeleteResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *DeleteResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) String() string {
var str string
for range Only.Once {
for i, k := range *t {
if i == 0 {
str += fmt.Sprintf("%s\n", web.PrintHeader(k))
}
str += fmt.Sprintf("%v\n", k.String())
}
}
return str
}
func (t *ListResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ListResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ListResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ListResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) String() string {
var str string
for range Only.Once {
str += web.PrintHeader(*t)
str += web.PrintValue(*t)
}
return str
}
func (t *ReadResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *ReadResponse) ToArray() [][]interface{} {
var ret [][]interface{}
for i, k := range *t {
if i == 0 {
ret = append(ret, web.HeaderAsArray(k))
}
ret = append(ret, web.AsArray(k))
}
return ret
}
func (t *ReadResponseSingle) String() string {
return web.PrintValue(*t)
}
func (t *ReadResponseSingle) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}
func (t *UpdateResponse) String() string {
var str string
for range Only.Once {
str = fmt.Sprintf("%v\n", t)
}
return str
}
func (t *UpdateResponse) JsonString() string {
var str string
for range Only.Once {
j, err := web.PrintAsJson(t)
if err != nil {
break
}
str = fmt.Sprintf(j)
}
return str
}

Some files were not shown because too many files have changed in this diff Show More