You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by mi...@apache.org on 2018/07/09 14:26:43 UTC

[trafficcontrol] 04/08: WIP - TP stream ISO

This is an automated email from the ASF dual-hosted git repository.

mitchell852 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git

commit 1bba6972c9fa80ab92c704e0e382fbe5740e2d11
Author: Jesse Rivas <je...@comcast.com>
AuthorDate: Tue Jun 26 12:46:50 2018 -0600

    WIP - TP stream ISO
---
 traffic_ops/app/lib/API/Iso.pm                     | 12 ++++++---
 .../common/modules/form/iso/FormISOController.js   | 31 +++++++++++++++++++---
 .../src/common/modules/form/iso/form.iso.tpl.html  | 11 ++++++++
 traffic_portal/app/src/index.html                  |  3 +++
 traffic_portal/app/src/scripts/shared-libs.js      |  2 ++
 traffic_portal/bower.json                          |  3 ++-
 traffic_portal/grunt/browserify2.js                |  4 ++-
 traffic_portal/package.json                        |  4 +++
 8 files changed, 60 insertions(+), 10 deletions(-)

diff --git a/traffic_ops/app/lib/API/Iso.pm b/traffic_ops/app/lib/API/Iso.pm
index b16d966..6487043 100644
--- a/traffic_ops/app/lib/API/Iso.pm
+++ b/traffic_ops/app/lib/API/Iso.pm
@@ -30,6 +30,8 @@ use Common::ReturnCodes qw(SUCCESS ERROR);
 use Mojolicious::Plugin::Config;
 use Data::Validate::IP qw(is_ipv4 is_ipv6);
 use Validate::Tiny ':all';
+use Net::Domain qw(hostfqdn);
+use MIME::Base64;
 
 my $filebasedir             = "/var/www/files";
 my $ksfiles_parm_name       = "kickstart.files.location";
