[release] v0.4.0-unstable6
This commit is contained in:
parent
6a8e97b242
commit
08d7dbbe4e
|
@ -66,3 +66,7 @@
|
|||
.darken {
|
||||
filter: brightness(0.5);
|
||||
}
|
||||
|
||||
.MuiAlert-icon {
|
||||
align-items: center;
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
import React from 'react';
|
||||
import { IconButton, Tooltip } from '@mui/material';
|
||||
import { CloseSquareOutlined, DeleteOutlined, PauseCircleOutlined, PlaySquareOutlined, ReloadOutlined, RollbackOutlined, StopOutlined, UpCircleOutlined } from '@ant-design/icons';
|
||||
import { CheckCircleOutlined, CloseSquareOutlined, DeleteOutlined, PauseCircleOutlined, PlaySquareOutlined, ReloadOutlined, RollbackOutlined, StopOutlined, UpCircleOutlined } from '@ant-design/icons';
|
||||
import * as API from '../../api';
|
||||
|
||||
const GetActions = ({
|
||||
|
@ -9,6 +9,8 @@ const GetActions = ({
|
|||
refreshServeApps,
|
||||
setIsUpdatingId
|
||||
}) => {
|
||||
const [confirmDelete, setConfirmDelete] = React.useState(false);
|
||||
|
||||
const doTo = (action) => {
|
||||
setIsUpdatingId(Id, true);
|
||||
API.docker.manageContainer(Id, action).then((res) => {
|
||||
|
@ -76,8 +78,12 @@ const GetActions = ({
|
|||
{
|
||||
t: 'Delete',
|
||||
if: ['exited', 'created'],
|
||||
e: <IconButton onClick={() => {doTo('remove')}} color="error" size='large'>
|
||||
<DeleteOutlined />
|
||||
e: <IconButton onClick={() => {
|
||||
if(confirmDelete) doTo('remove')
|
||||
else setConfirmDelete(true);
|
||||
}} color="error" size='large'>
|
||||
{confirmDelete ? <CheckCircleOutlined />
|
||||
: <DeleteOutlined />}
|
||||
</IconButton>
|
||||
}
|
||||
];
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import React from 'react';
|
||||
import { Formik } from 'formik';
|
||||
import { Button, Stack, Grid, MenuItem, TextField, IconButton, FormHelperText, CircularProgress, useTheme } from '@mui/material';
|
||||
import { Button, Stack, Grid, MenuItem, TextField, IconButton, FormHelperText, CircularProgress, useTheme, Alert } from '@mui/material';
|
||||
import MainCard from '../../../components/MainCard';
|
||||
import { CosmosCheckbox, CosmosFormDivider, CosmosInputText, CosmosSelect }
|
||||
from '../../config/users/formShortcuts';
|
||||
|
@ -12,13 +12,6 @@ import { NetworksColumns } from '../networks';
|
|||
import NewNetworkButton from '../createNetwork';
|
||||
|
||||
const NetworkContainerSetup = ({ config, containerInfo, refresh }) => {
|
||||
const restartPolicies = [
|
||||
['no', 'No Restart'],
|
||||
['always', 'Always Restart'],
|
||||
['on-failure', 'Restart On Failure'],
|
||||
['unless-stopped', 'Restart Unless Stopped'],
|
||||
];
|
||||
|
||||
const [networks, setNetworks] = React.useState([]);
|
||||
const theme = useTheme();
|
||||
const isDark = theme.palette.mode === 'dark';
|
||||
|
@ -40,13 +33,13 @@ const NetworkContainerSetup = ({ config, containerInfo, refresh }) => {
|
|||
|
||||
const connect = (network) => {
|
||||
setNetworks(null);
|
||||
return API.docker.attachNetwork(containerInfo.Id, network).then(() => {
|
||||
return API.docker.attachNetwork(containerInfo.Name.replace('/', ''), network).then(() => {
|
||||
refreshAll();
|
||||
});
|
||||
}
|
||||
|
||||
const disconnect = (network) => {
|
||||
return API.docker.detachNetwork(containerInfo.Id, network).then(() => {
|
||||
return API.docker.detachNetwork(containerInfo.Name.replace('/', ''), network).then(() => {
|
||||
refreshAll();
|
||||
});
|
||||
}
|
||||
|
@ -94,18 +87,20 @@ const NetworkContainerSetup = ({ config, containerInfo, refresh }) => {
|
|||
.then((res) => {
|
||||
setStatus({ success: true });
|
||||
setSubmitting(false);
|
||||
refresh && refresh();
|
||||
}
|
||||
).catch((err) => {
|
||||
setStatus({ success: false });
|
||||
setErrors({ submit: err.message });
|
||||
setSubmitting(false);
|
||||
refresh && refresh();
|
||||
});
|
||||
}}
|
||||
>
|
||||
{(formik) => (
|
||||
<form noValidate onSubmit={formik.handleSubmit}>
|
||||
<Stack spacing={2}>
|
||||
<MainCard title={'Exposed Ports'}>
|
||||
<MainCard title={'Ports'}>
|
||||
<Grid container spacing={4}>
|
||||
<Grid item xs={12}>
|
||||
{formik.values.ports.map((port, idx) => (
|
||||
|
@ -209,7 +204,30 @@ const NetworkContainerSetup = ({ config, containerInfo, refresh }) => {
|
|||
</Grid>
|
||||
</Grid>
|
||||
</MainCard>
|
||||
<MainCard title={'Connected Networks'}>
|
||||
<MainCard title={'Networks'}>
|
||||
<Stack spacing={2}>
|
||||
{networks && <Stack spacing={2}>
|
||||
{Object.keys(containerInfo.NetworkSettings.Networks).map((networkName) => {
|
||||
const network = networks.find((n) => n.Name === networkName);
|
||||
if (!network) {
|
||||
return <Alert severity="error">
|
||||
You are connected to a network that has been removed: <strong>{networkName}</strong>.
|
||||
Either re-create it or
|
||||
<Button
|
||||
style={{ marginLeft: '10px' }}
|
||||
variant="outlined"
|
||||
color="primary"
|
||||
onClick={() => {
|
||||
disconnect(networkName);
|
||||
}}
|
||||
>
|
||||
Disconnect It
|
||||
</Button>
|
||||
</Alert>
|
||||
}
|
||||
})}
|
||||
</Stack>}
|
||||
|
||||
{networks && <PrettyTableView
|
||||
data={networks}
|
||||
buttons={[
|
||||
|
@ -252,6 +270,7 @@ const NetworkContainerSetup = ({ config, containerInfo, refresh }) => {
|
|||
</center>
|
||||
</div>
|
||||
)}
|
||||
</Stack>
|
||||
</MainCard>
|
||||
</Stack>
|
||||
</form>
|
||||
|
|
|
@ -8,7 +8,7 @@ import { DeleteOutlined, PlusCircleOutlined } from '@ant-design/icons';
|
|||
import * as API from '../../../api';
|
||||
import { LoadingButton } from '@mui/lab';
|
||||
|
||||
const DockerContainerSetup = ({config, containerInfo}) => {
|
||||
const DockerContainerSetup = ({config, containerInfo, refresh}) => {
|
||||
const restartPolicies = [
|
||||
['no', 'No Restart'],
|
||||
['always', 'Always Restart'],
|
||||
|
@ -66,6 +66,7 @@ const DockerContainerSetup = ({config, containerInfo}) => {
|
|||
.then((res) => {
|
||||
setStatus({ success: true });
|
||||
setSubmitting(false);
|
||||
refresh && refresh();
|
||||
}
|
||||
).catch((err) => {
|
||||
setStatus({ success: false });
|
||||
|
|
|
@ -24,16 +24,16 @@ const VolumeContainerSetup = ({ config, containerInfo, refresh }) => {
|
|||
const isDark = theme.palette.mode === 'dark';
|
||||
|
||||
React.useEffect(() => {
|
||||
API.docker.networkList().then((res) => {
|
||||
setVolumes(res.data);
|
||||
API.docker.volumeList().then((res) => {
|
||||
setVolumes(res.data.Volumes);
|
||||
});
|
||||
}, []);
|
||||
|
||||
const refreshAll = () => {
|
||||
setVolumes(null);
|
||||
refresh().then(() => {
|
||||
API.docker.networkList().then((res) => {
|
||||
setVolumes(res.data);
|
||||
API.docker.volumeList().then((res) => {
|
||||
setVolumes(res.data.Volumes);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
@ -75,11 +75,13 @@ const VolumeContainerSetup = ({ config, containerInfo, refresh }) => {
|
|||
.then((res) => {
|
||||
setStatus({ success: true });
|
||||
setSubmitting(false);
|
||||
refresh && refresh();
|
||||
}
|
||||
).catch((err) => {
|
||||
setStatus({ success: false });
|
||||
setErrors({ submit: err.message });
|
||||
setSubmitting(false);
|
||||
refresh && refresh();
|
||||
});
|
||||
}}
|
||||
>
|
||||
|
@ -193,7 +195,6 @@ const VolumeContainerSetup = ({ config, containerInfo, refresh }) => {
|
|||
{
|
||||
title: '',
|
||||
field: (r) => {
|
||||
console.log(r);
|
||||
return (<Button
|
||||
variant="outlined"
|
||||
color="primary"
|
||||
|
@ -208,7 +209,7 @@ const VolumeContainerSetup = ({ config, containerInfo, refresh }) => {
|
|||
}
|
||||
]}
|
||||
/>}
|
||||
{!volumes && (<div style={{ height: '550px' }}>
|
||||
{!volumes && (<div style={{ height: '100px' }}>
|
||||
<center>
|
||||
<br />
|
||||
<CircularProgress />
|
||||
|
|
|
@ -106,6 +106,9 @@ const NetworkManagementList = () => {
|
|||
API.docker.networkDelete(r.Id).then(() => {
|
||||
refresh();
|
||||
setIsLoading(false);
|
||||
}).catch(() => {
|
||||
setIsLoading(false);
|
||||
refresh();
|
||||
});
|
||||
} else {
|
||||
setTryDelete(r.Id);
|
||||
|
|
|
@ -152,7 +152,7 @@ const ServeApps = () => {
|
|||
|
||||
<Grid2 container spacing={2}>
|
||||
{serveApps && serveApps.filter(app => search.length < 2 || app.Names[0].toLowerCase().includes(search.toLowerCase())).map((app) => {
|
||||
return <Grid2 style={gridAnim} xs={12} sm={6} md={6} lg={6} xl={4}>
|
||||
return <Grid2 style={gridAnim} xs={12} sm={6} md={6} lg={6} xl={4} key={app.Id} item>
|
||||
<Item>
|
||||
<Stack justifyContent='space-around' direction="column" spacing={2} padding={2} divider={<Divider orientation="horizontal" flexItem />}>
|
||||
<Stack direction="column" spacing={0} alignItems="flex-start">
|
||||
|
|
|
@ -99,6 +99,9 @@ const VolumeManagementList = () => {
|
|||
API.docker.volumeDelete(r.Name).then(() => {
|
||||
refresh();
|
||||
setIsLoading(false);
|
||||
}).catch(() => {
|
||||
setIsLoading(false);
|
||||
refresh();
|
||||
});
|
||||
} else {
|
||||
setTryDelete(r.Name);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "cosmos-server",
|
||||
"version": "0.4.0-unstable5",
|
||||
"version": "0.4.0-unstable6",
|
||||
"description": "",
|
||||
"main": "test-server.js",
|
||||
"bugs": {
|
||||
|
|
|
@ -25,11 +25,19 @@ func ManageContainerRoute(w http.ResponseWriter, req *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
|
||||
|
||||
vars := mux.Vars(req)
|
||||
containerName := utils.Sanitize(vars["containerId"])
|
||||
// stop, start, restart, kill, remove, pause, unpause, recreate
|
||||
action := utils.Sanitize(vars["action"])
|
||||
|
||||
if os.Getenv("HOSTNAME") != "" && (action == "recreate" || action == "update") && containerName == os.Getenv("HOSTNAME") {
|
||||
utils.Error("ManageContainer - cannot recreate/update self", nil)
|
||||
utils.HTTPError(w, "Cannot recreate/update self", http.StatusBadRequest, "DS003")
|
||||
return
|
||||
}
|
||||
|
||||
utils.Log("ManageContainer " + containerName)
|
||||
|
||||
if req.Method == "GET" {
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/azukaar/cosmos-server/src/utils"
|
||||
|
@ -157,6 +158,12 @@ func DetachNetwork(w http.ResponseWriter, req *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
if os.Getenv("HOSTNAME") != "" && networkID == "bridge" && containerID == os.Getenv("HOSTNAME") {
|
||||
utils.Error("DetachNetwork - Cannot disconnect self from bridge", nil)
|
||||
utils.HTTPError(w, "Cannot disconnect self from bridge", http.StatusBadRequest, "DS003")
|
||||
return
|
||||
}
|
||||
|
||||
err := DockerClient.NetworkDisconnect(context.Background(), networkID, containerID, true)
|
||||
if err != nil {
|
||||
utils.Error("DetachNetwork: Error while detaching network", err)
|
||||
|
|
|
@ -3,6 +3,7 @@ package docker
|
|||
import (
|
||||
"net/http"
|
||||
"encoding/json"
|
||||
"os"
|
||||
|
||||
"github.com/azukaar/cosmos-server/src/utils"
|
||||
|
||||
|
@ -18,6 +19,12 @@ func SecureContainerRoute(w http.ResponseWriter, req *http.Request) {
|
|||
containerName := utils.Sanitize(vars["containerId"])
|
||||
status := utils.Sanitize(vars["status"])
|
||||
|
||||
if os.Getenv("HOSTNAME") != "" && containerName == os.Getenv("HOSTNAME") {
|
||||
utils.Error("SecureContainerRoute - Cannot force secure self", nil)
|
||||
utils.HTTPError(w, "Cannot force secure self", http.StatusBadRequest, "DS003")
|
||||
return
|
||||
}
|
||||
|
||||
if(req.Method == "GET") {
|
||||
container, err := DockerClient.ContainerInspect(DockerContext, containerName)
|
||||
if err != nil {
|
||||
|
|
|
@ -3,6 +3,7 @@ package docker
|
|||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"github.com/azukaar/cosmos-server/src/utils"
|
||||
containerType "github.com/docker/docker/api/types/container"
|
||||
|
@ -38,6 +39,12 @@ func UpdateContainerRoute(w http.ResponseWriter, req *http.Request) {
|
|||
vars := mux.Vars(req)
|
||||
containerName := utils.Sanitize(vars["containerId"])
|
||||
|
||||
if os.Getenv("HOSTNAME") != "" && containerName == os.Getenv("HOSTNAME") {
|
||||
utils.Error("SecureContainerRoute - Cannot update self", nil)
|
||||
utils.HTTPError(w, "Cannot update self", http.StatusBadRequest, "DS003")
|
||||
return
|
||||
}
|
||||
|
||||
container, err := DockerClient.ContainerInspect(DockerContext, containerName)
|
||||
if err != nil {
|
||||
utils.Error("UpdateContainer", err)
|
||||
|
|
|
@ -25,11 +25,9 @@ func main() {
|
|||
docker.BootstrapAllContainersFromTags()
|
||||
|
||||
version, err := docker.DockerClient.ServerVersion(context.Background())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
utils.Log("Docker API version: " + version.APIVersion)
|
||||
}
|
||||
|
||||
StartServer()
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue