forked from NationTech/harmony
		
	wip(opnsense-config): It compiles now, still have to test it
This commit is contained in:
		
							parent
							
								
									32cea6c3ff
								
							
						
					
					
						commit
						8459c38499
					
				| @ -1,27 +1,68 @@ | |||||||
| use crate::error::Error; | use crate::error::Error; | ||||||
| use crate::modules::opnsense::OPNsense; | use crate::modules::opnsense::OPNsense; | ||||||
|  | use async_trait::async_trait; | ||||||
| use russh::client::{Config as SshConfig, Handler}; | use russh::client::{Config as SshConfig, Handler}; | ||||||
| use std::sync::Arc; |  | ||||||
| use russh_keys::key; | use russh_keys::key; | ||||||
|  | use std::{fmt::Write as _, sync::Arc}; | ||||||
|  | use tokio::io::AsyncWriteExt; | ||||||
|  | 
 | ||||||
|  | struct Client {} | ||||||
|  | 
 | ||||||
|  | // More SSH event handlers
 | ||||||
|  | // can be defined in this trait
 | ||||||
|  | // In this example, we're only using Channel, so these aren't needed.
 | ||||||
|  | #[async_trait] | ||||||
|  | impl Handler for Client { | ||||||
|  |     type Error = Error; | ||||||
|  | 
 | ||||||
|  |     async fn check_server_key( | ||||||
|  |         &mut self, | ||||||
|  |         _server_public_key: &key::PublicKey, | ||||||
|  |     ) -> Result<bool, Self::Error> { | ||||||
|  |         Ok(true) | ||||||
|  |     } | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| pub struct Config { | pub struct Config { | ||||||
|     opnsense: OPNsense, |     opnsense: OPNsense, | ||||||
|     ssh_config: Arc<SshConfig>, |     ssh_config: Arc<SshConfig>, | ||||||
|     host: String, |     host: String, | ||||||
|     username: String, |     username: String, | ||||||
|  |     key: Arc<key::KeyPair>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Config { | impl Config { | ||||||
|     pub async fn new(host: &str, username: &str, key_path: &str) -> Result<Self, Error> { |     pub async fn new(host: &str, username: &str, key_path: &str) -> Result<Self, Error> { | ||||||
|         let key = russh_keys::load_secret_key(key_path, None).expect("Secret key failed loading"); |         let key = russh_keys::load_secret_key(key_path, None).expect("Secret key failed loading"); | ||||||
|  |         let key = Arc::new(key); | ||||||
|         let config = SshConfig::default(); |         let config = SshConfig::default(); | ||||||
|         let config = Arc::new(config); |         let config = Arc::new(config); | ||||||
| 
 | 
 | ||||||
|         let mut ssh = russh::client::connect(config.clone(), host, Handler).await?; |         let mut ssh = russh::client::connect(config.clone(), host, Client {}).await?; | ||||||
|         ssh.authenticate_publickey(username, key).await?; |         ssh.authenticate_publickey(username, key.clone()).await?; | ||||||
| 
 | 
 | ||||||
|         let (xml, _) = ssh.exec(true, "cat /conf/config.xml").await?; |         let mut channel = ssh.channel_open_session().await?; | ||||||
|         let xml = String::from_utf8(xml).map_err(|e| Error::Config(e.to_string()))?; | 
 | ||||||
|  |         channel.exec(true, "cat /conf/config.xml").await?; | ||||||
|  |         let mut code; | ||||||
|  |         let mut output = String::new(); | ||||||
|  |         loop { | ||||||
|  |             let Some(msg) = channel.wait().await else { | ||||||
|  |                 break; | ||||||
|  |             }; | ||||||
|  | 
 | ||||||
|  |             match msg { | ||||||
|  |                 russh::ChannelMsg::Data { ref data } => { | ||||||
|  |                     write!(&mut output, "{:?}", data); | ||||||
|  |                     println!("Got data {output}"); | ||||||
|  |                 } | ||||||
|  |                 russh::ChannelMsg::ExitStatus { exit_status } => { | ||||||
|  |                     code = Some(exit_status); | ||||||
|  |                 } | ||||||
|  |                 _ => todo!(), | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         let xml = output; | ||||||
| 
 | 
 | ||||||
|         let opnsense = yaserde::de::from_str(&xml).map_err(|e| Error::Xml(e.to_string()))?; |         let opnsense = yaserde::de::from_str(&xml).map_err(|e| Error::Xml(e.to_string()))?; | ||||||
| 
 | 
 | ||||||
| @ -30,6 +71,7 @@ impl Config { | |||||||
|             ssh_config: config, |             ssh_config: config, | ||||||
|             host: host.to_string(), |             host: host.to_string(), | ||||||
|             username: username.to_string(), |             username: username.to_string(), | ||||||
|  |             key, | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -44,12 +86,14 @@ impl Config { | |||||||
|     pub async fn save(&self) -> Result<(), Error> { |     pub async fn save(&self) -> Result<(), Error> { | ||||||
|         let xml = yaserde::ser::to_string(&self.opnsense).map_err(|e| Error::Xml(e.to_string()))?; |         let xml = yaserde::ser::to_string(&self.opnsense).map_err(|e| Error::Xml(e.to_string()))?; | ||||||
| 
 | 
 | ||||||
|         let mut ssh = russh::client::connect(self.ssh_config.clone(), &self.host, Handler).await?; |         let mut ssh = | ||||||
|         ssh.authenticate_publickey(&self.username, key).await?; |             russh::client::connect(self.ssh_config.clone(), &self.host, Client {}).await?; | ||||||
|  |         ssh.authenticate_publickey(&self.username, self.key.clone()).await?; | ||||||
|  |         todo!("Writing config file to remote host {xml}"); | ||||||
| 
 | 
 | ||||||
|         ssh.exec(true, &format!("echo '{}' > /conf/config.xml", xml)) |         // ssh.exec(true, &format!("echo '{}' > /conf/config.xml", xml))
 | ||||||
|             .await?; |         //     .await?;
 | ||||||
| 
 | 
 | ||||||
|         Ok(()) |         // Ok(())
 | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user