Skip to content

Commit 9968985

Browse files
committed
Merge branch 'main' into ota-v2-support
2 parents cc9dc77 + 4db92cc commit 9968985

24 files changed

+13215
-64
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
---
2+
name: github.com/icza/bitio
3+
version: v1.1.0
4+
type: go
5+
summary: Package bitio provides an optimized bit-level Reader and Writer.
6+
homepage: https://pkg.go.dev/github.com/icza/bitio
7+
license: apache-2.0
8+
licenses:
9+
- sources: LICENSE
10+
text: |2
11+
Apache License
12+
Version 2.0, January 2004
13+
http://www.apache.org/licenses/
14+
15+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
16+
17+
1. Definitions.
18+
19+
"License" shall mean the terms and conditions for use, reproduction,
20+
and distribution as defined by Sections 1 through 9 of this document.
21+
22+
"Licensor" shall mean the copyright owner or entity authorized by
23+
the copyright owner that is granting the License.
24+
25+
"Legal Entity" shall mean the union of the acting entity and all
26+
other entities that control, are controlled by, or are under common
27+
control with that entity. For the purposes of this definition,
28+
"control" means (i) the power, direct or indirect, to cause the
29+
direction or management of such entity, whether by contract or
30+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
31+
outstanding shares, or (iii) beneficial ownership of such entity.
32+
33+
"You" (or "Your") shall mean an individual or Legal Entity
34+
exercising permissions granted by this License.
35+
36+
"Source" form shall mean the preferred form for making modifications,
37+
including but not limited to software source code, documentation
38+
source, and configuration files.
39+
40+
"Object" form shall mean any form resulting from mechanical
41+
transformation or translation of a Source form, including but
42+
not limited to compiled object code, generated documentation,
43+
and conversions to other media types.
44+
45+
"Work" shall mean the work of authorship, whether in Source or
46+
Object form, made available under the License, as indicated by a
47+
copyright notice that is included in or attached to the work
48+
(an example is provided in the Appendix below).
49+
50+
"Derivative Works" shall mean any work, whether in Source or Object
51+
form, that is based on (or derived from) the Work and for which the
52+
editorial revisions, annotations, elaborations, or other modifications
53+
represent, as a whole, an original work of authorship. For the purposes
54+
of this License, Derivative Works shall not include works that remain
55+
separable from, or merely link (or bind by name) to the interfaces of,
56+
the Work and Derivative Works thereof.
57+
58+
"Contribution" shall mean any work of authorship, including
59+
the original version of the Work and any modifications or additions
60+
to that Work or Derivative Works thereof, that is intentionally
61+
submitted to Licensor for inclusion in the Work by the copyright owner
62+
or by an individual or Legal Entity authorized to submit on behalf of
63+
the copyright owner. For the purposes of this definition, "submitted"
64+
means any form of electronic, verbal, or written communication sent
65+
to the Licensor or its representatives, including but not limited to
66+
communication on electronic mailing lists, source code control systems,
67+
and issue tracking systems that are managed by, or on behalf of, the
68+
Licensor for the purpose of discussing and improving the Work, but
69+
excluding communication that is conspicuously marked or otherwise
70+
designated in writing by the copyright owner as "Not a Contribution."
71+
72+
"Contributor" shall mean Licensor and any individual or Legal Entity
73+
on behalf of whom a Contribution has been received by Licensor and
74+
subsequently incorporated within the Work.
75+
76+
2. Grant of Copyright License. Subject to the terms and conditions of
77+
this License, each Contributor hereby grants to You a perpetual,
78+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
79+
copyright license to reproduce, prepare Derivative Works of,
80+
publicly display, publicly perform, sublicense, and distribute the
81+
Work and such Derivative Works in Source or Object form.
82+
83+
3. Grant of Patent License. Subject to the terms and conditions of
84+
this License, each Contributor hereby grants to You a perpetual,
85+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
86+
(except as stated in this section) patent license to make, have made,
87+
use, offer to sell, sell, import, and otherwise transfer the Work,
88+
where such license applies only to those patent claims licensable
89+
by such Contributor that are necessarily infringed by their
90+
Contribution(s) alone or by combination of their Contribution(s)
91+
with the Work to which such Contribution(s) was submitted. If You
92+
institute patent litigation against any entity (including a
93+
cross-claim or counterclaim in a lawsuit) alleging that the Work
94+
or a Contribution incorporated within the Work constitutes direct
95+
or contributory patent infringement, then any patent licenses
96+
granted to You under this License for that Work shall terminate
97+
as of the date such litigation is filed.
98+
99+
4. Redistribution. You may reproduce and distribute copies of the
100+
Work or Derivative Works thereof in any medium, with or without
101+
modifications, and in Source or Object form, provided that You
102+
meet the following conditions:
103+
104+
(a) You must give any other recipients of the Work or
105+
Derivative Works a copy of this License; and
106+
107+
(b) You must cause any modified files to carry prominent notices
108+
stating that You changed the files; and
109+
110+
(c) You must retain, in the Source form of any Derivative Works
111+
that You distribute, all copyright, patent, trademark, and
112+
attribution notices from the Source form of the Work,
113+
excluding those notices that do not pertain to any part of
114+
the Derivative Works; and
115+
116+
(d) If the Work includes a "NOTICE" text file as part of its
117+
distribution, then any Derivative Works that You distribute must
118+
include a readable copy of the attribution notices contained
119+
within such NOTICE file, excluding those notices that do not
120+
pertain to any part of the Derivative Works, in at least one
121+
of the following places: within a NOTICE text file distributed
122+
as part of the Derivative Works; within the Source form or
123+
documentation, if provided along with the Derivative Works; or,
124+
within a display generated by the Derivative Works, if and
125+
wherever such third-party notices normally appear. The contents
126+
of the NOTICE file are for informational purposes only and
127+
do not modify the License. You may add Your own attribution
128+
notices within Derivative Works that You distribute, alongside
129+
or as an addendum to the NOTICE text from the Work, provided
130+
that such additional attribution notices cannot be construed
131+
as modifying the License.
132+
133+
You may add Your own copyright statement to Your modifications and
134+
may provide additional or different license terms and conditions
135+
for use, reproduction, or distribution of Your modifications, or
136+
for any such Derivative Works as a whole, provided Your use,
137+
reproduction, and distribution of the Work otherwise complies with
138+
the conditions stated in this License.
139+
140+
5. Submission of Contributions. Unless You explicitly state otherwise,
141+
any Contribution intentionally submitted for inclusion in the Work
142+
by You to the Licensor shall be under the terms and conditions of
143+
this License, without any additional terms or conditions.
144+
Notwithstanding the above, nothing herein shall supersede or modify
145+
the terms of any separate license agreement you may have executed
146+
with Licensor regarding such Contributions.
147+
148+
6. Trademarks. This License does not grant permission to use the trade
149+
names, trademarks, service marks, or product names of the Licensor,
150+
except as required for reasonable and customary use in describing the
151+
origin of the Work and reproducing the content of the NOTICE file.
152+
153+
7. Disclaimer of Warranty. Unless required by applicable law or
154+
agreed to in writing, Licensor provides the Work (and each
155+
Contributor provides its Contributions) on an "AS IS" BASIS,
156+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
157+
implied, including, without limitation, any warranties or conditions
158+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
159+
PARTICULAR PURPOSE. You are solely responsible for determining the
160+
appropriateness of using or redistributing the Work and assume any
161+
risks associated with Your exercise of permissions under this License.
162+
163+
8. Limitation of Liability. In no event and under no legal theory,
164+
whether in tort (including negligence), contract, or otherwise,
165+
unless required by applicable law (such as deliberate and grossly
166+
negligent acts) or agreed to in writing, shall any Contributor be
167+
liable to You for damages, including any direct, indirect, special,
168+
incidental, or consequential damages of any character arising as a
169+
result of this License or out of the use or inability to use the
170+
Work (including but not limited to damages for loss of goodwill,
171+
work stoppage, computer failure or malfunction, or any and all
172+
other commercial damages or losses), even if such Contributor
173+
has been advised of the possibility of such damages.
174+
175+
9. Accepting Warranty or Additional Liability. While redistributing
176+
the Work or Derivative Works thereof, You may choose to offer,
177+
and charge a fee for, acceptance of support, warranty, indemnity,
178+
or other liability obligations and/or rights consistent with this
179+
License. However, in accepting such obligations, You may act only
180+
on Your own behalf and on Your sole responsibility, not on behalf
181+
of any other Contributor, and only if You agree to indemnify,
182+
defend, and hold each Contributor harmless for any liability
183+
incurred by, or claims asserted against, such Contributor by reason
184+
of your accepting any such warranty or additional liability.
185+
186+
END OF TERMS AND CONDITIONS
187+
188+
APPENDIX: How to apply the Apache License to your work.
189+
190+
To apply the Apache License to your work, attach the following
191+
boilerplate notice, with the fields enclosed by brackets "{}"
192+
replaced with your own identifying information. (Don't include
193+
the brackets!) The text should be enclosed in the appropriate
194+
comment syntax for the file format. We also recommend that a
195+
file or class name and description of purpose be included on the
196+
same "printed page" as the copyright notice for easier
197+
identification within third-party archives.
198+
199+
Copyright 2016 Andras Belicza
200+
201+
Licensed under the Apache License, Version 2.0 (the "License");
202+
you may not use this file except in compliance with the License.
203+
You may obtain a copy of the License at
204+
205+
http://www.apache.org/licenses/LICENSE-2.0
206+
207+
Unless required by applicable law or agreed to in writing, software
208+
distributed under the License is distributed on an "AS IS" BASIS,
209+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
210+
See the License for the specific language governing permissions and
211+
limitations under the License.
212+
notices: []

