Follow along with the video below to see how to install our site as a web app on your home screen.
Huomio: This feature may not be available in some browsers.
Hyvää joulua!
Osallistu io-techin piparikakkutalokilpailuun 2025 Linkki osallistumisketjuun >>>
SER-huutokaupat hyväntekeväisyyteen käynnissä! Linkki huutokauppaan >>>
Lisäksi multitaskasin googlesta ja siellä sanottiin, että kaikki mitä kyseiselle laitteelle teen pyyhkiytyy pois kun uusia firmiksiä tai konfeja ajetaan kontrollerin kautta
Mistä laitteesta on kyse?
authorized_keys ei ole kansio vaan tiedosto, jonka luot tuohon .ssh-kansioon jos sellaista ei ole ennestään.
Kyseessä Unifin USG reititin.
Mä siis mielestäni yritin päästä SSH kansioon mutta sellaista ei ollut olemassa. Nyt mä toisaalta mietin, että yritinkö luoda väärällä komennolla tiedostoa ja samalla kansiota..joita kumpaakaan ei ole olemassa. Onneksi en ole ihan tällä alalla...tai jos olisin niin en varmasti pitkään.
Unifi laitteisiin ssh avaimet lisätään unifi controllerin kautta. Settings -> System -> Network Device SSH Authentication -> SSH keys
Yksinkertaisuudessaan pitäisi toimia ihan tyyliin:Moi, tämän löysin itsekin asetuksista. Kävin katsomassa ohjeet ja loin avaimen. Millä tuo tunnuksen toimiminen voidaan todentaa? Kun vein avaimen unifille ja tallensin (annoin keksimäni käyttäjätunnuksen), niin pitäisikö minun siltä aloittavalta koneelta päästä ssh:lla pelkällä tunnuksella Unifin controlleriin kiinni. Näin siis oletan, mutta ei onnistunut.
Yksinkertaisuudessaan pitäisi toimia ihan tyyliin:
ssh luomasi_käyttäjätunnus@unifin_ip_osoite
Tosiaan, SSH-avain (julkinen puolisko) pitää olla sinne laitteeseen laitettuna niinkuin nyt pitäisi olla. Sitten tuolla koneella miltä otat yhteyttä pitää olla tuon avaimen toinen puolisko (privaattipuolisko) ja se varmaankin onkin siellä. Kokeilithan ottaa ssh-yhteyttä samalla käyttäjällä millä loit nuo avaimet?
Jos tuo SSH-yhteys ei onnistu niin herjaako se jotain virhettä vai kysyykö kuitenkin salasanaa?
No, ainakin tuosta selkeästi käy ilmi että jotain vikaa avainparissa on ja USG sentään ymmärtää että avaimella yritetään kirjautua eli itse lähtisin ehkä generoimaan nuo avaimet uudestaan ja yrittämään uudestaan. Itsekin joskus tappelin puttyn kanssa puttygen:llä generoitujen avainten kanssa enkä nyt yhtäkkiä muista mikä siinä kiikasti. Itselläni siis ei ole (vielä) Ubiquitin laitteita joten en osaa sanoa onko niissä jotain omia ihmeellisyyksiä mutta parin kymmenen vuoden linux- ja ssh-kokemus kuitenkinSeurasin näitä ohjeita:
Halusin ensiksi todentaa Puttylla, että kuvio toimii. Ei vaan toimi.
Public key viety Unifille ja keksitty käyttäjänimi.
![]()
Tämän jälkeen "save" ja olen vielä erikseen provisioinut kontrollerin.
Seuraavaksi Puttyyn:
![]()
Ja privatekey paikalleen:
![]()
Sitten Open.
![]()
Ja kertoo, että server (eli usg) hylkii avainta ja pyytää salasanaa, jota ei luontaisesti tunnuksella ole.![]()
No, ainakin tuosta selkeästi käy ilmi että jotain vikaa avainparissa on ja USG sentään ymmärtää että avaimella yritetään kirjautua eli itse lähtisin ehkä generoimaan nuo avaimet uudestaan ja yrittämään uudestaan. Itsekin joskus tappelin puttyn kanssa puttygen:llä generoitujen avainten kanssa enkä nyt yhtäkkiä muista mikä siinä kiikasti. Itselläni siis ei ole (vielä) Ubiquitin laitteita joten en osaa sanoa onko niissä jotain omia ihmeellisyyksiä mutta parin kymmenen vuoden linux- ja ssh-kokemus kuitenkin
Hetkinen, tuohan tuolla kertoo että tuo avain pitäisi alkaa "ssh-rsa" ja alla kuitenkin näkyy jotain AA... eli olisiko tuossa vika?
Kokeilin tätä oman USG:n kanssa. Toimii ihan sukkana. Mulla on siis julkinen avain tiedostossa muodossaSeurasin näitä ohjeita:
Halusin ensiksi todentaa Puttylla, että kuvio toimii. Ei vaan toimi.
Public key viety Unifille ja keksitty käyttäjänimi.
![]()
Tämän jälkeen "save" ja olen vielä erikseen provisioinut kontrollerin.
Seuraavaksi Puttyyn:
![]()
Ja privatekey paikalleen:
![]()
Sitten Open.
![]()
Ja kertoo, että server (eli usg) hylkii avainta ja pyytää salasanaa, jota ei luontaisesti tunnuksella ole.![]()
ssh-rsa AAAA******************************* avaimen_nimi
Palautatko sää todos (return todos) vai onko tuo vain karsittu koodin pätkä?Nyt on kyllä pää solmussa. Miten mä saan tästä datan ulos. Ei ihan promiset nyt oo sisäistynyt.
async function getData() { const response = await api.getTodos() const todos = await response.json() }
async function getData() {
const response = await api.getTodos()
const todos = await response.json()
}
const api = new MockApi()
async function getData() {
const response = await api.getTodos()
const todos = await response.json()
return todos
}
const todos = await getData()
console.log(todos)Hmm tuolla trulee virhe Uncaught Error: Module parse failed: The top-level-await experiment is not enabled (set experiments.topLevelAwait: true to enabled it)
getData().then(data => console.log(data)).catch(e => console.error(e));
getData().then(data => console.log(data)).catch(e => console.error(e));
Mites mä pääsen muokkaamaan tota dataa tai näyttämään sivuilla. *nolo*
import { useEffect, useState } from "react";
export default function App() {
const [data, setData] = useState({ state: "not_loaded" });
useEffect(() => {
setData({ state: "loading" });
fetch("https://jsonplaceholder.typicode.com/todos/1")
.then((response) => response.json())
.then((data) => setData({ state: "loaded", data }))
.catch((e) => setData({ state: "error" }));
}, []);
return (
<div className="App">
{data.state === "not_loaded" && <p>Not loaded</p>}
{data.state === "loading" && <p>Loading...</p>}
{data.state === "loaded" && <p>Got data: {data.data.title}</p>}
{data.state === "error" && <p>Error!</p>}
</div>
);
}
useEffect(() => {
async function getWork() {
let url = baseURL + params.workId?.toString();
try {
const response = await getApiContent(url, user);
setWork(response.data);
} catch (e) {
console.error(e);
}
}
getWork();
}, [params.workId, user])
const api = new MockApi()
const TodoItem = () => {
const [data, setData] = useState([])
const getData = async () => {
const response = await api.getTodos()
const data = await response.json()
setData(data)
}
useEffect(() => {
getData()
}, [])
return data.map((data, index) => (
<ul>
<li key={index}>{data.task}</li>
</ul>
)
)
}
export default TodoItem
Tässä muuten ainakin minulle hyvin mielenkiintoinen video tilanhallinnasta Reactissa:
.
Kokeilin tätä oman USG:n kanssa. Toimii ihan sukkana. Mulla on siis julkinen avain tiedostossa muodossa
Koodi:ssh-rsa AAAA******************************* avaimen_nimi
Tuohon Unifin kenttiin laitoin avaimen ssh-rsa alkuineena ja nimi-kenttään avaimen nimen. Mulla ei tosin ole Puttya vaan Linux tässä client-koneella.
Mitä tuo "getting ready"-jumi tarkoittaa? Ei toimi netti-UI etkä pääse SSH:lla sisään?
| Parameter | Required | Type | Description |
| pindora.id | Yes Note: In the next minor release, this parameter will be optional and only mandatory if more than one Pindora exists. | string | ID of the Pindora you want to give the permission to. |
| id | Yes | string | Your own ID for this permission. It can be whatever you want to map it to your internal transaction logs |
Käsittääkseni selaimen osoiteriviltä ei suoraan voi POST-requestia tehdä (tietty javascript-kikkailulla onnistuu). Eli tuolla curlilla, wgetillä tai vastaavalla tai siten tekemällä koneelle jonkun html-tiedoston jota aukoo selaimella.Asiasta kolmanteen.
Nyt vuorossa yrittää ymmärtää
1) missä muodossa POST-komento pitää lähettää jos API-ohjeessa lukee seuraavaa:
External Open Permissions a.k.a allow Pindora to open the lock
With this endpoint you will be able to set a permission for Pindora to open the lock. After setting the permission for a Pindora using this endpoint, the Pindora will behave the same way as it would if the user would have typed in a PIN code.
In other words, you just set the external open permission (for example through your own app) and then knock on the door. Pindora will open the lock.
To create an external permission
POST https://admin.pindora.fi/api/integration/openpermissions
Required scope
dooropengrand.create
To issue a new external permission for Pindora to open, the client needs to send a POST request with following request body parameters as JSON to https://admin.pindora.fi/api/integration/openpermission :
Parameter Required Type Description pindora.id Yes
Note: In the next minor release, this parameter will be optional and only mandatory if more than one Pindora exists.string ID of the Pindora you want to give the permission to. id Yes string Your own ID for this permission. It can be whatever you want to map it to your internal transaction logs
Examples
Request example using Curl
curl --request POST \
--url https://admin.pindora.fi/api/integration/openpermissions \
--header 'Pindora-Api-Key: d217d336-550g-4dd3-b834-b7deb95b7607' \
--header 'content-type: application/vdn.pindora.v1+json' \
--data '{"pindora":{"id":"66c1b208-7b31-4747-a331-fc9753634104"},"id": "ext-1"}'
Full request data sent (example)
POST /api/integration/openpermissions HTTP/1.1
Host: admin.pindora.fi
Accept: application/vdn.pindora.v1+json
Pindora-Api-Key: d217d336-550g-4dd3-b834-b7deb95b7607
{
"pindora": {
"id": "66c1b208-7b31-4747-a331-fc9753634104"
},
"id": "ext-1"
Oletan, että tuossa on ihan selkeä ohje miten ja mitä pitää tehdä mutta minä en ymmärrä. Olenko käsittänyt oikein, että post-komento pitäisi olla sellainen jonka toimivuuden voi todentaa lähettämällä selaimen osoiteriviltä komennon. Ja kun tuo komento toimii, niin sitten voi lopuksi pähkäillä millä työkalulla ja miten aikoo POST-komentoa milloinkin lähetellä. Tämä jälkimmäinen on menossa kotiautomaation webocoren kautta käyttöön, mutta nyt pitäisi ymmärtää mikä on komennon oikea muoto. Osaisiko joku hieman avittaa?
Olenko käsittänyt oikein, että post-komento pitäisi olla sellainen jonka toimivuuden voi todentaa lähettämällä selaimen osoiteriviltä komennon
Mutta ymmärränkö oikein, että nämä esimerkit ovat jo ihan aidossa muodossaan olevia komentoja?
Tuo curl-alkuinen on komento, jonka voi antaa jossain Linuxissa ja se toimii suoraan. Tuo POST-alkuinen ei ole mikään komento, vaan siinä vaan listataan pyynnön tarvitsemat tiedot. Ja ne pitää sitten syöttää oikealla tavalla riippuen millä sen pyynnön sitten teetkin (curl, Postman, JS:n fetch jne.). Postmanissa esim. osoiteriville kirjoittaisit osoitteen jossaon siis protokolla, host että polku, esim: https://admin.pindora.fi/api/integration/openpermissions. Sitten data (tuo {...}-objekti) laitetaan Postmanissa Body->Raw->Json. Ihan copy-pastella. Postmanissa on myös oma paikkansa headereille, johon tulee tuo Pindora-Api-Key ja Accept.
Valittaa API keyn puuttumisesta. Onkohan minulla jokin merkkivirhe vai lähtökohtaisesti isompi ongelma käsillä?
Älä laita sitä dataa headereihin vaan tuonne body-välilehdelle vai onko se sielläkin?Okei, no sitten olen jo lähellä.
![]()
Valittaa API keyn puuttumisesta. Onkohan minulla jokin merkkivirhe vai lähtökohtaisesti isompi ongelma käsillä?
Älä laita sitä dataa headereihin vaan tuonne body-välilehdelle vai onko se sielläkin?
Älä laita form-dataa vaan täppää tuo raw ja siihen se pelkkä JSONÄh. Juuri ymmärsin saman.
Eli kaksi headeria, ja yksi data.
Laitoin bodyn alle seuraavasti:
![]()
Ja sama lopputulos. Onko tuolla nyt { tai " merkkejä jotenkin väärin. Kopioin rivin suoraan sellaisenaan ja samalla periaatteella kuten header-kenttiinkin. Hieman hämmentää kun value kohdassa on ohjeen mukaisesti kaksi id:tä, joissa toisessa id ja toisessa vapaavalintainen nimi.
Laitoin bodyn alle seuraavasti
Käytämme välttämättömiä evästeitä, jotta tämä sivusto toimisi, ja valinnaisia evästeitä käyttökokemuksesi parantamiseksi.