2 * Copyright 2018 Intel Corporation, Inc
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
34 pkgerrors "github.com/pkg/errors"
37 //DataJSON stores a list of domains from JSON file
38 type DataJSON struct {
39 //Support single domain: {} structure in JSON
40 Domain SecretDomainJSON `json:"domain,omitempty"`
41 //Support plural domains: [{}] structure in JSON
42 Domains []SecretDomainJSON `json:"domains,omitempty"`
45 //SecretDomainJSON stores a name for the Domain and a list of Secrets
46 type SecretDomainJSON struct {
47 Name string `json:"name"`
48 Secrets []SecretJSON `json:"secrets"`
51 //SecretJSON stores a name for the Secret and a list of Values
52 type SecretJSON struct {
53 Name string `json:"name"`
54 Values map[string]interface{} `json:"values"`
57 //Processes the JSON file and returns a DataJSON struct
58 func processJSONFile(name string) (DataJSON, error) {
60 data, err := ioutil.ReadFile(name)
62 return DataJSON{}, pkgerrors.Cause(err)
66 err = json.Unmarshal(data, &d)
68 return DataJSON{}, pkgerrors.Cause(err)
74 type smsClient struct {
80 httpClient *http.Client
83 func (c *smsClient) init() error {
86 caCert, err := ioutil.ReadFile(c.CaCertPath)
88 fmt.Println(pkgerrors.Cause(err))
89 fmt.Println("Using Insecure Server Verification")
93 tlsConfig := &tls.Config{
94 MinVersion: tls.VersionTLS12,
97 tlsConfig.InsecureSkipVerify = skipVerify
99 // Add cert information when skipVerify is false
100 if skipVerify == false {
101 caCertPool := x509.NewCertPool()
102 caCertPool.AppendCertsFromPEM(caCert)
103 tlsConfig.RootCAs = caCertPool
106 tr := &http.Transport{
107 TLSClientConfig: tlsConfig,
110 c.httpClient = &http.Client{
112 Timeout: time.Duration(c.Timeout) * time.Second,
118 func (c *smsClient) sendPostRequest(relURL string, message map[string]interface{}) error {
120 rel, err := url.Parse(relURL)
122 return pkgerrors.Cause(err)
124 u := c.BaseURL.ResolveReference(rel)
126 body, err := json.Marshal(message)
128 return pkgerrors.Cause(err)
131 resp, err := c.httpClient.Post(u.String(), "application/json", bytes.NewBuffer(body))
133 return pkgerrors.Cause(err)
136 if resp.StatusCode >= 400 && resp.StatusCode < 600 {
138 errText, _ := ioutil.ReadAll(resp.Body)
139 return pkgerrors.Errorf("Request Failed with: %s and Error: %s",
140 resp.Status, string(errText))
146 func (c *smsClient) createDomain(domain string) error {
148 message := map[string]interface{}{
151 url := "/v1/sms/domain"
152 err := c.sendPostRequest(url, message)
154 return pkgerrors.Cause(err)
159 func (c *smsClient) createSecret(domain string, secret string,
161 values map[string]interface{}) error {
162 message := map[string]interface{}{
167 url := "/v1/sms/domain/" + strings.TrimSpace(domain) + "/secret"
168 err := c.sendPostRequest(url, message)
170 return pkgerrors.Cause(err)
176 //uploadToSMS reads through the domain or domains and uploads
177 //their corresponding secrets to SMS service
178 func (c *smsClient) uploadToSMS(data DataJSON) error {
180 var ldata []SecretDomainJSON
182 //Check if Domain is empty
183 if strings.TrimSpace(data.Domain.Name) != "" {
184 ldata = append(ldata, data.Domain)
185 } else if len(data.Domains) != 0 {
186 //Check if plural Domains are empty
187 ldata = append(ldata, data.Domains...)
189 return pkgerrors.New("Invalid JSON Data. No domain or domains found")
192 for _, d := range ldata {
193 err := c.createDomain(d.Name)
195 return pkgerrors.Cause(err)
198 for _, s := range d.Secrets {
199 err = c.createSecret(d.Name, s.Name, s.Values)
201 return pkgerrors.Cause(err)
211 cacert := flag.String("cacert", "/sms/certs/aaf_root_ca.cer",
212 "Path to the CA Certificate file")
213 serviceurl := flag.String("serviceurl", "https://aaf-sms.onap",
214 "Url for the SMS Service")
215 serviceport := flag.String("serviceport", "10443",
216 "Service port if its different than the default")
217 jsondir := flag.String("jsondir", ".",
218 "Folder containing json files to upload")
222 //Clear all trailing/leading spaces from incoming strings
223 *cacert = strings.TrimSpace(*cacert)
224 *serviceurl = strings.TrimSpace(*serviceurl)
225 *serviceport = strings.TrimSpace(*serviceport)
226 *jsondir = strings.TrimSpace(*jsondir)
228 files, err := ioutil.ReadDir(*jsondir)
230 log.Fatal(pkgerrors.Cause(err))
233 //URL validity is checked here
234 serviceURL, err := url.Parse(*serviceurl + ":" + *serviceport)
236 log.Fatal(pkgerrors.Cause(err))
239 client := &smsClient{
246 for _, file := range files {
247 if filepath.Ext(file.Name()) == ".json" {
248 fmt.Println("Processing ", filepath.Join(*jsondir, file.Name()))
249 d, err := processJSONFile(filepath.Join(*jsondir, file.Name()))
251 log.Printf("Error Reading %s : %s", file.Name(), pkgerrors.Cause(err))
255 err = client.uploadToSMS(d)
257 log.Printf("Error Uploading %s : %s", file.Name(), pkgerrors.Cause(err))