Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
debomatic-webui
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
debomatic-webui-admins
debomatic-webui
Commits
f7a4f04a
Commit
f7a4f04a
authored
Jun 06, 2014
by
Leo Iannacone
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into portable
parents
04380791
43903d3a
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
1431 additions
and
1435 deletions
+1431
-1435
debomatic-webui/debomatic-webui
debomatic-webui/debomatic-webui
+5
-0
debomatic-webui/lib/broadcaster.js
debomatic-webui/lib/broadcaster.js
+59
-59
debomatic-webui/lib/client.js
debomatic-webui/lib/client.js
+158
-161
debomatic-webui/lib/config.js
debomatic-webui/lib/config.js
+94
-97
debomatic-webui/lib/parser.js
debomatic-webui/lib/parser.js
+30
-29
debomatic-webui/lib/tail.js
debomatic-webui/lib/tail.js
+32
-30
debomatic-webui/lib/utils.js
debomatic-webui/lib/utils.js
+135
-131
debomatic-webui/public/javascripts/debug.js
debomatic-webui/public/javascripts/debug.js
+21
-20
debomatic-webui/public/javascripts/main.js
debomatic-webui/public/javascripts/main.js
+20
-19
debomatic-webui/public/javascripts/page_distribution.js
debomatic-webui/public/javascripts/page_distribution.js
+563
-577
debomatic-webui/public/javascripts/page_generic.js
debomatic-webui/public/javascripts/page_generic.js
+168
-171
debomatic-webui/public/javascripts/preferences.js
debomatic-webui/public/javascripts/preferences.js
+52
-50
debomatic-webui/public/javascripts/utils.js
debomatic-webui/public/javascripts/utils.js
+88
-89
debomatic-webui/views/distribution.ejs
debomatic-webui/views/distribution.ejs
+6
-2
No files found.
debomatic-webui/debomatic-webui
View file @
f7a4f04a
...
...
@@ -19,6 +19,11 @@ var express = require('express'),
Broadcaster = require('./lib/broadcaster.js');
// serve dsc files as octet-stream
serve_static.mime.define({
'application/octet-stream': ['dsc']
});
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(serve_static(__dirname + '/public'));
...
...
debomatic-webui/lib/broadcaster.js
View file @
f7a4f04a
var
config
=
require
(
'
./config.js
'
)
,
fs
=
require
(
'
fs
'
)
,
Tail
=
require
(
'
./tail.js
'
)
'
use strict
'
;
function
__watch_status_check_same_obj
(
obj1
,
obj2
)
{
if
(
obj1
.
status
==
obj2
.
status
)
{
if
(
obj1
.
distribution
==
obj2
.
distribution
)
{
if
(
obj1
.
hasOwnProperty
(
'
package
'
)
&&
obj2
.
hasOwnProperty
(
'
package
'
))
{
if
(
obj1
.
package
==
obj2
.
package
)
return
true
;
return
false
}
return
true
var
config
=
require
(
'
./config.js
'
),
fs
=
require
(
'
fs
'
),
utils
=
require
(
'
./utils.js
'
),
Tail
=
require
(
'
./tail.js
'
);
function
__watch_status_check_same_obj
(
obj1
,
obj2
)
{
if
(
obj1
.
status
==
obj2
.
status
)
{
if
(
obj1
.
distribution
==
obj2
.
distribution
)
{
if
(
obj1
.
hasOwnProperty
(
'
package
'
)
&&
obj2
.
hasOwnProperty
(
'
package
'
))
{
if
(
obj1
.
package
==
obj2
.
package
)
return
true
;
return
false
;
}
return
true
;
}
}
}
return
false
return
false
;
}
// watcher on build_status
function
__watch_status
(
socket
,
status
)
{
function
__watch_status
(
socket
,
status
)
{
var
watcher
=
new
Tail
(
config
.
debomatic
.
jsonfile
)
watcher
.
on
(
'
line
'
,
function
(
new_content
)
{
var
data
=
null
try
{
data
=
JSON
.
parse
(
new_content
)
}
catch
(
err
)
{
utils
.
errors_handler
(
'
Broadcaster:__watch_status:JSON.parse(new_content) -
'
,
err
,
socket
)
return
}
// looking for same status already in statuses lists
if
(
data
.
hasOwnProperty
(
'
success
'
))
{
for
(
i
=
0
;
i
<
status
.
length
;
i
++
)
{
if
(
__watch_status_check_same_obj
(
data
,
status
[
i
]))
{
status
.
splice
(
i
,
1
)
break
;
var
watcher
=
new
Tail
(
config
.
debomatic
.
jsonfile
);
watcher
.
on
(
'
line
'
,
function
(
new_content
)
{
var
data
=
null
;
try
{
data
=
JSON
.
parse
(
new_content
);
}
catch
(
err
)
{
utils
.
errors_handler
(
'
Broadcaster:__watch_status:JSON.parse(new_content) -
'
,
err
,
socket
);
return
;
}
else
continue
;
}
}
else
{
status
.
push
(
data
)
}
socket
.
emit
(
config
.
events
.
broadcast
.
status_update
,
data
)
})
watcher
.
on
(
'
error
'
,
function
(
msg
)
{
socket
.
emit
(
config
.
events
.
error
,
msg
)
})
// looking for same status already in statuses lists
if
(
data
.
hasOwnProperty
(
'
success
'
))
{
for
(
var
i
=
0
;
i
<
status
.
length
;
i
++
)
{
if
(
__watch_status_check_same_obj
(
data
,
status
[
i
]))
{
status
.
splice
(
i
,
1
);
break
;
}
else
continue
;
}
}
else
{
status
.
push
(
data
);
}
socket
.
emit
(
config
.
events
.
broadcast
.
status_update
,
data
);
});
watcher
.
on
(
'
error
'
,
function
(
msg
)
{
socket
.
emit
(
config
.
events
.
error
,
msg
);
});
}
// watcher on new distributions
function
__watch_distributions
(
socket
)
{
fs
.
watch
(
config
.
debomatic
.
path
,
{
persistent
:
true
},
function
(
event
,
fileName
)
{
// wait half a second to get pool subdir created
setTimeout
(
function
()
{
utils
.
send_distributions
(
socket
)
},
500
)
})
function
__watch_distributions
(
socket
)
{
fs
.
watch
(
config
.
debomatic
.
path
,
{
persistent
:
true
},
function
(
event
,
fileName
)
{
// wait half a second to get pool subdir created
setTimeout
(
function
()
{
utils
.
send_distributions
(
socket
);
},
500
);
});
}
function
Broadcaster
(
sockets
,
status
)
{
var
sockets
=
sockets
function
Broadcaster
(
sockets
,
status
)
{
__watch_status
(
sockets
,
status
)
__watch_status
(
sockets
,
status
);
__watch_distributions
(
sockets
)
__watch_distributions
(
sockets
);
return
{
return
{
}
};
}
module
.
exports
=
Broadcaster
module
.
exports
=
Broadcaster
;
debomatic-webui/lib/client.js
View file @
f7a4f04a
var
fs
=
require
(
'
fs
'
)
,
path
=
require
(
'
path
'
)
,
config
=
require
(
'
./config.js
'
)
,
utils
=
require
(
'
./utils.js
'
)
'
use strict
'
;
var
fs
=
require
(
'
fs
'
),
path
=
require
(
'
path
'
),
config
=
require
(
'
./config.js
'
),
utils
=
require
(
'
./utils.js
'
);
var
_e
=
config
.
events
.
client
var
_e
=
config
.
events
.
client
;
function
__get_files_list_from_package
(
data
,
callback
)
{
package_path
=
utils
.
get_package_path
(
data
)
utils
.
get_files_list
(
package_path
,
false
,
function
(
files
)
{
data
.
package
.
files
=
[]
data
.
package
.
debs
=
[]
data
.
package
.
sources
=
[]
files
.
forEach
(
function
(
f
)
{
file
=
{}
file
.
path
=
path
.
join
(
package_path
,
f
).
replace
(
config
.
debomatic
.
path
,
config
.
routes
.
debomatic
)
file
.
orig_name
=
f
file
.
name
=
f
.
split
(
'
_
'
)[
0
]
file
.
extension
=
f
.
split
(
'
.
'
).
pop
();
if
(
file
.
extension
==
"
deb
"
||
file
.
extension
==
"
ddeb
"
)
{
data
.
package
.
debs
.
push
(
file
);
}
else
if
(
f
.
indexOf
(
'
.tar
'
)
>=
0
||
file
.
extension
==
"
changes
"
||
file
.
extension
==
"
dsc
"
)
{
file
.
name
=
f
.
replace
(
data
.
package
.
name
+
'
_
'
+
data
.
package
.
version
+
'
.
'
,
'
'
)
if
(
file
.
extension
==
'
changes
'
)
file
.
name
=
file
.
extension
else
if
(
f
.
indexOf
(
'
.tar
'
)
>=
0
&&
f
.
indexOf
(
'
.orig.
'
)
>
0
)
file
.
name
=
'
orig.
'
+
f
.
split
(
'
.orig.
'
).
pop
()
data
.
package
.
sources
.
push
(
file
)
}
else
{
file
.
name
=
file
.
extension
data
.
package
.
files
.
push
(
file
)
}
var
package_path
=
utils
.
get_package_path
(
data
);
utils
.
get_files_list
(
package_path
,
false
,
function
(
files
)
{
data
.
package
.
files
=
[];
data
.
package
.
debs
=
[];
data
.
package
.
sources
=
[];
files
.
forEach
(
function
(
f
)
{
var
file
=
{};
file
.
path
=
path
.
join
(
package_path
,
f
).
replace
(
config
.
debomatic
.
path
,
config
.
routes
.
debomatic
);
file
.
orig_name
=
f
;
file
.
name
=
f
.
split
(
'
_
'
)[
0
];
file
.
extension
=
f
.
split
(
'
.
'
).
pop
();
if
(
file
.
extension
==
'
deb
'
||
file
.
extension
==
'
ddeb
'
)
{
data
.
package
.
debs
.
push
(
file
);
}
else
if
(
f
.
indexOf
(
'
.tar
'
)
>=
0
||
file
.
extension
==
'
changes
'
||
file
.
extension
==
'
dsc
'
)
{
file
.
name
=
f
.
replace
(
data
.
package
.
name
+
'
_
'
+
data
.
package
.
version
+
'
.
'
,
''
);
if
(
file
.
extension
==
'
changes
'
)
file
.
name
=
file
.
extension
;
else
if
(
f
.
indexOf
(
'
.tar
'
)
>=
0
&&
f
.
indexOf
(
'
.orig.
'
)
>
0
)
file
.
name
=
'
orig.
'
+
f
.
split
(
'
.orig.
'
).
pop
();
data
.
package
.
sources
.
push
(
file
);
}
else
{
file
.
name
=
file
.
extension
;
data
.
package
.
files
.
push
(
file
);
}
});
callback
(
data
);
});
callback
(
data
);
});
}
function
__send_package_files_list
(
event_name
,
socket
,
data
)
{
__get_files_list_from_package
(
data
,
function
(
new_data
)
{
socket
.
emit
(
event_name
,
new_data
)
});
function
__send_package_files_list
(
event_name
,
socket
,
data
)
{
__get_files_list_from_package
(
data
,
function
(
new_data
)
{
socket
.
emit
(
event_name
,
new_data
);
});
}
function
__send_package_status
(
socket
,
data
,
package_data
)
{
var
event_name
=
config
.
events
.
client
.
distribution_packages
.
status
var
new_data
=
{}
new_data
.
distribution
=
data
.
distribution
new_data
.
package
=
package_data
var
status_data
=
{}
status_data
.
status
=
config
.
status
.
build
status_data
.
distribution
=
data
.
distribution
.
name
status_data
.
package
=
package_data
.
orig_name
var
package_path
=
utils
.
get_package_path
(
new_data
)
// status policy:
// + successed: exists .dsc
// + building: wc -l .datestamp == 1 (FIX_ME)
// + failed: else
var
base_path
=
path
.
join
(
package_path
,
package_data
.
orig_name
)
fs
.
exists
(
base_path
+
'
.dsc
'
,
function
(
dsc_exists
){
if
(
dsc_exists
)
{
status_data
.
success
=
config
.
status
.
success
socket
.
emit
(
event_name
,
status_data
)
}
else
{
// emulate wc -l .datestamp in nodejs
var
count
=
0
var
datestamp
=
base_path
+
'
.datestamp
'
fs
.
exists
(
datestamp
,
function
(
datestamp_exists
){
if
(
datestamp_exists
)
{
// count lines
fs
.
createReadStream
(
datestamp
)
.
on
(
'
data
'
,
function
(
chunk
)
{
for
(
var
i
=
0
;
i
<
chunk
.
length
;
++
i
)
if
(
chunk
[
i
]
==
10
)
count
++
;
})
.
on
(
'
end
'
,
function
()
{
if
(
count
>
1
)
status_data
.
success
=
config
.
status
.
fail
socket
.
emit
(
event_name
,
status_data
)
});
var
event_name
=
config
.
events
.
client
.
distribution_packages
.
status
;
var
new_data
=
{};
new_data
.
distribution
=
data
.
distribution
;
new_data
.
package
=
package_data
;
var
status_data
=
{};
status_data
.
status
=
config
.
status
.
build
;
status_data
.
distribution
=
data
.
distribution
.
name
;
status_data
.
package
=
package_data
.
orig_name
;
var
package_path
=
utils
.
get_package_path
(
new_data
);
// status policy:
// + successed: exists .dsc
// + building: wc -l .datestamp == 1 (FIX_ME)
// + failed: else
var
base_path
=
path
.
join
(
package_path
,
package_data
.
orig_name
);
fs
.
exists
(
base_path
+
'
.dsc
'
,
function
(
dsc_exists
)
{
if
(
dsc_exists
)
{
status_data
.
success
=
config
.
status
.
success
;
socket
.
emit
(
event_name
,
status_data
);
}
else
{
// emulate wc -l .datestamp in nodejs
var
count
=
0
;
var
datestamp
=
base_path
+
'
.datestamp
'
;
fs
.
exists
(
datestamp
,
function
(
datestamp_exists
)
{
if
(
datestamp_exists
)
{
// count lines
fs
.
createReadStream
(
datestamp
)
.
on
(
'
data
'
,
function
(
chunk
)
{
for
(
var
i
=
0
;
i
<
chunk
.
length
;
++
i
)
if
(
chunk
[
i
]
==
10
)
count
++
;
})
.
on
(
'
end
'
,
function
()
{
if
(
count
>
1
)
status_data
.
success
=
config
.
status
.
fail
;
socket
.
emit
(
event_name
,
status_data
);
});
}
});
}
})
}
})
}
function
__send_distribution_packages
(
event_name
,
socket
,
data
)
{
distro_path
=
utils
.
get_distribution_pool_path
(
data
)
utils
.
get_files_list
(
distro_path
,
true
,
function
(
packages
)
{
data
.
distribution
.
packages
=
[]
packages
.
forEach
(
function
(
p
)
{
pack
=
{}
info
=
p
.
split
(
'
_
'
)
pack
.
name
=
info
[
0
]
pack
.
version
=
info
[
1
]
pack
.
orig_name
=
p
data
.
distribution
.
packages
.
push
(
pack
)
__send_package_status
(
socket
,
data
,
pack
)
});
socket
.
emit
(
event_name
,
data
)
});
}
function
__send_file
(
event_name
,
socket
,
data
)
{
var
file_path
=
utils
.
get_file_path
(
data
)
fs
.
readFile
(
file_path
,
'
utf8
'
,
function
(
err
,
content
)
{
if
(
err
)
{
utils
.
errors_handler
(
'
client:__send_file
'
,
err
,
socket
)
return
}
data
.
file
.
orig_name
=
file_path
.
split
(
'
/
'
).
pop
()
data
.
file
.
content
=
content
data
.
file
.
path
=
file_path
.
replace
(
config
.
debomatic
.
path
,
config
.
routes
.
debomatic
)
socket
.
emit
(
event_name
,
data
)
});
}
function
__handler_get_file
(
socket
,
data
)
{
var
file_path
=
utils
.
get_file_path
(
data
)
utils
.
watch_path_onsocket
(
_e
.
file_newcontent
,
socket
,
data
,
file_path
,
function
(
event_name
,
socket
,
data
)
{
data
.
file
.
content
=
null
socket
.
emit
(
event_name
,
data
)
})
__send_file
(
_e
.
file
.
set
,
socket
,
data
)
function
__send_distribution_packages
(
event_name
,
socket
,
data
)
{
var
distro_path
=
utils
.
get_distribution_pool_path
(
data
);
utils
.
get_files_list
(
distro_path
,
true
,
function
(
packages
)
{
data
.
distribution
.
packages
=
[];
packages
.
forEach
(
function
(
p
)
{
var
pack
=
{};
var
info
=
p
.
split
(
'
_
'
);
pack
.
name
=
info
[
0
];
pack
.
version
=
info
[
1
];
pack
.
orig_name
=
p
;
data
.
distribution
.
packages
.
push
(
pack
);
__send_package_status
(
socket
,
data
,
pack
);
});
socket
.
emit
(
event_name
,
data
);
});
}
function
Client
(
socket
)
{
var
socket
=
socket
this
.
start
=
function
()
{
// init send distributions
utils
.
send_distributions
(
socket
)
// init events
socket
.
on
(
_e
.
distribution_packages
.
get
,
function
(
data
)
{
if
(
!
utils
.
check_data_distribution
(
data
))
return
distribution_path
=
path
.
join
(
config
.
debomatic
.
path
,
data
.
distribution
.
name
,
'
pool
'
)
utils
.
generic_handler_watcher
(
_e
.
distribution_packages
.
set
,
socket
,
data
,
distribution_path
,
__send_distribution_packages
)
})
socket
.
on
(
_e
.
package_files_list
.
get
,
function
(
data
)
{
if
(
!
utils
.
check_data_package
(
data
))
return
package_path
=
utils
.
get_package_path
(
data
)
utils
.
generic_handler_watcher
(
_e
.
package_files_list
.
set
,
socket
,
data
,
package_path
,
__send_package_files_list
)
})
socket
.
on
(
_e
.
file
.
get
,
function
(
data
){
if
(
!
utils
.
check_data_file
(
data
))
return
__handler_get_file
(
socket
,
data
)
})
// on client disconnection close all watchers
socket
.
on
(
'
disconnect
'
,
function
()
{
socket
.
get
(
"
watchers
"
,
function
(
err
,
socket_watchers
){
if
(
!
socket_watchers
)
return
;
for
(
key
in
socket_watchers
)
{
try
{
socket_watchers
[
key
].
close
()
}
catch
(
err
)
{}
function
__send_file
(
event_name
,
socket
,
data
)
{
var
file_path
=
utils
.
get_file_path
(
data
);
fs
.
readFile
(
file_path
,
'
utf8
'
,
function
(
err
,
content
)
{
if
(
err
)
{
utils
.
errors_handler
(
'
client:__send_file
'
,
err
,
socket
);
return
;
}
})
data
.
file
.
orig_name
=
file_path
.
split
(
'
/
'
).
pop
();
data
.
file
.
content
=
content
;
data
.
file
.
path
=
file_path
.
replace
(
config
.
debomatic
.
path
,
config
.
routes
.
debomatic
);
socket
.
emit
(
event_name
,
data
);
});
}
}
function
__handler_get_file
(
socket
,
data
)
{
var
file_path
=
utils
.
get_file_path
(
data
);
utils
.
watch_path_onsocket
(
_e
.
file_newcontent
,
socket
,
data
,
file_path
,
function
(
event_name
,
socket
,
data
)
{
data
.
file
.
content
=
null
;
socket
.
emit
(
event_name
,
data
);
});
__send_file
(
_e
.
file
.
set
,
socket
,
data
);
}
this
.
send_status
=
function
(
status
)
{
socket
.
emit
(
_e
.
status
,
status
)
}
function
Client
(
socket
)
{
this
.
start
=
function
()
{
// init send distributions
utils
.
send_distributions
(
socket
);
// init events
socket
.
on
(
_e
.
distribution_packages
.
get
,
function
(
data
)
{
if
(
!
utils
.
check_data_distribution
(
data
))
return
;
var
distribution_path
=
path
.
join
(
config
.
debomatic
.
path
,
data
.
distribution
.
name
,
'
pool
'
);
utils
.
generic_handler_watcher
(
_e
.
distribution_packages
.
set
,
socket
,
data
,
distribution_path
,
__send_distribution_packages
);
});
socket
.
on
(
_e
.
package_files_list
.
get
,
function
(
data
)
{
if
(
!
utils
.
check_data_package
(
data
))
return
;
var
package_path
=
utils
.
get_package_path
(
data
);
utils
.
generic_handler_watcher
(
_e
.
package_files_list
.
set
,
socket
,
data
,
package_path
,
__send_package_files_list
);
});
socket
.
on
(
_e
.
file
.
get
,
function
(
data
)
{
if
(
!
utils
.
check_data_file
(
data
))
return
;
__handler_get_file
(
socket
,
data
);
});
// on client disconnection close all watchers
socket
.
on
(
'
disconnect
'
,
function
()
{
socket
.
get
(
'
watchers
'
,
function
(
err
,
socket_watchers
)
{
if
(
!
socket_watchers
)
return
;
for
(
var
key
in
socket_watchers
)
{
try
{
socket_watchers
[
key
].
close
();
}
catch
(
err
)
{}
}
});
});
};
this
.
send_status
=
function
(
status
)
{
socket
.
emit
(
_e
.
status
,
status
);
};
}
module
.
exports
=
Client
module
.
exports
=
Client
;
debomatic-webui/lib/config.js
View file @
f7a4f04a
'
use strict
'
;
/*
* Please DO NOT edit this file.
*
* Edit auto-generated
"user.config.js"
file instead.
* Edit auto-generated
'user.config.js'
file instead.
*
*/
// #start config-auto-export
var
config
=
{}
var
config
=
{}
;
/*
* Configure host and port.
* Please for ports < 1000 use authbind. DO NOT RUN nodejs as root.
* $ authbind nodejs index.js
*/
config
.
host
=
'
localhost
'
config
.
port
=
3000
config
.
host
=
'
localhost
'
;
config
.
port
=
3000
;
config
.
socket
=
{}
config
.
socket
.
log
=
false
config
.
socket
=
{}
;
config
.
socket
.
log
=
false
;
config
.
debomatic
=
{}
config
.
debomatic
.
path
=
'
/srv/debomatic-amd64
'
config
.
debomatic
.
jsonfile
=
'
/var/log/debomatic-json.log
'
config
.
debomatic
=
{}
;
config
.
debomatic
.
path
=
'
/srv/debomatic-amd64
'
;
config
.
debomatic
.
jsonfile
=
'
/var/log/debomatic-json.log
'
;
config
.
routes
=
{}
config
.
routes
.
debomatic
=
'
/debomatic
'
config
.
routes
.
distribution
=
'
/distribution
'
config
.
routes
.
preferences
=
'
/preferences
'
config
.
routes
=
{}
;
config
.
routes
.
debomatic
=
'
/debomatic
'
;
config
.
routes
.
distribution
=
'
/distribution
'
;
config
.
routes
.
preferences
=
'
/preferences
'
;
config
.
web
=
{}
config
.
web
.
title
=
"
Deb-o-Matic web.ui
"
config
.
web
.
description
=
"
This is a web interface for debomatic
"
config
.
web
=
{}
;
config
.
web
.
title
=
'
Deb-o-Matic web.ui
'
;
config
.
web
.
description
=
'
This is a web interface for debomatic
'
;
// debomatic configuration exportable for web
config
.
web
.
debomatic
=
{}
config
.
web
.
debomatic
.
admin
=
{}
config
.
web
.
debomatic
.
admin
.
name
=
"
Your Name
"
config
.
web
.
debomatic
.
admin
.
email
=
"
you AT debian DOT org
"
// please use this SPAMFREE form - it will be converted client side by javascript
config
.
web
.
debomatic
.
architecture
=
'
amd64
'
config
.
web
.
debomatic
.
dput
=
{}
config
.
web
.
debomatic
.
dput
.
incoming
=
config
.
debomatic
.
path
config
.
web
.
debomatic
.
dput
.
host
=
config
.
host
config
.
web
.
debomatic
.
dput
.
login
=
"
debomatic
"
config
.
web
.
debomatic
.
dput
.
method
=
"
scp
"
config
.
web
.
debomatic
.
dput
.
unsigned_uploads
=
false
config
.
web
.
debomatic
=
{}
;
config
.
web
.
debomatic
.
admin
=
{}
;
config
.
web
.
debomatic
.
admin
.
name
=
'
Your Name
'
;
config
.
web
.
debomatic
.
admin
.
email
=
'
you AT debian DOT org
'
;
// please use this SPAMFREE form - it will be converted client side by javascript
config
.
web
.
debomatic
.
architecture
=
'
amd64
'
;
config
.
web
.
debomatic
.
dput
=
{}
;
config
.
web
.
debomatic
.
dput
.
incoming
=
config
.
debomatic
.
path
;
config
.
web
.
debomatic
.
dput
.
host
=
config
.
host
;
config
.
web
.
debomatic
.
dput
.
login
=
'
debomatic
'
;
config
.
web
.
debomatic
.
dput
.
method
=
'
scp
'
;
config
.
web
.
debomatic
.
dput
.
unsigned_uploads
=
false
;
// default ui settings
config
.
web
.
preferences
=
{}
config
.
web
.
preferences
.
autoscroll
=
true
config
.
web
.
preferences
.
header
=
true
config
.
web
.
preferences
.
sidebar
=
true
config
.
web
.
preferences
.
glossy_theme
=
true
config
.
web
.
preferences
.
file_background
=
true
config
.
web
.
preferences
.
file_fontsize
=
13
// valid values are [13..16]
config
.
web
.
preferences
.
debug
=
0
// debug level - 0 means disabled
config
.
web
.
preferences
=
{}
;
config
.
web
.
preferences
.
autoscroll
=
true
;
config
.
web
.
preferences
.
header
=
true
;
config
.
web
.
preferences
.
sidebar
=
true
;
config
.
web
.
preferences
.
glossy_theme
=
true
;
config
.
web
.
preferences
.
file_background
=
true
;
config
.
web
.
preferences
.
file_fontsize
=
13
;
// valid values are [13..16]
config
.
web
.
preferences
.
debug
=
0
;
// debug level - 0 means disabled
// #end config-auto-export
// DO NOT TOUCH these ones
config
.
version
=
'
0.2.
2
'
config
.
version
=
'
0.2.
3
'
;
// A simple function to quickly have
// get and set strings for client events
function
_event_get_set
(
event_name
)
{
return
{
set
:
event_name
,
get
:
'
get_
'
+
event_name
}
return
{
set
:
event_name
,
get
:
'
get_
'
+
event_name
};
}
config
.
events
=
{}
config
.
events
.
error
=
'
error
'
config
.
events
.
broadcast
=
{}
config
.
events
.
broadcast
.
distributions
=
'
distributions
'
config
.
events
.
broadcast
.
status_update
=
'
status_update
'
config
.
events
=
{}
;
config
.
events
.
error
=
'
error
'
;
config
.
events
.
broadcast
=
{}
;
config
.
events
.
broadcast
.
distributions
=
'
distributions
'
;
config
.
events
.
broadcast
.
status_update
=
'
status_update
'
;
config
.
events
.
client
=
{}
config
.
events
.
client
.
distribution_packages
=
_event_get_set
(
'
distribution_packages
'
)
config
.
events
.
client
.
distribution_packages
.
status
=
'
package_status
'
config
.
events
.
client
.
package_files_list
=
_event_get_set
(
'
package_files_list
'
)
config
.
events
.
client
.
file
=
_event_get_set
(
'
file
'
)
config
.
events
.
client
.
file_newcontent
=
'
file_newcontent
'
config
.
events
.
client
.
status
=
'
status
'
config
.
events
.
client
=
{}
;
config
.
events
.
client
.
distribution_packages
=
_event_get_set
(
'
distribution_packages
'
)
;
config
.
events
.
client
.
distribution_packages
.
status
=
'
package_status
'
;
config
.
events
.
client
.
package_files_list
=
_event_get_set
(
'
package_files_list
'
)
;
config
.
events
.
client
.
file
=
_event_get_set
(
'
file
'
)
;
config
.
events
.
client
.
file_newcontent
=
'
file_newcontent
'
;
config
.
events
.
client
.
status
=
'
status
'
;
// debomatic status according with JSONLogger.py module
config
.
status
=
{}
config
.
status
.
build
=
'
build
'
config
.
status
.
create
=
'
create
'
config
.
status
.
update
=
'
update
'
config
.
status
.
success
=
true
config
.
status
.
fail
=
false
config
.
status
=
{}
;
config
.
status
.
build
=
'
build
'
;
config
.
status
.
create
=
'
create
'
;
config
.
status
.
update
=
'
update
'
;
config
.
status
.
success
=
true
;
config
.
status
.
fail
=
false
;
// read user configuration and merge it
/*
* update object1 with object2 values
*/
function
_merge
(
object1
,
object2
)
{
var
result
=
{}
for
(
p
in
object1
)
{
if
(
object2
.
hasOwnProperty
(
p
))
{
if
(
typeof
object1
[
p
]
===
'
object
'
&&
typeof
object2
[
p
]
===
'
object
'
)
{
result
[
p
]
=
_merge
(
object1
[
p
],
object2
[
p
])
}
else
{
result
[
p
]
=
object2
[
p
]
}
var
result
=
{};
for
(
var
p
in
object1
)
{
if
(
object2
.
hasOwnProperty
(
p
))
{
if
(
typeof
object1
[
p
]
===
'
object
'
&&
typeof
object2
[
p
]
===
'
object
'
)
{
result
[
p
]
=
_merge
(
object1
[
p
],
object2
[
p
]);
}
else
{
result
[
p
]
=
object2
[
p
];
}
}
else
{
result
[
p
]
=
object1
[
p
];
}
}
else
{
result
[
p
]
=
object1
[
p
]
}
}
return
result
return
result
;
}
try
{
var
Parser
=
require
(
'
./parser.js
'
)
var
parser
=
new
Parser
()
var
user_config
=
parser
.
getUserConfig
()
if
(
user_config
)
{
console
.
log
(
"
Reading user configutation ...
"
)
config
=
_merge
(
config
,
require
(
user_config
))
}
else
{
console
.
log
(
"
No user config specified. Using global settings.
"
)
}
var
Parser
=
require
(
'
./parser.js
'
);
var
parser
=
new
Parser
();
var
user_config
=
parser
.
getUserConfig
();
if
(
user_config
)
{
console
.
log
(
'
Reading user configutation ...
'
);
config
=
_merge
(
config
,
require
(
user_config
));
}
else
{
console
.
log
(
'
No user config specified. Using global settings.
'
);
}
}
catch
(
err
)
{
if
(
err
.
code
==
'
MODULE_NOT_FOUND
'
)
{
console
.
log
(
"
File %s not found.
"
,
user_config
)
process
.
exit
(
1
)
}
else
{
console
.
error
(
"
Error reading user configutation
"
,
err
);
process
.
exit
(
1
)
}
if
(
err
.
code
==
'
MODULE_NOT_FOUND
'
)
{
console
.
log
(
'
File %s not found.
'
,
user_config
);
process
.
exit
(
1
);
}
else
{
console
.
error
(
'
Error reading user configutation
'
,
err
);
process
.
exit
(
1
);
}
}
finally
{
// export some variable
config
.
web
.
paths
=
config
.
routes
config
.
web
.
events
=
config
.
events
config
.
web
.
status
=
config
.
status
config
.
web
.
host
=
config
.
host
module
.
exports
=
config
// export some variable
config
.
web
.
paths
=
config
.
routes
;
config
.
web
.
events
=
config
.
events
;
config
.
web
.
status
=
config
.
status
;
config
.
web
.
host
=
config
.
host
;
module
.
exports
=
config
;
}
debomatic-webui/lib/parser.js
View file @
f7a4f04a
function
Parser
()
{
'
use strict
'
;
var
args
=
process
.
argv
.
slice
(
2
);
function
Parser
()
{
var
help
=
function
()
{
console
.
log
(
"
\
var
args
=
process
.
argv
.
slice
(
2
);
var
help
=
function
()
{
console
.
log
(
'
\
Usage: %s [-c config]
\n\
-h print this help
\n\
-c set user configuration file
"
,
process
.
argv
[
1
].
split
(
'
/
'
).
pop
());
process
.
exit
(
0
);
}
-c set user configuration file
'
,
process
.
argv
[
1
].
split
(
'
/
'
).
pop
());
this
.
getUserConfig
=
function
()
{
var
configFile
=
null
;
args
.
forEach
(
function
(
val
,
index
)
{
if
(
val
==
'
-c
'
)
{
configFile
=
args
[
index
+
1
]
return
}
})
if
(
configFile
)
return
process
.
cwd
()
+
'
/
'
+
configFile
;
else
return
null
}
process
.
exit
(
0
);
};
args
.
forEach
(
function
(
val
,
index
)
{
if
(
val
==
'
-h
'
)
{
help
()
}
})
this
.
getUserConfig
=
function
()
{
var
configFile
=
null
;
args
.
forEach
(
function
(
val
,
index
)
{
if
(
val
==
'
-c
'
)
{
configFile
=
args
[
index
+
1
];
return
;
}
});
if
(
configFile
)
return
process
.
cwd
()
+
'
/
'
+
configFile
;
else
return
null
;
};
args
.
forEach
(
function
(
val
,
index
)
{
if
(
val
==
'
-h
'
)
{
help
();
}
});
}
module
.
exports
=
Parser
\ No newline at end of file
module
.
exports
=
Parser
debomatic-webui/lib/tail.js
View file @
f7a4f04a
var
fs
=
require
(
'
fs
'
)
,
Tail
=
require
(
'
tail
'
).
Tail
'
use strict
'
;
Tail
.
prototype
.
watchEvent
=
function
(
e
)
{
var
_this
=
this
;
var
fs
=
require
(
'
fs
'
),
Tail
=
require
(
'
tail
'
).
Tail
;
if
(
e
===
'
change
'
)
{
return
fs
.
stat
(
this
.
filename
,
function
(
err
,
stats
)
{
if
(
err
)
{
_this
.
emit
(
'
error
'
,
err
);
}
if
(
stats
.
size
<
_this
.
pos
)
{
_this
.
pos
=
stats
.
size
;
}
if
(
stats
.
size
>
_this
.
pos
)
{
_this
.
queue
.
push
({
start
:
_this
.
pos
,
end
:
stats
.
size
Tail
.
prototype
.
watchEvent
=
function
(
e
)
{
var
_this
=
this
;
if
(
e
===
'
change
'
)
{
return
fs
.
stat
(
this
.
filename
,
function
(
err
,
stats
)
{
if
(
err
)
{
_this
.
emit
(
'
error
'
,
err
);
}
if
(
stats
.
size
<
_this
.
pos
)
{
_this
.
pos
=
stats
.
size
;
}
if
(
stats
.
size
>
_this
.
pos
)
{
_this
.
queue
.
push
({
start
:
_this
.
pos
,
end
:
stats
.
size
});
_this
.
pos
=
stats
.
size
;
if
(
_this
.
queue
.
length
===
1
)
{
return
_this
.
internalDispatcher
.
emit
(
'
next
'
);
}
}
});
_this
.
pos
=
stats
.
size
;
if
(
_this
.
queue
.
length
===
1
)
{
return
_this
.
internalDispatcher
.
emit
(
"
next
"
);
}
}
});
}
else
if
(
e
===
'
rename
'
)
{
this
.
unwatch
();
_this
.
emit
(
'
error
'
,
"
File
"
+
this
.
filename
+
"
deleted.
"
);
}
}
else
if
(
e
===
'
rename
'
)
{
this
.
unwatch
();
_this
.
emit
(
'
error
'
,
'
File
'
+
this
.
filename
+
'
deleted.
'
);
}
};
Tail
.
prototype
.
close
=
function
()
{
this
.
unwatch
()
}
Tail
.
prototype
.
close
=
function
()
{
this
.
unwatch
();
}
;
module
.
exports
=
Tail
\ No newline at end of file
module
.
exports
=
Tail
;
debomatic-webui/lib/utils.js
View file @
f7a4f04a
var
path
=
require
(
'
path
'
)
,
fs
=
require
(
'
fs
'
)
,
config
=
require
(
'
./config.js
'
)
,
Tail
=
require
(
'
./tail.js
'
)
'
use strict
'
;
var
path
=
require
(
'
path
'
),
fs
=
require
(
'
fs
'
),
config
=
require
(
'
./config.js
'
),
Tail
=
require
(
'
./tail.js
'
);
function
__errors_handler
(
from
,
err
,
socket
)
{
if
(
!
socket
)
from
=
"
NO SOCKET:
"
+
from
console
.
error
(
from
,
err
)
if
(
socket
)
socket
.
emit
(
config
.
events
.
error
,
err
.
message
)
if
(
!
socket
)
from
=
'
NO SOCKET:
'
+
from
;
console
.
error
(
from
,
err
);
if
(
socket
)
socket
.
emit
(
config
.
events
.
error
,
err
.
message
);
}
function
__check_no_backward
(
backward_path
)
{
try
{
return
backward_path
.
indexOf
(
'
..
'
)
<
0
}
catch
(
err
)
{
return
true
}
try
{
return
backward_path
.
indexOf
(
'
..
'
)
<
0
;
}
catch
(
err
)
{
return
true
;
}
}
function
__check_data_distribution
(
data
)
{
return
__check_no_backward
(
data
)
&&
__check_no_backward
(
data
.
distribution
)
&&
__check_no_backward
(
data
.
distribution
.
name
)
return
__check_no_backward
(
data
)
&&
__check_no_backward
(
data
.
distribution
)
&&
__check_no_backward
(
data
.
distribution
.
name
);
}
function
__check_data_package
(
data
)
{
return
__check_data_distribution
(
data
)
&&
__check_no_backward
(
data
.
package
)
&&
__check_no_backward
(
data
.
package
.
name
)
&&
__check_no_backward
(
data
.
package
.
version
)
return
__check_data_distribution
(
data
)
&&
__check_no_backward
(
data
.
package
)
&&
__check_no_backward
(
data
.
package
.
name
)
&&
__check_no_backward
(
data
.
package
.
version
);
}
function
__check_data_file
(
data
)
{
return
__check_data_package
(
data
)
&&
__check_no_backward
(
data
.
file
)
&&
__check_no_backward
(
data
.
file
.
name
)
return
__check_data_package
(
data
)
&&
__check_no_backward
(
data
.
file
)
&&
__check_no_backward
(
data
.
file
.
name
);
}
function
__get_distribution_pool_path
(
data
)
{
return
path
.
join
(
config
.
debomatic
.
path
,
data
.
distribution
.
name
,
'
pool
'
)
return
path
.
join
(
config
.
debomatic
.
path
,
data
.
distribution
.
name
,
'
pool
'
);
}
function
__get_package_path
(
data
)
{
return
path
.
join
(
__get_distribution_pool_path
(
data
),
data
.
package
.
name
+
'
_
'
+
data
.
package
.
version
)
return
path
.
join
(
__get_distribution_pool_path
(
data
),
data
.
package
.
name
+
'
_
'
+
data
.
package
.
version
);
}
function
__get_file_path
(
data
)
{
return
path
.
join
(
__get_package_path
(
data
),
data
.
package
.
name
+
'
_
'
+
data
.
package
.
version
+
'
.
'
+
data
.
file
.
name
)
return
path
.
join
(
__get_package_path
(
data
),
data
.
package
.
name
+
'
_
'
+
data
.
package
.
version
+
'
.
'
+
data
.
file
.
name
);
}
function
__get_files_list
(
dir
,
onlyDirectories
,
callback
)
{
fs
.
readdir
(
dir
,
function
(
err
,
files
){
result
=
[];
if
(
err
)
{
__errors_handler
(
"
__get_files_list
"
,
err
)
return
;
}
files
.
forEach
(
function
(
f
)
{
try
{
complete_path
=
path
.
join
(
dir
,
f
);
stat
=
fs
.
statSync
(
complete_path
)
if
(
onlyDirectories
)
{
if
(
stat
.
isDirectory
())
{
result
.
push
(
f
);
}
}
else
{
if
(
stat
.
isFile
())
{
result
.
push
(
f
);
}
fs
.
readdir
(
dir
,
function
(
err
,
files
)
{
var
result
=
[];
if
(
err
)
{
__errors_handler
(
'
__get_files_list
'
,
err
);
return
;
}
}
catch
(
fs_error
)
{
__errors_handler
(
"
__get_files_list:forEach
"
,
fs_error
)
return
}
files
.
forEach
(
function
(
f
)
{
try
{
var
complete_path
=
path
.
join
(
dir
,
f
);
var
stat
=
fs
.
statSync
(
complete_path
);
if
(
onlyDirectories
)
{
if
(
stat
.
isDirectory
())
{
result
.
push
(
f
);
}
}
else
{
if
(
stat
.
isFile
())
{
result
.
push
(
f
);
}
}
}
catch
(
fs_error
)
{
__errors_handler
(
'
__get_files_list:forEach
'
,
fs_error
);
return
;
}
});
callback
(
result
);
});
callback
(
result
);
});
}
function
__watch_path_onsocket
(
event_name
,
socket
,
data
,
watch_path
,
updater
)
{
socket
.
get
(
"
watchers
"
,
function
(
err
,
socket_watchers
){
if
(
!
socket_watchers
)
{
// init socket watchers
socket_watchers
=
{}
}
try
{
var
watcher
=
socket_watchers
[
event_name
]
if
(
watcher
)
watcher
.
close
()
fs
.
stat
(
watch_path
,
function
(
err
,
stats
)
{
if
(
err
)
{
__errors_handler
(
"
__watch_path_onsocket:fs.stat
"
,
err
,
socket
)
return
}
if
(
stats
.
isDirectory
())
{
watcher
=
fs
.
watch
(
watch_path
,
{
persistent
:
true
},
function
(
event
,
fileName
)
{
if
(
event
==
'
rename
'
)
updater
(
event_name
,
socket
,
data
)
})
socket
.
get
(
'
watchers
'
,
function
(
err
,
socket_watchers
)
{
if
(
!
socket_watchers
)
{
// init socket watchers
socket_watchers
=
{};
}
else
if
(
stats
.
isFile
())
{
watcher
=
new
Tail
(
watch_path
)
watcher
.
on
(
'
line
'
,
function
(
new_content
,
tailInfo
)
{
data
.
file
.
new_content
=
new_content
+
'
\n
'
updater
(
event_name
,
socket
,
data
)
});
watcher
.
on
(
'
error
'
,
function
(
msg
)
{
socket
.
emit
(
config
.
events
.
error
,
msg
);
});
try
{
var
watcher
=
socket_watchers
[
event_name
];
if
(
watcher
)
watcher
.
close
();
fs
.
stat
(
watch_path
,
function
(
err
,
stats
)
{
if
(
err
)
{
__errors_handler
(
'
__watch_path_onsocket:fs.stat
'
,
err
,
socket
);
return
;
}
if
(
stats
.
isDirectory
())
{
watcher
=
fs
.
watch
(
watch_path
,
{
persistent
:
true
},
function
(
event
,
fileName
)
{
if
(
event
==
'
rename
'
)
updater
(
event_name
,
socket
,
data
);
});
}
else
if
(
stats
.
isFile
())
{
watcher
=
new
Tail
(
watch_path
);
watcher
.
on
(
'
line
'
,
function
(
new_content
,
tailInfo
)
{
data
.
file
.
new_content
=
new_content
+
'
\n
'
;
updater
(
event_name
,
socket
,
data
);
});
watcher
.
on
(
'
error
'
,
function
(
msg
)
{
socket
.
emit
(
config
.
events
.
error
,
msg
);
});
}
socket_watchers
[
event_name
]
=
watcher
;
socket
.
set
(
'
watchers
'
,
socket_watchers
);
});
}
catch
(
err
)
{
__errors_handler
(
'
__watch_path_onsocket <-
'
+
arguments
.
callee
.
caller
.
name
,
err
,
socket
);
return
;
}
socket_watchers
[
event_name
]
=
watcher
socket
.
set
(
"
watchers
"
,
socket_watchers
)
})
}
catch
(
err
)
{
__errors_handler
(
"
__watch_path_onsocket <-
"
+
arguments
.
callee
.
caller
.
name
,
err
,
socket
)
return
}
})
});
}
function
__generic_handler_watcher
(
event_name
,
socket
,
data
,
watch_path
,
callback
)
{
callback
(
event_name
,
socket
,
data
)
__watch_path_onsocket
(
event_name
,
socket
,
data
,
watch_path
,
callback
)
callback
(
event_name
,
socket
,
data
);
__watch_path_onsocket
(
event_name
,
socket
,
data
,
watch_path
,
callback
);
}
function
__send_distributions
(
socket
)
{
__get_files_list
(
config
.
debomatic
.
path
,
true
,
function
(
directories
)
{
var
distributions
=
[]
directories
.
forEach
(
function
(
dir
)
{
var
data
=
{}
data
.
distribution
=
{}
data
.
distribution
.
name
=
dir
var
pool_path
=
__get_distribution_pool_path
(
data
)
if
(
fs
.
existsSync
(
pool_path
))
{
distributions
.
push
(
dir
)
}
})
socket
.
emit
(
config
.
events
.
broadcast
.
distributions
,
distributions
);
})
__get_files_list
(
config
.
debomatic
.
path
,
true
,
function
(
directories
)
{
var
distributions
=
[];
directories
.
forEach
(
function
(
dir
)
{
var
data
=
{};
data
.
distribution
=
{};
data
.
distribution
.
name
=
dir
;
var
pool_path
=
__get_distribution_pool_path
(
data
);
if
(
fs
.
existsSync
(
pool_path
))
{
distributions
.
push
(
dir
);
}
});
socket
.
emit
(
config
.
events
.
broadcast
.
distributions
,
distributions
);
});
}
utils
=
{
check_data_distribution
:
function
(
data
)
{
return
__check_data_distribution
(
data
)
},
check_data_package
:
function
(
data
)
{
return
__check_data_package
(
data
)
},
check_data_file
:
function
(
data
)
{
return
__check_data_file
(
data
)
},
get_distribution_pool_path
:
function
(
data
)
{
return
__get_distribution_pool_path
(
data
)
},
get_package_path
:
function
(
data
)
{
return
__get_package_path
(
data
)
},
get_file_path
:
function
(
data
)
{
return
__get_file_path
(
data
)
},
get_files_list
:
function
(
dir
,
onlyDirectories
,
callback
)
{
return
__get_files_list
(
dir
,
onlyDirectories
,
callback
)
},
watch_path_onsocket
:
function
(
event_name
,
socket
,
data
,
watch_path
,
updater
)
{
return
__watch_path_onsocket
(
event_name
,
socket
,
data
,
watch_path
,
updater
)
},
generic_handler_watcher
:
function
(
event_name
,
socket
,
data
,
watch_path
,
callback
)
{
return
__generic_handler_watcher
(
event_name
,
socket
,
data
,
watch_path
,
callback
);
},
send_distributions
:
function
(
socket
)
{
return
__send_distributions
(
socket
)
},
errors_handler
:
function
(
from
,
error
,
socket
)
{
return
__errors_handler
(
from
,
error
,
socket
)
}
}
var
utils
=
{
check_data_distribution
:
function
(
data
)
{
return
__check_data_distribution
(
data
);
},
check_data_package
:
function
(
data
)
{
return
__check_data_package
(
data
);
},
check_data_file
:
function
(
data
)
{
return
__check_data_file
(
data
);
},
get_distribution_pool_path
:
function
(
data
)
{
return
__get_distribution_pool_path
(
data
);
},
get_package_path
:
function
(
data
)
{
return
__get_package_path
(
data
);
},
get_file_path
:
function
(
data
)
{
return
__get_file_path
(
data
);
},
get_files_list
:
function
(
dir
,
onlyDirectories
,
callback
)
{
return
__get_files_list
(
dir
,
onlyDirectories
,
callback
);
},
watch_path_onsocket
:
function
(
event_name
,
socket
,
data
,
watch_path
,
updater
)
{
return
__watch_path_onsocket
(
event_name
,
socket
,
data
,
watch_path
,
updater
);
},
generic_handler_watcher
:
function
(
event_name
,
socket
,
data
,
watch_path
,
callback
)
{
return
__generic_handler_watcher
(
event_name
,
socket
,
data
,
watch_path
,
callback
);
},
send_distributions
:
function
(
socket
)
{
return
__send_distributions
(
socket
);
},
errors_handler
:
function
(
from
,
error
,
socket
)
{
return
__errors_handler
(
from
,
error
,
socket
);
}
}
;
module
.
exports
=
utils
module
.
exports
=
utils
;
debomatic-webui/public/javascripts/debug.js
View file @
f7a4f04a
"
use strict
"
;
/*
General information about debugging:
...
...
@@ -10,18 +11,18 @@
3 - socket emit data
4 - socket received data
*/
var
debug
=
function
()
{
if
(
arguments
.
length
<
2
)
{
return
}
var
level
=
arguments
[
0
]
arguments
[
0
]
=
"
debug [
"
+
level
+
"
]:
"
if
(
level
<=
config
.
preferences
.
debug
)
{
if
(
console
.
debug
)
console
.
debug
.
apply
(
console
,
arguments
)
else
console
.
log
.
apply
(
console
,
arguments
)
}
var
debug
=
function
()
{
if
(
arguments
.
length
<
2
)
{
return
;
}
var
level
=
arguments
[
0
];
arguments
[
0
]
=
"
debug [
"
+
level
+
"
]:
"
;
if
(
level
<=
config
.
preferences
.
debug
)
{
if
(
console
.
debug
)
console
.
debug
.
apply
(
console
,
arguments
);
else
console
.
log
.
apply
(
console
,
arguments
);
}
}
/*
...
...
@@ -30,11 +31,11 @@ var debug = function() {
usage: debug_socket("emit"|"received", event_name, data)
*/
var
debug_socket
=
function
()
{
if
(
arguments
.
length
!=
3
)
return
var
level
=
3
;
if
(
arguments
[
0
]
==
"
received
"
)
level
=
4
debug
(
level
,
"
socket
"
,
arguments
[
0
],
"
event:
"
,
arguments
[
1
],
"
data:
"
,
arguments
[
2
])
}
\ No newline at end of file
var
debug_socket
=
function
()
{
if
(
arguments
.
length
!=
3
)
return
;
var
level
=
3
;
if
(
arguments
[
0
]
==
"
received
"
)
level
=
4
;
debug
(
level
,
"
socket
"
,
arguments
[
0
],
"
event:
"
,
arguments
[
1
],
"
data:
"
,
arguments
[
2
]);
}
debomatic-webui/public/javascripts/main.js
View file @
f7a4f04a
// main client javascript
'
use strict
'
;
var
preferences
=
new
Preferences
()
var
preferences
=
new
Preferences
()
;
var
page_generic
=
new
Page_Generic
()
var
page_generic
=
new
Page_Generic
()
;
if
(
window
.
location
.
pathname
==
config
.
paths
.
preferences
)
{
preferences
.
initPage
()
preferences
.
initPage
();
}
if
(
window
.
location
.
pathname
==
'
/
'
)
{
// convert email addresses in the right format
var
emails
=
$
(
"
.email
"
)
$
.
each
(
emails
,
function
()
{
var
subject
=
''
if
(
$
(
this
).
attr
(
'
subject
'
))
{
subject
=
'
?subject=
'
+
$
(
this
).
attr
(
'
subject
'
)
}
var
real_email
=
$
(
this
).
attr
(
'
address
'
).
replace
(
'
AT
'
,
'
@
'
).
replace
(
'
DOT
'
,
'
.
'
).
replace
(
/ /g
,
''
)
var
label
=
real_email
if
(
config
.
debomatic
.
admin
.
name
&&
config
.
debomatic
.
admin
.
name
!=
'
Your Name
'
)
label
=
config
.
debomatic
.
admin
.
name
real_email
=
'
<a href="mailto:
'
+
real_email
+
subject
+
'
">
'
+
label
+
'
</a>
'
$
(
this
).
html
(
real_email
)
})
// convert email addresses in the right format
var
emails
=
$
(
'
.email
'
);
$
.
each
(
emails
,
function
()
{
var
subject
=
''
;
if
(
$
(
this
).
attr
(
'
subject
'
))
{
subject
=
'
?subject=
'
+
$
(
this
).
attr
(
'
subject
'
);
}
var
real_email
=
$
(
this
).
attr
(
'
address
'
).
replace
(
'
AT
'
,
'
@
'
).
replace
(
'
DOT
'
,
'
.
'
).
replace
(
/ /g
,
''
);
var
label
=
real_email
;
if
(
config
.
debomatic
.
admin
.
name
&&
config
.
debomatic
.
admin
.
name
!=
'
Your Name
'
);
label
=
config
.
debomatic
.
admin
.
name
;
real_email
=
'
<a href="mailto:
'
+
real_email
+
subject
+
'
">
'
+
label
+
'
</a>
'
;
$
(
this
).
html
(
real_email
);
})
}
var
socket
=
io
.
connect
(
'
/
'
);
page_generic
.
start
(
socket
)
page_generic
.
start
(
socket
)
;
if
(
window
.
location
.
pathname
==
config
.
paths
.
distribution
)
{
new
Page_Distrubion
(
socket
).
start
()
new
Page_Distrubion
(
socket
).
start
();
}
debomatic-webui/public/javascripts/page_distribution.js
View file @
f7a4f04a
'
use strict
'
;
// function to get all files in on click
// event comes from HTML
function
download_all
(
div_id
)
{
frame_id
=
'
downloadAllFrame
'
if
(
$
(
"
#
"
+
frame_id
).
length
>
0
)
frame
=
$
(
$
(
"
#
"
+
frame_id
)[
0
])
else
{
frame
=
$
(
'
<iframe></iframe>
'
)
frame
.
hide
()
frame
.
attr
(
'
id
'
,
frame_id
)
$
(
'
body
'
).
append
(
frame
)
}
files
=
$
(
div_id
).
find
(
'
ul li a
'
)
$
.
each
(
files
,
function
(
index
,
item
)
{
setTimeout
(
function
()
{
frame
.
attr
(
'
src
'
,
item
.
href
)
},
index
*
1000
)
})
function
download_all
(
div_id
)
{
var
frame_id
=
'
downloadAllFrame
'
;
var
frame
=
null
;
if
(
$
(
'
#
'
+
frame_id
).
length
>
0
)
frame
=
$
(
$
(
'
#
'
+
frame_id
)[
0
]);
else
{
frame
=
$
(
'
<iframe></iframe>
'
);
frame
.
hide
();
frame
.
attr
(
'
id
'
,
frame_id
);
$
(
'
body
'
).
append
(
frame
);
}
var
files
=
$
(
div_id
).
find
(
'
ul li a
'
);
$
.
each
(
files
,
function
(
index
,
item
)
{
setTimeout
(
function
()
{
frame
.
attr
(
'
src
'
,
item
.
href
);
},
index
*
1000
);
});
}
function
Page_Distrubion
(
socket
)
{
function
Page_Distrubion
(
socket
)
{
/*
...
...
@@ -60,570 +62,554 @@ function Page_Distrubion(socket)
*/
var
socket
=
socket
var
_e
=
config
.
events
.
client
var
view
=
Utils
.
from_hash_to_view
()
var
sidebarOffset
=
0
var
new_lines
=
[]
var
_e
=
config
.
events
.
client
;
var
view
=
Utils
.
from_hash_to_view
();
var
sidebarOffset
=
0
;
var
new_lines
=
[];
function
__check_hash_makes_sense
()
{
if
(
window
.
location
.
hash
.
indexOf
(
'
..
'
)
>=
0
)
{
error
.
set
(
"
Detected '..' God Is Watching You !
"
)
return
false
}
if
(
!
window
.
location
.
hash
)
{
welcome
.
show
()
return
false
}
var
info
=
window
.
location
.
hash
.
split
(
'
/
'
)
if
(
info
.
length
==
2
)
window
.
location
.
hash
=
info
[
0
]
return
true
}
var
title
=
{
set
:
function
(
label
)
{
if
(
label
)
{
$
(
'
#title
'
).
html
(
label
)
page_generic
.
set_window_title
(
label
)
return
}
var
label
=
''
var
window_title
=
null
if
(
Utils
.
check_view_file
(
view
))
{
var
complete_name
=
view
.
package
.
orig_name
+
'
.
'
+
view
.
file
.
name
window_title
=
complete_name
if
(
!
view
.
file
.
path
)
view
.
file
.
path
=
config
.
paths
.
debomatic
+
'
/
'
+
view
.
distribution
.
name
+
'
/pool/
'
+
view
.
package
.
orig_name
+
'
/
'
+
complete_name
label
=
complete_name
+
'
\
<a class="btn btn-link btn-lg" title="Download" href="
'
+
view
.
file
.
path
+
'
">
\
<span class="glyphicon glyphicon-download-alt"></span>
\
</a>
'
}
else
if
(
Utils
.
check_view_package
(
view
))
label
=
view
.
package
.
orig_name
else
if
(
Utils
.
check_view_distribution
(
view
))
label
=
view
.
distribution
.
name
$
(
'
#title
'
).
html
(
label
)
if
(
window_title
)
label
=
window_title
page_generic
.
set_window_title
(
label
)
},
clean
:
function
()
{
$
(
'
#title
'
).
html
(
''
)
page_generic
.
set_window_title
()
}
}
var
packages
=
{
set
:
function
(
socket_data
)
{
packages
.
clean
()
var
tmp
=
Utils
.
clone
(
socket_data
)
tmp
.
file
=
null
view
.
packages
=
{}
if
(
socket_data
.
distribution
.
packages
&&
socket_data
.
distribution
.
packages
.
length
>
0
)
{
socket_data
.
distribution
.
packages
.
forEach
(
function
(
p
){
tmp
.
package
=
p
// get datestamp if package is clicked
$
(
'
#packages ul
'
).
append
(
'
<li id="package-
'
+
p
.
orig_name
+
'
"><a href="
'
+
Utils
.
from_view_to_hash
(
tmp
)
+
'
/datestamp">
'
+
p
.
name
+
'
<span>
'
+
p
.
version
+
'
</span></a></li>
'
)
view
.
packages
[
p
.
orig_name
]
=
Utils
.
clone
(
p
)
})
packages
.
select
()
}
else
{
$
(
'
#packages ul
'
).
append
(
'
<li class="text-muted">No packages yet</li>
'
)
}
packages
.
show
()
sticky
.
updateOffset
()
},
clean
:
function
()
{
$
(
'
#packages ul
'
).
html
(
''
)
},
get
:
function
()
{
if
(
Utils
.
check_view_distribution
(
view
))
{
var
query_data
=
{}
query_data
.
distribution
=
view
.
distribution
debug_socket
(
"
emit
"
,
_e
.
distribution_packages
.
get
,
query_data
)
socket
.
emit
(
_e
.
distribution_packages
.
get
,
query_data
)
}
},
select
:
function
()
{
packages
.
unselect
()
if
(
Utils
.
check_view_package
(
view
))
{
$
(
"
#packages li[id='package-
"
+
view
.
package
.
orig_name
+
"
']
"
).
addClass
(
'
active
'
)
}
},
unselect
:
function
()
{
$
(
'
#packages li
'
).
removeClass
(
'
active
'
)
},
set_status
:
function
(
status_data
)
{
// set status in view
if
(
view
.
distribution
.
name
==
status_data
.
distribution
&&
view
.
packages
[
status_data
.
package
]
)
{
view
.
packages
[
status_data
.
package
].
status
=
status_data
.
status
if
(
status_data
.
hasOwnProperty
(
'
success
'
))
view
.
packages
[
status_data
.
package
].
success
=
status_data
.
success
else
delete
(
view
.
packages
[
status_data
.
package
].
success
)
}
// and in html
var
p_html
=
$
(
"
#packages li[id='package-
"
+
status_data
.
package
+
"
'] a
"
)
p_html
.
find
(
'
span.icon
'
).
remove
()
p_html
.
append
(
Utils
.
get_status_icon_html
(
status_data
))
if
(
Utils
.
check_view_package
(
view
)
&&
view
.
package
.
orig_name
==
status_data
.
package
&&
view
.
distribution
.
name
==
status_data
.
distribution
)
{
// in case user is watching this package, update also view.package
view
.
package
=
Utils
.
clone
(
view
.
packages
[
status_data
.
package
])
}
},
show
:
function
()
{
$
(
"
#packages
"
).
show
()
},
hide
:
function
()
{
$
(
"
#packages
"
).
hide
()
}
}
var
files
=
{
set
:
function
(
socket_data
)
{
files
.
clean
()
var
tmp
=
Utils
.
clone
(
socket_data
)
if
(
socket_data
.
package
.
files
&&
socket_data
.
package
.
files
.
length
>
0
)
{
// update view
view
.
package
.
files
=
Utils
.
clone
(
socket_data
.
package
.
files
)
// update html
socket_data
.
package
.
files
.
forEach
(
function
(
f
){
tmp
.
file
=
f
var
html_file
=
$
(
'
<li id="file-
'
+
f
.
orig_name
+
'
"><a title="
'
+
f
.
orig_name
+
'
" href="
'
+
Utils
.
from_view_to_hash
(
tmp
)
+
'
">
'
+
f
.
name
+
'
</a></li>
'
)
html_file
.
on
(
"
click
"
,
function
(){
files
.
select
(
this
)
})
$
(
'
#logs ul
'
).
append
(
html_file
)
})
$
(
'
#logs
'
).
show
()
files
.
select
()
}
if
(
socket_data
.
package
.
debs
&&
socket_data
.
package
.
debs
.
length
>
0
)
{
// update view
view
.
package
.
debs
=
Utils
.
clone
(
socket_data
.
package
.
debs
)
// update.html
socket_data
.
package
.
debs
.
forEach
(
function
(
f
){
$
(
'
#debs ul
'
).
append
(
'
<li><a title="
'
+
f
.
orig_name
+
'
" href="
'
+
f
.
path
+
'
">
'
+
f
.
name
+
'
</a> <span>.
'
+
f
.
extension
+
'
</span></li>
'
)
})
$
(
'
#debs
'
).
show
()
}
if
(
socket_data
.
package
.
sources
&&
socket_data
.
package
.
sources
.
length
>
0
)
{
// update view
view
.
package
.
sources
=
Utils
.
clone
(
socket_data
.
package
.
sources
)
// update html
socket_data
.
package
.
sources
.
forEach
(
function
(
f
){
$
(
'
#sources ul
'
).
append
(
'
<li><a title="
'
+
f
.
orig_name
+
'
" href="
'
+
f
.
path
+
'
">
'
+
f
.
name
+
'
</a></li>
'
)
})
$
(
'
#sources
'
).
show
()
}
files
.
show
()
sticky
.
updateOffset
()
},
clean
:
function
()
{
$
(
'
#logs ul
'
).
html
(
''
);
$
(
'
#logs
'
).
hide
()
$
(
'
#debs ul
'
).
html
(
''
);
$
(
'
#debs
'
).
hide
();
$
(
'
#sources ul
'
).
html
(
''
)
$
(
'
#sources
'
).
hide
()
files
.
hide
()
},
get
:
function
()
{
if
(
Utils
.
check_view_package
(
view
))
{
var
query_data
=
{}
query_data
.
distribution
=
view
.
distribution
query_data
.
package
=
view
.
package
debug_socket
(
"
emit
"
,
_e
.
package_files_list
.
get
,
query_data
)
socket
.
emit
(
_e
.
package_files_list
.
get
,
query_data
)
}
},
select
:
function
()
{
files
.
show
()
files
.
unselect
()
if
(
Utils
.
check_view_file
(
view
))
{
$
(
"
#logs li[id='file-
"
+
view
.
file
.
orig_name
+
"
']
"
).
addClass
(
'
active
'
)
}
},
unselect
:
function
()
{
$
(
'
#logs li
'
).
removeClass
(
'
active
'
);
},
hide
:
function
()
{
$
(
'
#files
'
).
hide
()
},
show
:
function
()
{
$
(
'
#files
'
).
show
()
},
}
var
file
=
{
set
:
function
(
socket_data
)
{
view
.
file
=
Utils
.
clone
(
socket_data
.
file
)
$
(
"
#file pre
"
).
html
(
socket_data
.
file
.
content
)
$
(
"
#file
"
).
show
()
},
clean
:
function
()
{
$
(
'
#file pre
'
).
html
(
''
)
$
(
'
#file
'
).
hide
()
},
append
:
function
(
new_content
)
{
var
content
=
$
(
"
#file pre
"
)
content
.
append
(
new_content
)
if
(
config
.
preferences
.
autoscroll
)
{
// scroll down if file is covering footer
var
file_height
=
$
(
"
#fileOffset
"
).
offset
().
top
var
footerOffset
=
$
(
"
footer
"
).
offset
().
top
if
(
file_height
>
footerOffset
)
{
debug
(
2
,
'
scoll down on new content
'
)
$
(
'
html,body
'
).
animate
({
scrollTop
:
file_height
},
0
);
function
__check_hash_makes_sense
()
{
if
(
window
.
location
.
hash
.
indexOf
(
'
..
'
)
>=
0
)
{
error
.
set
(
'
Detected ".." God Is Watching You !
'
);
return
false
;
}
}
},
get
:
function
()
{
if
(
Utils
.
check_view_file
(
view
))
{
var
query_data
=
{}
query_data
.
distribution
=
view
.
distribution
query_data
.
package
=
view
.
package
query_data
.
file
=
view
.
file
query_data
.
file
.
content
=
null
// get a feedback to user while downloading file
$
(
"
#file pre
"
).
html
(
"
Downloading file, please wait a while ...
"
)
$
(
"
#file
"
).
show
()
debug_socket
(
"
emit
"
,
_e
.
file
.
get
,
query_data
)
socket
.
emit
(
_e
.
file
.
get
,
query_data
)
}
}
}
var
breadcrumb
=
{
update
:
function
(
label
)
{
if
(
label
)
{
$
(
'
.breadcrumb
'
).
html
(
'
<li class="active">
'
+
label
+
'
</li>
'
)
return
}
hash
=
window
.
location
.
hash
.
replace
(
'
#
'
,
''
)
var
new_html
=
''
var
new_hash
=
'
#
'
var
info
=
hash
.
split
(
'
/
'
)
for
(
var
i
=
0
;
i
<
info
.
length
;
i
++
)
{
new_hash
+=
info
[
i
]
if
(
i
==
(
info
.
length
-
1
))
new_html
+=
'
<li class="active">
'
+
info
[
i
]
+
'
</li>
'
else
new_html
+=
'
<li><a href="
'
+
new_hash
+
'
">
'
+
info
[
i
]
+
'
</a>
'
new_hash
+=
'
/
'
}
$
(
'
.breadcrumb
'
).
html
(
new_html
)
}
}
// sticky sidebar
var
sticky
=
{
init
:
function
()
{
if
(
sidebarOffset
==
0
)
return
if
(
$
(
window
).
scrollTop
()
>
sidebarOffset
)
{
sticky
.
show
()
}
else
{
sticky
.
hide
()
sticky
.
updateOffset
()
}
},
start
:
function
()
{
$
(
window
).
scroll
(
sticky
.
init
)
},
stop
:
function
()
{
$
(
window
).
off
(
"
scroll
"
)
},
reset
:
function
()
{
sticky
.
stop
()
sticky
.
update
()
sticky
.
init
()
sticky
.
start
()
},
show
:
function
()
{
if
(
config
.
preferences
.
sidebar
)
{
$
(
"
#sticky
"
).
addClass
(
'
fixed
'
)
}
debug
(
2
,
"
showing sticky
"
)
$
(
"
#sticky-package
"
).
fadeIn
()
},
hide
:
function
()
{
$
(
"
#sticky
"
).
removeClass
(
'
fixed
'
)
$
(
"
#sticky-package
"
).
fadeOut
(
150
)
},
update
:
function
()
{
sticky
.
updateOffset
()
if
(
Utils
.
check_view_distribution
(
view
))
$
(
"
#sticky-package .distribution
"
).
html
(
view
.
distribution
.
name
)
if
(
Utils
.
check_view_package
(
view
))
{
$
(
"
#sticky-package .name
"
).
html
(
view
.
package
.
name
)
$
(
"
#sticky-package .version
"
).
html
(
view
.
package
.
version
)
sticky
.
set_status
()
}
},
updateOffset
:
function
()
{
var
sidebar
=
$
(
"
#files
"
)
sidebarOffset
=
sidebar
.
offset
().
top
},
set_status
:
function
(
status_data
)
{
if
(
!
status_data
)
{
status_data
=
{}
status_data
.
distribution
=
view
.
distribution
.
name
status_data
.
package
=
view
.
package
.
orig_name
status_data
.
status
=
view
.
package
.
status
if
(
view
.
package
.
hasOwnProperty
(
'
success
'
))
status_data
.
success
=
view
.
package
.
success
}
if
(
Utils
.
check_view_package
(
view
)
&&
status_data
.
distribution
==
view
.
distribution
.
name
&&
status_data
.
package
==
view
.
package
.
orig_name
)
{
// update html
var
info
=
Utils
.
get_status_icon_and_class
(
status_data
)
var
panel
=
$
(
"
#sticky-package-content
"
)
panel
.
removeClass
()
panel
.
addClass
(
'
panel panel-
'
+
info
.
className
)
var
div
=
$
(
"
#sticky-package .status
"
)
div
.
find
(
'
span.icon
'
).
remove
()
div
.
append
(
Utils
.
get_status_icon_html
(
status_data
))
}
if
(
!
window
.
location
.
hash
)
{
welcome
.
show
();
return
false
;
}
var
info
=
window
.
location
.
hash
.
split
(
'
/
'
);
if
(
info
.
length
==
2
)
window
.
location
.
hash
=
info
[
0
];
return
true
;
}
}
var
error
=
{
set
:
function
(
socket_error
)
{
$
(
"
#error span
"
).
html
(
socket_error
)
error
.
view
()
},
clean
:
function
()
{
$
(
"
#error
"
).
hide
()
$
(
"
#error span
"
).
html
(
''
)
},
view
:
function
()
{
$
(
"
#error
"
).
fadeIn
(
100
)
title
.
set
(
"
Something is wrong ...
"
)
breadcrumb
.
update
(
'
Something is wrong ...
'
)
file
.
clean
()
files
.
hide
()
unselect
()
},
}
var
welcome
=
{
set
:
function
(
distributions
)
{
welcome
.
clean
()
if
(
distributions
.
length
<
1
)
{
$
(
'
#welcome
'
).
append
(
'
<p class="lead text-muted">There is no distribution at the moment</p>
'
)
}
else
{
distributions
.
forEach
(
function
(
name
){
$
(
'
#welcome
'
).
append
(
'
<a class="btn btn-lg btn-primary" href="
'
+
config
.
paths
.
distribution
+
'
#
'
+
name
+
'
">
'
+
name
+
'
</a>
'
);
var
title
=
{
set
:
function
(
label
)
{
if
(
label
)
{
$
(
'
#title
'
).
html
(
label
);
page_generic
.
set_window_title
(
label
);
return
;
}
label
=
''
;
var
window_title
=
null
;
if
(
Utils
.
check_view_file
(
view
))
{
var
complete_name
=
view
.
package
.
orig_name
+
'
.
'
+
view
.
file
.
name
;
window_title
=
complete_name
;
if
(
!
view
.
file
.
path
);
view
.
file
.
path
=
config
.
paths
.
debomatic
+
'
/
'
+
view
.
distribution
.
name
+
'
/pool/
'
+
view
.
package
.
orig_name
+
'
/
'
+
complete_name
;
label
=
complete_name
+
'
<a class="btn btn-link btn-lg" title="Download" href="
'
+
view
.
file
.
path
+
'
">
'
+
'
<span class="glyphicon glyphicon-download-alt"></span></a>
'
;
}
else
if
(
Utils
.
check_view_package
(
view
))
label
=
view
.
package
.
orig_name
;
else
if
(
Utils
.
check_view_distribution
(
view
))
label
=
view
.
distribution
.
name
;
$
(
'
#title
'
).
html
(
label
);
if
(
window_title
)
label
=
window_title
;
page_generic
.
set_window_title
(
label
);
},
clean
:
function
()
{
$
(
'
#title
'
).
html
(
''
);
page_generic
.
set_window_title
();
}
};
var
packages
=
{
set
:
function
(
socket_data
)
{
packages
.
clean
();
var
tmp
=
Utils
.
clone
(
socket_data
);
tmp
.
file
=
null
;
view
.
packages
=
{};
if
(
socket_data
.
distribution
.
packages
&&
socket_data
.
distribution
.
packages
.
length
>
0
)
{
socket_data
.
distribution
.
packages
.
forEach
(
function
(
p
)
{
tmp
.
package
=
p
;
// get datestamp if package is clicked
$
(
'
#packages ul
'
).
append
(
'
<li id="package-
'
+
p
.
orig_name
+
'
"><a href="
'
+
Utils
.
from_view_to_hash
(
tmp
)
+
'
/datestamp">
'
+
p
.
name
+
'
<span>
'
+
p
.
version
+
'
</span></a></li>
'
);
view
.
packages
[
p
.
orig_name
]
=
Utils
.
clone
(
p
);
});
packages
.
select
();
}
else
{
$
(
'
#packages ul
'
).
append
(
'
<li class="text-muted">No packages yet</li>
'
);
}
packages
.
show
();
sticky
.
updateOffset
();
},
clean
:
function
()
{
$
(
'
#packages ul
'
).
html
(
''
);
},
get
:
function
()
{
if
(
Utils
.
check_view_distribution
(
view
))
{
var
query_data
=
{};
query_data
.
distribution
=
view
.
distribution
;
debug_socket
(
'
emit
'
,
_e
.
distribution_packages
.
get
,
query_data
);
socket
.
emit
(
_e
.
distribution_packages
.
get
,
query_data
);
}
},
select
:
function
()
{
packages
.
unselect
();
if
(
Utils
.
check_view_package
(
view
))
{
$
(
'
#packages li[id="package-
'
+
view
.
package
.
orig_name
+
'
"]
'
).
addClass
(
'
active
'
);
}
},
unselect
:
function
()
{
$
(
'
#packages li
'
).
removeClass
(
'
active
'
);
},
set_status
:
function
(
status_data
)
{
// set status in view
if
(
view
.
distribution
.
name
==
status_data
.
distribution
&&
view
.
packages
[
status_data
.
package
])
{
view
.
packages
[
status_data
.
package
].
status
=
status_data
.
status
;
if
(
status_data
.
hasOwnProperty
(
'
success
'
))
view
.
packages
[
status_data
.
package
].
success
=
status_data
.
success
;
else
delete
(
view
.
packages
[
status_data
.
package
].
success
);
}
// and in html
var
p_html
=
$
(
'
#packages li[id="package-
'
+
status_data
.
package
+
'
"] a
'
);
p_html
.
find
(
'
span.icon
'
).
remove
();
p_html
.
append
(
Utils
.
get_status_icon_html
(
status_data
));
if
(
Utils
.
check_view_package
(
view
)
&&
view
.
package
.
orig_name
==
status_data
.
package
&&
view
.
distribution
.
name
==
status_data
.
distribution
)
{
// in case user is watching this package, update also view.package
view
.
package
=
Utils
.
clone
(
view
.
packages
[
status_data
.
package
]);
}
},
show
:
function
()
{
$
(
'
#packages
'
).
show
();
},
hide
:
function
()
{
$
(
'
#packages
'
).
hide
();
}
};
var
files
=
{
set
:
function
(
socket_data
)
{
files
.
clean
();
var
tmp
=
Utils
.
clone
(
socket_data
);
if
(
socket_data
.
package
.
files
&&
socket_data
.
package
.
files
.
length
>
0
)
{
// update view
view
.
package
.
files
=
Utils
.
clone
(
socket_data
.
package
.
files
);
// update html
socket_data
.
package
.
files
.
forEach
(
function
(
f
)
{
tmp
.
file
=
f
;
var
html_file
=
$
(
'
<li id="file-
'
+
f
.
orig_name
+
'
"><a title="
'
+
f
.
orig_name
+
'
" href="
'
+
Utils
.
from_view_to_hash
(
tmp
)
+
'
">
'
+
f
.
name
+
'
</a></li>
'
);
html_file
.
on
(
'
click
'
,
function
()
{
files
.
select
(
this
);
});
$
(
'
#logs ul
'
).
append
(
html_file
);
});
$
(
'
#logs
'
).
show
();
files
.
select
();
}
if
(
socket_data
.
package
.
debs
&&
socket_data
.
package
.
debs
.
length
>
0
)
{
// update view
view
.
package
.
debs
=
Utils
.
clone
(
socket_data
.
package
.
debs
);
// update.html
socket_data
.
package
.
debs
.
forEach
(
function
(
f
)
{
$
(
'
#debs ul
'
).
append
(
'
<li><a title="
'
+
f
.
orig_name
+
'
" href="
'
+
f
.
path
+
'
">
'
+
f
.
name
+
'
</a> <span>.
'
+
f
.
extension
+
'
</span></li>
'
);
});
$
(
'
#debs
'
).
show
();
}
if
(
socket_data
.
package
.
sources
&&
socket_data
.
package
.
sources
.
length
>
0
)
{
// update view
view
.
package
.
sources
=
Utils
.
clone
(
socket_data
.
package
.
sources
);
// update html
socket_data
.
package
.
sources
.
forEach
(
function
(
f
)
{
$
(
'
#sources ul
'
).
append
(
'
<li><a title="
'
+
f
.
orig_name
+
'
" href="
'
+
f
.
path
+
'
">
'
+
f
.
name
+
'
</a></li>
'
);
})
$
(
'
#sources
'
).
show
();
}
files
.
show
();
sticky
.
updateOffset
();
},
clean
:
function
()
{
$
(
'
#logs ul
'
).
html
(
''
);
$
(
'
#logs
'
).
hide
();
$
(
'
#debs ul
'
).
html
(
''
);
$
(
'
#debs
'
).
hide
();
$
(
'
#sources ul
'
).
html
(
''
);
$
(
'
#sources
'
).
hide
();
files
.
hide
();
},
get
:
function
()
{
if
(
Utils
.
check_view_package
(
view
))
{
var
query_data
=
{};
query_data
.
distribution
=
view
.
distribution
;
query_data
.
package
=
view
.
package
;
debug_socket
(
'
emit
'
,
_e
.
package_files_list
.
get
,
query_data
);
socket
.
emit
(
_e
.
package_files_list
.
get
,
query_data
);
}
},
select
:
function
()
{
files
.
show
();
files
.
unselect
();
if
(
Utils
.
check_view_file
(
view
))
{
$
(
'
#logs li[id="file-
'
+
view
.
file
.
orig_name
+
'
"]
'
).
addClass
(
'
active
'
);
}
},
unselect
:
function
()
{
$
(
'
#logs li
'
).
removeClass
(
'
active
'
);
},
hide
:
function
()
{
$
(
'
#files
'
).
hide
();
},
show
:
function
()
{
$
(
'
#files
'
).
show
();
},
};
var
file
=
{
set
:
function
(
socket_data
)
{
view
.
file
=
Utils
.
clone
(
socket_data
.
file
);
$
(
'
#file pre
'
).
html
(
socket_data
.
file
.
content
);
$
(
'
#file
'
).
show
();
},
clean
:
function
()
{
$
(
'
#file pre
'
).
html
(
''
);
$
(
'
#file
'
).
hide
();
},
append
:
function
(
new_content
)
{
var
content
=
$
(
'
#file pre
'
);
content
.
append
(
new_content
);
if
(
config
.
preferences
.
autoscroll
)
{
// scroll down if file is covering footer
var
file_height
=
$
(
'
#fileOffset
'
).
offset
().
top
;
var
footerOffset
=
$
(
'
footer
'
).
offset
().
top
;
if
(
file_height
>
footerOffset
)
{
debug
(
2
,
'
scoll down on new content
'
);
$
(
'
html,body
'
).
animate
({
scrollTop
:
file_height
},
0
);
}
}
},
get
:
function
()
{
if
(
Utils
.
check_view_file
(
view
))
{
var
query_data
=
{};
query_data
.
distribution
=
view
.
distribution
;
query_data
.
package
=
view
.
package
;
query_data
.
file
=
view
.
file
;
query_data
.
file
.
content
=
null
;
// get a feedback to user while downloading file
$
(
'
#file pre
'
).
html
(
'
Downloading file, please wait a while ...
'
);
$
(
'
#file
'
).
show
();
debug_socket
(
'
emit
'
,
_e
.
file
.
get
,
query_data
);
socket
.
emit
(
_e
.
file
.
get
,
query_data
);
}
}
};
var
breadcrumb
=
{
update
:
function
(
label
)
{
if
(
label
)
{
$
(
'
.breadcrumb
'
).
html
(
'
<li class="active">
'
+
label
+
'
</li>
'
);
return
;
}
var
hash
=
window
.
location
.
hash
.
replace
(
'
#
'
,
''
);
var
new_html
=
''
;
var
new_hash
=
'
#
'
;
var
info
=
hash
.
split
(
'
/
'
);
for
(
var
i
=
0
;
i
<
info
.
length
;
i
++
)
{
new_hash
+=
info
[
i
];
if
(
i
==
(
info
.
length
-
1
))
new_html
+=
'
<li class="active">
'
+
info
[
i
]
+
'
</li>
'
;
else
new_html
+=
'
<li><a href="
'
+
new_hash
+
'
">
'
+
info
[
i
]
+
'
</a>
'
;
new_hash
+=
'
/
'
;
}
$
(
'
.breadcrumb
'
).
html
(
new_html
);
}
};
// sticky sidebar
var
sticky
=
{
init
:
function
()
{
if
(
sidebarOffset
===
0
)
return
;
if
(
$
(
window
).
scrollTop
()
>
sidebarOffset
)
{
sticky
.
show
();
}
else
{
sticky
.
hide
();
sticky
.
updateOffset
();
}
},
start
:
function
()
{
$
(
window
).
scroll
(
sticky
.
init
);
},
stop
:
function
()
{
$
(
window
).
off
(
'
scroll
'
);
},
reset
:
function
()
{
sticky
.
stop
();
sticky
.
update
();
sticky
.
init
();
sticky
.
start
();
},
show
:
function
()
{
if
(
config
.
preferences
.
sidebar
)
{
$
(
'
#sticky
'
).
addClass
(
'
fixed
'
);
}
debug
(
2
,
'
showing sticky
'
);
$
(
'
#sticky-package
'
).
fadeIn
();
},
hide
:
function
()
{
$
(
'
#sticky
'
).
removeClass
(
'
fixed
'
);
$
(
'
#sticky-package
'
).
fadeOut
(
150
);
},
update
:
function
()
{
sticky
.
updateOffset
();
if
(
Utils
.
check_view_distribution
(
view
))
$
(
'
#sticky-package .distribution
'
).
html
(
view
.
distribution
.
name
);
if
(
Utils
.
check_view_package
(
view
))
{
$
(
'
#sticky-package .name
'
).
html
(
view
.
package
.
name
);
$
(
'
#sticky-package .version
'
).
html
(
view
.
package
.
version
);
sticky
.
set_status
();
}
},
updateOffset
:
function
()
{
var
sidebar
=
$
(
'
#files
'
);
sidebarOffset
=
sidebar
.
offset
().
top
;
},
set_status
:
function
(
status_data
)
{
if
(
!
status_data
)
{
status_data
=
{};
status_data
.
distribution
=
view
.
distribution
.
name
;
status_data
.
package
=
view
.
package
.
orig_name
;
status_data
.
status
=
view
.
package
.
status
;
if
(
view
.
package
.
hasOwnProperty
(
'
success
'
))
status_data
.
success
=
view
.
package
.
success
;
}
if
(
Utils
.
check_view_package
(
view
)
&&
status_data
.
distribution
==
view
.
distribution
.
name
&&
status_data
.
package
==
view
.
package
.
orig_name
)
{
// update html
var
info
=
Utils
.
get_status_icon_and_class
(
status_data
);
var
panel
=
$
(
'
#sticky-package-content
'
);
panel
.
removeClass
();
panel
.
addClass
(
'
panel panel-
'
+
info
.
className
);
var
div
=
$
(
'
#sticky-package .status
'
);
div
.
find
(
'
span.icon
'
).
remove
();
div
.
append
(
Utils
.
get_status_icon_html
(
status_data
));
}
}
};
var
error
=
{
set
:
function
(
socket_error
)
{
$
(
'
#error span
'
).
html
(
socket_error
);
error
.
view
();
},
clean
:
function
()
{
$
(
'
#error
'
).
hide
();
$
(
'
#error span
'
).
html
(
''
);
},
view
:
function
()
{
$
(
'
#error
'
).
fadeIn
(
100
);
title
.
set
(
'
Something is wrong ...
'
);
breadcrumb
.
update
(
'
Something is wrong ...
'
);
file
.
clean
();
files
.
hide
();
unselect
();
},
};
var
welcome
=
{
set
:
function
(
distributions
)
{
welcome
.
clean
();
if
(
distributions
.
length
<
1
)
{
$
(
'
#welcome
'
).
append
(
'
<p class="lead text-muted">There is no distribution at the moment</p>
'
);
}
else
{
distributions
.
forEach
(
function
(
name
)
{
$
(
'
#welcome
'
).
append
(
'
<a class="btn btn-lg btn-primary" href="
'
+
config
.
paths
.
distribution
+
'
#
'
+
name
+
'
">
'
+
name
+
'
</a>
'
);
});
}
},
show
:
function
()
{
title
.
set
(
'
Please select a distribution
'
);
breadcrumb
.
update
(
'
Select a distribution
'
);
packages
.
hide
();
file
.
clean
();
files
.
hide
();
unselect
();
$
(
'
#welcome
'
).
show
();
},
clean
:
function
()
{
$
(
'
#welcome
'
).
html
(
''
);
},
hide
:
function
()
{
$
(
'
#welcome
'
).
hide
();
}
};
var
preferences
=
function
()
{
if
(
!
config
.
preferences
.
sidebar
)
{
debug
(
2
,
'
no sidebar - updating html
'
);
$
(
'
#sidebar
'
).
removeClass
();
$
(
'
#sidebar
'
).
addClass
(
'
col-md-12 row
'
);
$
(
'
#packages
'
).
addClass
(
'
col-md-4
'
);
$
(
'
#logs
'
).
addClass
(
'
col-md-4
'
);
$
(
'
#files .others
'
).
addClass
(
'
col-md-4
'
);
$
(
'
#main
'
).
removeClass
().
addClass
(
'
col-md-12
'
);
$
(
'
#sticky-package
'
).
addClass
(
'
on-top
'
);
}
if
(
!
config
.
preferences
.
file_background
)
{
$
(
'
#file pre
'
).
addClass
(
'
no-background
'
);
}
$
(
'
#file pre
'
).
css
(
'
font-size
'
,
config
.
preferences
.
file_fontsize
);
};
var
select
=
function
()
{
unselect
();
if
(
Utils
.
check_view_distribution
(
view
))
{
$
(
'
#distributions li[id="distribution-
'
+
view
.
distribution
.
name
+
'
"]
'
).
addClass
(
'
active
'
);
}
packages
.
select
();
files
.
select
();
};
var
unselect
=
function
()
{
$
(
'
#distributions li
'
).
removeClass
(
'
active
'
);
files
.
unselect
();
packages
.
unselect
();
};
var
clean
=
function
()
{
welcome
.
hide
();
title
.
clean
();
packages
.
clean
();
files
.
clean
();
file
.
clean
();
unselect
();
breadcrumb
.
update
();
error
.
clean
();
};
var
update
=
{
page
:
function
(
old_view
)
{
if
(
!
old_view
||
!
Utils
.
check_view_distribution
(
old_view
)
||
!
Utils
.
check_view_distribution
(
view
)
||
view
.
distribution
.
name
!=
old_view
.
distribution
.
name
||
!
view
.
package
.
orig_name
)
{
// new distribution view
populate
();
return
;
}
else
if
(
!
Utils
.
check_view_package
(
old_view
)
||
!
Utils
.
check_view_package
(
view
)
||
view
.
package
.
orig_name
!=
old_view
.
package
.
orig_name
)
{
// new package view
files
.
get
();
file
.
get
();
}
else
if
(
!
Utils
.
check_view_file
(
old_view
)
||
!
Utils
.
check_view_file
(
view
)
||
view
.
file
.
name
!=
old_view
.
file
.
name
)
{
// new file view
file
.
get
();
}
update
.
view
(
view
);
},
view
:
function
()
{
error
.
clean
();
title
.
set
();
breadcrumb
.
update
();
select
();
sticky
.
reset
();
}
};
var
populate
=
function
()
{
clean
();
packages
.
get
();
files
.
get
();
file
.
get
();
update
.
view
();
};
this
.
start
=
function
()
{
socket
.
on
(
config
.
events
.
error
,
function
(
socket_error
)
{
debug_socket
(
'
received
'
,
config
.
events
.
error
,
socket_error
);
error
.
set
(
socket_error
);
});
}
},
show
:
function
()
{
title
.
set
(
"
Please select a distribution
"
)
breadcrumb
.
update
(
"
Select a distribution
"
)
packages
.
hide
()
file
.
clean
()
files
.
hide
()
unselect
()
$
(
"
#welcome
"
).
show
()
},
clean
:
function
()
{
$
(
"
#welcome
"
).
html
(
''
)
},
hide
:
function
()
{
$
(
"
#welcome
"
).
hide
()
}
}
var
preferences
=
function
()
{
if
(
!
config
.
preferences
.
sidebar
)
{
debug
(
2
,
"
no sidebar - updating html
"
)
$
(
"
#sidebar
"
).
removeClass
()
$
(
"
#sidebar
"
).
addClass
(
"
col-md-12 row
"
)
$
(
"
#packages
"
).
addClass
(
"
col-md-4
"
)
$
(
"
#logs
"
).
addClass
(
"
col-md-4
"
)
$
(
"
#files .others
"
).
addClass
(
"
col-md-4
"
)
$
(
"
#main
"
).
removeClass
().
addClass
(
"
col-md-12
"
)
$
(
"
#sticky-package
"
).
addClass
(
"
on-top
"
)
}
if
(
!
config
.
preferences
.
file_background
)
{
$
(
"
#file pre
"
).
addClass
(
"
no-background
"
)
}
$
(
"
#file pre
"
).
css
(
'
font-size
'
,
config
.
preferences
.
file_fontsize
)
}
var
select
=
function
()
{
unselect
()
if
(
Utils
.
check_view_distribution
(
view
))
{
$
(
"
#distributions li[id='distribution-
"
+
view
.
distribution
.
name
+
"
']
"
).
addClass
(
'
active
'
)
}
packages
.
select
()
files
.
select
()
}
var
unselect
=
function
()
{
$
(
'
#distributions li
'
).
removeClass
(
'
active
'
)
files
.
unselect
()
packages
.
unselect
()
}
var
clean
=
function
()
{
welcome
.
hide
()
title
.
clean
()
packages
.
clean
()
files
.
clean
()
file
.
clean
()
unselect
()
breadcrumb
.
update
()
error
.
clean
()
}
var
update
=
{
page
:
function
(
old_view
)
{
if
(
!
old_view
||
!
Utils
.
check_view_distribution
(
old_view
)
||
!
Utils
.
check_view_distribution
(
view
)
||
view
.
distribution
.
name
!=
old_view
.
distribution
.
name
||
!
view
.
package
.
orig_name
)
{
// new distribution view
populate
()
return
}
else
if
(
!
Utils
.
check_view_package
(
old_view
)
||
!
Utils
.
check_view_package
(
view
)
||
view
.
package
.
orig_name
!=
old_view
.
package
.
orig_name
)
{
// new package view
files
.
get
()
file
.
get
()
}
else
if
(
!
Utils
.
check_view_file
(
old_view
)
||
!
Utils
.
check_view_file
(
view
)
||
view
.
file
.
name
!=
old_view
.
file
.
name
)
{
// new file view
file
.
get
()
}
update
.
view
(
view
)
},
view
:
function
()
{
error
.
clean
()
title
.
set
()
breadcrumb
.
update
()
select
()
sticky
.
reset
()
}
}
var
populate
=
function
()
{
clean
()
packages
.
get
()
files
.
get
()
file
.
get
()
update
.
view
()
}
this
.
start
=
function
()
{
socket
.
on
(
config
.
events
.
error
,
function
(
socket_error
)
{
debug_socket
(
"
received
"
,
config
.
events
.
error
,
socket_error
)
error
.
set
(
socket_error
)
})
socket
.
on
(
config
.
events
.
broadcast
.
distributions
,
function
(
socket_data
)
{
debug_socket
(
"
received
"
,
config
.
events
.
broadcast
.
distributions
,
socket_data
)
welcome
.
set
(
socket_data
)
})
socket
.
on
(
_e
.
distribution_packages
.
set
,
function
(
socket_data
){
debug_socket
(
"
received
"
,
_e
.
distribution_packages
.
set
,
socket_data
)
packages
.
set
(
socket_data
)
})
socket
.
on
(
_e
.
distribution_packages
.
status
,
function
(
socket_data
){
debug_socket
(
"
received
"
,
_e
.
distribution_packages
.
set
,
socket_data
)
packages
.
set_status
(
socket_data
)
sticky
.
set_status
(
socket_data
)
})
socket
.
on
(
config
.
events
.
broadcast
.
status_update
,
function
(
socket_data
){
packages
.
set_status
(
socket_data
)
sticky
.
set_status
(
socket_data
)
})
socket
.
on
(
_e
.
package_files_list
.
set
,
function
(
socket_data
){
debug_socket
(
"
received
"
,
_e
.
package_files_list
.
set
,
socket_data
)
files
.
set
(
socket_data
)
})
socket
.
on
(
_e
.
file
.
set
,
function
(
socket_data
)
{
debug_socket
(
"
received
"
,
_e
.
file
.
set
,
socket_data
)
file
.
set
(
socket_data
)
})
socket
.
on
(
_e
.
file_newcontent
,
function
(
socket_data
)
{
debug_socket
(
"
received
"
,
_e
.
file_newcontent
,
socket_data
)
new_lines
.
push
(
socket_data
.
file
.
new_content
)
})
$
(
window
).
on
(
'
hashchange
'
,
function
()
{
if
(
!
__check_hash_makes_sense
())
return
var
old_view
=
Utils
.
clone
(
view
)
var
new_view
=
Utils
.
from_hash_to_view
()
// reset current view
view
.
distribution
=
Utils
.
clone
(
new_view
.
distribution
)
view
.
package
=
Utils
.
clone
(
new_view
.
package
)
if
(
view
.
packages
[
new_view
.
package
.
orig_name
])
view
.
package
=
Utils
.
clone
(
view
.
packages
[
new_view
.
package
.
orig_name
])
view
.
file
=
Utils
.
clone
(
new_view
.
file
)
update
.
page
(
old_view
)
$
(
'
html,body
'
).
animate
({
scrollTop
:
0
},
0
);
debug
(
1
,
"
changing view
"
,
"
old:
"
,
old_view
,
"
new:
"
,
view
)
});
if
(
!
__check_hash_makes_sense
())
return
populate
()
// Init sticky-package back_on_top on click
$
(
"
#sticky-package
"
).
on
(
"
click
"
,
function
(){
$
(
'
html,body
'
).
animate
({
scrollTop
:
0
},
100
);
})
// WORKAROUND:
// when page is loaded sidebar has offset().top
// equals 0. This is because html is loaded on socket
// events. Sleep a while and call stiky.reset()
setTimeout
(
sticky
.
reset
,
500
);
// WORKAROUND:
// On incoming hundred of lines browser goes crazy.
// Append lines every 200 mills.
function
watch_for_new_lines
()
{
if
(
new_lines
.
length
>
0
)
{
file
.
append
(
new_lines
.
join
(
''
))
new_lines
=
[]
}
setTimeout
(
watch_for_new_lines
,
200
);
}
watch_for_new_lines
()
socket
.
on
(
config
.
events
.
broadcast
.
distributions
,
function
(
socket_data
)
{
debug_socket
(
'
received
'
,
config
.
events
.
broadcast
.
distributions
,
socket_data
);
welcome
.
set
(
socket_data
);
});
socket
.
on
(
_e
.
distribution_packages
.
set
,
function
(
socket_data
)
{
debug_socket
(
'
received
'
,
_e
.
distribution_packages
.
set
,
socket_data
);
packages
.
set
(
socket_data
);
});
socket
.
on
(
_e
.
distribution_packages
.
status
,
function
(
socket_data
)
{
debug_socket
(
'
received
'
,
_e
.
distribution_packages
.
set
,
socket_data
);
packages
.
set_status
(
socket_data
);
sticky
.
set_status
(
socket_data
);
});
socket
.
on
(
config
.
events
.
broadcast
.
status_update
,
function
(
socket_data
)
{
packages
.
set_status
(
socket_data
);
sticky
.
set_status
(
socket_data
);
});
socket
.
on
(
_e
.
package_files_list
.
set
,
function
(
socket_data
)
{
debug_socket
(
'
received
'
,
_e
.
package_files_list
.
set
,
socket_data
);
files
.
set
(
socket_data
);
});
socket
.
on
(
_e
.
file
.
set
,
function
(
socket_data
)
{
debug_socket
(
'
received
'
,
_e
.
file
.
set
,
socket_data
);
file
.
set
(
socket_data
);
});
socket
.
on
(
_e
.
file_newcontent
,
function
(
socket_data
)
{
debug_socket
(
'
received
'
,
_e
.
file_newcontent
,
socket_data
);
new_lines
.
push
(
socket_data
.
file
.
new_content
);
});
$
(
window
).
on
(
'
hashchange
'
,
function
()
{
if
(
!
__check_hash_makes_sense
())
return
;
var
old_view
=
Utils
.
clone
(
view
);
var
new_view
=
Utils
.
from_hash_to_view
();
// reset current view
view
.
distribution
=
Utils
.
clone
(
new_view
.
distribution
);
view
.
package
=
Utils
.
clone
(
new_view
.
package
);
if
(
view
.
packages
[
new_view
.
package
.
orig_name
])
view
.
package
=
Utils
.
clone
(
view
.
packages
[
new_view
.
package
.
orig_name
]);
view
.
file
=
Utils
.
clone
(
new_view
.
file
);
update
.
page
(
old_view
);
$
(
'
html,body
'
).
animate
({
scrollTop
:
0
},
0
);
debug
(
1
,
'
changing view
'
,
'
old:
'
,
old_view
,
'
new:
'
,
view
);
});
if
(
!
__check_hash_makes_sense
())
return
;
populate
();
// Init sticky-package back_on_top on click
$
(
'
#sticky-package
'
).
on
(
'
click
'
,
function
()
{
$
(
'
html,body
'
).
animate
({
scrollTop
:
0
},
100
);
});
// WORKAROUND:
// when page is loaded sidebar has offset().top
// equals 0. This is because html is loaded on socket
// events. Sleep a while and call stiky.reset()
setTimeout
(
sticky
.
reset
,
500
);
// WORKAROUND:
// On incoming hundred of lines browser goes crazy.
// Append lines every 200 mills.
function
watch_for_new_lines
()
{
if
(
new_lines
.
length
>
0
)
{
file
.
append
(
new_lines
.
join
(
''
));
new_lines
=
[];
}
setTimeout
(
watch_for_new_lines
,
200
);
}
watch_for_new_lines
();
// Update html according with preferences
preferences
()
// Update html according with preferences
preferences
();
}
};
}
debomatic-webui/public/javascripts/page_generic.js
View file @
f7a4f04a
function
Page_Generic
()
{
var
_e
=
config
.
events
function
__get_status_html_id
(
status_data
)
{
var
result
=
'
status-
'
+
status_data
.
status
+
'
-
'
+
status_data
.
distribution
if
(
status_data
.
hasOwnProperty
(
'
package
'
))
result
+=
'
-
'
+
status_data
.
package
return
result
}
function
__get_status_html_href
(
status_data
)
{
result
=
config
.
paths
.
distribution
+
'
#
'
+
status_data
.
distribution
if
(
status_data
.
hasOwnProperty
(
'
package
'
))
result
+=
'
/
'
+
status_data
.
package
.
replace
(
'
_
'
,
'
/
'
)
+
'
/datestamp
'
return
result
}
function
__get_status_html_title
(
status_data
)
{
result
=
status_data
.
status
+
'
:
'
+
status_data
.
distribution
if
(
status_data
.
hasOwnProperty
(
'
package
'
))
result
+=
'
>
'
+
status_data
.
package
if
(
status_data
.
hasOwnProperty
(
'
uploader
'
)
&&
status_data
.
uploader
.
length
>
0
)
result
+=
'
by
'
+
status_data
.
uploader
return
result
}
function
__get_status_html_inner
(
status_data
)
{
if
(
status_data
.
hasOwnProperty
(
'
package
'
))
return
status_data
.
package
;
return
status_data
.
distribution
}
function
__get_status_html
(
status_data
)
{
var
_s
=
status_data
var
li
=
$
(
'
<li></li>
'
)
li
.
attr
(
'
id
'
,
__get_status_html_id
(
status_data
))
var
button
=
$
(
'
<a></a>
'
)
button
.
addClass
(
'
btn btn-xs
'
)
button
.
addClass
(
_s
.
status
)
button
.
attr
(
'
title
'
,
__get_status_html_title
(
_s
))
button
.
attr
(
'
href
'
,
__get_status_html_href
(
_s
))
button
.
html
(
__get_status_html_inner
(
_s
))
var
info
=
Utils
.
get_status_icon_and_class
(
_s
)
button
.
addClass
(
'
btn-
'
+
info
.
className
)
// add icon
button
.
html
(
button
.
html
()
+
'
'
+
Utils
.
get_status_icon_html
(
_s
))
li
.
html
(
button
)
var
result
=
$
(
'
<div></div>
'
)
result
.
html
(
li
)
return
result
.
html
()
}
var
distributions
=
{
set
:
function
(
distributions
)
{
$
(
'
#distributions ul
'
).
html
(
''
);
if
(
distributions
.
length
<
1
)
{
$
(
'
#distributions ul
'
).
append
(
'
<li><a title="There is no distribution at the moment" onclick="return false">None</li>
'
)
}
else
{
distributions
.
forEach
(
function
(
name
){
$
(
'
#distributions ul
'
).
append
(
'
<li id="distribution-
'
+
name
+
'
"><a href="
'
+
config
.
paths
.
distribution
+
'
#
'
+
name
+
'
">
'
+
name
+
'
</a></li>
'
);
});
if
(
window
.
location
.
pathname
==
config
.
paths
.
distribution
)
{
var
data
=
Utils
.
from_hash_to_view
()
if
(
Utils
.
check_view_distribution
(
data
))
{
$
(
"
#distributions li[id='distribution-
"
+
data
.
distribution
.
name
+
"
']
"
).
addClass
(
'
active
'
)
}
}
}
},
}
var
status
=
{
set
:
function
(
data_status
)
{
$
(
"
#status ul
"
).
html
(
''
)
if
(
data_status
.
length
>
0
)
{
data_status
.
forEach
(
function
(
s
){
status
.
append
(
s
)
})
}
},
append
:
function
(
status_data
)
{
$
(
'
#status .idle
'
).
hide
()
$
(
"
#status ul
"
).
append
(
__get_status_html
(
status_data
))
},
update
:
function
(
status_data
)
{
var
li
=
$
(
"
#status li[id='
"
+
__get_status_html_id
(
status_data
)
+
"
']
"
)
if
(
li
.
length
>
0
&&
status_data
.
hasOwnProperty
(
'
success
'
))
{
// Update color and icon
li
=
$
(
li
[
0
])
li
.
html
(
$
(
__get_status_html
(
status_data
)).
children
())
li
.
attr
(
'
id
'
,
''
)
// This is a chain to have a fadeOut and correctly
// delete status li from list.
// The first timemout fades out the status element.
setTimeout
(
function
()
{
li
.
children
().
fadeOut
(
config
.
status
.
delay
.
fadeOut
)
// Then resize list.
setTimeout
(
function
()
{
li
.
animate
({
width
:
'
toggle
'
})
},
config
.
status
.
delay
.
fadeOut
)
// Finally remove status html
// and show idle label if necessary.
setTimeout
(
function
()
{
li
.
remove
()
if
(
$
(
'
#status li
'
).
length
==
0
)
$
(
'
#status .idle
'
).
show
()
},
config
.
status
.
delay
.
remove
+
2000
)
// more delay on remove html
},
config
.
status
.
delay
.
remove
)
}
else
if
(
!
status_data
.
hasOwnProperty
(
'
success
'
))
{
status
.
append
(
status_data
)
}
},
}
this
.
preferences
=
function
()
{
if
(
config
.
preferences
.
header
)
{
$
(
"
#pageheader
"
).
show
()
$
(
"
.navbar .home-link
"
).
hide
()
'
use strict
'
;
function
Page_Generic
()
{
var
_e
=
config
.
events
;
function
__get_status_html_id
(
status_data
)
{
var
result
=
'
status-
'
+
status_data
.
status
+
'
-
'
+
status_data
.
distribution
;
if
(
status_data
.
hasOwnProperty
(
'
package
'
))
result
+=
'
-
'
+
status_data
.
package
;
return
result
;
}
function
__get_status_html_href
(
status_data
)
{
result
=
config
.
paths
.
distribution
+
'
#
'
+
status_data
.
distribution
;
if
(
status_data
.
hasOwnProperty
(
'
package
'
))
result
+=
'
/
'
+
status_data
.
package
.
replace
(
'
_
'
,
'
/
'
)
+
'
/datestamp
'
;
return
result
;
}
else
{
$
(
"
#pageheader
"
).
hide
()
$
(
"
.navbar .home-link
"
).
show
()
function
__get_status_html_title
(
status_data
)
{
result
=
status_data
.
status
+
'
:
'
+
status_data
.
distribution
;
if
(
status_data
.
hasOwnProperty
(
'
package
'
))
result
+=
'
>
'
+
status_data
.
package
;
if
(
status_data
.
hasOwnProperty
(
'
uploader
'
)
&&
status_data
.
uploader
.
length
>
0
)
result
+=
'
by
'
+
status_data
.
uploader
;
return
result
;
}
function
__get_status_html_inner
(
status_data
)
{
if
(
status_data
.
hasOwnProperty
(
'
package
'
))
return
status_data
.
package
;
return
status_data
.
distribution
;
}
if
(
config
.
preferences
.
glossy_theme
)
{
if
(
$
(
"
head
"
).
find
(
"
link[href='/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css']
"
).
length
==
0
)
$
(
"
head
"
).
append
(
'
<link rel="stylesheet" href="/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css">
'
)
function
__get_status_html
(
status_data
)
{
var
_s
=
status_data
;
var
li
=
$
(
'
<li></li>
'
);
li
.
attr
(
'
id
'
,
__get_status_html_id
(
status_data
));
var
button
=
$
(
'
<a></a>
'
);
button
.
addClass
(
'
btn btn-xs
'
);
button
.
addClass
(
_s
.
status
);
button
.
attr
(
'
title
'
,
__get_status_html_title
(
_s
));
button
.
attr
(
'
href
'
,
__get_status_html_href
(
_s
));
button
.
html
(
__get_status_html_inner
(
_s
));
var
info
=
Utils
.
get_status_icon_and_class
(
_s
);
button
.
addClass
(
'
btn-
'
+
info
.
className
);
// add icon
button
.
html
(
button
.
html
()
+
'
'
+
Utils
.
get_status_icon_html
(
_s
));
li
.
html
(
button
);
var
result
=
$
(
'
<div></div>
'
);
result
.
html
(
li
);
return
result
.
html
();
}
else
{
$
(
"
head
"
).
find
(
"
link[href='/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css']
"
).
remove
()
var
distributions
=
{
set
:
function
(
distributions
)
{
$
(
'
#distributions ul
'
).
html
(
''
);
if
(
distributions
.
length
<
1
)
{
$
(
'
#distributions ul
'
).
append
(
'
<li><a title="There is no distribution at the moment" onclick="return false">None</li>
'
);
}
else
{
distributions
.
forEach
(
function
(
name
)
{
$
(
'
#distributions ul
'
).
append
(
'
<li id="distribution-
'
+
name
+
'
"><a href="
'
+
config
.
paths
.
distribution
+
'
#
'
+
name
+
'
">
'
+
name
+
'
</a></li>
'
);
});
if
(
window
.
location
.
pathname
==
config
.
paths
.
distribution
)
{
var
data
=
Utils
.
from_hash_to_view
();
if
(
Utils
.
check_view_distribution
(
data
))
{
$
(
'
#distributions li[id="distribution-
'
+
data
.
distribution
.
name
+
'
"]
'
).
addClass
(
'
active
'
);
}
}
}
},
}
var
status
=
{
set
:
function
(
data_status
)
{
$
(
"
#status ul
"
).
html
(
''
);
if
(
data_status
.
length
>
0
)
{
data_status
.
forEach
(
function
(
s
)
{
status
.
append
(
s
);
})
}
},
append
:
function
(
status_data
)
{
$
(
'
#status .idle
'
).
hide
();
$
(
"
#status ul
"
).
append
(
__get_status_html
(
status_data
));
},
update
:
function
(
status_data
)
{
var
li
=
$
(
'
#status li[id="
'
+
__get_status_html_id
(
status_data
)
+
'
"]
'
);
if
(
li
.
length
>
0
&&
status_data
.
hasOwnProperty
(
'
success
'
))
{
// Update color and icon
li
=
$
(
li
[
0
]);
li
.
html
(
$
(
__get_status_html
(
status_data
)).
children
());
li
.
attr
(
'
id
'
,
''
);
// This is a chain to have a fadeOut and correctly
// delete status li from list.
// The first timemout fades out the status element.
setTimeout
(
function
()
{
li
.
children
().
fadeOut
(
config
.
status
.
delay
.
fadeOut
);
// Then resize list.
setTimeout
(
function
()
{
li
.
animate
({
width
:
'
toggle
'
});
},
config
.
status
.
delay
.
fadeOut
);
// Finally remove status html
// and show idle label if necessary.
setTimeout
(
function
()
{
li
.
remove
();
if
(
$
(
'
#status li
'
).
length
===
0
);
$
(
'
#status .idle
'
).
show
();
},
config
.
status
.
delay
.
remove
+
2000
);
// more delay on remove html
},
config
.
status
.
delay
.
remove
);
}
else
if
(
!
status_data
.
hasOwnProperty
(
'
success
'
))
{
status
.
append
(
status_data
);
}
},
};
this
.
preferences
=
function
()
{
if
(
config
.
preferences
.
header
)
{
$
(
'
#pageheader
'
).
show
();
$
(
'
.navbar .home-link
'
).
hide
();
}
else
{
$
(
'
#pageheader
'
).
hide
();
$
(
'
.navbar .home-link
'
).
show
();
}
if
(
config
.
preferences
.
glossy_theme
)
{
if
(
$
(
'
head
'
).
find
(
'
link[href="/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css"]
'
).
length
===
0
)
$
(
'
head
'
).
append
(
'
<link rel="stylesheet" href="/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css">
'
);
}
else
{
$
(
'
head
'
).
find
(
'
link[href="/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css"]
'
).
remove
();
}
};
this
.
set_window_title
=
function
(
label
)
{
var
window_title_separator
=
'
\
u00ab
'
;
if
(
label
)
window
.
document
.
title
=
label
+
window_title_separator
+
config
.
title
;
else
window
.
document
.
title
=
config
.
title
;
};
this
.
start
=
function
(
socket
)
{
// update distributions
socket
.
on
(
_e
.
broadcast
.
distributions
,
function
(
socket_distributions
)
{
debug_socket
(
'
received
'
,
_e
.
broadcast
.
distributions
,
socket_distributions
);
distributions
.
set
(
socket_distributions
);
});
socket
.
on
(
_e
.
client
.
status
,
function
(
socket_status
)
{
debug_socket
(
'
received
'
,
_e
.
client
.
status
,
socket_status
);
status
.
set
(
socket_status
);
});
socket
.
on
(
_e
.
broadcast
.
status_update
,
function
(
package_status
)
{
debug_socket
(
'
received
'
,
_e
.
broadcast
.
status_update
,
package_status
);
status
.
update
(
package_status
);
});
socket
.
on
(
_e
.
error
,
function
(
error
)
{
console
.
error
(
'
socket >
'
+
error
);
});
};
// select current page in navbar
if
(
window
.
location
.
pathname
!=
config
.
paths
.
distribution
)
{
$
(
'
.navbar li a[href="
'
+
window
.
location
.
pathname
+
'
"]
'
).
parent
().
addClass
(
'
active
'
);
}
}
this
.
set_window_title
=
function
(
label
)
{
var
window_title_separator
=
'
\
u00ab
'
if
(
label
)
window
.
document
.
title
=
label
+
window_title_separator
+
config
.
title
else
window
.
document
.
title
=
config
.
title
}
this
.
start
=
function
(
socket
)
{
// update distributions
socket
.
on
(
_e
.
broadcast
.
distributions
,
function
(
socket_distributions
)
{
debug_socket
(
"
received
"
,
_e
.
broadcast
.
distributions
,
socket_distributions
)
distributions
.
set
(
socket_distributions
)
});
socket
.
on
(
_e
.
client
.
status
,
function
(
socket_status
)
{
debug_socket
(
"
received
"
,
_e
.
client
.
status
,
socket_status
)
status
.
set
(
socket_status
)
})
socket
.
on
(
_e
.
broadcast
.
status_update
,
function
(
package_status
)
{
debug_socket
(
"
received
"
,
_e
.
broadcast
.
status_update
,
package_status
)
status
.
update
(
package_status
)
})
socket
.
on
(
_e
.
error
,
function
(
error
)
{
console
.
error
(
"
socket >
"
+
error
)
})
}
// select current page in navbar
if
(
window
.
location
.
pathname
!=
config
.
paths
.
distribution
)
{
$
(
"
.navbar li a[href='
"
+
window
.
location
.
pathname
+
"
']
"
).
parent
().
addClass
(
"
active
"
)
}
// update html according with preferences
this
.
preferences
()
// update html according with preferences
this
.
preferences
();
}
debomatic-webui/public/javascripts/preferences.js
View file @
f7a4f04a
'
use strict
'
;
function
Preferences
()
{
// update config.preferences according with user choices
var
load
=
function
()
{
for
(
key
in
config
.
preferences
)
{
if
((
value
=
localStorage
.
getItem
(
key
)))
{
debug
(
2
,
'
loading preference
'
,
key
,
value
)
config
.
preferences
[
key
]
=
JSON
.
parse
(
value
)
}
}
}
// set prefence
var
set
=
function
(
key
,
value
)
{
if
(
config
.
preferences
.
hasOwnProperty
(
key
))
{
debug
(
1
,
'
setting preference
'
,
key
,
value
)
localStorage
.
setItem
(
key
,
value
)
config
.
preferences
[
key
]
=
JSON
.
parse
(
value
)
}
}
// init prefence page
this
.
initPage
=
function
()
{
page_generic
.
set_window_title
(
"
Preferences
"
)
// set view according with config.preferences
for
(
key
in
config
.
preferences
)
{
var
element
=
$
(
"
#preferences #
"
+
key
)
if
(
element
.
attr
(
'
type
'
)
==
"
checkbox
"
)
{
element
.
prop
(
'
checked
'
,
config
.
preferences
[
key
])
}
else
{
element
.
val
(
config
.
preferences
[
key
])
}
}
// on input change, set prefence
$
(
"
#preferences input, #preferences select
"
).
change
(
function
()
{
var
key
=
$
(
this
).
attr
(
'
id
'
)
var
value
=
$
(
this
).
val
()
if
(
$
(
this
).
attr
(
'
type
'
)
==
'
checkbox
'
)
value
=
$
(
this
).
is
(
'
:checked
'
)
set
(
key
,
value
)
// give to user an immediate feedback changing preferences
page_generic
.
preferences
()
})
}
load
()
}
\ No newline at end of file
// update config.preferences according with user choices
var
load
=
function
()
{
for
(
var
key
in
config
.
preferences
)
{
var
value
=
localStorage
.
getItem
(
key
);
if
(
value
)
{
debug
(
2
,
'
loading preference
'
,
key
,
value
);
config
.
preferences
[
key
]
=
JSON
.
parse
(
value
);
}
}
};
// set prefence
var
set
=
function
(
key
,
value
)
{
if
(
config
.
preferences
.
hasOwnProperty
(
key
))
{
debug
(
1
,
'
setting preference
'
,
key
,
value
);
localStorage
.
setItem
(
key
,
value
);
config
.
preferences
[
key
]
=
JSON
.
parse
(
value
);
}
};
// init prefence page
this
.
initPage
=
function
()
{
page_generic
.
set_window_title
(
'
Preferences
'
);
// set view according with config.preferences
for
(
var
key
in
config
.
preferences
)
{
var
element
=
$
(
'
#preferences #
'
+
key
);
if
(
element
.
attr
(
'
type
'
)
==
'
checkbox
'
)
{
element
.
prop
(
'
checked
'
,
config
.
preferences
[
key
]);
}
else
{
element
.
val
(
config
.
preferences
[
key
]);
}
}
// on input change, set prefence
$
(
'
#preferences input, #preferences select
'
).
change
(
function
()
{
var
key
=
$
(
this
).
attr
(
'
id
'
);
var
value
=
$
(
this
).
val
();
if
(
$
(
this
).
attr
(
'
type
'
)
==
'
checkbox
'
)
value
=
$
(
this
).
is
(
'
:checked
'
);
set
(
key
,
value
);
// give to user an immediate feedback changing preferences
page_generic
.
preferences
();
});
};
load
();
}
debomatic-webui/public/javascripts/utils.js
View file @
f7a4f04a
'
use strict
'
;
var
Utils
=
{
from_hash_to_view
:
function
(
hash
)
{
if
(
!
hash
)
hash
=
window
.
location
.
hash
hash
=
hash
.
replace
(
'
#
'
,
''
)
info
=
hash
.
split
(
'
/
'
);
var
view
=
{}
view
.
distribution
=
{}
view
.
packages
=
{}
view
.
package
=
{}
view
.
file
=
{}
from_hash_to_view
:
function
(
hash
)
{
if
(
!
hash
)
hash
=
window
.
location
.
hash
;
hash
=
hash
.
replace
(
'
#
'
,
''
);
var
info
=
hash
.
split
(
'
/
'
);
var
view
=
{};
view
.
distribution
=
{};
view
.
packages
=
{};
view
.
package
=
{};
view
.
file
=
{};
if
(
info
.
length
>=
1
)
{
view
.
distribution
.
name
=
info
[
0
];
}
if
(
info
.
length
>=
3
){
view
.
package
.
name
=
info
[
1
];
view
.
package
.
version
=
info
[
2
];
view
.
package
.
orig_name
=
view
.
package
.
name
+
'
_
'
+
view
.
package
.
version
}
if
(
info
.
length
>=
4
)
{
view
.
file
.
name
=
info
[
3
]
view
.
file
.
orig_name
=
view
.
package
.
orig_name
+
'
.
'
+
view
.
file
.
name
}
return
view
},
from_view_to_hash
:
function
(
view
)
{
hash
=
"
#
"
if
(
Utils
.
check_view_distribution
(
view
))
{
hash
=
hash
+
view
.
distribution
.
name
if
(
Utils
.
check_view_package
(
view
))
{
hash
=
hash
+
'
/
'
+
view
.
package
.
name
+
"
/
"
+
view
.
package
.
version
if
(
Utils
.
check_view_file
(
view
))
hash
=
hash
+
'
/
'
+
view
.
file
.
name
}
}
return
hash
},
check_view_distribution
:
function
(
view
)
{
return
view
&&
view
.
distribution
&&
view
.
distribution
.
name
},
check_view_package
:
function
(
view
)
{
return
Utils
.
check_view_distribution
(
view
)
&&
view
.
package
&&
view
.
package
.
name
&&
view
.
package
.
version
&&
view
.
package
.
orig_name
},
check_view_file
:
function
(
view
)
{
return
Utils
.
check_view_package
(
view
)
&&
view
.
file
&&
view
.
file
.
name
},
if
(
info
.
length
>=
1
)
{
view
.
distribution
.
name
=
info
[
0
];
}
if
(
info
.
length
>=
3
)
{
view
.
package
.
name
=
info
[
1
];
view
.
package
.
version
=
info
[
2
];
view
.
package
.
orig_name
=
view
.
package
.
name
+
'
_
'
+
view
.
package
.
version
;
}
if
(
info
.
length
>=
4
)
{
view
.
file
.
name
=
info
[
3
];
view
.
file
.
orig_name
=
view
.
package
.
orig_name
+
'
.
'
+
view
.
file
.
name
;
}
return
view
;
},
get_status_icon_and_class
:
function
(
status_data
)
{
var
_c
=
config
.
status
.
className
var
_i
=
config
.
status
.
icons
var
_s
=
status_data
var
className
=
null
var
icon
=
null
if
(
_s
.
hasOwnProperty
(
'
success
'
))
{
if
(
_s
.
success
==
true
)
{
className
=
_c
.
success
icon
=
_i
.
success
}
else
{
className
=
_c
.
fail
icon
=
_i
.
fail
}
}
else
{
className
=
_c
[
_s
.
status
]
icon
=
_i
[
_s
.
status
]
}
from_view_to_hash
:
function
(
view
)
{
var
hash
=
'
#
'
;
if
(
Utils
.
check_view_distribution
(
view
))
{
hash
=
hash
+
view
.
distribution
.
name
;
if
(
Utils
.
check_view_package
(
view
))
{
hash
=
hash
+
'
/
'
+
view
.
package
.
name
+
'
/
'
+
view
.
package
.
version
;
if
(
Utils
.
check_view_file
(
view
))
hash
=
hash
+
'
/
'
+
view
.
file
.
name
;
}
}
return
hash
;
},
// do not change color if update or create and successed
if
(
_s
.
success
==
true
&&
_s
.
status
!=
config
.
status
.
build
)
{
className
=
_c
[
_s
.
status
]
}
check_view_distribution
:
function
(
view
)
{
return
view
&&
view
.
distribution
&&
view
.
distribution
.
name
;
},
return
{
className
:
className
,
icon
:
icon
}
},
check_view_package
:
function
(
view
)
{
return
Utils
.
check_view_distribution
(
view
)
&&
view
.
package
&&
view
.
package
.
name
&&
view
.
package
.
version
&&
view
.
package
.
orig_name
;
},
check_view_file
:
function
(
view
)
{
return
Utils
.
check_view_package
(
view
)
&&
view
.
file
&&
view
.
file
.
name
;
},
get_status_icon_and_class
:
function
(
status_data
)
{
var
_c
=
config
.
status
.
className
;
var
_i
=
config
.
status
.
icons
;
var
_s
=
status_data
;
var
className
=
null
;
var
icon
=
null
;
if
(
_s
.
hasOwnProperty
(
'
success
'
))
{
if
(
_s
.
success
===
true
)
{
className
=
_c
.
success
;
icon
=
_i
.
success
;
}
else
{
className
=
_c
.
fail
;
icon
=
_i
.
fail
;
}
}
else
{
className
=
_c
[
_s
.
status
];
icon
=
_i
[
_s
.
status
];
}
get_status_icon_html
:
function
(
status_data
)
{
info
=
Utils
.
get_status_icon_and_class
(
status_data
)
return
'
<span class="icon glyphicon glyphicon-
'
+
info
.
icon
+
'
"></span>
'
},
// do not change color if update or create and successed
if
(
_s
.
success
===
true
&&
_s
.
status
!=
config
.
status
.
build
)
{
className
=
_c
[
_s
.
status
];
}
// clone an object via JSON
clone
:
function
(
object
)
{
return
JSON
.
parse
(
JSON
.
stringify
(
object
));
}
}
return
{
className
:
className
,
icon
:
icon
};
},
get_status_icon_html
:
function
(
status_data
)
{
var
info
=
Utils
.
get_status_icon_and_class
(
status_data
);
return
'
<span class="icon glyphicon glyphicon-
'
+
info
.
icon
+
'
"></span>
'
;
},
// clone an object via JSON
clone
:
function
(
object
)
{
return
JSON
.
parse
(
JSON
.
stringify
(
object
));
}
};
debomatic-webui/views/distribution.ejs
View file @
f7a4f04a
...
...
@@ -15,7 +15,7 @@
<h2>Packages</h2>
<ul class="nav nav-pills nav-stacked"></ul>
</nav>
<div id="sticky" >
<section id="files">
<nav id="logs">
...
...
@@ -24,7 +24,11 @@
</nav>
<div class="others">
<nav id="sources">
<h4>Sources</h4>
<h4>Sources
<a class="btn btn-link" title="Get all sources in one click" onclick="download_all('#sources')">
<span class="glyphicon glyphicon-download-alt"></span>
</a>
</h4>
<ul></ul>
</nav>
<nav id="debs">
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment