diff --git a/.env b/.env index 75c593d5..c962701d 100644 --- a/.env +++ b/.env @@ -59,6 +59,7 @@ SHUFFLE_BASE_IMAGE_TAG_SUFFIX="-0.8.80" SHUFFLE_CONTAINER_AUTO_CLEANUP=false SHUFFLE_ELASTIC=true SHUFFLE_LOGS_DISABLED=false +SHUFFLE_CHAT_DISABLED=false # DATABASE CONFIGURATIONS DATASTORE_EMULATOR_HOST=shuffle-database:8000 diff --git a/backend/app_sdk/Dockerfile_ubuntu b/backend/app_sdk/Dockerfile_ubuntu new file mode 100644 index 00000000..228d5a41 --- /dev/null +++ b/backend/app_sdk/Dockerfile_ubuntu @@ -0,0 +1,19 @@ +FROM ubuntu as base + +FROM base as builder + +RUN apt-get update +RUN apt-get dist-upgrade -y +RUN apt install build-essential libffi-dev musl-dev openssl python3 python3-pip -y + +RUN mkdir /install +WORKDIR /install + +COPY requirements.txt /requirements.txt +RUN pip install --prefix="/install" -r /requirements.txt + +FROM base + +COPY --from=builder /install /usr/local +COPY __init__.py /app/walkoff_app_sdk/__init__.py +COPY app_base.py /app/walkoff_app_sdk/app_base.py diff --git a/backend/app_sdk/app_base.py b/backend/app_sdk/app_base.py index 82a14724..69dc1687 100644 --- a/backend/app_sdk/app_base.py +++ b/backend/app_sdk/app_base.py @@ -2494,7 +2494,7 @@ class AppBase: # FIXME: Check if the previous node has a result or not - self.logger.info("[DEBUG] Relevant conditions: %s" % branch["conditions"]) + #self.logger.info("[DEBUG] Relevant conditions: %s" % branch["conditions"]) successful_conditions = [] failed_conditions = [] successful_conditions = 0 diff --git a/backend/app_sdk/build.sh b/backend/app_sdk/build.sh index 8e92913b..4200ca10 100644 --- a/backend/app_sdk/build.sh +++ b/backend/app_sdk/build.sh @@ -1,9 +1,8 @@ #!/bin/bash - ### DEFAULT NAME=shuffle-app_sdk -VERSION=0.9.67 +VERSION=0.9.69 docker rmi docker.pkg.github.com/frikky/shuffle/$NAME:$VERSION --force docker build . -f Dockerfile -t frikky/shuffle:app_sdk -t frikky/$NAME:$VERSION -t docker.pkg.github.com/frikky/shuffle/$NAME:$VERSION -t ghcr.io/frikky/$NAME:$VERSION -t ghcr.io/frikky/$NAME:nightly @@ -16,6 +15,16 @@ docker push ghcr.io/frikky/$NAME:latest +#### UBUNTU +NAME=shuffle-app_sdk_ubuntu +docker build . -f Dockerfile_ubuntu -t frikky/shuffle:app_sdk_ubuntu -t frikky/$NAME:$VERSION -t docker.pkg.github.com/frikky/shuffle/$NAME:$VERSION -t ghcr.io/frikky/$NAME:$VERSION +docker push frikky/shuffle:app_sdk_ubuntu +docker push ghcr.io/frikky/$NAME:$VERSION + + + + + #### KALI ### #NAME=shuffle-app_sdk_kali #docker build . -f Dockerfile_kali -t frikky/shuffle:app_sdk_kali -t frikky/$NAME:$VERSION -t docker.pkg.github.com/frikky/shuffle/$NAME:$VERSION -t ghcr.io/frikky/$NAME:$VERSION diff --git a/backend/go-app/docker.go b/backend/go-app/docker.go index db57f05a..9ca293bf 100644 --- a/backend/go-app/docker.go +++ b/backend/go-app/docker.go @@ -261,7 +261,7 @@ func buildImageMemory(fs billy.Filesystem, tags []string, dockerfileFolder strin //log.Printf("RESPONSE: %#v", imageBuildResponse) //log.Printf("Response: %#v", imageBuildResponse.Body) - log.Printf("[DEBUG] IMAGERESPONSE: %#v", imageBuildResponse.Body) + //log.Printf("[DEBUG] IMAGERESPONSE: %#v", imageBuildResponse.Body) if imageBuildResponse.Body != nil { defer imageBuildResponse.Body.Close() diff --git a/backend/go-app/go.mod b/backend/go-app/go.mod index 5e590eed..25119c40 100644 --- a/backend/go-app/go.mod +++ b/backend/go-app/go.mod @@ -2,7 +2,7 @@ module main go 1.16 -//replace github.com/shuffle/shuffle-shared => ../../../shuffle-shared +replace github.com/shuffle/shuffle-shared => ../../../shuffle-shared //replace github.com/frikky/kin-openapi => ../../../../git/kin-openapi //replace github.com/frikky/go-elasticsearch => ../../../../git/go-elasticsearch @@ -24,7 +24,7 @@ require ( github.com/h2non/filetype v1.1.3 github.com/nirasan/go-oauth-pkce-code-verifier v0.0.0-20170819232839-0fbfe93532da // indirect github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.2.28 + github.com/shuffle/shuffle-shared v0.2.29 go4.org v0.0.0-20201209231011-d4a079459e60 // indirect golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce google.golang.org/api v0.65.0 diff --git a/backend/go-app/main.go b/backend/go-app/main.go index f70e1618..f4149c3a 100644 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -1029,6 +1029,10 @@ func handleInfo(resp http.ResponseWriter, request *http.Request) { } } + if os.Getenv("SHUFFLE_CHAT_DISABLED") == "true" { + chatDisabled = true + } + tutorialsFinished := []string{} returnValue := shuffle.HandleInfo{ Success: true, @@ -1044,8 +1048,9 @@ func handleInfo(resp http.ResponseWriter, request *http.Request) { Expiration: expiration.Unix(), }, }, - EthInfo: userInfo.EthInfo, - Tutorials: tutorialsFinished, + EthInfo: userInfo.EthInfo, + Tutorials: tutorialsFinished, + ChatDisabled: chatDisabled, } returnData, err := json.Marshal(returnValue) diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index 3e76b62c..20b43e8d 100644 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -150,6 +150,7 @@ func handleGetWorkflowqueueConfirm(resp http.ResponseWriter, request *http.Reque } // FIXME: Add authentication? + // Cloud has auth. id := request.Header.Get("Org-Id") if len(id) == 0 { log.Printf("[ERROR] No Org-Id header set - confirm") diff --git a/docker-compose.yml b/docker-compose.yml index 5668fe1c..7353a12c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,7 +16,7 @@ services: depends_on: - backend backend: - #build: ./backend + build: ./backend image: ghcr.io/frikky/shuffle-backend:nightly container_name: shuffle-backend hostname: ${BACKEND_HOSTNAME} diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 9c4a4509..c543af90 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -39,6 +39,7 @@ import { useAlert, positions, Provider } from "react-alert"; import { isMobile } from "react-device-detect"; import detectEthereumProvider from "@metamask/detect-provider"; +import Drift from "react-driftjs"; // Production - backend proxy forwarding in nginx var globalUrl = window.location.origin; @@ -275,6 +276,10 @@ const App = (message, props) => { position: positions.BOTTOM_LEFT, }; + const handleFirstInteraction = (event) => { + console.log("First interaction: ", event) + } + const includedData = window.location.pathname === "/home" || window.location.pathname === "/features" ? ( @@ -299,6 +304,20 @@ const App = (message, props) => { getUserNotifications={getUserNotifications} setCurpath={setCurpath} /> + {!isLoaded ? null : + + }
{ handleClose(); }} > - + About @@ -508,7 +508,7 @@ const Header = (props) => {
- +
{ */} - +
{ } const imagesize = 22 - console.log("Org: ", data) //if (data.creator_org !== undefined && data.creator_org !== null && data.creator_org.length > 0 && data.fixed !== true) { var skipOrg = false @@ -773,7 +772,7 @@ const Header = (props) => { - +
{ queryitem.name.toLowerCase() == "url" || queryitem.name.toLowerCase() == "body" || queryitem.name.toLowerCase() == "self" || + queryitem.name.toLowerCase() == "query" || queryitem.name.toLowerCase() == "ssl_verify" || queryitem.name.toLowerCase() == "queries" || queryitem.name.toLowerCase() == "headers" || diff --git a/frontend/src/views/Contact.jsx b/frontend/src/views/Contact.jsx deleted file mode 100644 index 54932023..00000000 --- a/frontend/src/views/Contact.jsx +++ /dev/null @@ -1,365 +0,0 @@ -import React, { useState } from "react"; -import { BrowserView, MobileView } from "react-device-detect"; - -import Paper from "@material-ui/core/Paper"; -import Button from "@material-ui/core/Button"; - -import TextField from "@material-ui/core/TextField"; - -import { useTheme } from "@material-ui/core/styles"; - -const bodyDivStyle = { - margin: "auto", - textAlign: "center", - width: "900px", -}; - -// Should be different if logged in :| -const Contact = (props) => { - const { globalUrl, isLoaded } = props; - - const theme = useTheme(); - - const boxStyle = { - flex: "1", - marginLeft: "10px", - marginRight: "10px", - paddingLeft: "30px", - paddingRight: "30px", - paddingBottom: "30px", - paddingTop: "30px", - backgroundColor: theme.palette.surfaceColor, - display: "flex", - flexDirection: "column", - }; - - const bodyTextStyle = { - color: "#ffffff", - }; - - const [firstname, setFirstname] = useState(""); - const [lastname, setLastname] = useState(""); - const [title, setTitle] = useState(""); - const [companyname, setCompanyname] = useState(""); - const [email, setEmail] = useState(""); - const [phone, setPhone] = useState(""); - const [message, setMessage] = useState(""); - - const [formMessage, setFormMessage] = useState(""); - - const submitContact = () => { - const data = { - firstname: firstname, - lastname: lastname, - title: title, - companyname: companyname, - email: email, - phone: phone, - message: message, - }; - console.log(data); - - fetch(globalUrl + "/api/v1/contact", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(data), - }) - .then((response) => response.json()) - .then((response) => { - if (response.success === true) { - setFormMessage(response.message); - } else { - setFormMessage( - "Something went wrong. Please contact frikky@shuffler.io." - ); - } - console.log(response); - }) - .catch((error) => { - console.log(error); - }); - }; - - // Random names for type & autoComplete. Didn't research :^) - const landingpageDataBrowser = ( -
-
-

Contact us

-

Lets talk!

-
-
- -

Contact Details

-
- setFirstname(e.target.value)} - /> - setLastname(e.target.value)} - /> -
-
- setTitle(e.target.value)} - /> - setCompanyname(e.target.value)} - /> -
-
- setEmail(e.target.value)} - /> - setPhone(e.target.value)} - /> -
-
-