cli/ota/decode.go

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// This file is part of arduino-cloud-cli.
2+
//
3+
// Copyright (C) 2021 ARDUINO SA (http://www.arduino.cc/)
4+
//
5+
// This program is free software: you can redistribute it and/or modify
6+
// it under the terms of the GNU Affero General Public License as published
7+
// by the Free Software Foundation, either version 3 of the License, or
8+
// (at your option) any later version.
9+
//
10+
// This program is distributed in the hope that it will be useful,
11+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
// GNU Affero General Public License for more details.
14+
//
15+
// You should have received a copy of the GNU Affero General Public License
16+
// along with this program. If not, see <https://www.gnu.org/licenses/>.
17+
18+
package ota
19+
20+
import (
21+
"os"
22+
23+
"github.com/arduino/arduino-cli/cli/errorcodes"
24+
"github.com/arduino/arduino-cli/cli/feedback"
25+
"github.com/arduino/arduino-cloud-cli/command/ota"
26+
"github.com/spf13/cobra"
27+
)
28+
29+
type decodeHeaderFlags struct {
30+
file string
31+
}
32+
33+
func initDecodeHeaderCommand() *cobra.Command {
34+
flags := &decodeHeaderFlags{}
35+
uploadCommand := &cobra.Command{
36+
Use: "header-decode",
37+
Short: "OTA firmware header decoder",
38+
Long: "decode OTA firmware header of the given binary file",
39+
Run: func(cmd *cobra.Command, args []string) {
40+
if err := runDecodeHeaderCommand(flags); err != nil {
41+
feedback.Errorf("Error during firmware decoding: %v", err)
42+
os.Exit(errorcodes.ErrGeneric)
43+
}
44+
},
45+
}
46+
uploadCommand.Flags().StringVarP(&flags.file, "file", "", "", "Binary file (.ota)")
47+
uploadCommand.MarkFlagRequired("file")
48+
return uploadCommand
49+
}
50+
51+
func runDecodeHeaderCommand(flags *decodeHeaderFlags) error {
52+
params := &ota.ReadHeaderParams{
53+
File: flags.file,
54+
}
55+
if err := ota.ReadHeader(params); err != nil {
56+
return err
57+
}
58+
return nil
59+
}

