PyObjC

2015-08-18 17 views
18

kullanarak DNS ayarlarını değiştirme Mac'imdeki (10.10.4) DNS sunucularını PyObjC (3.0.4) kullanarak değiştirmeye çalışıyorum. görünüyor PyObjC

Her şey çalışmak: Ben bir kimlik doğrulama iletişim programım ağ ayarlarını değiştirmek için çalıştığını isteyen almak ve uygulamak/taahhüt komutları başarılı olup belirtmek istiyorum True, dönün. Bununla birlikte, sistem ayarları aslında değişmez: daha önce olduğu gibi kalırlar. Neden "sopa" yapmıyorlar?

kodu (bağımsız, sen PyObjC bir üst sürümü yüklüyse çalışması gerekir):

#!/usr/bin/env python 

import objc 
from SystemConfiguration import * 

# Open dynamic store and get primary interface 
store = SCDynamicStoreCreate(None, 'MyApp', None, None) 
primaryif = SCDynamicStoreCopyValue(store, 'State:/Network/Global/IPv4')['PrimaryInterface'] 
if primaryif: 
    print "Using %s as primary interface" % primaryif 
else: 
    raise "Can't find primary interface" 

# Load SecurityInterface framework to provide SFAuthorization 
objc.initFrameworkWrapper(
    frameworkName  = "SecurityInterface", 
    frameworkIdentifier = "com.apple.securityinterface", 
    frameworkPath  = objc.pathForFramework("/System/Library/Frameworks/SecurityInterface.framework"), 
    globals    = globals() 
) 

# Access system preferences 
preferences = SCPreferencesCreateWithAuthorization(None, 'MyApp', None, SFAuthorization.authorization().authorizationRef()) 

# Lock preferences 
SCPreferencesLock(preferences, True) 

# Get list of network services 
networkSet = SCNetworkSetCopyCurrent(preferences) 
networkSetServices = SCNetworkSetCopyServices(networkSet) 

# Find the network service that belongs to the primary interface 
for networkService in networkSetServices: 
    interface = SCNetworkServiceGetInterface(networkService) 
    if primaryif != SCNetworkInterfaceGetBSDName(interface): 
     continue 

    # Load currently configured DNS servers 
    networkProtocol = SCNetworkServiceCopyProtocol(networkService, kSCNetworkProtocolTypeDNS) 
    DNSDict = SCNetworkProtocolGetConfiguration(networkProtocol) or {} 

    # Set new DNS servers 
    DNSDict[kSCPropNetDNSServerAddresses] = [ '192.168.23.12', '8.8.4.4' ] 
    SCNetworkProtocolSetConfiguration(networkService, DNSDict) 

    # Unlock, commit and apply preferences 
    print "UL", SCPreferencesUnlock(preferences) 
    print "CO", SCPreferencesCommitChanges(preferences) 
    print "AP", SCPreferencesApplyChanges(preferences) 

DÜZENLEME: Yukarıdaki kod çoğu da "dokunaklı" anlaşılacağı this page dayanmaktadır ayarları saklamak için dinamik mağaza (bunu yapmak için kod sonunda doğru yorumlanır). Ancak, hiçbir şey yapmıyor gibi görünüyor.

DÜZENLEME 2.: /usr/sbin/networksetup demonte tarafından ben herhangi bir değişiklik kabul edilmeden önce belirli haklara (system.services.systemconfiguration.network) bir dizi gerekir fikir alıyorum.

+1

"sudo" kullanarak komut dosyasını çalıştırmayı denediniz mi? –

+0

@ l'L'l evet, bu hiçbir şeyi değiştirmiyor (tam anlamıyla) :-( – robertklep

+0

Sadece komut dosyasını denedim ve yetkilendirme istedikten sonra bir hata alıyorum: 'DNSDict [kSCPropNetDNSServerAddresses] = ['192.168.23.12' , '8.8.4.4'] TypeError: 'NoneType' nesnesi öğe atamasını desteklemiyor ' –

cevap

1

PyObjC ile çalışmamasına neden olan sorunlar var gibi görünüyor, ancak farklı bir çözüm kullanarak bunun etrafında bir yol bulabiliyorsunuz. Senin yerinde olsam ve durumum izin verseydi, DNS sunucularını ayarlamak için sistem komut satırı araçlarını arardım.

OSXDaily göre, ile yapabilirsiniz:

networksetup -setdnsservers (Network Service) (DNS IP) 

bu arzu daha açıkçası azdır çapraz platform gereksinimleri varsa.

+0

Öneriniz için teşekkürler: DI zaten '' networketup'' kullanıldı (bkz. [Bu yorum] (http://stackoverflow.com/questions/32073573/change-dns-settings-using-pyobjc/40538034 # comment52226266_32073573)) ve saf bir PyObjC yerine arıyordu. Hiç böyle çalışmayı başaramadım, fakat 'networketup' kullanmak zorunda kalmak kabul edilebilir. – robertklep