Message

-
-
- setMessage(e.target.value)} - /> -
- -

{formMessage}

-
-
-
- ); - - const landingpageDataMobile = ( -
-
-

Contact us

-

Lets talk!

-
-
- -

Contact Details

-
- setFirstname(e.target.value)} - /> -
-
- setEmail(e.target.value)} - /> -
-
-

Message

-
-
- setMessage(e.target.value)} - /> -
- -

{formMessage}

-
-
-
- ); - - const loadedCheck = isLoaded ? ( -
- -
{landingpageDataBrowser}
-
- {landingpageDataMobile} -
- ) : ( -
- ); - - return
{loadedCheck}
; -}; -export default Contact; diff --git a/frontend/src/views/Docs.jsx b/frontend/src/views/Docs.jsx index d6c98b9e..91d5ba3f 100644 --- a/frontend/src/views/Docs.jsx +++ b/frontend/src/views/Docs.jsx @@ -6,6 +6,9 @@ import { BrowserView, MobileView } from "react-device-detect"; import { useParams, useNavigate, Link } from "react-router-dom"; import { + Grid, + TextField, + IconButton, Tooltip, Divider, Button, @@ -15,7 +18,11 @@ import { Paper, List, } from "@material-ui/core"; -import { Link as LinkIcon, Edit as EditIcon } from "@material-ui/icons"; + +import { + Link as LinkIcon, + Edit as EditIcon, +} from "@material-ui/icons"; const Body = { maxWidth: 1000, @@ -50,12 +57,13 @@ const Docs = (defaultprops) => { var props = JSON.parse(JSON.stringify(defaultprops)) props.match = {} props.match.params = params + console.log("Props: ", props.match.params) useEffect(() => { - if (params["key"] === undefined) { - navigate("/docs/about") - return - } + //if (params["key"] === undefined) { + // navigate("/docs/about") + // return + //} }, []) //console.log("PARAMS: ", params) @@ -229,8 +237,12 @@ const Docs = (defaultprops) => { // navigate("/docs/about") // return null //} + // + if (props.match.params.key === undefined) { - fetchDocs(props.match.params.key) + } else { + fetchDocs(props.match.params.key) + } } } } @@ -404,7 +416,6 @@ const Docs = (defaultprops) => { rel="noopener noreferrer" target="_blank" href={selectedMeta.link} - target="_blank" style={{ textDecoration: "none", color: "#f85a3e" }} >
); diff --git a/functions/onprem/orborus/build.sh b/functions/onprem/orborus/build.sh index 17303549..49b0d14f 100644 --- a/functions/onprem/orborus/build.sh +++ b/functions/onprem/orborus/build.sh @@ -1,5 +1,5 @@ NAME=shuffle-orborus -VERSION=0.9.67 +VERSION=0.9.69 echo "Running docker build with $NAME:$VERSION" #docker rmi frikky/shuffle:$NAME --force diff --git a/functions/onprem/orborus/orborus.go b/functions/onprem/orborus/orborus.go index d72df574..ba6a7700 100644 --- a/functions/onprem/orborus/orborus.go +++ b/functions/onprem/orborus/orborus.go @@ -89,7 +89,7 @@ func init() { dockercli, err = dockerclient.NewEnvClient() if err != nil { - panic(fmt.Sprintf("Unable to create docker client: %s", err)) + log.Printf("Unable to create docker client: %s", err) } getThisContainerId() @@ -203,7 +203,7 @@ func deployServiceWorkers(image string) { if swarmConfig == "run" || swarmConfig == "swarm" { ctx := context.Background() // Looks for and cleans up all existing items in swarm we can't re-use (Shuffle only) - cleanupExistingNodes(ctx) + // frikky@debian:~/git/shuffle/functions/onprem/worker$ docker service create --replicas 5 --name shuffle-workers --env SHUFFLE_SWARM_CONFIG=run --publish published=33333,target=33333 ghcr.io/frikky/shuffle-worker:nightly networkName := "shuffle_swarm_executions" if len(swarmNetworkName) > 0 { @@ -495,7 +495,9 @@ func deployWorker(image string, identifier string, env []string, executionReques // FIXME: Should we handle replies properly? // In certain cases, a workflow may e.g. be aborted already. If it's aborted, that returns // a 401 from the worker, which returns an error here - go sendWorkerRequest(executionRequest) + //go sendWorkerRequest(executionRequest) + sendWorkerRequest(executionRequest) + //err := sendWorkerRequest(executionRequest) //if err != nil { // log.Printf("[ERROR] Failed worker request for %s: %s", executionRequest.ExecutionId, err) @@ -859,10 +861,15 @@ func main() { workerImage := fmt.Sprintf("%s/%s/shuffle-worker:%s", baseimageregistry, baseimagename, workerVersion) if swarmConfig == "run" || swarmConfig == "swarm" { checkSwarmService(ctx) + + log.Printf("[DEBUG] Cleaning up containers from previous run") + cleanupExistingNodes(ctx) + time.Sleep(time.Duration(5) * time.Second) + log.Printf("[DEBUG] Deploying worker image %s to swarm", workerImage) deployServiceWorkers(workerImage) - log.Printf("[DEBUG] Waiting 30 seconds to ensure workers are deployed. Run: \"docker service ls\" for more info") - time.Sleep(time.Duration(30) * time.Second) + log.Printf("[DEBUG] Waiting 45 seconds to ensure workers are deployed. Run: \"docker service ls\" for more info") + time.Sleep(time.Duration(45) * time.Second) //deployServiceWorkers(workerImage) } @@ -900,7 +907,7 @@ func main() { if err != nil { log.Printf("[ERROR] Failed making request builder during init: %s", err) - os.Exit(3) + return } zombiecounter := 0 @@ -1336,6 +1343,7 @@ func sendWorkerRequest(workflowExecution shuffle.ExecutionRequest) error { ) if err != nil { log.Printf("[ERROR] Failed creating worker request: %s", err) + if strings.Contains(fmt.Sprintf("%s", err), "connection refused") || strings.Contains(fmt.Sprintf("%s", err), "EOF") { workerImage := fmt.Sprintf("%s/%s/shuffle-worker:%s", baseimageregistry, baseimagename, workerVersion) deployServiceWorkers(workerImage) @@ -1349,7 +1357,7 @@ func sendWorkerRequest(workflowExecution shuffle.ExecutionRequest) error { newresp, err := client.Do(req) if err != nil { - log.Printf("[ERROR] Error running worker request: %s", err) + log.Printf("[ERROR] Error running worker request (1): %s", err) if strings.Contains(fmt.Sprintf("%s", err), "connection refused") || strings.Contains(fmt.Sprintf("%s", err), "EOF") { workerImage := fmt.Sprintf("%s/%s/shuffle-worker:%s", baseimageregistry, baseimagename, workerVersion) deployServiceWorkers(workerImage) @@ -1368,7 +1376,7 @@ func sendWorkerRequest(workflowExecution shuffle.ExecutionRequest) error { } if newresp.StatusCode != 200 { - log.Printf("[ERROR] Error running worker request - status code is %d, not 200. Body: %s", newresp.StatusCode, string(body)) + log.Printf("[ERROR] Error running worker request (2) - status code is %d, not 200. Body: %s", newresp.StatusCode, string(body)) workerImage := fmt.Sprintf("%s/%s/shuffle-worker:%s", baseimageregistry, baseimagename, workerVersion) deployServiceWorkers(workerImage)