cli/ota/encode.go

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// This file is part of arduino-cloud-cli.
2+
//
3+
// Copyright (C) 2021 ARDUINO SA (http://www.arduino.cc/)
4+
//
5+
// This program is free software: you can redistribute it and/or modify
6+
// it under the terms of the GNU Affero General Public License as published
7+
// by the Free Software Foundation, either version 3 of the License, or
8+
// (at your option) any later version.
9+
//
10+
// This program is distributed in the hope that it will be useful,
11+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
// GNU Affero General Public License for more details.
14+
//
15+
// You should have received a copy of the GNU Affero General Public License
16+
// along with this program. If not, see <https://www.gnu.org/licenses/>.
17+
18+
package ota
19+
20+
import (
21+
"fmt"
22+
"os"
23+
24+
"github.com/arduino/arduino-cli/cli/errorcodes"
25+
"github.com/arduino/arduino-cli/cli/feedback"
26+
"github.com/arduino/arduino-cloud-cli/command/ota"
27+
"github.com/spf13/cobra"
28+
)
29+
30+
type encodeBinaryFlags struct {
31+
FQBN string
32+
file string
33+
}
34+
35+
func initEncodeBinaryCommand() *cobra.Command {
36+
flags := &encodeBinaryFlags{}
37+
uploadCommand := &cobra.Command{
38+
Use: "header-encode",
39+
Short: "OTA firmware encoder",
40+
Long: "encode header firmware to make it compatible with Arduino OTA",
41+
Run: func(cmd *cobra.Command, args []string) {
42+
if err := runEncodeCommand(flags); err != nil {
43+
feedback.Errorf("Error during firmware encoding: %v", err)
44+
os.Exit(errorcodes.ErrGeneric)
45+
}
46+
},
47+
}
48+
uploadCommand.Flags().StringVarP(&flags.FQBN, "fqbn", "b", "", "Device fqbn")
49+
uploadCommand.Flags().StringVarP(&flags.file, "file", "", "", "Binary file (.bin) to be encoded")
50+
uploadCommand.MarkFlagRequired("fqbn")
51+
uploadCommand.MarkFlagRequired("file")
52+
return uploadCommand
53+
}
54+
55+
func runEncodeCommand(flags *encodeBinaryFlags) error {
56+
params := &ota.EncodeParams{
57+
FQBN: flags.FQBN,
58+
File: flags.file,
59+
}
60+
otafile, err := ota.Encode(params)
61+
if err != nil {
62+
return err
63+
}
64+
65+
feedback.Print(fmt.Sprintf("Encode successfully performed. File: %s", *otafile))
66+
67+
return nil
68+
}

