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) resolveURL(relURL string) (*url.URL, error) {
120 rel, err := url.Parse(relURL)
122 return nil, pkgerrors.Cause(err)
125 return c.BaseURL.ResolveReference(rel), nil
129 func (c *smsClient) sendGetRequest(relURL string) (map[string]interface{}, error) {
131 u, err := c.resolveURL(relURL)
133 return nil, pkgerrors.Cause(err)
136 resp, err := c.httpClient.Get(u.String())
138 return nil, pkgerrors.Cause(err)
141 if resp.StatusCode >= 400 && resp.StatusCode < 600 {
143 errText, _ := ioutil.ReadAll(resp.Body)
144 return nil, pkgerrors.Errorf("Request Failed with: %s and Error: %s",
145 resp.Status, string(errText))
148 var result map[string]interface{}
149 err = json.NewDecoder(resp.Body).Decode(&result)
151 return nil, pkgerrors.Cause(err)
157 func (c *smsClient) sendPostRequest(relURL string, message map[string]interface{}) error {
159 u, err := c.resolveURL(relURL)
161 return pkgerrors.Cause(err)
164 body, err := json.Marshal(message)
166 return pkgerrors.Cause(err)
169 resp, err := c.httpClient.Post(u.String(), "application/json", bytes.NewBuffer(body))
171 return pkgerrors.Cause(err)
174 if resp.StatusCode >= 400 && resp.StatusCode < 600 {
176 errText, _ := ioutil.ReadAll(resp.Body)
177 return pkgerrors.Errorf("Request Failed with: %s and Error: %s",
178 resp.Status, string(errText))
184 func (c *smsClient) createDomain(domain string) error {
186 message := map[string]interface{}{
189 url := "/v1/sms/domain"
190 err := c.sendPostRequest(url, message)
192 if strings.Contains(err.Error(), "existing domain") {
193 fmt.Println("Domain ", domain, " already exists...")
196 return pkgerrors.Cause(err)
201 func (c *smsClient) createSecret(domain string, secret string,
202 values map[string]interface{}) error {
204 message := map[string]interface{}{
209 url := "/v1/sms/domain/" + strings.TrimSpace(domain) + "/secret"
210 err := c.sendPostRequest(url, message)
212 return pkgerrors.Cause(err)
218 func (c *smsClient) isReady() bool {
220 url := "v1/sms/quorum/status"
221 res, err := c.sendGetRequest(url)
223 fmt.Println(pkgerrors.Cause(err))
227 if res["sealstatus"] == true {
234 //uploadToSMS reads through the domain or domains and uploads
235 //their corresponding secrets to SMS service
236 func (c *smsClient) uploadToSMS(data DataJSON) error {
238 var ldata []SecretDomainJSON
240 //Check if Domain is empty
241 if strings.TrimSpace(data.Domain.Name) != "" {
242 ldata = append(ldata, data.Domain)
243 } else if len(data.Domains) != 0 {
244 //Check if plural Domains are empty
245 ldata = append(ldata, data.Domains...)
247 return pkgerrors.New("Invalid JSON Data. No domain or domains found")
250 isReady := make(chan bool)
252 for c.isReady() == false {
253 time.Sleep(5 * time.Second)
254 fmt.Println("Waiting for SMS to accept requests...")
260 fmt.Println("Uploading data...")
262 for _, d := range ldata {
263 err := c.createDomain(d.Name)
265 return pkgerrors.Cause(err)
268 for _, s := range d.Secrets {
269 err = c.createSecret(d.Name, s.Name, s.Values)
271 return pkgerrors.Cause(err)
281 cacert := flag.String("cacert", "/sms/certs/aaf_root_ca.cer",
282 "Path to the CA Certificate file")
283 serviceurl := flag.String("serviceurl", "https://aaf-sms.onap",
284 "Url for the SMS Service")
285 serviceport := flag.String("serviceport", "10443",
286 "Service port if its different than the default")
287 jsondir := flag.String("jsondir", ".",
288 "Folder containing json files to upload")
292 //Clear all trailing/leading spaces from incoming strings
293 *cacert = strings.TrimSpace(*cacert)
294 *serviceurl = strings.TrimSpace(*serviceurl)
295 *serviceport = strings.TrimSpace(*serviceport)
296 *jsondir = strings.TrimSpace(*jsondir)
298 files, err := ioutil.ReadDir(*jsondir)
300 log.Fatal(pkgerrors.Cause(err))
303 //URL validity is checked here
304 serviceURL, err := url.Parse(*serviceurl + ":" + *serviceport)
306 log.Fatal(pkgerrors.Cause(err))
309 client := &smsClient{
316 for _, file := range files {
317 if filepath.Ext(file.Name()) == ".json" {
318 fmt.Println("Processing ", filepath.Join(*jsondir, file.Name()))
319 d, err := processJSONFile(filepath.Join(*jsondir, file.Name()))
321 log.Printf("Error Reading %s : %s", file.Name(), pkgerrors.Cause(err))
325 err = client.uploadToSMS(d)
327 log.Printf("Error Uploading %s : %s", file.Name(), pkgerrors.Cause(err))