@@ -238,7 +240,8 @@ sub generate_iso {
 
 		&log($self, "ISO created [ " . $osversion_dir . " ] for " . $fqdn, "APICHANGE");
 
-		my $iso_url = join("/", $config->{'to'}{'base_url'}, $iso_dir, $iso_file_name);
+		#my $iso_url = join("/", $config->{'to'}{'base_url'}, $iso_dir, $iso_file_name);
+		my $iso_url = join("/", "https://" + hostfqdn(), $iso_dir, $iso_file_name);
 
 		$response = {
 			isoName => $iso_file_name,
@@ -246,12 +249,13 @@ sub generate_iso {
 		};
 	}
 	else {
-		$self->res->headers->content_type("application/download");
+		$self->res->headers->content_type("application/x-iso9660-image");
 		$self->res->headers->content_disposition("attachment; filename=\"$iso_file_name\"");
 		my $data = `$cmd`;
-		$self->render( data => $data );
+		#$self->render( data => $data );
+		my $encodedIso = encode_base64($data);
 		$response = {
-			iso => $data,
+			iso => $encodedIso,
 			name => $iso_file_name,
 		};
 	}
diff --git a/traffic_portal/app/src/common/modules/form/iso/FormISOController.js b/traffic_portal/app/src/common/modules/form/iso/FormISOController.js
index 382ddf8..9af70d6 100644
--- a/traffic_portal/app/src/common/modules/form/iso/FormISOController.js
+++ b/traffic_portal/app/src/common/modules/form/iso/FormISOController.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-var FormISOController = function(servers, osversions, $scope, $anchorScroll, formUtils, toolsService, messageModel) {
+var FormISOController = function(servers, osversions, $scope, $anchorScroll, formUtils, toolsService, messageModel, FileSaver, Blob) {
 
 	$scope.servers = servers;
 
@@ -31,7 +31,8 @@ var FormISOController = function(servers, osversions, $scope, $anchorScroll, for
 	];
 
 	$scope.iso = {
-		dhcp: 'no'
+		dhcp: 'no',
+		stream: 'no'
 	};
 
 	$scope.isDHCP = function() {
@@ -50,7 +51,23 @@ var FormISOController = function(servers, osversions, $scope, $anchorScroll, for
 		toolsService.generateISO(iso)
 			.then(function(result) {
 				$anchorScroll(); // scrolls window to top
-				messageModel.setMessages([ { level: 'success', text: 'ISO created at ' + result.isoURL } ], false);
+				if (iso.stream != 'yes') {
+                    messageModel.setMessages([{level: 'success', text: 'ISO created at ' + result.isoURL}], false);
+                }
+                else {
+					//var isoStr = result.iso.replace(/\n/g, "");
+					//var decodedIso = Base64.atob(result.iso);
+					//isoStr += '=';
+					//alert(isoStr.length)
+                    //var decodedIso = $base64.atob(result.iso);
+					var decodedIso = atob(result.iso);
+					var newData = new Blob([decodedIso], { type: 'application/x-iso9660-image' } );
+					//var encodedIso = new Blob([result.iso], { type: 'application/x-iso9660-image' } );
+					//var file = new File([decodedIso], result.name, { type: 'application/x-iso9660-image' } );
+					//alert(newData.size + " : " + encodedIso.size);
+
+					FileSaver.saveAs(newData, result.name);
+				}
 			});
 	};
 
@@ -58,7 +75,13 @@ var FormISOController = function(servers, osversions, $scope, $anchorScroll, for
 
 	$scope.hasPropertyError = formUtils.hasPropertyError;
 
+    // function b64DecodeUnicode(str) {
+    //     return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {
+    //         return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
+    //     }).join(''))
+    // }
+
 };
 
-FormISOController.$inject = ['servers', 'osversions', '$scope', '$anchorScroll', 'formUtils', 'toolsService', 'messageModel'];
+FormISOController.$inject = ['servers', 'osversions', '$scope', '$anchorScroll', 'formUtils', 'toolsService', 'messageModel', 'FileSaver', 'Blob'];
 module.exports = FormISOController;
diff --git a/traffic_portal/app/src/common/modules/form/iso/form.iso.tpl.html b/traffic_portal/app/src/common/modules/form/iso/form.iso.tpl.html
index 015325e..5b15ea6 100644
--- a/traffic_portal/app/src/common/modules/form/iso/form.iso.tpl.html
+++ b/traffic_portal/app/src/common/modules/form/iso/form.iso.tpl.html
@@ -189,6 +189,17 @@ under the License.
                     <span ng-show="hasError(isoForm.mgmtInterface)" class="form-control-feedback"><i class="fa fa-times"></i></span>
                 </div>
             </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(isoForm.stream), 'has-feedback': hasError(isoForm.stream)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Stream ISO *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select name="stream" class="form-control" ng-model="iso.stream" ng-options="x.value as x.label for x in falseTrue" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(isoForm.stream, 'required')">Required</small>
+                </div>
+            </div>
+
             <div class="modal-footer">
                 <button type="button" class="btn btn-success" ng-disabled="isoForm.$pristine || isoForm.$invalid" ng-click="generate(iso)">Generate ISO</button>
             </div>
diff --git a/traffic_portal/app/src/index.html b/traffic_portal/app/src/index.html
index fc5363b..ebc373d 100644
--- a/traffic_portal/app/src/index.html
+++ b/traffic_portal/app/src/index.html
@@ -54,6 +54,9 @@ under the License.
         <script src="resources/assets/js/underscore-min_1.8.3.js"></script>
         <script src="resources/assets/js/jquery.dataTables.min_1.10.16.js"></script>
 
+        <script src="resources/assets/js/base64.js"></script>
+        <script src="resources/assets/js/base64js.min.js"></script>
+
     </body>
 
 </html>
diff --git a/traffic_portal/app/src/scripts/shared-libs.js b/traffic_portal/app/src/scripts/shared-libs.js
index 06c68f2..932704c 100644
--- a/traffic_portal/app/src/scripts/shared-libs.js
+++ b/traffic_portal/app/src/scripts/shared-libs.js
@@ -28,6 +28,7 @@ require('angular-resource');
 require('angular-route');
 require('angular-sanitize');
 require('angular-ui-router');
+require('angular-file-saver');
 
 // angular jwt
 require('angular-jwt');
@@ -56,3 +57,4 @@ require('jquery-flot-axislabels');
 // misc
 require('es5-shim');
 require('json3');
+require('js-base64');
\ No newline at end of file
diff --git a/traffic_portal/bower.json b/traffic_portal/bower.json
index ec23260..929a219 100755
--- a/traffic_portal/bower.json
+++ b/traffic_portal/bower.json
@@ -18,6 +18,7 @@
         "font-awesome": "4.5.0",
         "jquery": "2.0.0",
         "json3": "3.3.2",
-        "restangular": "1.5.2"
+        "restangular": "1.5.2",
+        "file-saver": "1.3.8"
     }
 }
diff --git a/traffic_portal/grunt/browserify2.js b/traffic_portal/grunt/browserify2.js
index 2528df4..4b10d50 100644
--- a/traffic_portal/grunt/browserify2.js
+++ b/traffic_portal/grunt/browserify2.js
@@ -103,7 +103,9 @@ module.exports = {
                                 'es5-shim/es5-shim.js',
                                 'jquery/jquery.js',
                                 'json3/lib/json3.js',
-                                'restangular/dist/restangular.js'
+                                'restangular/dist/restangular.js',
+                                'angular-file-saver/dist/angular-file-saver.bundle.js',
+                                'js-base64/base64.js'
                             ]
                     },
                     {
diff --git a/traffic_portal/package.json b/traffic_portal/package.json
index 6f51e0e..d2038de 100755
--- a/traffic_portal/package.json
+++ b/traffic_portal/package.json
@@ -33,5 +33,9 @@
   },
   "engines": {
     "node": "0.11.14"
+  },
+  "dependencies": {
+    "base64-js": "^1.3.0",
+    "js-base64": "^2.4.5"
   }
 }