cli/ota/massupload.go

+13-10
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@ import (
3333
)
3434

3535
type massUploadFlags struct {
36-
deviceIDs []string
37-
tags map[string]string
38-
file string
39-
deferred bool
40-
fqbn string
36+
deviceIDs []string
37+
tags map[string]string
38+
file string
39+
deferred bool
40+
fqbn string
41+
doNotApplyHeader bool
4142
}
4243

4344
func initMassUploadCommand() *cobra.Command {
@@ -63,6 +64,7 @@ func initMassUploadCommand() *cobra.Command {
6364
massUploadCommand.Flags().StringVarP(&flags.file, "file", "", "", "Binary file (.bin) to be uploaded")
6465
massUploadCommand.Flags().BoolVar(&flags.deferred, "deferred", false, "Perform a deferred OTA. It can take up to 1 week.")
6566
massUploadCommand.Flags().StringVarP(&flags.fqbn, "fqbn", "b", "", "FQBN of the devices to update")
67+
massUploadCommand.Flags().BoolVar(&flags.doNotApplyHeader, "no-header", false, "Do not apply header and compression to binary file before upload")
6668
massUploadCommand.MarkFlagRequired("file")
6769
massUploadCommand.MarkFlagRequired("fqbn")
6870
return massUploadCommand
@@ -72,11 +74,12 @@ func runMassUploadCommand(flags *massUploadFlags) error {
7274
logrus.Infof("Uploading binary %s", flags.file)
7375

7476
params := &ota.MassUploadParams{
75-
DeviceIDs: flags.deviceIDs,
76-
Tags: flags.tags,
77-
File: flags.file,
78-
Deferred: flags.deferred,
79-
FQBN: flags.fqbn,
77+
DeviceIDs: flags.deviceIDs,
78+
Tags: flags.tags,
79+
File: flags.file,
80+
Deferred: flags.deferred,
81+
FQBN: flags.fqbn,
82+
DoNotApplyHeader: flags.doNotApplyHeader,
8083
}
8184

8285
cred, err := config.RetrieveCredentials()

cli/ota/ota.go

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ func NewCommand() *cobra.Command {
3131
otaCommand.AddCommand(initUploadCommand())
3232
otaCommand.AddCommand(initMassUploadCommand())
3333
otaCommand.AddCommand(initOtaStatusCommand())
34+
otaCommand.AddCommand(initEncodeBinaryCommand())
35+
otaCommand.AddCommand(initDecodeHeaderCommand())
3436

3537
return otaCommand
3638
}

0 commit comments

Comments
 (0)