Copy-pasteat. Eli otat ssh-yhteyden kuten ennenkin, eli salasanalla. Avaat tuon tiedoston ~/.ssh/authorized_keys tai luot jos sellaista ei vielä ole. Ja sinne sitten pasteat sen julkisen avaimen .pub-tiedostosta. Jos tiedostossa oli aiempia rivejä, jätä ne ennalleen ja laitat sen oman julkisen avaimen uudelle riville tiedoston loppuun. Siellä on siis julkisia avaimia omilla riveillään. Se kertoo, että niilla avaimilla palvelin antaa ottaa ssh-yhteyden. Ja vain niillä.Millä helvetillä saan tuon filun nyt sinne laitteelle?
Mistä laitteesta on kyse?Lisäksi multitaskasin googlesta ja siellä sanottiin, että kaikki mitä kyseiselle laitteelle teen pyyhkiytyy pois kun uusia firmiksiä tai konfeja ajetaan kontrollerin kautta
Kyseessä Unifin USG reititin.Mistä laitteesta on kyse?
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.authorized_keys ei ole kansio vaan tiedosto, jonka luot tuohon .ssh-kansioon jos sellaista ei ole ennestään.
Kysyn jatkokyssärin: mihin tarvitset skriptiä, joka rebuuttaa sen?Kyseessä Unifin USG reititin.
Unifi laitteisiin ssh avaimet lisätään unifi controllerin kautta. Settings -> System -> Network Device SSH Authentication -> SSH keysMä 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.
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.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.
Seurasin näitä ohjeita: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.
Mä huomasin just itse saman ja kävin muuttamassa asetusta, nyt sitten USG jäi "Getting ready" kohtaan jumiin eikä sinne pääse hallintaliittymän kautta tekemään mitään. On tämä Unifi-maailma hienoa. Eli mä palaan tähän heti kun saan tuon USG:n korjattua. huhhuh..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
async function getData() {
const response = await api.getTodos()
const todos = await response.json()
}
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()
}
Nyt et palauta tuossa mitään (eli palautat undefined). Tuo vaatii returnin. Ja siellä kutsuvassa päässä pitää sitten awaitata tätä getData-funktiota, koska se palauttaa promisen.Jos ei näillä ala toimia, niin näytä enemmän koodia.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)
Herjaa ettet voi käyttää awaitia top-levelissä eli funktioiden ulkopuolella. Yleensä ei ole mitään syytä tehdä tuollaista. Mitähän sä varsinaisesti yrität tehdä?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));
Sun pitäis näyttää enemmän sitä koodia ja oikeasti kertoa, mitä sä olet tekemässä. Tää on vähän vaikea arvailla pala kerrallaanMites 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
Olen käyttänyt react querya ja zustandia omissa projekteissa, molemmista olen tykännyt. Nyt olen tallentanut formi datan localstorageen, mutta en tiedä onko se kovin hyvä ratkaisu, vai olisiko pitänyt tallentaa serveri puolelle kuitenkin.Tässä muuten ainakin minulle hyvin mielenkiintoinen video tilanhallinnasta Reactissa:
.
Nyt uskaltauduin taas testaamaan, ja meikäläisen USG kaatuu kun sinne tallentaa SSH-avaimen. Jää jumiin "getting readyyn" ja laite jää siihen tilaan todennäköisesti ikuiseksi ajaksi. Näin tapahtui viime kerrallakin. Kirjoittaakohan tuo ssh key lisääminen config.json fileen jotain joka jumittaa purkin.Kokeilin tätä oman USG:n kanssa. Toimii ihan sukkana. Mulla on siis julkinen avain tiedostossa muodossa
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.Koodi:ssh-rsa AAAA******************************* avaimen_nimi
Ei pysty ajamaan mitään konfeja enää sisään, eikä pysty hallintasivun kautta hallinnoimaan USG:tä lainkaan.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?
Selain lähettää osoiteriviltä GET-pyynnön, ei POST-pyyntöä. Suosittelen lämmöllä asentamaan esim. Postmanin: Postman Tuolla on helppo luoda juuri halutunlaisia kyselyitä ja niille parametreja, tallentaa ne kansioihinsa jne. Tehty juuri APIen testaamiseen, debuggaukseen, dokumentointiin jne. Yksinkertaisimmillaan kirjoitat osoitteen, valitsen oikean metodin, asetat headerit ja lähetät pyynnön ja katsot mitä tuli ulos.Olenko käsittänyt oikein, että post-komento pitäisi olla sellainen jonka toimivuuden voi todentaa lähettämällä selaimen osoiteriviltä komennon
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.Mutta ymmärränkö oikein, että nämä esimerkit ovat jo ihan aidossa muodossaan olevia komentoja?
Okei, no sitten olen jo lähellä.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.
Olikohan tuo bulk-edit missä näkee noi kaikki tekstimuodossa, tsekkaisin ensimmäisenä sieltä, ettei ole mitään extra-välilyöntejä tms. Ja, että mahdolliset viivat sun muut 'tavallisia' viivoja, ettei copy-pastessa ole tapahtunut mitään.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ä?
Äh. Juuri ymmärsin saman.Ä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.
Laita se kuten jo neuvoin: body -> raw -> JSON. Nyt laitoit Body->form-data. Mutta virhe tosiaan kertoisi että sulla ei ole validia API-avainta.Laitoin bodyn alle seuraavasti