commit
98ff399ee6
@ -0,0 +1,9 @@
|
||||
node_modules/
|
||||
libs/
|
||||
site/
|
||||
.idea
|
||||
*.cer
|
||||
*.req
|
||||
*.key
|
||||
serial
|
||||
osconsole/config.js
|
||||
@ -0,0 +1,22 @@
|
||||
FROM centos:centos7
|
||||
MAINTAINER Jimmi Dyson <jimmidyson@gmail.com>
|
||||
ENTRYPOINT ["/kuisp"]
|
||||
CMD [ "-p", "9090", \
|
||||
"-c", "/site/osconsole/config.js.tmpl=/site/osconsole/config.js", \
|
||||
"--default-page=/index.html", \
|
||||
"--max-age=24h", \
|
||||
"--compress" ]
|
||||
EXPOSE 9090
|
||||
|
||||
ENV KUISP_VERSION 0.10
|
||||
|
||||
RUN yum install -y tar && \
|
||||
yum clean all && \
|
||||
curl -L https://github.com/jimmidyson/kuisp/releases/download/v${KUISP_VERSION}/kuisp-${KUISP_VERSION}-linux-amd64.tar.gz | \
|
||||
tar xzv
|
||||
|
||||
COPY site /site/
|
||||
RUN chmod 777 /site/osconsole/
|
||||
|
||||
WORKDIR /site/
|
||||
USER nobody
|
||||
@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
@ -0,0 +1,61 @@
|
||||
## hawtio-kubernetes [](https://circleci.com/gh/hawtio/hawtio-kubernetes)
|
||||
|
||||
This plugin provides a [Kubernetes](http://kubernetes.io/) console for hawtio
|
||||
|
||||

|
||||
|
||||
### Running
|
||||
|
||||
#### Running a release
|
||||
|
||||
If you have a [Kubernetes](http://kubernetes.io/) or [OpenShift](http://www.openshift.org/) environment, the easiest way to try out this console is to just run the app directly in kubernetes via [these instructions](http://fabric8.io/v2/console.html#running-the-console-on-kubernetesopenshift)
|
||||
|
||||
Or you can try running the [fabric8/hawtio-kubernetes docker image](https://registry.hub.docker.com/u/fabric8/hawtio-kubernetes/):
|
||||
|
||||
docker pull fabric8/hawtio-kubernetes
|
||||
docker run -it -p 9090:9090 -e KUBERNETES_SERVICE_HOST=$DOCKER_IP fabric8/hawtio-kubernetes
|
||||
|
||||
Where **DOCKER_IP** is the IP address or host running the kubernetes master.
|
||||
|
||||
#### Running this plugin locally
|
||||
|
||||
First clone the source
|
||||
|
||||
git clone https://github.com/hawtio/hawtio-kubernetes.git
|
||||
cd hawtio-kubernetes
|
||||
|
||||
Next you'll need to [install NodeJS](http://nodejs.org/download/) and then install the default global npm dependencies:
|
||||
|
||||
npm install -g bower gulp slush slush-hawtio-javascript slush-hawtio-typescript typescript
|
||||
|
||||
Then install all local nodejs packages and update bower dependencies via:
|
||||
|
||||
npm install
|
||||
bower update
|
||||
|
||||
Next you need to setup the **KUBERNETES_MASTER** environment variable to point to the kubernetes master you want to run against. e.g.
|
||||
|
||||
export KUBERNETES_MASTER=https://$DOCKER_IP:8443
|
||||
|
||||
Where **DOCKER_IP** is the IP address or host running the kubernetes master.
|
||||
|
||||
If you need to disable OAUTH authentication in development try use **DISABLE_OAUTH**:
|
||||
|
||||
export DISABLE_OAUTH=true
|
||||
|
||||
Then to run the web application:
|
||||
|
||||
gulp
|
||||
|
||||
#### Install the bower package
|
||||
|
||||
`bower install --save hawtio-kubernetes`
|
||||
|
||||
#### Output build to a different directory
|
||||
|
||||
When developing this plugin in a dependent console you can change the output directory where the compiled .js and .css go. Just use the 'out' flag to set a different output directory, for example:
|
||||
|
||||
`gulp watch --out=../fabric8-console/libs/hawtio-kubernetes/dist/`
|
||||
|
||||
Whenever the build completes the compiled .js file will be put into the target directory. Don't forget to first do a `gulp build` without this flag before committing changes!
|
||||
|
||||
@ -0,0 +1,37 @@
|
||||
function Recursion(node){
|
||||
var count=0;
|
||||
for (var key in node) {
|
||||
count++;
|
||||
var value = node[key];
|
||||
delete node[key];
|
||||
//如果node为叶子节点
|
||||
if (key.toString() == '$') {
|
||||
for (var attr in value)
|
||||
node[attr] = value[attr];
|
||||
} else {
|
||||
if (value instanceof Array) {
|
||||
if (value.length > 0) {
|
||||
node["children"] = value;
|
||||
for (var obj in value)
|
||||
Recursion(value[obj]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(count==1)
|
||||
node["children"]=[];
|
||||
}
|
||||
|
||||
function randomString(len) {
|
||||
len = len || 32;
|
||||
var $chars = 'abcdefhijkmnprstwxyz'; // 默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1
|
||||
var maxPos = $chars.length;
|
||||
var pwd = '';
|
||||
for (i = 0; i < len; i++) {
|
||||
pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
|
||||
}
|
||||
return pwd;
|
||||
}
|
||||
|
||||
exports.randomString=randomString;
|
||||
exports.Recursion=Recursion;
|
||||
@ -0,0 +1,213 @@
|
||||
var fs = require('fs'), path = require('path'), util = require('util'), Stream = require('stream').Stream;
|
||||
|
||||
|
||||
|
||||
module.exports = resumable = function(temporaryFolder){
|
||||
var $ = this;
|
||||
$.temporaryFolder = temporaryFolder;
|
||||
$.maxFileSize = null;
|
||||
$.fileParameterName = 'file';
|
||||
|
||||
try {
|
||||
fs.mkdirSync($.temporaryFolder);
|
||||
}catch(e){}
|
||||
|
||||
|
||||
var cleanIdentifier = function(identifier){
|
||||
return identifier.replace(/^0-9A-Za-z_-/img, '');
|
||||
}
|
||||
|
||||
var getChunkFilename = function(chunkNumber, identifier){
|
||||
// Clean up the identifier
|
||||
identifier = cleanIdentifier(identifier);
|
||||
// What would the file name be?
|
||||
return path.join($.temporaryFolder, './resumable-'+identifier+'.'+chunkNumber);
|
||||
}
|
||||
|
||||
var validateRequest = function(chunkNumber, chunkSize, totalSize, identifier, filename, fileSize){
|
||||
// Clean up the identifier
|
||||
identifier = cleanIdentifier(identifier);
|
||||
|
||||
// Check if the request is sane
|
||||
if (chunkNumber==0 || chunkSize==0 || totalSize==0 || identifier.length==0 || filename.length==0) {
|
||||
return 'non_resumable_request';
|
||||
}
|
||||
var numberOfChunks = Math.max(Math.floor(totalSize/(chunkSize*1.0)), 1);
|
||||
if (chunkNumber>numberOfChunks) {
|
||||
return 'invalid_resumable_request1';
|
||||
}
|
||||
|
||||
// Is the file too big?
|
||||
if($.maxFileSize && totalSize>$.maxFileSize) {
|
||||
return 'invalid_resumable_request2';
|
||||
}
|
||||
|
||||
if(typeof(fileSize)!='undefined') {
|
||||
if(chunkNumber<numberOfChunks && fileSize!=chunkSize) {
|
||||
// The chunk in the POST request isn't the correct size
|
||||
return 'invalid_resumable_request3';
|
||||
}
|
||||
if(numberOfChunks>1 && chunkNumber==numberOfChunks && fileSize!=((totalSize%chunkSize)+chunkSize)) {
|
||||
// The chunks in the POST is the last one, and the fil is not the correct size
|
||||
return 'invalid_resumable_request4';
|
||||
}
|
||||
if(numberOfChunks==1 && fileSize!=totalSize) {
|
||||
// The file is only a single chunk, and the data size does not fit
|
||||
return 'invalid_resumable_request5';
|
||||
}
|
||||
}
|
||||
|
||||
return 'valid';
|
||||
}
|
||||
|
||||
//'found', filename, original_filename, identifier
|
||||
//'not_found', null, null, null
|
||||
$.get = function(req, callback){
|
||||
var chunkNumber = req.param('resumableChunkNumber', 0);
|
||||
var chunkSize = req.param('resumableChunkSize', 0);
|
||||
var totalSize = req.param('resumableTotalSize', 0);
|
||||
var identifier = req.param('resumableIdentifier', "");
|
||||
var filename = req.param('resumableFilename', "");
|
||||
|
||||
if(validateRequest(chunkNumber, chunkSize, totalSize, identifier, filename)=='valid') {
|
||||
var chunkFilename = getChunkFilename(chunkNumber, identifier);
|
||||
fs.exists(chunkFilename, function(exists){
|
||||
if(exists){
|
||||
callback('found', chunkFilename, filename, identifier);
|
||||
} else {
|
||||
callback('not_found', chunkFilename, filename, identifier);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
callback('not_found2', chunkFilename, filename, identifier);
|
||||
}
|
||||
}
|
||||
|
||||
//'partly_done', filename, original_filename, identifier
|
||||
//'done', filename, original_filename, identifier
|
||||
//'invalid_resumable_request', null, null, null
|
||||
//'non_resumable_request', null, null, null
|
||||
$.post = function(req, callback){
|
||||
|
||||
var fields = req.body;
|
||||
var files = req.files;
|
||||
|
||||
var chunkNumber = fields['resumableChunkNumber'];
|
||||
var chunkSize = fields['resumableChunkSize'];
|
||||
var totalSize = fields['resumableTotalSize'];
|
||||
var identifier = cleanIdentifier(fields['resumableIdentifier']);
|
||||
var filename = fields['resumableFilename'];
|
||||
|
||||
var original_filename = fields['resumableIdentifier'];
|
||||
|
||||
if(!files[$.fileParameterName] || !files[$.fileParameterName].size) {
|
||||
callback('invalid_resumable_request', null, null, null);
|
||||
return;
|
||||
}
|
||||
var validation = validateRequest(chunkNumber, chunkSize, totalSize, identifier, files[$.fileParameterName].size);
|
||||
if(validation=='valid') {
|
||||
var chunkFilename = getChunkFilename(chunkNumber, identifier);
|
||||
|
||||
// Save the chunk (TODO: OVERWRITE)
|
||||
fs.rename(files[$.fileParameterName].path, chunkFilename, function(){
|
||||
|
||||
// Do we have all the chunks?
|
||||
var currentTestChunk = 1;
|
||||
var numberOfChunks = Math.max(Math.floor(totalSize/(chunkSize*1.0)), 1);
|
||||
var testChunkExists = function(){
|
||||
fs.exists(getChunkFilename(currentTestChunk, identifier), function(exists){
|
||||
if(exists){
|
||||
currentTestChunk++;
|
||||
if(currentTestChunk>numberOfChunks) {
|
||||
callback('done', filename, original_filename, identifier);
|
||||
} else {
|
||||
// Recursion
|
||||
testChunkExists();
|
||||
}
|
||||
} else {
|
||||
callback('partly_done', filename, original_filename, identifier);
|
||||
}
|
||||
});
|
||||
}
|
||||
testChunkExists();
|
||||
});
|
||||
} else {
|
||||
callback(validation, filename, original_filename, identifier);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Pipe chunks directly in to an existsing WritableStream
|
||||
// r.write(identifier, response);
|
||||
// r.write(identifier, response, {end:false});
|
||||
//
|
||||
// var stream = fs.createWriteStream(filename);
|
||||
// r.write(identifier, stream);
|
||||
// stream.on('data', function(data){...});
|
||||
// stream.on('end', function(){...});
|
||||
$.write = function(identifier, writableStream, options) {
|
||||
options = options || {};
|
||||
options.end = (typeof options['end'] == 'undefined' ? true : options['end']);
|
||||
|
||||
// Iterate over each chunk
|
||||
var pipeChunk = function(number) {
|
||||
|
||||
var chunkFilename = getChunkFilename(number, identifier);
|
||||
|
||||
fs.exists(chunkFilename, function(exists) {
|
||||
|
||||
if (exists) {
|
||||
// If the chunk with the current number exists,
|
||||
// then create a ReadStream from the file
|
||||
// and pipe it to the specified writableStream.
|
||||
var sourceStream = fs.createReadStream(chunkFilename);
|
||||
sourceStream.pipe(writableStream, {
|
||||
end: false
|
||||
});
|
||||
sourceStream.on('end', function() {
|
||||
// When the chunk is fully streamed,
|
||||
// jump to the next one
|
||||
pipeChunk(number + 1);
|
||||
});
|
||||
} else {
|
||||
// When all the chunks have been piped, end the stream
|
||||
if (options.end) writableStream.end();
|
||||
if (options.onDone) options.onDone();
|
||||
}
|
||||
});
|
||||
}
|
||||
pipeChunk(1);
|
||||
}
|
||||
|
||||
|
||||
$.clean = function(identifier, options) {
|
||||
options = options || {};
|
||||
|
||||
// Iterate over each chunk
|
||||
var pipeChunkRm = function(number) {
|
||||
|
||||
var chunkFilename = getChunkFilename(number, identifier);
|
||||
|
||||
//console.log('removing pipeChunkRm ', number, 'chunkFilename', chunkFilename);
|
||||
fs.exists(chunkFilename, function(exists) {
|
||||
if (exists) {
|
||||
|
||||
console.log('exist removing ', chunkFilename);
|
||||
fs.unlink(chunkFilename, function(err) {
|
||||
if (err && options.onError) options.onError(err);
|
||||
});
|
||||
|
||||
pipeChunkRm(number + 1);
|
||||
|
||||
} else {
|
||||
|
||||
if (options.onDone) options.onDone();
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
pipeChunkRm(1);
|
||||
}
|
||||
|
||||
return $;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,216 @@
|
||||
/* 样式重置 */
|
||||
body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{ margin:0; padding:0;}
|
||||
body,table,input,textarea,select,button { font-family: "微软雅黑","宋体"; font-size:12px;line-height:1.5; background:#fff;}
|
||||
div,img,tr,td,table{ border:0;}
|
||||
table,tr,td{border:0;cellspacing:0; cellpadding:0;}
|
||||
ol,ul,li{ list-style-type:none}
|
||||
a:link,a:visited{color:#7f7f7f;text-decoration:none;}
|
||||
a:hover,a:active{color:#000;}
|
||||
.fl{ float:left;}
|
||||
.fr{ float:right;}
|
||||
.cl{ clear:both; overflow:hidden;}
|
||||
|
||||
/* 数据页面 */
|
||||
.data_container{
|
||||
width:100%;
|
||||
margin:0 auto;
|
||||
}
|
||||
.data_heaer{
|
||||
height:66px;
|
||||
width:100%;
|
||||
background-color:#3499db;
|
||||
text-align:center;
|
||||
}
|
||||
.data_heaer h2{
|
||||
font-size:30px;
|
||||
font-weight:300;
|
||||
color:#fff;
|
||||
line-height:66px;
|
||||
}
|
||||
.data_content{
|
||||
width:1280px;
|
||||
height:838px;
|
||||
margin:0 auto;
|
||||
background-color:#fff;
|
||||
border:1px solid #e0dede;
|
||||
border-top:none;
|
||||
}
|
||||
.data_leftside{
|
||||
width:612px;
|
||||
border-right:1px solid #e0dede;
|
||||
}
|
||||
.data_h3{
|
||||
width:100%;
|
||||
text-align:center;
|
||||
height:50px;
|
||||
font-size:18px;
|
||||
color:#444;
|
||||
line-height:50px;
|
||||
}
|
||||
.data_leftside_files{
|
||||
border-right:1px solid #e0dede;
|
||||
border-bottom:1px solid #e0dede;
|
||||
height:710px;
|
||||
overflow :auto;
|
||||
}
|
||||
.data_leftside_files input{
|
||||
margin-top:15px;
|
||||
width:15px;
|
||||
height:15px;
|
||||
}
|
||||
.data_leftside_files li{
|
||||
height:40px;
|
||||
line-height:40px;
|
||||
border-bottom:1px solid #e0dede;
|
||||
padding:0 10px;
|
||||
}
|
||||
.data_leftside_files li.data_title{
|
||||
width:210px; height:36px;
|
||||
line-height:36px;
|
||||
text-align:center;
|
||||
background-color:#e9f3fb;
|
||||
border:none;
|
||||
overflow:hidden;
|
||||
text-overflow:ellipsis;
|
||||
-o-text-overflow:ellipsis;
|
||||
white-space:nowrap;
|
||||
}
|
||||
.date_label{
|
||||
display:block;
|
||||
width:168px;
|
||||
overflow:hidden;
|
||||
text-overflow:ellipsis;
|
||||
-o-text-overflow:ellipsis;
|
||||
white-space:nowrap;
|
||||
}
|
||||
.data_leftside_shu{
|
||||
border-right:none;
|
||||
}
|
||||
.data_leftside_shu li{
|
||||
border-bottom:none;
|
||||
}
|
||||
.data_conbar{ width:149px;
|
||||
height:834px;
|
||||
border-right:1px solid #e0dede;
|
||||
border-left:1px solid #e0dede;
|
||||
}
|
||||
.date_btns{
|
||||
width:260px;
|
||||
margin:20px auto;
|
||||
}
|
||||
.date_btns_w{
|
||||
width:390px;
|
||||
}
|
||||
.date_btns button{
|
||||
margin:10px 20px;
|
||||
}
|
||||
.data_btn{
|
||||
border:none;
|
||||
width:108px;
|
||||
height:35px;
|
||||
line-height:35px;
|
||||
text-align:center;
|
||||
background-color:#3499db;
|
||||
color:#fff;
|
||||
font-size:14px;
|
||||
-webkit-border-radius:5px;
|
||||
-moz-border-radius:5px;
|
||||
-o-border-radius:5px;
|
||||
border-radius:5px;
|
||||
}
|
||||
.data_btn:hover{
|
||||
background-color:#2989da;
|
||||
}
|
||||
.data_rightside{
|
||||
width:667px;
|
||||
}
|
||||
.data_rightside_w{
|
||||
width:407px;
|
||||
}
|
||||
.data_leftside_files li.data_title_w{
|
||||
width:183px;
|
||||
}
|
||||
.date_label_w{
|
||||
width:150px;
|
||||
}
|
||||
.data_leftside_shu li{
|
||||
border-bottom:none;
|
||||
}
|
||||
|
||||
a.data_file_btn{ display:block; position:relative; width:108px; height:35px; margin:15px auto; line-height:35px; font-size:14px; color: #fff; text-align:center;
|
||||
background-color: #79b4e7;
|
||||
background-image: -webkit-linear-gradient(#79b4e7, #1377cf);
|
||||
background-image: linear-gradient(#79b4e7, #1377cf);
|
||||
border-color: #076bc2;
|
||||
-webkit-border-radius:5px;
|
||||
-moz-border-radius:5px;
|
||||
-o-border-radius:5px;
|
||||
border-radius:5px;
|
||||
vertical-align: middle;
|
||||
cursor: pointer;
|
||||
margin:0 10px;
|
||||
}
|
||||
a:hover.data_file_btn{
|
||||
background-color: #076bc2;
|
||||
background-image: -webkit-linear-gradient(#79b4e7, #076bc2);
|
||||
background-image: linear-gradient(#79b4e7, #076bc2);
|
||||
border-color: #076bc2;}
|
||||
.data_file_btn input{ position:absolute; left:0px;opacity:0; filter:alpha(opacity=0); width:108px; height:35px;}
|
||||
|
||||
|
||||
.data_conbox{
|
||||
width:407px;
|
||||
height:709px;
|
||||
border-top:1px solid #e0dede;
|
||||
border-bottom:1px solid #e0dede;
|
||||
overflow: auto;
|
||||
}
|
||||
.data_con_title{
|
||||
width:49.8%;
|
||||
height:36px;
|
||||
line-height:36px;
|
||||
text-align:center;
|
||||
background-color:#e9f3fb;
|
||||
overflow:hidden;
|
||||
text-overflow:ellipsis;
|
||||
-o-text-overflow:ellipsis;
|
||||
white-space:nowrap;
|
||||
}
|
||||
.data_con_line{
|
||||
border-right:1px solid #e0dede;
|
||||
|
||||
}
|
||||
.data_con_li{
|
||||
width:49.8%;
|
||||
height:36px;
|
||||
line-height:36px;
|
||||
overflow:hidden;
|
||||
text-overflow:ellipsis;
|
||||
-o-text-overflow:ellipsis;
|
||||
white-space:nowrap;
|
||||
border-bottom:1px solid #e0dede;
|
||||
}
|
||||
.mt15{ margin-top:15px;}
|
||||
|
||||
|
||||
/* 树形结构 */
|
||||
.data_rightside_tree{
|
||||
width:259px;
|
||||
height:709px;
|
||||
border-right:1px solid #e0dede;
|
||||
border-top:1px solid #e0dede;
|
||||
border-bottom:1px solid #e0dede;
|
||||
overflow: auto;
|
||||
}
|
||||
.tree { min-height:20px;padding:15px;padding-left:30px;border-bottom:1px dashed #ccc;}
|
||||
.tree li {list-style-type:none;margin:0; padding:10px 5px 0 20px; position:relative}
|
||||
.tree li::before, .tree li::after { content:'';left:-30px;position:absolute; right:auto}
|
||||
.tree li::before { border-left:1px solid #999; bottom:50px;height:100%; top:0; width:0px}
|
||||
.tree li::after {border-top:1px solid #999;height:20px; top:25px; width:35px}
|
||||
.tree li p {display:inline-block;padding:3px 10px;border:1px solid #fff; margin-left:-15px; width:150px; }
|
||||
.tree li.parent_li>p {cursor:pointer}
|
||||
.tree>ul>li::before, .tree>ul>li::after {border:0}
|
||||
.tree li:last-child::before { height:30px}
|
||||
.tree li.parent_li>p:hover, .tree li.parent_li>p:hover+ul li p { }
|
||||
.icon-plus-sign{ margin-left:-15px; background:url(../img/icons1.gif) -5px 10px no-repeat; }
|
||||
.icon-minus-sign{ margin-left:-15px; background:url(../img/icons2.gif) -6px 9px no-repeat;}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,63 @@
|
||||
{
|
||||
"name": "hawtio-kubernetes",
|
||||
"version": "2.1.179",
|
||||
"keywords": [
|
||||
"hawtio"
|
||||
],
|
||||
"main": [
|
||||
"dist/hawtio-kubernetes.css",
|
||||
"dist/hawtio-kubernetes.js"
|
||||
],
|
||||
"ignore": [
|
||||
".*",
|
||||
"**/.*",
|
||||
"node_modules",
|
||||
"bower_components",
|
||||
"libs",
|
||||
"test",
|
||||
"tests",
|
||||
"plugins"
|
||||
],
|
||||
"dependencies": {
|
||||
"angular-nvd3": "~1.0.2",
|
||||
"angular": "~1.4.4",
|
||||
"angular-resource": "~1.4.7",
|
||||
"angular-ui-codemirror": "~0.3.0",
|
||||
"angular-ui-validate": "~1.2.1",
|
||||
"angularjs-scroll-glue": "~0.0.1",
|
||||
"hawtio-core": "~2.0.16",
|
||||
"hawtio-forms": "~2.0.15",
|
||||
"hawtio-oauth": "~2.0.21",
|
||||
"hawtio-template-cache": "*",
|
||||
"hawtio-ui": "~2.0.67",
|
||||
"hawtio-utilities": "~2.0.21",
|
||||
"kubernetes-container-terminal": "~0.0.3",
|
||||
"term.js": "~0.0.3",
|
||||
"urijs": "~1.17.0",
|
||||
"hawtio-kubernetes-api": "~2.0.0",
|
||||
"human-date": "^1.3.2",
|
||||
"js-yaml": "^3.5.4"
|
||||
},
|
||||
"overrides": {
|
||||
"term.js": {
|
||||
"main": [
|
||||
"./src/term.js"
|
||||
]
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"bootstrap": "~3.3.6",
|
||||
"patternfly": "~2.7.0",
|
||||
"hawtio-core-dts": "~2.0.0",
|
||||
"angular-mocks": "~1.3.7",
|
||||
"hawtio-preferences": "~2.0.1",
|
||||
"hawtio-extension-service": "~2.0.1"
|
||||
},
|
||||
"resolutions": {
|
||||
"codemirror": "^5.0",
|
||||
"angular": "~1.3.5",
|
||||
"angular-resource": "~1.3.9",
|
||||
"urijs": "~1.17.0",
|
||||
"lodash": "3.10.1"
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,29 @@
|
||||
machine:
|
||||
node:
|
||||
version: 0.10.33
|
||||
services:
|
||||
- docker
|
||||
|
||||
dependencies:
|
||||
pre:
|
||||
- npm install -g bower gulp slush slush-hawtio-javascript slush-hawtio-typescript typescript
|
||||
- npm install
|
||||
- bower update
|
||||
- bower prune
|
||||
override:
|
||||
- gulp site
|
||||
|
||||
test:
|
||||
override:
|
||||
- echo yes
|
||||
|
||||
##deployment:
|
||||
## hub:
|
||||
## branch: master
|
||||
## owner: hawtio
|
||||
## commands:
|
||||
## - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
|
||||
## - docker build -t fabric8/hawtio-kubernetes .
|
||||
## - docker push fabric8/hawtio-kubernetes
|
||||
|
||||
|
||||
@ -0,0 +1,7 @@
|
||||
/// <reference path="../../includes.d.ts" />
|
||||
/// <reference path="../../kubernetes/ts/kubernetesHelpers.d.ts" />
|
||||
/// <reference path="developerEnrichers.d.ts" />
|
||||
/// <reference path="developerHelpers.d.ts" />
|
||||
/// <reference path="developerNavigation.d.ts" />
|
||||
declare module Developer {
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
/// <reference path="../../includes.d.ts" />
|
||||
declare module Developer {
|
||||
class dataInfoModelService {
|
||||
serverData: {};
|
||||
serverData: Object;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
/// <reference path="../../includes.d.ts" />
|
||||
declare module Developer {
|
||||
function enrichWorkspaces(projects: any): any;
|
||||
function enrichWorkspace(build: any): any;
|
||||
function asDate(value: any): Date;
|
||||
function enrichJenkinsJobs(jobsData: any, projectId: any, jobName: any): any;
|
||||
function enrichJenkinsJob(job: any, projectId: any, jobName: any): any;
|
||||
function createBuildStatusIconClass(result: any): string;
|
||||
function createBuildStatusBackgroundClass(result: any): string;
|
||||
function enrichJenkinsBuild(job: any, build: any): any;
|
||||
function jenkinsLink(): any;
|
||||
function forgeReadyLink(): any;
|
||||
function enrichJenkinsPipelineJob(job: any, projectId: any, jobId: any): void;
|
||||
function enrichJenkinsStages(build: any, projectId: any, jobName: any): any;
|
||||
function enrichJenkinsStage(stage: any, build?: any): void;
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
/// <reference path="../../includes.d.ts" />
|
||||
declare module Developer {
|
||||
var context: string;
|
||||
var hash: string;
|
||||
var pluginName: string;
|
||||
var pluginPath: string;
|
||||
var templatePath: string;
|
||||
var log: Logging.Logger;
|
||||
var jenkinsServiceName: string;
|
||||
var jenkinsServiceNameAndPort: string;
|
||||
var jenkinsHttpConfig: {
|
||||
headers: {
|
||||
Accept: string;
|
||||
};
|
||||
};
|
||||
/**
|
||||
* Returns true if the value hasn't changed from the last cached JSON version of this object
|
||||
*/
|
||||
function hasObjectChanged(value: any, state: any): boolean;
|
||||
function projectForScope($scope: any): any;
|
||||
/**
|
||||
* Lets load the project versions for the given namespace
|
||||
*/
|
||||
function loadProjectVersions($scope: any, $element: any, project: any, env: any, ns: any, answer: any, caches: any): void;
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
/// <reference path="../../includes.d.ts" />
|
||||
declare module Developer {
|
||||
function workspaceLink(): string;
|
||||
function projectLink(projectId: any): string;
|
||||
function createWorkspacesBreadcrumbs(developPerspective: any): any[];
|
||||
function createWorkspacesSubNavBars(developPerspective: any): any;
|
||||
function createWorkspaceBreadcrumbs(children?: any, workspaceName?: any): any;
|
||||
function createEnvironmentBreadcrumbs($scope: any, $location: any, $routeParams: any): any;
|
||||
function createProjectBreadcrumbs(projectName?: any, children?: any, workspaceName?: any): any;
|
||||
function createProjectSettingsBreadcrumbs(projectName: any, workspaceName?: any): any;
|
||||
function createWorkspaceSubNavBars(): any;
|
||||
function createProjectSubNavBars(projectName: any, jenkinsJobId?: any, $scope?: any): any;
|
||||
function createProjectSettingsSubNavBars(projectName: any, jenkinsJobId?: any): any;
|
||||
function forgeProjectHasBuilder(name: any): any;
|
||||
function forgeProjectHasPerspective(name: any): any;
|
||||
function editPipelineLinkScope($scope: any): string;
|
||||
function createProjectLink(workspaceName?: any): string;
|
||||
function editPipelineLink(workspaceName: any, projectName: any): string;
|
||||
function editMavenBuildLink(workspaceName: any, projectName: any): string;
|
||||
function projectSecretsLink(workspaceName: any, projectName: any): string;
|
||||
function secretsNamespaceLink(workspaceName: any, projectName: any, secretsNamespace: any): string;
|
||||
function projectWorkspaceLink(workspaceName: any, projectName: any, path: any, ignoreBlankProject?: boolean): string;
|
||||
var customProjectSubTabFactories: any[];
|
||||
function createJenkinsBreadcrumbs(projectName: any, jobId: any, buildId: any): any;
|
||||
function createJenkinsSubNavBars(projectName: any, jenkinsJobId: any, buildId: any, extraOption?: any): any;
|
||||
function createEnvironmentSubNavBars($scope: any, $location: any, $routeParams: any): any;
|
||||
function namespaceLink($scope: any, $routeParams: any, path?: any): string;
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
/// <reference path="../../includes.d.ts" />
|
||||
/// <reference path="developerHelpers.d.ts" />
|
||||
declare module Developer {
|
||||
var _module: ng.IModule;
|
||||
var controller: (name: string, inlineAnnotatedConstructor: any[]) => ng.IModule;
|
||||
var route: (templateName: string, reloadOnSearch?: boolean) => {
|
||||
templateUrl: string;
|
||||
reloadOnSearch: boolean;
|
||||
};
|
||||
}
|
||||
@ -0,0 +1,3 @@
|
||||
/// <reference path="developerPlugin.d.ts" />
|
||||
declare module Developer {
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
/// <reference path="../../includes.d.ts" />
|
||||
/// <reference path="../../kubernetes/ts/kubernetesHelpers.d.ts" />
|
||||
/// <reference path="developerEnrichers.d.ts" />
|
||||
/// <reference path="developerHelpers.d.ts" />
|
||||
/// <reference path="developerNavigation.d.ts" />
|
||||
declare module Developer {
|
||||
var HomeController: ng.IModule;
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
/// <reference path="../../includes.d.ts" />
|
||||
/// <reference path="../../kubernetes/ts/kubernetesHelpers.d.ts" />
|
||||
/// <reference path="developerEnrichers.d.ts" />
|
||||
/// <reference path="developerHelpers.d.ts" />
|
||||
/// <reference path="developerNavigation.d.ts" />
|
||||
declare module Developer {
|
||||
var JenkinsJobController: ng.IModule;
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
/// <reference path="../../includes.d.ts" />
|
||||
/// <reference path="../../kubernetes/ts/kubernetesHelpers.d.ts" />
|
||||
/// <reference path="developerEnrichers.d.ts" />
|
||||
/// <reference path="developerHelpers.d.ts" />
|
||||
/// <reference path="developerNavigation.d.ts" />
|
||||
declare module Developer {
|
||||
var JenkinsJobsController: ng.IModule;
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
/// <reference path="../../includes.d.ts" />
|
||||
/// <reference path="../../kubernetes/ts/kubernetesHelpers.d.ts" />
|
||||
/// <reference path="../../kubernetes/ts/kubernetesInterfaces.d.ts" />
|
||||
/// <reference path="../../kubernetes/ts/kubernetesModel.d.ts" />
|
||||
/// <reference path="developerPlugin.d.ts" />
|
||||
/// <reference path="developerEnrichers.d.ts" />
|
||||
/// <reference path="developerHelpers.d.ts" />
|
||||
/// <reference path="developerNavigation.d.ts" />
|
||||
declare module Developer {
|
||||
function clickApprove(element: any, url: any): void;
|
||||
var JenkinsLogController: ng.IModule;
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
/// <reference path="../../includes.d.ts" />
|
||||
/// <reference path="../../kubernetes/ts/kubernetesHelpers.d.ts" />
|
||||
/// <reference path="developerEnrichers.d.ts" />
|
||||
/// <reference path="developerHelpers.d.ts" />
|
||||
/// <reference path="developerNavigation.d.ts" />
|
||||
declare module Developer {
|
||||
var JenkinsMetricsController: ng.IModule;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue